Compare commits
18 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
728d4d0fa8 | ||
|
|
e70f4ff3a6 | ||
|
|
04032c0dfe | ||
|
|
ecba6461df | ||
|
|
433ba6c250 | ||
|
|
ff6c55d1d0 | ||
|
|
d9f8facf2e | ||
|
|
6bd3e5cc8f | ||
|
|
936fb5ae45 | ||
|
|
8e661e1260 | ||
|
|
987d9b0502 | ||
|
|
f6a9169446 | ||
|
|
d5c1c43eb1 | ||
|
|
20c74dac60 | ||
|
|
30161275a3 | ||
|
|
7e9479806e | ||
|
|
39b9ea9f1d | ||
|
|
5a9165d7c6 |
69
.github/workflows/push-docker.yml
vendored
69
.github/workflows/push-docker.yml
vendored
@@ -8,8 +8,14 @@ on:
|
|||||||
- main
|
- main
|
||||||
jobs:
|
jobs:
|
||||||
push:
|
push:
|
||||||
|
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
|
strategy:
|
||||||
|
matrix:
|
||||||
|
config: [
|
||||||
|
{ dockerfile: "./Dockerfile", tagSuffix: "" },
|
||||||
|
{ dockerfile: "./Dockerfile-ultra-lite", tagSuffix: "-ultra-lite" },
|
||||||
|
{ dockerfile: "./Dockerfile-lite", tagSuffix: "-lite" }
|
||||||
|
]
|
||||||
steps:
|
steps:
|
||||||
|
|
||||||
- uses: actions/checkout@v3.5.2
|
- uses: actions/checkout@v3.5.2
|
||||||
@@ -46,17 +52,10 @@ jobs:
|
|||||||
username: ${{ github.actor }}
|
username: ${{ github.actor }}
|
||||||
password: ${{ github.token }}
|
password: ${{ github.token }}
|
||||||
|
|
||||||
- name: Generate tags
|
- name: Convert repository owner to lowercase
|
||||||
id: meta
|
id: repoowner
|
||||||
uses: docker/metadata-action@v4.4.0
|
run: echo "::set-output name=lowercase::$(echo ${{ github.repository_owner }} | awk '{print tolower($0)}')"
|
||||||
with:
|
|
||||||
images: |
|
|
||||||
${{ secrets.DOCKER_HUB_USERNAME }}/s-pdf
|
|
||||||
ghcr.io/${{ github.repository_owner }}/s-pdf
|
|
||||||
tags: |
|
|
||||||
type=raw,value=${{ steps.versionNumber.outputs.versionNumber }},enable=${{ github.ref == 'refs/heads/master' }}
|
|
||||||
type=raw,value=latest,enable=${{ github.ref == 'refs/heads/master' }}
|
|
||||||
type=raw,value=alpha,enable=${{ github.ref == 'refs/heads/main' }}
|
|
||||||
|
|
||||||
- name: Set up QEMU
|
- name: Set up QEMU
|
||||||
uses: docker/setup-qemu-action@v2.1.0
|
uses: docker/setup-qemu-action@v2.1.0
|
||||||
@@ -64,11 +63,24 @@ jobs:
|
|||||||
- name: Set up Docker Buildx
|
- name: Set up Docker Buildx
|
||||||
uses: docker/setup-buildx-action@v2.5.0
|
uses: docker/setup-buildx-action@v2.5.0
|
||||||
|
|
||||||
- name: Build and push main Dockerfile
|
|
||||||
|
- name: Generate tags
|
||||||
|
id: meta
|
||||||
|
uses: docker/metadata-action@v4.4.0
|
||||||
|
with:
|
||||||
|
images: |
|
||||||
|
${{ secrets.DOCKER_HUB_USERNAME }}/s-pdf
|
||||||
|
ghcr.io/${{ steps.repoowner.outputs.lowercase }}/s-pdf
|
||||||
|
tags: |
|
||||||
|
type=raw,value=${{ steps.versionNumber.outputs.versionNumber }}${{ matrix.config.tagSuffix }},enable=${{ github.ref == 'refs/heads/master' }}
|
||||||
|
type=raw,value=latest${{ matrix.config.tagSuffix }},enable=${{ github.ref == 'refs/heads/master' }}
|
||||||
|
type=raw,value=alpha,enable=${{ github.ref == 'refs/heads/main' }}
|
||||||
|
|
||||||
|
- name: Build and push Dockerfile
|
||||||
uses: docker/build-push-action@v4.0.0
|
uses: docker/build-push-action@v4.0.0
|
||||||
with:
|
with:
|
||||||
context: .
|
context: .
|
||||||
dockerfile: ./Dockerfile
|
dockerfile: ${{ matrix.config.dockerfile }}
|
||||||
push: true
|
push: true
|
||||||
cache-from: type=gha
|
cache-from: type=gha
|
||||||
cache-to: type=gha,mode=max
|
cache-to: type=gha,mode=max
|
||||||
@@ -76,32 +88,3 @@ jobs:
|
|||||||
labels: ${{ steps.meta.outputs.labels }}
|
labels: ${{ steps.meta.outputs.labels }}
|
||||||
platforms: linux/amd64,linux/arm64/v8
|
platforms: linux/amd64,linux/arm64/v8
|
||||||
|
|
||||||
- name: Generate tags
|
|
||||||
id: meta2
|
|
||||||
uses: docker/metadata-action@v4.4.0
|
|
||||||
with:
|
|
||||||
images: |
|
|
||||||
${{ secrets.DOCKER_HUB_USERNAME }}/s-pdf
|
|
||||||
ghcr.io/${{ github.repository_owner }}/s-pdf
|
|
||||||
tags: |
|
|
||||||
type=raw,value=${{ steps.versionNumber.outputs.versionNumber }}-ultra-light,enable=${{ github.ref == 'refs/heads/master' }}
|
|
||||||
type=raw,value=latest-ultra-light,enable=${{ github.ref == 'refs/heads/master' }}
|
|
||||||
type=raw,value=alpha-ultra-light,enable=${{ github.ref == 'refs/heads/main' }}
|
|
||||||
|
|
||||||
- name: Convert repository owner to lowercase
|
|
||||||
id: repoowner
|
|
||||||
run: echo "::set-output name=lowercase::$(echo ${{ github.repository_owner }} | awk '{print tolower($0)}')"
|
|
||||||
|
|
||||||
- name: Build and push Dockerfile-ultralite
|
|
||||||
uses: docker/build-push-action@v4.0.0
|
|
||||||
with:
|
|
||||||
context: .
|
|
||||||
file: ./Dockerfile-ultralite
|
|
||||||
push: true
|
|
||||||
cache-from: type=gha
|
|
||||||
cache-to: type=gha,mode=max
|
|
||||||
tags: ${{ steps.meta2.outputs.tags }}
|
|
||||||
labels: ${{ steps.meta2.outputs.labels }}
|
|
||||||
platforms: linux/amd64,linux/arm64/v8
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
# Build jbig2enc in a separate stage
|
# Build jbig2enc in a separate stage
|
||||||
FROM frooodle/stirling-pdf-base:beta3
|
FROM frooodle/stirling-pdf-base:latest
|
||||||
|
|
||||||
# Create scripts folder and copy local scripts
|
# Create scripts folder and copy local scripts
|
||||||
RUN mkdir /scripts
|
RUN mkdir /scripts
|
||||||
|
|||||||
23
Dockerfile-lite
Normal file
23
Dockerfile-lite
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
# Build jbig2enc in a separate stage
|
||||||
|
FROM bellsoft/liberica-openjdk-debian:17
|
||||||
|
RUN apt-get update && \
|
||||||
|
apt-get install -y --no-install-recommends \
|
||||||
|
libreoffice-core-nogui \
|
||||||
|
libreoffice-common \
|
||||||
|
libreoffice-writer-nogui \
|
||||||
|
libreoffice-calc-nogui \
|
||||||
|
libreoffice-impress-nogui \
|
||||||
|
unoconv && \
|
||||||
|
rm -rf /var/lib/apt/lists/*
|
||||||
|
|
||||||
|
# Copy the application JAR file
|
||||||
|
COPY build/libs/*.jar app.jar
|
||||||
|
|
||||||
|
# Expose the application port
|
||||||
|
EXPOSE 8080
|
||||||
|
|
||||||
|
# Set environment variables
|
||||||
|
ENV GROUPS_TO_REMOVE=Python,OpenCV,OCRmyPDF
|
||||||
|
|
||||||
|
# Run the application
|
||||||
|
CMD ["java", "-jar", "/app.jar"]
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
# Build jbig2enc in a separate stage
|
# Build jbig2enc in a separate stage
|
||||||
FROM openjdk:17-jdk-slim
|
FROM bellsoft/liberica-openjdk-alpine:17
|
||||||
|
|
||||||
# Copy the application JAR file
|
# Copy the application JAR file
|
||||||
COPY build/libs/*.jar app.jar
|
COPY build/libs/*.jar app.jar
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
# Main stage
|
# Main stage
|
||||||
FROM openjdk:17-jdk-slim AS base
|
FROM bellsoft/liberica-openjdk-debian:17 AS base
|
||||||
RUN apt-get update && \
|
RUN apt-get update && \
|
||||||
apt-get install -y --no-install-recommends \
|
apt-get install -y --no-install-recommends \
|
||||||
libreoffice-core-nogui \
|
libreoffice-core-nogui \
|
||||||
|
|||||||
@@ -21,7 +21,7 @@ Feel free to request any features or bug fixes either in github issues or our [D
|
|||||||

|

|
||||||
|
|
||||||
## Features
|
## Features
|
||||||
- Full intractable GUI for merging/splitting/rotating/moving PDFs and their pages.
|
- Full interactive GUI for merging/splitting/rotating/moving PDFs and their pages.
|
||||||
- Split PDFs into multiple files at specified page numbers or extract all pages as individual files.
|
- Split PDFs into multiple files at specified page numbers or extract all pages as individual files.
|
||||||
- Merge multiple PDFs together into a single resultant file
|
- Merge multiple PDFs together into a single resultant file
|
||||||
- Convert PDFs to and from images
|
- Convert PDFs to and from images
|
||||||
|
|||||||
@@ -7,7 +7,7 @@ plugins {
|
|||||||
}
|
}
|
||||||
|
|
||||||
group = 'stirling.software'
|
group = 'stirling.software'
|
||||||
version = '0.10.0'
|
version = '0.10.1'
|
||||||
sourceCompatibility = '17'
|
sourceCompatibility = '17'
|
||||||
|
|
||||||
repositories {
|
repositories {
|
||||||
|
|||||||
@@ -5,6 +5,8 @@ merge-pdfs | X | | | | | |
|
|||||||
split-pdfs | X | | | | | | | | | X |
|
split-pdfs | X | | | | | | | | | X |
|
||||||
pdf-organizer | X | | | | | | | | | X | X
|
pdf-organizer | X | | | | | | | | | X | X
|
||||||
rotate-pdf | X | | | | | | | | | X |
|
rotate-pdf | X | | | | | | | | | X |
|
||||||
|
multi-page-layout | X | | | | | | | | | X |
|
||||||
|
scale-pages | X | | | | | | | | | X |
|
||||||
pdf-to-img | | X | | | | | | | | X |
|
pdf-to-img | | X | | | | | | | | X |
|
||||||
img-to-pdf | | X | | | | | | | | X |
|
img-to-pdf | | X | | | | | | | | X |
|
||||||
pdf-to-pdfa | | X | | | X | | | | X | |
|
pdf-to-pdfa | | X | | | X | | | | X | |
|
||||||
@@ -19,6 +21,7 @@ add-password | | | X | | | |
|
|||||||
remove-password | | | X | | | | | | | X |
|
remove-password | | | X | | | | | | | X |
|
||||||
change-permissions | | | X | | | | | | | X |
|
change-permissions | | | X | | | | | | | X |
|
||||||
add-watermark | | | X | | | | | | | X |
|
add-watermark | | | X | | | | | | | X |
|
||||||
|
cert-sign | | | X | | | | | | | X |
|
||||||
ocr-pdf | | | | X | X | | | | X | |
|
ocr-pdf | | | | X | X | | | | X | |
|
||||||
add-image | | | | X | | | | | | X |
|
add-image | | | | X | | | | | | X |
|
||||||
compress-pdf | | | | X | X | | | | X
|
compress-pdf | | | | X | X | | | | X
|
||||||
@@ -30,3 +33,6 @@ flatten | | | | X | | |
|
|||||||
repair | | | | X | X | | | X | | |
|
repair | | | | X | X | | | X | | |
|
||||||
remove-blanks | | | | X | X | X | X | | | |
|
remove-blanks | | | | X | X | X | X | | | |
|
||||||
compare | | | | X | | | | | | | X
|
compare | | | | X | | | | | | | X
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -16,11 +16,19 @@ def is_blank_image(image_path, threshold=10, white_percent=99, white_value=255,
|
|||||||
_, thresholded_image = cv2.threshold(blurred_image, white_value - threshold, white_value, cv2.THRESH_BINARY)
|
_, thresholded_image = cv2.threshold(blurred_image, white_value - threshold, white_value, cv2.THRESH_BINARY)
|
||||||
|
|
||||||
# Calculate the percentage of white pixels in the thresholded image
|
# Calculate the percentage of white pixels in the thresholded image
|
||||||
white_pixels = np.sum(thresholded_image == white_value)
|
white_pixels = 0
|
||||||
total_pixels = thresholded_image.size
|
total_pixels = thresholded_image.size
|
||||||
white_pixel_percentage = (white_pixels / total_pixels) * 100
|
for i in range(0, thresholded_image.shape[0], 2):
|
||||||
|
for j in range(0, thresholded_image.shape[1], 2):
|
||||||
|
if thresholded_image[i, j] == white_value:
|
||||||
|
white_pixels += 1
|
||||||
|
white_pixel_percentage = (white_pixels / (i * thresholded_image.shape[1] + j + 1)) * 100
|
||||||
|
if white_pixel_percentage < white_percent:
|
||||||
|
return False
|
||||||
|
|
||||||
print(f"Page has white pixel percent of {white_pixel_percentage}")
|
print(f"Page has white pixel percent of {white_pixel_percentage}")
|
||||||
return white_pixel_percentage > white_percent
|
return True
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
|
|||||||
@@ -24,9 +24,11 @@ public class EndpointConfiguration {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void disableEndpoint(String endpoint) {
|
public void disableEndpoint(String endpoint) {
|
||||||
|
if(!endpointStatuses.containsKey(endpoint) || endpointStatuses.get(endpoint) != false) {
|
||||||
logger.info("Disabling {}", endpoint);
|
logger.info("Disabling {}", endpoint);
|
||||||
endpointStatuses.put(endpoint, false);
|
endpointStatuses.put(endpoint, false);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
public boolean isEndpointEnabled(String endpoint) {
|
public boolean isEndpointEnabled(String endpoint) {
|
||||||
if (endpoint.startsWith("/")) {
|
if (endpoint.startsWith("/")) {
|
||||||
|
|||||||
@@ -29,6 +29,7 @@ import org.springframework.web.multipart.MultipartFile;
|
|||||||
import io.swagger.v3.oas.annotations.Operation;
|
import io.swagger.v3.oas.annotations.Operation;
|
||||||
import io.swagger.v3.oas.annotations.Parameter;
|
import io.swagger.v3.oas.annotations.Parameter;
|
||||||
import stirling.software.SPDF.utils.GeneralUtils;
|
import stirling.software.SPDF.utils.GeneralUtils;
|
||||||
|
import stirling.software.SPDF.utils.WebResponseUtils;
|
||||||
|
|
||||||
@RestController
|
@RestController
|
||||||
public class SplitPDFController {
|
public class SplitPDFController {
|
||||||
@@ -38,7 +39,7 @@ public class SplitPDFController {
|
|||||||
@PostMapping(consumes = "multipart/form-data", value = "/split-pages")
|
@PostMapping(consumes = "multipart/form-data", value = "/split-pages")
|
||||||
@Operation(summary = "Split a PDF file into separate documents",
|
@Operation(summary = "Split a PDF file into separate documents",
|
||||||
description = "This endpoint splits a given PDF file into separate documents based on the specified page numbers or ranges. Users can specify pages using individual numbers, ranges, or 'all' for every page.")
|
description = "This endpoint splits a given PDF file into separate documents based on the specified page numbers or ranges. Users can specify pages using individual numbers, ranges, or 'all' for every page.")
|
||||||
public ResponseEntity<Resource> splitPdf(
|
public ResponseEntity<byte[]> splitPdf(
|
||||||
@RequestPart(required = true, value = "fileInput")
|
@RequestPart(required = true, value = "fileInput")
|
||||||
@Parameter(description = "The input PDF file to be split")
|
@Parameter(description = "The input PDF file to be split")
|
||||||
MultipartFile file,
|
MultipartFile file,
|
||||||
@@ -97,10 +98,11 @@ public class SplitPDFController {
|
|||||||
|
|
||||||
Path zipFile = Files.createTempFile("split_documents", ".zip");
|
Path zipFile = Files.createTempFile("split_documents", ".zip");
|
||||||
|
|
||||||
|
String filename = file.getOriginalFilename().replaceFirst("[.][^.]+$", "");
|
||||||
try (ZipOutputStream zipOut = new ZipOutputStream(Files.newOutputStream(zipFile))) {
|
try (ZipOutputStream zipOut = new ZipOutputStream(Files.newOutputStream(zipFile))) {
|
||||||
// loop through the split documents and write them to the zip file
|
// loop through the split documents and write them to the zip file
|
||||||
for (int i = 0; i < splitDocumentsBoas.size(); i++) {
|
for (int i = 0; i < splitDocumentsBoas.size(); i++) {
|
||||||
String fileName = "split_document_" + (i + 1) + ".pdf";
|
String fileName = filename + "_" + (i + 1) + ".pdf";
|
||||||
ByteArrayOutputStream baos = splitDocumentsBoas.get(i);
|
ByteArrayOutputStream baos = splitDocumentsBoas.get(i);
|
||||||
byte[] pdf = baos.toByteArray();
|
byte[] pdf = baos.toByteArray();
|
||||||
|
|
||||||
@@ -119,12 +121,11 @@ public class SplitPDFController {
|
|||||||
|
|
||||||
logger.info("Successfully created zip file with split documents: {}", zipFile.toString());
|
logger.info("Successfully created zip file with split documents: {}", zipFile.toString());
|
||||||
byte[] data = Files.readAllBytes(zipFile);
|
byte[] data = Files.readAllBytes(zipFile);
|
||||||
ByteArrayResource resource = new ByteArrayResource(data);
|
|
||||||
Files.delete(zipFile);
|
Files.delete(zipFile);
|
||||||
|
|
||||||
// return the Resource in the response
|
// return the Resource in the response
|
||||||
return ResponseEntity.ok().header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=" + file.getOriginalFilename().replaceFirst("[.][^.]+$", "") + "_split.zip")
|
return WebResponseUtils.bytesToWebResponse(data, filename + ".zip", MediaType.APPLICATION_OCTET_STREAM);
|
||||||
.contentType(MediaType.APPLICATION_OCTET_STREAM).contentLength(resource.contentLength()).body(resource);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -99,7 +99,7 @@ public class ConvertImgPDFController {
|
|||||||
boolean autoRotate) throws IOException {
|
boolean autoRotate) throws IOException {
|
||||||
// Convert the file to PDF and get the resulting bytes
|
// Convert the file to PDF and get the resulting bytes
|
||||||
byte[] bytes = PdfUtils.imageToPdf(file, stretchToFit, autoRotate, colorType);
|
byte[] bytes = PdfUtils.imageToPdf(file, stretchToFit, autoRotate, colorType);
|
||||||
return WebResponseUtils.bytesToWebResponse(bytes, file[0].getOriginalFilename().replaceFirst("[.][^.]+$", "") + "_coverted.pdf");
|
return WebResponseUtils.bytesToWebResponse(bytes, file[0].getOriginalFilename().replaceFirst("[.][^.]+$", "") + "_converted.pdf");
|
||||||
}
|
}
|
||||||
|
|
||||||
private String getMediaType(String imageFormat) {
|
private String getMediaType(String imageFormat) {
|
||||||
|
|||||||
@@ -74,7 +74,9 @@ public class OtherWebController {
|
|||||||
@Hidden
|
@Hidden
|
||||||
public ModelAndView ocrPdfPage() {
|
public ModelAndView ocrPdfPage() {
|
||||||
ModelAndView modelAndView = new ModelAndView("other/ocr-pdf");
|
ModelAndView modelAndView = new ModelAndView("other/ocr-pdf");
|
||||||
modelAndView.addObject("languages", getAvailableTesseractLanguages());
|
List<String> languages = getAvailableTesseractLanguages();
|
||||||
|
Collections.sort(languages);
|
||||||
|
modelAndView.addObject("languages", languages);
|
||||||
modelAndView.addObject("currentPage", "ocr-pdf");
|
modelAndView.addObject("currentPage", "ocr-pdf");
|
||||||
return modelAndView;
|
return modelAndView;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -129,6 +129,9 @@ home.repair.desc = يحاول إصلاح ملف PDF تالف / معطل
|
|||||||
home.removeBlanks.title = إزالة الصفحات الفارغة
|
home.removeBlanks.title = إزالة الصفحات الفارغة
|
||||||
home.removeBlanks.desc = يكتشف ويزيل الصفحات الفارغة من المستند
|
home.removeBlanks.desc = يكتشف ويزيل الصفحات الفارغة من المستند
|
||||||
|
|
||||||
|
home.certSign.title=Sign with Certificate
|
||||||
|
home.certSign.desc=Signs a PDF with a Certificate/Key (PEM/P12)
|
||||||
|
|
||||||
home.compare.title = قارن
|
home.compare.title = قارن
|
||||||
home.compare.desc = يقارن ويظهر الاختلافات بين 2 من مستندات PDF
|
home.compare.desc = يقارن ويظهر الاختلافات بين 2 من مستندات PDF
|
||||||
|
|
||||||
|
|||||||
@@ -122,6 +122,9 @@ home.repair.desc=Intenta reparar un PDF danyat o trencat
|
|||||||
home.removeBlanks.title=Elimina les pàgines en blanc
|
home.removeBlanks.title=Elimina les pàgines en blanc
|
||||||
home.removeBlanks.desc=Detecta i elimina les pàgines en blanc d'un document
|
home.removeBlanks.desc=Detecta i elimina les pàgines en blanc d'un document
|
||||||
|
|
||||||
|
home.certSign.title=Sign with Certificate
|
||||||
|
home.certSign.desc=Signs a PDF with a Certificate/Key (PEM/P12)
|
||||||
|
|
||||||
home.compare.title=Compara
|
home.compare.title=Compara
|
||||||
home.compare.desc=Compara i mostra les diferències entre 2 documents PDF
|
home.compare.desc=Compara i mostra les diferències entre 2 documents PDF
|
||||||
|
|
||||||
|
|||||||
@@ -121,6 +121,9 @@ home.repair.desc=Versucht, ein beschädigtes/kaputtes PDF zu reparieren
|
|||||||
home.removeBlanks.title=Leere Seiten entfernen
|
home.removeBlanks.title=Leere Seiten entfernen
|
||||||
home.removeBlanks.desc=Erkennt und entfernt leere Seiten aus einem Dokument
|
home.removeBlanks.desc=Erkennt und entfernt leere Seiten aus einem Dokument
|
||||||
|
|
||||||
|
home.certSign.title=Sign with Certificate
|
||||||
|
home.certSign.desc=Signs a PDF with a Certificate/Key (PEM/P12)
|
||||||
|
|
||||||
home.compare.title=Vergleichen
|
home.compare.title=Vergleichen
|
||||||
home.compare.desc=Vergleicht und zeigt die Unterschiede zwischen zwei PDF-Dokumenten an
|
home.compare.desc=Vergleicht und zeigt die Unterschiede zwischen zwei PDF-Dokumenten an
|
||||||
|
|
||||||
|
|||||||
@@ -11,7 +11,7 @@ imgPrompt=Seleccionar Imagen(es)
|
|||||||
genericSubmit=Enviar
|
genericSubmit=Enviar
|
||||||
processTimeWarning=Advertencia: este proceso puede tardar hasta un minuto dependiendo del tamaño del archivo
|
processTimeWarning=Advertencia: este proceso puede tardar hasta un minuto dependiendo del tamaño del archivo
|
||||||
pageOrderPrompt=Orden de páginas (Introduzca una lista de números de página separados por coma):
|
pageOrderPrompt=Orden de páginas (Introduzca una lista de números de página separados por coma):
|
||||||
goToPage=Ir
|
goToPage=Ir a
|
||||||
true=Verdadero
|
true=Verdadero
|
||||||
false=Falso
|
false=Falso
|
||||||
unknown=Desconocido
|
unknown=Desconocido
|
||||||
@@ -23,7 +23,7 @@ bored=¿Aburrido de esperar?
|
|||||||
#############
|
#############
|
||||||
# HOME-PAGE #
|
# HOME-PAGE #
|
||||||
#############
|
#############
|
||||||
home.desc=Tu autohospedada ventanilla única para todas tus necesidades PDF.
|
home.desc=Tu ventanilla única autohospedada para todas tus necesidades PDF
|
||||||
|
|
||||||
navbar.convert=Convertir
|
navbar.convert=Convertir
|
||||||
navbar.security=Seguridad
|
navbar.security=Seguridad
|
||||||
@@ -35,19 +35,19 @@ home.multiTool.title=Multi-herramienta PDF
|
|||||||
home.multiTool.desc=Combinar, rotar, reorganizar y eliminar páginas
|
home.multiTool.desc=Combinar, rotar, reorganizar y eliminar páginas
|
||||||
|
|
||||||
home.merge.title=Unir
|
home.merge.title=Unir
|
||||||
home.merge.desc=Unir fácilmente múltiples PDFs en uno.
|
home.merge.desc=Unir fácilmente múltiples PDFs en uno
|
||||||
|
|
||||||
home.split.title=Dividir
|
home.split.title=Dividir
|
||||||
home.split.desc=Dividir PDFs en múltiples documentos
|
home.split.desc=Dividir PDFs en múltiples documentos
|
||||||
|
|
||||||
home.rotate.title=Rotar
|
home.rotate.title=Rotar
|
||||||
home.rotate.desc=Rotar fácilmente tus PDFs.
|
home.rotate.desc=Rotar fácilmente tus PDFs
|
||||||
|
|
||||||
home.imageToPdf.title=Imagen a PDF
|
home.imageToPdf.title=Imagen a PDF
|
||||||
home.imageToPdf.desc=Convertir una imagen (PNG, JPEG, GIF) a PDF.
|
home.imageToPdf.desc=Convertir una imagen (PNG, JPEG, GIF) a PDF
|
||||||
|
|
||||||
home.pdfToImage.title=PDF a Imagen
|
home.pdfToImage.title=PDF a Imagen
|
||||||
home.pdfToImage.desc=Convertir un PDF a una imagen. (PNG, JPEG, GIF)
|
home.pdfToImage.desc=Convertir un PDF a una imagen (PNG, JPEG, GIF)
|
||||||
|
|
||||||
home.pdfOrganiser.title=Organizador
|
home.pdfOrganiser.title=Organizador
|
||||||
home.pdfOrganiser.desc=Eliminar/Reorganizar páginas en cualquier orden
|
home.pdfOrganiser.desc=Eliminar/Reorganizar páginas en cualquier orden
|
||||||
@@ -56,37 +56,37 @@ home.addImage.title=Agregar imagen al PDF
|
|||||||
home.addImage.desc=Agregar una imagen en una ubicación establecida en el PDF (trabajo en progreso)
|
home.addImage.desc=Agregar una imagen en una ubicación establecida en el PDF (trabajo en progreso)
|
||||||
|
|
||||||
home.watermark.title=Añadir marca de agua
|
home.watermark.title=Añadir marca de agua
|
||||||
home.watermark.desc=Añadir una marca de agua predefinida a tu documento PDF.
|
home.watermark.desc=Añadir una marca de agua predefinida al documento PDF
|
||||||
|
|
||||||
home.remove-watermark.title=Eliminar marca de agua
|
home.remove-watermark.title=Eliminar marca de agua
|
||||||
home.remove-watermark.desc=Eliminar marcas de agua de tu documento PDF.
|
home.remove-watermark.desc=Eliminar marca de agua de tu documento PDF
|
||||||
|
|
||||||
home.permissions.title=Cambiar Permisos
|
home.permissions.title=Cambiar permisos
|
||||||
home.permissions.desc=Cambiar los permisos de tu documento PDF
|
home.permissions.desc=Cambiar los permisos del documento PDF
|
||||||
|
|
||||||
home.removePages.title=Eliminar
|
home.removePages.title=Eliminar
|
||||||
home.removePages.desc=Eliminar páginas no deseadas de tu documento PDF.
|
home.removePages.desc=Eliminar páginas no deseadas del documento PDF
|
||||||
|
|
||||||
home.addPassword.title=Añadir Contraseña
|
home.addPassword.title=Añadir contraseña
|
||||||
home.addPassword.desc=Encriptar el documento PDF con una contraseña.
|
home.addPassword.desc=Encriptar el documento PDF con una contraseña
|
||||||
|
|
||||||
home.removePassword.title=Eliminar Contraseña
|
home.removePassword.title=Eliminar contraseña
|
||||||
home.removePassword.desc=Eliminar la contraseña del documento PDF.
|
home.removePassword.desc=Eliminar la contraseña del documento PDF
|
||||||
|
|
||||||
home.compressPdfs.title=Comprimir
|
home.compressPdfs.title=Comprimir
|
||||||
home.compressPdfs.desc=Comprimir PDFs para reducir el tamaño del fichero.
|
home.compressPdfs.desc=Comprimir PDFs para reducir el tamaño del fichero
|
||||||
|
|
||||||
home.changeMetadata.title=Cambiar Metadatos
|
home.changeMetadata.title=Cambiar metadatos
|
||||||
home.changeMetadata.desc=Cambiar/Eliminar/Añadir metadatos al documento PDF.
|
home.changeMetadata.desc=Cambiar/Eliminar/Añadir metadatos al documento PDF
|
||||||
|
|
||||||
home.fileToPDF.title=Convertir fichero a PDF
|
home.fileToPDF.title=Convertir fichero a PDF
|
||||||
home.fileToPDF.desc=Convertir casi cualquier archivo a PDF (DOCX, PNG, XLS, PPT, TXT y más)
|
home.fileToPDF.desc=Convertir casi cualquier archivo a PDF (DOCX, PNG, XLS, PPT, TXT y más)
|
||||||
|
|
||||||
home.ocr.title=Ejecutar OCR en PDF y/o escaneos de limpieza
|
home.ocr.title=Ejecutar OCR en PDF y/o escaneos de limpieza
|
||||||
home.ocr.desc=Escaneos de limpieza y detecta texto de imágenes dentro de un PDF y lo vuelve a agregar como texto.
|
home.ocr.desc=Escaneos de limpieza y detectar texto de imágenes dentro de un PDF y volver a agregarlo como texto
|
||||||
|
|
||||||
home.extractImages.title=Extraer imágenes
|
home.extractImages.title=Extraer imágenes
|
||||||
home.extractImages.desc=Extraer todas las imágenes de un PDF y guardarlas en zip
|
home.extractImages.desc=Extraer todas las imágenes de un PDF y guardarlas en ZIP
|
||||||
|
|
||||||
home.pdfToPDFA.title=Convertir PDF a PDF/A
|
home.pdfToPDFA.title=Convertir PDF a PDF/A
|
||||||
home.pdfToPDFA.desc=Convertir PDF a PDF/A para almacenamiento a largo plazo
|
home.pdfToPDFA.desc=Convertir PDF a PDF/A para almacenamiento a largo plazo
|
||||||
@@ -110,27 +110,30 @@ home.ScannerImageSplit.title=Detectar/Dividir fotos escaneadas
|
|||||||
home.ScannerImageSplit.desc=Dividir varias fotos dentro de una foto/PDF
|
home.ScannerImageSplit.desc=Dividir varias fotos dentro de una foto/PDF
|
||||||
|
|
||||||
home.sign.title=Firmar
|
home.sign.title=Firmar
|
||||||
home.sign.desc=Añade firma a PDF mediante dibujo, texto o imagen
|
home.sign.desc=Añadir firma a PDF mediante dibujo, texto o imagen
|
||||||
|
|
||||||
home.flatten.title=Aplanar
|
home.flatten.title=Aplanar
|
||||||
home.flatten.desc=Eliminar todos los elementos y formularios interactivos de un PDF
|
home.flatten.desc=Eliminar todos los elementos y formularios interactivos de un PDF
|
||||||
|
|
||||||
home.repair.title=Reparar
|
home.repair.title=Reparar
|
||||||
home.repair.desc=Intenta reparar un PDF corrupto/roto
|
home.repair.desc=Intentar reparar un PDF corrupto/roto
|
||||||
|
|
||||||
home.removeBlanks.title=Eliminar páginas en blanco
|
home.removeBlanks.title=Eliminar páginas en blanco
|
||||||
home.removeBlanks.descdetecta y elimina páginas en blanco de un documento
|
home.removeBlanks.desc=Detectar y eliminar páginas en blanco de un documento
|
||||||
|
|
||||||
|
home.certSign.title=Firmar con certificado
|
||||||
|
home.certSign.desc=Firmar un PDF con un Certificado/Clave (PEM/P12)
|
||||||
|
|
||||||
home.compare.title=Comparar
|
home.compare.title=Comparar
|
||||||
home.compare.desc=Compara y muestra las diferencias entre 2 documentos PDF
|
home.compare.desc=Comparar y mostrar las diferencias entre 2 documentos PDF
|
||||||
|
|
||||||
home.pageLayout.title=Multi-Page Layout
|
home.pageLayout.title=Diseño de varias páginas
|
||||||
home.pageLayout.desc=Merge multiple pages of a PDF document into a single page
|
home.pageLayout.desc=Unir varias páginas de un documento PDF en una sola página
|
||||||
|
|
||||||
home.scalePages.title=Adjust page size/scale
|
home.scalePages.title=Escalar/ajustar tamaño de página
|
||||||
home.scalePages.desc=Change the size/scale of page and/or its contents.
|
home.scalePages.desc=Escalar/cambiar el tamaño de una pagina y/o su contenido
|
||||||
|
|
||||||
error.pdfPassword=The PDF Document is passworded and either the password was not provided or was incorrect
|
error.pdfPassword=El documento PDF está protegido con contraseña y no se ha proporcionado o es incorrecta
|
||||||
|
|
||||||
downloadPdf=Descargar PDF
|
downloadPdf=Descargar PDF
|
||||||
text=Texto
|
text=Texto
|
||||||
@@ -138,19 +141,19 @@ font=Fuente
|
|||||||
selectFilter=-- Seleccionar --
|
selectFilter=-- Seleccionar --
|
||||||
pageNum=Número de página
|
pageNum=Número de página
|
||||||
|
|
||||||
pageLayout.title=Multi Page Layout
|
pageLayout.title=Diseño de varias páginas
|
||||||
pageLayout.header=Multi Page Layout
|
pageLayout.header=Diseño de varias páginas
|
||||||
pageLayout.pagesPerSheet=Pages per sheet:
|
pageLayout.pagesPerSheet=Páginas por hoja:
|
||||||
pageLayout.submit=Submit
|
pageLayout.submit=Entregar
|
||||||
|
|
||||||
scalePages.title=Adjust page-scale
|
scalePages.title=Ajustar escala de la página
|
||||||
scalePages.header=Adjust page-scale
|
scalePages.header=Adjustar escala de la página
|
||||||
scalePages.pageSize=Size of a page of the document.
|
scalePages.pageSize=Tamaño de la página del documento
|
||||||
scalePages.scaleFactor=Zoom level (crop) of a page.
|
scalePages.scaleFactor=Nivel de zoom (recorte) de la página
|
||||||
scalePages.submit=Submit
|
scalePages.submit=Entregar
|
||||||
|
|
||||||
certSign.title=Firma de certificado
|
certSign.title=Firma de certificado
|
||||||
certSign.header=Firme un PDF con su certificado (Trabajo en progreso)
|
certSign.header=Firmar un PDF con su certificado (Trabajo en progreso)
|
||||||
certSign.selectPDF=Seleccione un archivo PDF para firmar:
|
certSign.selectPDF=Seleccione un archivo PDF para firmar:
|
||||||
certSign.selectKey=Seleccione su archivo de clave privada (formato PKCS#8, podría ser .pem o .der):
|
certSign.selectKey=Seleccione su archivo de clave privada (formato PKCS#8, podría ser .pem o .der):
|
||||||
certSign.selectCert=Seleccione su archivo de certificado (formato X.509, podría ser .pem o .der):
|
certSign.selectCert=Seleccione su archivo de certificado (formato X.509, podría ser .pem o .der):
|
||||||
@@ -194,13 +197,13 @@ flatten.header=Acoplar archivos PDF
|
|||||||
flatten.submit=Aplanar
|
flatten.submit=Aplanar
|
||||||
|
|
||||||
ScannerImageSplit.selectText.1=Umbral de ángulo:
|
ScannerImageSplit.selectText.1=Umbral de ángulo:
|
||||||
ScannerImageSplit.selectText.2=Establece el ángulo absoluto mínimo requerido para rotar la imagen (predeterminado: 10).
|
ScannerImageSplit.selectText.2=Establecer el ángulo absoluto mínimo requerido para rotar la imagen (predeterminado: 10).
|
||||||
ScannerImageSplit.selectText.3=Tolerancia:
|
ScannerImageSplit.selectText.3=Tolerancia:
|
||||||
ScannerImageSplit.selectText.4=Determina el rango de variación de color alrededor del color de fondo estimado (predeterminado: 30).
|
ScannerImageSplit.selectText.4=Determinar el rango de variación de color alrededor del color de fondo estimado (predeterminado: 30).
|
||||||
ScannerImageSplit.selectText.5=Área mínima:
|
ScannerImageSplit.selectText.5=Área mínima:
|
||||||
ScannerImageSplit.selectText.6=Establece el umbral mínimo de área para una foto (predeterminado: 10000).
|
ScannerImageSplit.selectText.6=Establecer el umbral mínimo de área para una foto (predeterminado: 10000).
|
||||||
ScannerImageSplit.selectText.7=Área de contorno mínima:
|
ScannerImageSplit.selectText.7=Área de contorno mínima:
|
||||||
ScannerImageSplit.selectText.8=Establece el umbral mínimo del área de contorno para una foto
|
ScannerImageSplit.selectText.8=Establecer el umbral mínimo del área de contorno para una foto
|
||||||
ScannerImageSplit.selectText.9=Tamaño del borde:
|
ScannerImageSplit.selectText.9=Tamaño del borde:
|
||||||
ScannerImageSplit.selectText.10=Establece el tamaño del borde agregado y eliminado para evitar bordes blancos en la salida (predeterminado: 1).
|
ScannerImageSplit.selectText.10=Establece el tamaño del borde agregado y eliminado para evitar bordes blancos en la salida (predeterminado: 1).
|
||||||
|
|
||||||
@@ -208,10 +211,10 @@ navbar.settings=Ajustes
|
|||||||
settings.title=Ajustes
|
settings.title=Ajustes
|
||||||
settings.update=Actualización disponible
|
settings.update=Actualización disponible
|
||||||
settings.appVersion=Versión de la aplicación:
|
settings.appVersion=Versión de la aplicación:
|
||||||
settings.downloadOption.title=Elige la opción de descarga (para descargas de un solo archivo sin ZIP):
|
settings.downloadOption.title=Elegir la opción de descarga (para descargas de un solo archivo sin ZIP):
|
||||||
settings.downloadOption.1=Abre en la misma ventana
|
settings.downloadOption.1=Abrir en la misma ventana
|
||||||
settings.downloadOption.2=Abre en una nueva ventana
|
settings.downloadOption.2=Abrir en una nueva ventana
|
||||||
settings.downloadOption.3=Descarga el fichero
|
settings.downloadOption.3=Descargar el fichero
|
||||||
settings.zipThreshold=Ficheros ZIP cuando excede el número de ficheros descargados
|
settings.zipThreshold=Ficheros ZIP cuando excede el número de ficheros descargados
|
||||||
|
|
||||||
|
|
||||||
@@ -220,53 +223,53 @@ settings.zipThreshold=Ficheros ZIP cuando excede el número de ficheros descarga
|
|||||||
#OCR
|
#OCR
|
||||||
ocr.title=OCR / Escaneo de limpieza
|
ocr.title=OCR / Escaneo de limpieza
|
||||||
ocr.header=Escaneos de limpieza / OCR (Reconocimiento óptico de caracteres)
|
ocr.header=Escaneos de limpieza / OCR (Reconocimiento óptico de caracteres)
|
||||||
ocr.selectText.1=Selecciona los idiomas que se detectarán en el PDF (Los enumerados son los detectados actualmente):
|
ocr.selectText.1=Seleccionar los idiomas que se detectarán en el PDF (Los enumerados son los detectados actualmente):
|
||||||
ocr.selectText.2=Produzca un archivo de texto que contenga texto OCR junto con el PDF editado con OCR
|
ocr.selectText.2=Producir un archivo de texto que contenga texto OCR junto con el PDF editado con OCR
|
||||||
ocr.selectText.3=Corrija las páginas que se escanearon en un ángulo torcido girándolas nuevamente a su lugar
|
ocr.selectText.3=Corregir las páginas que se escanearon en un ángulo torcido girándolas nuevamente a su lugar
|
||||||
ocr.selectText.4=Limpie la página para que sea menos probable que el OCR encuentre texto en el ruido de fondo. (Sin cambio de salida)
|
ocr.selectText.4=Limpiar la página para que sea menos probable que el OCR encuentre texto en el ruido de fondo (Sin cambio de salida)
|
||||||
ocr.selectText.5=Limpie la página para que sea menos probable que el OCR encuentre texto en el ruido de fondo, mantiene la limpieza en la salida.
|
ocr.selectText.5=Limpiar la página para que sea menos probable que el OCR encuentre texto en el ruido de fondo, mantiene la limpieza en la salida.
|
||||||
ocr.selectText.6=Ignora las páginas que tienen texto interactivo, solo las páginas OCR que son imágenes
|
ocr.selectText.6=Ignorar las páginas que tienen texto interactivo, solo las páginas OCR que son imágenes
|
||||||
ocr.selectText.7=Fuerza OCR, OCR eliminará en cada página todo el texto original
|
ocr.selectText.7=Forzar OCR, OCR eliminará en cada página todo el texto original
|
||||||
ocr.selectText.8=Normal (Se producirá un error si el PDF contiene texto)
|
ocr.selectText.8=Normal (se producirá un error si el PDF contiene texto)
|
||||||
ocr.selectText.9=Ajustes Adicionales
|
ocr.selectText.9=Ajustes adicionales
|
||||||
ocr.selectText.10=Modo OCR
|
ocr.selectText.10=Modo OCR
|
||||||
ocr.selectText.11=Eliminar imágenes después de OCR (Elimina TODAS las imágenes, solo es útil si es parte del paso de conversión)
|
ocr.selectText.11=Eliminar imágenes después de OCR (Elimina TODAS las imágenes, solo es útil si es parte del paso de conversión)
|
||||||
ocr.selectText.12=Tipo de procesamiento (avanzado)
|
ocr.selectText.12=Tipo de procesamiento (avanzado)
|
||||||
ocr.help=Lea esta documentación sobre cómo usar esto para otros idiomas y/o no usarlo en docker
|
ocr.help=Lea esta documentación sobre cómo usar esto para otros idiomas y/o no usarlo en Docker
|
||||||
ocr.credit=Este servicio utiliza OCRmyPDF y Tesseract para OCR.
|
ocr.credit=Este servicio utiliza OCRmyPDF y Tesseract para OCR
|
||||||
ocr.submit=Procesa PDF con OCR
|
ocr.submit=Procesar PDF con OCR
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
extractImages.title=Extraer imágenes
|
extractImages.title=Extraer imágenes
|
||||||
extractImages.header=Extraer imágenes
|
extractImages.header=Extraer imágenes
|
||||||
extractImages.selectText=Selecciona el formato de imagen para convertir las imágenes extraídas
|
extractImages.selectText=Seleccionar el formato de imagen para convertir las imágenes extraídas
|
||||||
extractImages.submit=Extraer
|
extractImages.submit=Extraer
|
||||||
|
|
||||||
|
|
||||||
#File to PDF
|
#File to PDF
|
||||||
fileToPDF.title=Fichero a PDF
|
fileToPDF.title=Archivo a PDF
|
||||||
fileToPDF.header=Convierte cualquier fichero a PDF
|
fileToPDF.header=Convertir cualquier archivo a PDF
|
||||||
fileToPDF.credit=Este servicio usa LibreOffice y Unoconv para la conversión de ficheros.
|
fileToPDF.credit=Este servicio usa LibreOffice y Unoconv para la conversión de ficheros
|
||||||
fileToPDF.supportedFileTypes=Los tipos de ficheros soportados deben incluir los de abajo; sin embargo para una completa y acutualizada lista de formatos soportados, por favor consulte la documentación de LibreOffice
|
fileToPDF.supportedFileTypes=Los tipos de ficheros soportados deben incluir los de abajo; sin embargo, para una completa y acutualizada lista de formatos soportados, por favor consulte la documentación de LibreOffice
|
||||||
fileToPDF.submit=Convertir a PDF
|
fileToPDF.submit=Convertir a PDF
|
||||||
|
|
||||||
|
|
||||||
#compress
|
#compress
|
||||||
compress.title=Comprimir
|
compress.title=Comprimir
|
||||||
compress.header=Comprimir PDF
|
compress.header=Comprimir PDF
|
||||||
compress.credit=Este servicio utiliza Ghostscript para compresión/optimización de PDF.
|
compress.credit=Este servicio utiliza Ghostscript para compresión/optimización de PDF
|
||||||
compress.selectText.1=Modo manual - De 1 a 4
|
compress.selectText.1=Modo manual - De 1 a 4
|
||||||
compress.selectText.2=Nivel de optimización:
|
compress.selectText.2=Nivel de optimización:
|
||||||
compress.selectText.3=4 (Terrible para imágenes de texto)
|
compress.selectText.3=4 (Terrible para imágenes de texto)
|
||||||
compress.selectText.4=Modo automático: ajusta automáticamente la calidad para que el PDF tenga el tamaño exacto
|
compress.selectText.4=Modo automático: ajusta automáticamente la calidad para que el PDF tenga el tamaño exacto
|
||||||
compress.selectText.5=Tamaño de PDF esperado (por ejemplo, 25 MB, 10,8 MB, 25 KB)
|
compress.selectText.5=Tamaño esperado del PDF (por ejemplo, 25 MB, 10.8 MB, 25 KB)
|
||||||
compress.submit=Comprimir
|
compress.submit=Comprimir
|
||||||
|
|
||||||
|
|
||||||
#Add image
|
#Add image
|
||||||
addImage.title=Añadir Imagen
|
addImage.title=Añadir imagen
|
||||||
addImage.header=Añadir image de PDF
|
addImage.header=Añadir imagen de PDF
|
||||||
addImage.everyPage=¿Todas las páginas?
|
addImage.everyPage=¿Todas las páginas?
|
||||||
addImage.submit=Añadir imagen
|
addImage.submit=Añadir imagen
|
||||||
|
|
||||||
@@ -288,13 +291,13 @@ multiTool.header=Multi-herramienta PDF
|
|||||||
#pageRemover
|
#pageRemover
|
||||||
pageRemover.title=Eliminador de páginas
|
pageRemover.title=Eliminador de páginas
|
||||||
pageRemover.header=Eliminador de páginas PDF
|
pageRemover.header=Eliminador de páginas PDF
|
||||||
pageRemover.pagesToDelete=Páginas a eliminar (Introduzca una lista de números de página separados por coma):
|
pageRemover.pagesToDelete=Páginas a eliminar (introducir una lista de números de página separados por coma):
|
||||||
pageRemover.submit=Eliminar Páginas
|
pageRemover.submit=Eliminar Páginas
|
||||||
|
|
||||||
#rotate
|
#rotate
|
||||||
rotate.title=Rotar PDF
|
rotate.title=Rotar PDF
|
||||||
rotate.header=Rotar PDF
|
rotate.header=Rotar PDF
|
||||||
rotate.SeleccionaAngle=Seleccionar ángulo de rotación (múltiple de 90 grados):
|
rotate.SeleccionaAngle=Seleccionar ángulo de rotación (múltiplo de 90 grados):
|
||||||
rotate.submit=Rotar
|
rotate.submit=Rotar
|
||||||
|
|
||||||
|
|
||||||
@@ -303,7 +306,7 @@ rotate.submit=Rotar
|
|||||||
#merge
|
#merge
|
||||||
split.title=Dividir PDF
|
split.title=Dividir PDF
|
||||||
split.header=Dividir PDF
|
split.header=Dividir PDF
|
||||||
split.desc.1=Los números que selecciones son el número de página en el que desea hacer una división
|
split.desc.1=Los números que seleccione son el número de página en el que desea hacer una división
|
||||||
split.desc.2=Como tal, seleccionar 1,3,7-8 dividiría un documento de 10 páginas en 6 archivos PDF separados con:
|
split.desc.2=Como tal, seleccionar 1,3,7-8 dividiría un documento de 10 páginas en 6 archivos PDF separados con:
|
||||||
split.desc.3=Documento #1: Página 1
|
split.desc.3=Documento #1: Página 1
|
||||||
split.desc.4=Documento #2: Páginas 2 y 3
|
split.desc.4=Documento #2: Páginas 2 y 3
|
||||||
@@ -311,7 +314,7 @@ split.desc.5=Documento #3: Páginas 4, 5 y 6
|
|||||||
split.desc.6=Documento #4: Página 7
|
split.desc.6=Documento #4: Página 7
|
||||||
split.desc.7=Documento #5: Página 8
|
split.desc.7=Documento #5: Página 8
|
||||||
split.desc.8=Documento #6: Páginas 9 y 10
|
split.desc.8=Documento #6: Páginas 9 y 10
|
||||||
split.splitPages=Introduce las páginas para dividir:
|
split.splitPages=Introducir las páginas para dividir:
|
||||||
split.submit=Dividir
|
split.submit=Dividir
|
||||||
|
|
||||||
|
|
||||||
@@ -321,7 +324,7 @@ imageToPDF.header=Imagen a PDF
|
|||||||
imageToPDF.submit=Convertir
|
imageToPDF.submit=Convertir
|
||||||
imageToPDF.selectText.1=Estirar para ajustar
|
imageToPDF.selectText.1=Estirar para ajustar
|
||||||
imageToPDF.selectText.2=Rotación automática del PDF
|
imageToPDF.selectText.2=Rotación automática del PDF
|
||||||
imageToPDF.selectText.3=Lógica de archivos múltiples (Únicamente activado si funciona con multiples imágenes)
|
imageToPDF.selectText.3=Lógica de archivos múltiples (únicamente activado si funciona con multiples imágenes)
|
||||||
imageToPDF.selectText.4=Unir en un único archivo PDF
|
imageToPDF.selectText.4=Unir en un único archivo PDF
|
||||||
imageToPDF.selectText.5=Convertir a PDFs separados
|
imageToPDF.selectText.5=Convertir a PDFs separados
|
||||||
|
|
||||||
@@ -330,21 +333,21 @@ pdfToImage.title=PDF a Imagen
|
|||||||
pdfToImage.header=PDF a Imagen
|
pdfToImage.header=PDF a Imagen
|
||||||
pdfToImage.selectText=Formato de Imagen
|
pdfToImage.selectText=Formato de Imagen
|
||||||
pdfToImage.singleOrMultiple=Tipo resultante de imagen
|
pdfToImage.singleOrMultiple=Tipo resultante de imagen
|
||||||
pdfToImage.single=Una Imagen Grande Única
|
pdfToImage.single=Una única imagen grande
|
||||||
pdfToImage.multi=Múltiples Imágenes
|
pdfToImage.multi=Múltiples imágenes
|
||||||
pdfToImage.colorType=Tipo de color
|
pdfToImage.colorType=Tipo de color
|
||||||
pdfToImage.color=Color
|
pdfToImage.color=Color
|
||||||
pdfToImage.grey=Escala de Grises
|
pdfToImage.grey=Escala de grises
|
||||||
pdfToImage.blackwhite=Blanco y Negro (¡Puedes perder datos!)
|
pdfToImage.blackwhite=Blanco y Negro (¡Puede perder datos!)
|
||||||
pdfToImage.submit=Convertir
|
pdfToImage.submit=Convertir
|
||||||
|
|
||||||
#addPassword
|
#addPassword
|
||||||
addPassword.title=Añadir Contraseña
|
addPassword.title=Añadir contraseña
|
||||||
addPassword.header=Añadir contraseña (Encriptar)
|
addPassword.header=Añadir contraseña (encriptar)
|
||||||
addPassword.selectText.1=Seleccionar PDF para encriptar
|
addPassword.selectText.1=Seleccionar PDF para encriptar
|
||||||
addPassword.selectText.2=Contraseña
|
addPassword.selectText.2=Contraseña
|
||||||
addPassword.selectText.3=Longitud de la clave de cifrado
|
addPassword.selectText.3=Longitud de la clave de cifrado
|
||||||
addPassword.selectText.4=Valores altos son más fuertes, pero valores bajos tienen mejor compatibilidad.
|
addPassword.selectText.4=Valores altos son más fuertes, pero valores bajos tienen mejor compatibilidad
|
||||||
addPassword.selectText.5=Permisos para establecer
|
addPassword.selectText.5=Permisos para establecer
|
||||||
addPassword.selectText.6=Impedir el ensamblaje del documento
|
addPassword.selectText.6=Impedir el ensamblaje del documento
|
||||||
addPassword.selectText.7=Impedir la extracción de contenido
|
addPassword.selectText.7=Impedir la extracción de contenido
|
||||||
@@ -354,9 +357,9 @@ addPassword.selectText.10=Impedir modificación
|
|||||||
addPassword.selectText.11=Impedir modificación de anotaciones
|
addPassword.selectText.11=Impedir modificación de anotaciones
|
||||||
addPassword.selectText.12=Impedir imprimir
|
addPassword.selectText.12=Impedir imprimir
|
||||||
addPassword.selectText.13=Impedir imprimir diferentes formatos
|
addPassword.selectText.13=Impedir imprimir diferentes formatos
|
||||||
addPassword.selectText.14=Owner Password
|
addPassword.selectText.14=Contraseña
|
||||||
addPassword.selectText.15=Restricts what can be done with the document once it is opened (Not supported by all readers)
|
addPassword.selectText.15=Restringe qué se puede hacer con el documento una vez abierto (no soportado por todos los lectores)
|
||||||
addPassword.selectText.16=Restricts the opening of the document itself
|
addPassword.selectText.16=Restringe la apertura del propio documento
|
||||||
addPassword.submit=Encriptar
|
addPassword.submit=Encriptar
|
||||||
|
|
||||||
#watermark
|
#watermark
|
||||||
@@ -379,8 +382,8 @@ remove-watermark.selectText.2=Texto de la marca de agua:
|
|||||||
remove-watermark.submit=Eliminar marca de agua
|
remove-watermark.submit=Eliminar marca de agua
|
||||||
|
|
||||||
#Change permissions
|
#Change permissions
|
||||||
permissions.title=Cambiar Permisos
|
permissions.title=Cambiar permisos
|
||||||
permissions.header=Cambiar Permisos
|
permissions.header=Cambiar permisos
|
||||||
permissions.warning=Advertencia: para que estos permisos no se puedan cambiar, se recomienda configurarlos con una contraseña a través de la página de cambio de contraseña
|
permissions.warning=Advertencia: para que estos permisos no se puedan cambiar, se recomienda configurarlos con una contraseña a través de la página de cambio de contraseña
|
||||||
permissions.selectText.1=Seleccionar PDF para cambiar los permisos
|
permissions.selectText.1=Seleccionar PDF para cambiar los permisos
|
||||||
permissions.selectText.2=Permisos a establecer
|
permissions.selectText.2=Permisos a establecer
|
||||||
@@ -396,21 +399,21 @@ permissions.submit=Cambiar
|
|||||||
|
|
||||||
#remove password
|
#remove password
|
||||||
removePassword.title=Eliminar contraseña
|
removePassword.title=Eliminar contraseña
|
||||||
removePassword.header=Eliminar contraseña (Desencriptar)
|
removePassword.header=Eliminar contraseña (desencriptar)
|
||||||
removePassword.selectText.1=Seleccionar PDF para Desencriptar
|
removePassword.selectText.1=Seleccionar PDF para desencriptar
|
||||||
removePassword.selectText.2=Contraseña
|
removePassword.selectText.2=Contraseña
|
||||||
removePassword.submit=Eliminar
|
removePassword.submit=Eliminar
|
||||||
|
|
||||||
changeMetadata.title=Cambiar Metadatos
|
changeMetadata.title=Cambiar metadatos
|
||||||
changeMetadata.header=Cambiar Metadatos
|
changeMetadata.header=Cambiar metadatos
|
||||||
changeMetadata.selectText.1=Editar las variables que desea cambiar
|
changeMetadata.selectText.1=Editar las variables que desea cambiar
|
||||||
changeMetadata.selectText.2=Eliminar todos los metadatos
|
changeMetadata.selectText.2=Eliminar todos los metadatos
|
||||||
changeMetadata.selectText.3=Mostrar metadatos personalizados:
|
changeMetadata.selectText.3=Mostrar metadatos personalizados:
|
||||||
changeMetadata.author=Autor:
|
changeMetadata.author=Autor:
|
||||||
changeMetadata.creationDate=Fecha de Creación (aaaa/MM/dd HH:mm:ss):
|
changeMetadata.creationDate=Fecha de creación (aaaa/MM/dd HH:mm:ss):
|
||||||
changeMetadata.creator=Creador:
|
changeMetadata.creator=Creador:
|
||||||
changeMetadata.keywords=Palabras clave:
|
changeMetadata.keywords=Palabras clave:
|
||||||
changeMetadata.modDate=Fecha de Modificación (aaaa/MM/dd HH:mm:ss):
|
changeMetadata.modDate=Fecha de modificación (aaaa/MM/dd HH:mm:ss):
|
||||||
changeMetadata.producer=Productor:
|
changeMetadata.producer=Productor:
|
||||||
changeMetadata.subject=Asunto:
|
changeMetadata.subject=Asunto:
|
||||||
changeMetadata.title=Título:
|
changeMetadata.title=Título:
|
||||||
@@ -437,29 +440,29 @@ pdfToPDFA.submit=Convertir
|
|||||||
PDFToWord.title=PDF a Word
|
PDFToWord.title=PDF a Word
|
||||||
PDFToWord.header=PDF a Word
|
PDFToWord.header=PDF a Word
|
||||||
PDFToWord.selectText.1=Formato de archivo de salida
|
PDFToWord.selectText.1=Formato de archivo de salida
|
||||||
PDFToWord.credit=Este servicio utiliza LibreOffice para la conversión de archivos.
|
PDFToWord.credit=Este servicio utiliza LibreOffice para la conversión de archivos
|
||||||
PDFToWord.submit=Convertir
|
PDFToWord.submit=Convertir
|
||||||
|
|
||||||
PDFToPresentation.title=PDF a presentación
|
PDFToPresentation.title=PDF a presentación
|
||||||
PDFToPresentation.header=PDF a presentación
|
PDFToPresentation.header=PDF a presentación
|
||||||
PDFToPresentation.selectText.1=Formato de archivo de salida
|
PDFToPresentation.selectText.1=Formato de archivo de salida
|
||||||
PDFToPresentation.credit=Este servicio utiliza LibreOffice para la conversión de archivos.
|
PDFToPresentation.credit=Este servicio utiliza LibreOffice para la conversión de archivos
|
||||||
PDFToPresentation.submit=Convertir
|
PDFToPresentation.submit=Convertir
|
||||||
|
|
||||||
|
|
||||||
PDFToText.title=PDF a TXT/RTF
|
PDFToText.title=PDF a TXT/RTF
|
||||||
PDFToText.header=PDF a TXT/RTF
|
PDFToText.header=PDF a TXT/RTF
|
||||||
PDFToText.selectText.1=Formato de archivo de salida
|
PDFToText.selectText.1=Formato de archivo de salida
|
||||||
PDFToText.credit=Este servicio utiliza LibreOffice para la conversión de archivos.
|
PDFToText.credit=Este servicio utiliza LibreOffice para la conversión de archivos
|
||||||
PDFToText.submit=Convertir
|
PDFToText.submit=Convertir
|
||||||
|
|
||||||
|
|
||||||
PDFToHTML.title=PDF a HTML
|
PDFToHTML.title=PDF a HTML
|
||||||
PDFToHTML.header=PDF a HTML
|
PDFToHTML.header=PDF a HTML
|
||||||
PDFToHTML.credit=Este servicio utiliza LibreOffice para la conversión de archivos.
|
PDFToHTML.credit=Este servicio utiliza LibreOffice para la conversión de archivos
|
||||||
PDFToHTML.submit=Convertir
|
PDFToHTML.submit=Convertir
|
||||||
|
|
||||||
PDFToXML.title=PDF a XML
|
PDFToXML.title=PDF a XML
|
||||||
PDFToXML.header=PDF a XML
|
PDFToXML.header=PDF a XML
|
||||||
PDFToXML.credit=Este servicio utiliza LibreOffice para la conversión de archivos.
|
PDFToXML.credit=Este servicio utiliza LibreOffice para la conversión de archivos
|
||||||
PDFToXML.submit=Convertir
|
PDFToXML.submit=Convertir
|
||||||
|
|||||||
@@ -127,6 +127,9 @@ home.repair.desc=Essaye de réparer un PDF corrompu/cassé
|
|||||||
home.removeBlanks.title=Supprimer les pages vierges
|
home.removeBlanks.title=Supprimer les pages vierges
|
||||||
home.removeBlanks.desc=Détecte et supprime les pages vierges d'un document
|
home.removeBlanks.desc=Détecte et supprime les pages vierges d'un document
|
||||||
|
|
||||||
|
home.certSign.title=Sign with Certificate
|
||||||
|
home.certSign.desc=Signs a PDF with a Certificate/Key (PEM/P12)
|
||||||
|
|
||||||
home.compare.title=Comparer
|
home.compare.title=Comparer
|
||||||
home.compare.desc=Compare et affiche les différences entre 2 documents PDF
|
home.compare.desc=Compare et affiche les différences entre 2 documents PDF
|
||||||
|
|
||||||
|
|||||||
@@ -122,6 +122,9 @@ home.repair.desc=Prova a riparare un PDF corrotto.
|
|||||||
home.removeBlanks.title=Rimuovi pagine vuote
|
home.removeBlanks.title=Rimuovi pagine vuote
|
||||||
home.removeBlanks.desc=Trova e rimuovi pagine vuote da un PDF.
|
home.removeBlanks.desc=Trova e rimuovi pagine vuote da un PDF.
|
||||||
|
|
||||||
|
home.certSign.title=Sign with Certificate
|
||||||
|
home.certSign.desc=Signs a PDF with a Certificate/Key (PEM/P12)
|
||||||
|
|
||||||
home.compare.title=Compara
|
home.compare.title=Compara
|
||||||
home.compare.desc=Vedi e compara le differenze tra due PDF.
|
home.compare.desc=Vedi e compara le differenze tra due PDF.
|
||||||
|
|
||||||
|
|||||||
@@ -125,6 +125,9 @@ home.removeBlanks.desc=Обнаруживает и удаляет пустые
|
|||||||
home.compare.title=Сравнение
|
home.compare.title=Сравнение
|
||||||
home.compare.desc=Сравнивает и показывает различия между двумя PDF-документами
|
home.compare.desc=Сравнивает и показывает различия между двумя PDF-документами
|
||||||
|
|
||||||
|
home.certSign.title=Sign with Certificate
|
||||||
|
home.certSign.desc=Signs a PDF with a Certificate/Key (PEM/P12)
|
||||||
|
|
||||||
home.pageLayout.title=Multi-Page Layout
|
home.pageLayout.title=Multi-Page Layout
|
||||||
home.pageLayout.desc=Merge multiple pages of a PDF document into a single page
|
home.pageLayout.desc=Merge multiple pages of a PDF document into a single page
|
||||||
|
|
||||||
|
|||||||
@@ -125,6 +125,9 @@ home.removeBlanks.desc=Känner av och tar bort tomma sidor från ett dokument
|
|||||||
home.compare.title=Jämför
|
home.compare.title=Jämför
|
||||||
home.compare.desc=Jämför och visar skillnaderna mellan 2 PDF-dokument
|
home.compare.desc=Jämför och visar skillnaderna mellan 2 PDF-dokument
|
||||||
|
|
||||||
|
home.certSign.title=Sign with Certificate
|
||||||
|
home.certSign.desc=Signs a PDF with a Certificate/Key (PEM/P12)
|
||||||
|
|
||||||
home.pageLayout.title=Multi-Page Layout
|
home.pageLayout.title=Multi-Page Layout
|
||||||
home.pageLayout.desc=Merge multiple pages of a PDF document into a single page
|
home.pageLayout.desc=Merge multiple pages of a PDF document into a single page
|
||||||
|
|
||||||
|
|||||||
@@ -125,6 +125,9 @@ home.removeBlanks.desc=\u68C0\u6D4B\u5E76\u5220\u9664\u6587\u6863\u4E2D\u7684\u7
|
|||||||
home.compare.title=\u6BD4\u8F83
|
home.compare.title=\u6BD4\u8F83
|
||||||
home.compare.desc=\u6BD4\u8F83\u5E76\u663E\u793A 2 \u4E2A PDF \u6587\u6863\u4E4B\u95F4\u7684\u5DEE\u5F02
|
home.compare.desc=\u6BD4\u8F83\u5E76\u663E\u793A 2 \u4E2A PDF \u6587\u6863\u4E4B\u95F4\u7684\u5DEE\u5F02
|
||||||
|
|
||||||
|
home.certSign.title=Sign with Certificate
|
||||||
|
home.certSign.desc=Signs a PDF with a Certificate/Key (PEM/P12)
|
||||||
|
|
||||||
home.pageLayout.title=Multi-Page Layout
|
home.pageLayout.title=Multi-Page Layout
|
||||||
home.pageLayout.desc=Merge multiple pages of a PDF document into a single page
|
home.pageLayout.desc=Merge multiple pages of a PDF document into a single page
|
||||||
|
|
||||||
|
|||||||
@@ -19,12 +19,13 @@ $(document).ready(function() {
|
|||||||
$('#submitBtn').text('Processing...');
|
$('#submitBtn').text('Processing...');
|
||||||
|
|
||||||
try {
|
try {
|
||||||
if (override === 'multi' || files.length > 1 && override !== 'single') {
|
if(remoteCall === true) {
|
||||||
|
if (override === 'multi' || (!multiple && files.length > 1) && override !== 'single' ) {
|
||||||
await submitMultiPdfForm(url, files);
|
await submitMultiPdfForm(url, files);
|
||||||
} else {
|
} else {
|
||||||
await handleSingleDownload(url, formData);
|
await handleSingleDownload(url, formData);
|
||||||
}
|
}
|
||||||
|
}
|
||||||
$('#submitBtn').text(originalButtonText);
|
$('#submitBtn').text(originalButtonText);
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
handleDownloadError(error);
|
handleDownloadError(error);
|
||||||
|
|||||||
@@ -32,7 +32,23 @@ const DraggableUtils = {
|
|||||||
var x = (parseFloat(target.getAttribute('data-x')) || 0)
|
var x = (parseFloat(target.getAttribute('data-x')) || 0)
|
||||||
var y = (parseFloat(target.getAttribute('data-y')) || 0)
|
var y = (parseFloat(target.getAttribute('data-y')) || 0)
|
||||||
|
|
||||||
// update the element's style
|
// check if control key is pressed
|
||||||
|
if (event.ctrlKey) {
|
||||||
|
const aspectRatio = target.offsetWidth / target.offsetHeight;
|
||||||
|
// preserve aspect ratio
|
||||||
|
let width = event.rect.width;
|
||||||
|
let height = event.rect.height;
|
||||||
|
|
||||||
|
if (Math.abs(event.deltaRect.width) >= Math.abs(event.deltaRect.height)) {
|
||||||
|
height = width / aspectRatio;
|
||||||
|
} else {
|
||||||
|
width = height * aspectRatio;
|
||||||
|
}
|
||||||
|
|
||||||
|
event.rect.width = width;
|
||||||
|
event.rect.height = height;
|
||||||
|
}
|
||||||
|
|
||||||
target.style.width = event.rect.width + 'px'
|
target.style.width = event.rect.width + 'px'
|
||||||
target.style.height = event.rect.height + 'px'
|
target.style.height = event.rect.height + 'px'
|
||||||
|
|
||||||
@@ -49,9 +65,10 @@ const DraggableUtils = {
|
|||||||
this.onInteraction(target);
|
this.onInteraction(target);
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
|
||||||
modifiers: [
|
modifiers: [
|
||||||
interact.modifiers.restrictSize({
|
interact.modifiers.restrictSize({
|
||||||
min: { width: 50, height: 50 },
|
min: { width: 5, height: 5 },
|
||||||
}),
|
}),
|
||||||
],
|
],
|
||||||
inertia: true,
|
inertia: true,
|
||||||
|
|||||||
@@ -62,7 +62,7 @@ class PdfContainer {
|
|||||||
const files = e.target.files;
|
const files = e.target.files;
|
||||||
this.fileName = files[0].name;
|
this.fileName = files[0].name;
|
||||||
for (var i=0; i < files.length; i++) {
|
for (var i=0; i < files.length; i++) {
|
||||||
this.addPdfFile(files[i], nextSiblingElement);
|
await this.addPdfFile(files[i], nextSiblingElement);
|
||||||
}
|
}
|
||||||
|
|
||||||
document.querySelectorAll(".enable-on-file").forEach(element => {
|
document.querySelectorAll(".enable-on-file").forEach(element => {
|
||||||
|
|||||||
@@ -90,9 +90,11 @@
|
|||||||
</dialog>
|
</dialog>
|
||||||
</th:block>
|
</th:block>
|
||||||
|
|
||||||
<th:block th:fragment="fileSelector(name, multiple)" th:with="accept=${accept} ?: '*/*', inputText=${inputText} ?: #{pdfPrompt}, remoteCall=${remoteCall} ?: 'true', notRequired=${notRequired} ?: false">
|
<th:block th:fragment="fileSelector(name, multiple)" th:with="accept=${accept} ?: '*/*', inputText=${inputText} ?: #{pdfPrompt}, remoteCall=${remoteCall} ?: true, notRequired=${notRequired} ?: false">
|
||||||
<script th:inline="javascript">
|
<script th:inline="javascript">
|
||||||
const pdfPasswordPrompt =/*[[#{error.pdfPassword}]]*/ '';
|
const pdfPasswordPrompt =/*[[#{error.pdfPassword}]]*/ '';
|
||||||
|
const multiple = [[${multiple}]] || false;
|
||||||
|
const remoteCall = [[${remoteCall}]] || true;
|
||||||
</script>
|
</script>
|
||||||
<script src="js/downloader.js"></script>
|
<script src="js/downloader.js"></script>
|
||||||
|
|
||||||
|
|||||||
@@ -131,11 +131,12 @@
|
|||||||
// some browsers report devicePixelRatio as less than 1
|
// some browsers report devicePixelRatio as less than 1
|
||||||
// and only part of the canvas is cleared then.
|
// and only part of the canvas is cleared then.
|
||||||
var ratio = Math.max(window.devicePixelRatio || 1, 1);
|
var ratio = Math.max(window.devicePixelRatio || 1, 1);
|
||||||
|
var additionalFactor = 10;
|
||||||
|
|
||||||
|
signaturePadCanvas.width = signaturePadCanvas.offsetWidth * ratio * additionalFactor;
|
||||||
|
signaturePadCanvas.height = signaturePadCanvas.offsetHeight * ratio * additionalFactor;
|
||||||
|
signaturePadCanvas.getContext("2d").scale(ratio * additionalFactor, ratio * additionalFactor);
|
||||||
|
|
||||||
// This part causes the canvas to be cleared
|
|
||||||
signaturePadCanvas.width = signaturePadCanvas.offsetWidth * ratio;
|
|
||||||
signaturePadCanvas.height = signaturePadCanvas.offsetHeight * ratio;
|
|
||||||
signaturePadCanvas.getContext("2d").scale(ratio, ratio);
|
|
||||||
|
|
||||||
// This library does not listen for canvas changes, so after the canvas is automatically
|
// This library does not listen for canvas changes, so after the canvas is automatically
|
||||||
// cleared by the browser, SignaturePad#isEmpty might still return false, even though the
|
// cleared by the browser, SignaturePad#isEmpty might still return false, even though the
|
||||||
|
|||||||
Reference in New Issue
Block a user