Merge pull request #360 from Frooodle/itextRemoval
Itext removal password enhancement and others
This commit is contained in:
commit
e5a7a0631b
156 changed files with 1925 additions and 1069 deletions
|
@ -8,7 +8,7 @@ Fork Stirling-PDF and make a new branch out of Main
|
||||||
|
|
||||||
Then add reference to the language in the navbar by adding a new language entry to the dropdown
|
Then add reference to the language in the navbar by adding a new language entry to the dropdown
|
||||||
|
|
||||||
https://github.com/Frooodle/Stirling-PDF/blob/main/src/main/resources/templates/fragments/navbar.html#L306
|
https://github.com/Frooodle/Stirling-PDF/blob/main/src/main/resources/templates/fragments/languages.html
|
||||||
and add a flag svg file to
|
and add a flag svg file to
|
||||||
https://github.com/Frooodle/Stirling-PDF/tree/main/src/main/resources/static/images/flags
|
https://github.com/Frooodle/Stirling-PDF/tree/main/src/main/resources/static/images/flags
|
||||||
Any SVG flags are fine, i got most of mine from [here](https://flagicons.lipis.dev/)
|
Any SVG flags are fine, i got most of mine from [here](https://flagicons.lipis.dev/)
|
||||||
|
@ -25,7 +25,7 @@ The data-language-code is the code used to reference the file in the next step.
|
||||||
|
|
||||||
Start by copying the existing english property file
|
Start by copying the existing english property file
|
||||||
|
|
||||||
[https://github.com/Frooodle/Stirling-PDF/tree/langSetup/src/main/resources/messages_en_GB.properties](https://github.com/Frooodle/Stirling-PDF/blob/main/src/main/resources/messages_en_US.properties)
|
[https://github.com/Frooodle/Stirling-PDF/blob/main/src/main/resources/messages_en_GB.properties](https://github.com/Frooodle/Stirling-PDF/blob/main/src/main/resources/messages_en_GB.properties)
|
||||||
|
|
||||||
Copy and rename it to messages_{your data-language-code here}.properties, in the polish example you would set the name to messages_pl_PL.properties
|
Copy and rename it to messages_{your data-language-code here}.properties, in the polish example you would set the name to messages_pl_PL.properties
|
||||||
|
|
||||||
|
|
104
README.md
104
README.md
|
@ -23,42 +23,63 @@ Feel free to request any features or bug fixes either in github issues or our [D
|
||||||
![stirling-home](images/stirling-home.png)
|
![stirling-home](images/stirling-home.png)
|
||||||
|
|
||||||
## Features
|
## Features
|
||||||
- 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.
|
|
||||||
- Merge multiple PDFs together into a single resultant file
|
|
||||||
- Convert PDFs to and from images
|
|
||||||
- Reorganize PDF pages into different orders.
|
|
||||||
- Add/Generate signatures
|
|
||||||
- Format PDFs into a multi-paged page
|
|
||||||
- Scale page contents size by set %
|
|
||||||
- Adjust Contrast
|
|
||||||
- Crop PDF
|
|
||||||
- Auto Split PDF (With physically scanned page dividers)
|
|
||||||
- Flatten PDFs
|
|
||||||
- Repair PDFs
|
|
||||||
- Detect and remove blank pages
|
|
||||||
- Compare 2 PDFs and show differences in text
|
|
||||||
- Add images to PDFs
|
|
||||||
- Rotating PDFs in 90 degree increments.
|
|
||||||
- Compressing PDFs to decrease their filesize. (Using OCRMyPDF)
|
|
||||||
- Add and remove passwords
|
|
||||||
- Set PDF Permissions
|
|
||||||
- Add watermark(s)
|
|
||||||
- Convert Any common file to PDF (using LibreOffice)
|
|
||||||
- Convert PDF to Word/Powerpoint/Others (using LibreOffice)
|
|
||||||
- Convert HTML to PDF
|
|
||||||
- URL to PDF
|
|
||||||
- Extract images from PDF
|
|
||||||
- Extract images from Scans
|
|
||||||
- Add page numbers
|
|
||||||
- Auto rename file by detecting PDF header text
|
|
||||||
- OCR on PDF (Using OCRMyPDF)
|
|
||||||
- PDF/A conversion (Using OCRMyPDF)
|
|
||||||
- Edit metadata
|
|
||||||
- Dark mode support.
|
- Dark mode support.
|
||||||
- Custom download options (see [here](https://github.com/Frooodle/Stirling-PDF/blob/main/images/settings.png) for example)
|
- Custom download options (see [here](https://github.com/Frooodle/Stirling-PDF/blob/main/images/settings.png) for example)
|
||||||
- Parallel file processing and downloads
|
- Parallel file processing and downloads
|
||||||
- API for integration with external scripts
|
- API for integration with external scripts
|
||||||
|
- Optional Login and Authentication support (see [here](https://github.com/Frooodle/Stirling-PDF/tree/main#login-authentication) for documentation)
|
||||||
|
|
||||||
|
|
||||||
|
## **PDF Features**
|
||||||
|
|
||||||
|
### **Page Operations**
|
||||||
|
- Full interactive GUI for merging/splitting/rotating/moving PDFs and their pages.
|
||||||
|
- Merge multiple PDFs together into a single resultant file.
|
||||||
|
- Split PDFs into multiple files at specified page numbers or extract all pages as individual files.
|
||||||
|
- Reorganize PDF pages into different orders.
|
||||||
|
- Rotate PDFs in 90-degree increments.
|
||||||
|
- Remove pages.
|
||||||
|
- Multi-page layout (Format PDFs into a multi-paged page).
|
||||||
|
- Scale page contents size by set %.
|
||||||
|
- Adjust Contrast.
|
||||||
|
- Crop PDF.
|
||||||
|
- Auto Split PDF (With physically scanned page dividers).
|
||||||
|
- Extract page(s).
|
||||||
|
- Convert PDF to a single page.
|
||||||
|
|
||||||
|
### **Conversion Operations**
|
||||||
|
- Convert PDFs to and from images.
|
||||||
|
- Convert any common file to PDF (using LibreOffice).
|
||||||
|
- Convert PDF to Word/Powerpoint/Others (using LibreOffice).
|
||||||
|
- Convert HTML to PDF.
|
||||||
|
- URL to PDF.
|
||||||
|
- Markdown to PDF.
|
||||||
|
|
||||||
|
### **Security & Permissions**
|
||||||
|
- Add and remove passwords.
|
||||||
|
- Change/set PDF Permissions.
|
||||||
|
- Add watermark(s).
|
||||||
|
- Certify/sign PDFs.
|
||||||
|
- Sanitize PDFs.
|
||||||
|
- Auto-redact text.
|
||||||
|
|
||||||
|
### **Other Operations**
|
||||||
|
- Add/Generate/Write signatures.
|
||||||
|
- Repair PDFs.
|
||||||
|
- Detect and remove blank pages.
|
||||||
|
- Compare 2 PDFs and show differences in text.
|
||||||
|
- Add images to PDFs.
|
||||||
|
- Compress PDFs to decrease their filesize (Using OCRMyPDF).
|
||||||
|
- Extract images from PDF.
|
||||||
|
- Extract images from Scans.
|
||||||
|
- Add page numbers.
|
||||||
|
- Auto rename file by detecting PDF header text.
|
||||||
|
- OCR on PDF (Using OCRMyPDF).
|
||||||
|
- PDF/A conversion (Using OCRMyPDF).
|
||||||
|
- Edit metadata.
|
||||||
|
- Flatten PDFs.
|
||||||
|
- Get all information on a PDF to view or export as JSON.
|
||||||
|
|
||||||
|
|
||||||
For a overview of the tasks and the technology each uses please view [groups.md](https://github.com/Frooodle/Stirling-PDF/blob/main/Groups.md)
|
For a overview of the tasks and the technology each uses please view [groups.md](https://github.com/Frooodle/Stirling-PDF/blob/main/Groups.md)
|
||||||
Hosted instance/demo of the app can be seen [here](https://pdf.adminforge.de/) hosted by the team at adminforge.de
|
Hosted instance/demo of the app can be seen [here](https://pdf.adminforge.de/) hosted by the team at adminforge.de
|
||||||
|
@ -94,6 +115,7 @@ docker run -d \
|
||||||
-p 8080:8080 \
|
-p 8080:8080 \
|
||||||
-v /location/of/trainingData:/usr/share/tesseract-ocr/4.00/tessdata \
|
-v /location/of/trainingData:/usr/share/tesseract-ocr/4.00/tessdata \
|
||||||
-v /location/of/extraConfigs:/configs \
|
-v /location/of/extraConfigs:/configs \
|
||||||
|
-e DOCKER_ENABLE_SECURITY=false \
|
||||||
--name stirling-pdf \
|
--name stirling-pdf \
|
||||||
frooodle/s-pdf:latest
|
frooodle/s-pdf:latest
|
||||||
|
|
||||||
|
@ -114,7 +136,8 @@ services:
|
||||||
- /location/of/trainingData:/usr/share/tesseract-ocr/4.00/tessdata #Required for extra OCR languages
|
- /location/of/trainingData:/usr/share/tesseract-ocr/4.00/tessdata #Required for extra OCR languages
|
||||||
- /location/of/extraConfigs:/configs
|
- /location/of/extraConfigs:/configs
|
||||||
# - /location/of/customFiles:/customFiles/
|
# - /location/of/customFiles:/customFiles/
|
||||||
|
environment:
|
||||||
|
- DOCKER_ENABLE_SECURITY=false
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
|
@ -122,8 +145,9 @@ services:
|
||||||
Please view https://github.com/Frooodle/Stirling-PDF/blob/main/HowToUseOCR.md
|
Please view https://github.com/Frooodle/Stirling-PDF/blob/main/HowToUseOCR.md
|
||||||
|
|
||||||
## Want to add your own language?
|
## Want to add your own language?
|
||||||
Stirling PDF currently supports 16!
|
Stirling PDF currently supports 18!
|
||||||
- English (English) (en_GB)
|
- English (English) (en_GB)
|
||||||
|
- English (US) (en_US)
|
||||||
- Arabic (العربية) (ar_AR)
|
- Arabic (العربية) (ar_AR)
|
||||||
- German (Deutsch) (de_DE)
|
- German (Deutsch) (de_DE)
|
||||||
- French (Français) (fr_FR)
|
- French (Français) (fr_FR)
|
||||||
|
@ -139,6 +163,7 @@ Stirling PDF currently supports 16!
|
||||||
- Russian (Русский) (ru_RU)
|
- Russian (Русский) (ru_RU)
|
||||||
- Basque (Euskara) (eu_ES)
|
- Basque (Euskara) (eu_ES)
|
||||||
- Japanese (日本語) (ja_JP)
|
- Japanese (日本語) (ja_JP)
|
||||||
|
- Dutch (Nederlands) (nl_NL)
|
||||||
|
|
||||||
If you want to add your own language to Stirling-PDF please refer
|
If you want to add your own language to Stirling-PDF please refer
|
||||||
https://github.com/Frooodle/Stirling-PDF/blob/main/HowToAddNewLanguage.md
|
https://github.com/Frooodle/Stirling-PDF/blob/main/HowToAddNewLanguage.md
|
||||||
|
@ -173,9 +198,6 @@ The Current list of settings is
|
||||||
```
|
```
|
||||||
security:
|
security:
|
||||||
enableLogin: false # set to 'true' to enable login
|
enableLogin: false # set to 'true' to enable login
|
||||||
initialLogin:
|
|
||||||
username: 'username' # Specify the initial username for first boot (e.g. 'admin')
|
|
||||||
password: 'password' # Specify the initial password for first boot (e.g. 'password123')
|
|
||||||
csrfDisabled: true
|
csrfDisabled: true
|
||||||
|
|
||||||
system:
|
system:
|
||||||
|
@ -193,7 +215,7 @@ endpoints:
|
||||||
groupsToRemove: [] # List groups to disable (e.g. ['LibreOffice'])
|
groupsToRemove: [] # List groups to disable (e.g. ['LibreOffice'])
|
||||||
|
|
||||||
metrics:
|
metrics:
|
||||||
enabled: true # 'true' to enable Info APIs (`/api/*`) endpoints, 'false' to disable
|
enabled: true # 'true' to enable Info APIs endpoints (view http://localhost:8080/swagger-ui/index.html#/API to learn more), 'false' to disable
|
||||||
```
|
```
|
||||||
### Extra notes
|
### Extra notes
|
||||||
- Endpoints. Currently, the endpoints ENDPOINTS_TO_REMOVE and GROUPS_TO_REMOVE can include comma separate lists of endpoints and groups to disable as example ENDPOINTS_TO_REMOVE=img-to-pdf,remove-pages would disable both image-to-pdf and remove pages, GROUPS_TO_REMOVE=LibreOffice Would disable all things that use LibreOffice. You can see a list of all endpoints and groups [here](https://github.com/Frooodle/Stirling-PDF/blob/main/groups.md)
|
- Endpoints. Currently, the endpoints ENDPOINTS_TO_REMOVE and GROUPS_TO_REMOVE can include comma separate lists of endpoints and groups to disable as example ENDPOINTS_TO_REMOVE=img-to-pdf,remove-pages would disable both image-to-pdf and remove pages, GROUPS_TO_REMOVE=LibreOffice Would disable all things that use LibreOffice. You can see a list of all endpoints and groups [here](https://github.com/Frooodle/Stirling-PDF/blob/main/groups.md)
|
||||||
|
@ -213,11 +235,11 @@ For those wanting to use Stirling-PDFs backend API to link with their own custom
|
||||||
### Prerequisites:
|
### Prerequisites:
|
||||||
- User must have the folder ./configs volumed within docker so that it is retained during updates.
|
- User must have the folder ./configs volumed within docker so that it is retained during updates.
|
||||||
- Docker uses must download the security jar version by setting ``DOCKER_ENABLE_SECURITY`` to ``true`` in environment variables.
|
- Docker uses must download the security jar version by setting ``DOCKER_ENABLE_SECURITY`` to ``true`` in environment variables.
|
||||||
- Now the initial user must be generated. Navigate to your settings.yaml and configure your security settings along with the username and password (only required on the first boot to create the initial user, ignored after.). Alternatively, you can set these via the environment variables ``SECURITY_ENABLELOGIN : true`` ``SECURITY_INITIALLOGIN_USERNAME: username`` ``SECURITY_INITIALLOGIN_PASSWORD: password``
|
- Now the initial user will be generated with username ``admin`` and password ``stirling``. On login you will be forced to change the password to a new one.
|
||||||
|
|
||||||
Once the above has been done, on restart, a new stirling-pdf-DB.mv.db will show if everything worked.
|
Once the above has been done, on restart, a new stirling-pdf-DB.mv.db will show if everything worked.
|
||||||
|
|
||||||
When you login to Stirling PDF you will be redirected to /login page to login with those credentials. After login everything should function as normal
|
When you login to Stirling PDF you will be redirected to /login page to login with those default credentials. After login everything should function as normal
|
||||||
|
|
||||||
To access your account settings go to Account settings in the settings cog menu (top right in navbar) This Account settings menu is also where you find your API key.
|
To access your account settings go to Account settings in the settings cog menu (top right in navbar) This Account settings menu is also where you find your API key.
|
||||||
|
|
||||||
|
@ -232,7 +254,7 @@ For API usage you must provide a header with 'X-API-Key' and the associated API
|
||||||
- Progress bar/Tracking
|
- Progress bar/Tracking
|
||||||
- Full custom logic pipelines to combine multiple operations together.
|
- Full custom logic pipelines to combine multiple operations together.
|
||||||
- Folder support with auto scanning to perform operations on
|
- Folder support with auto scanning to perform operations on
|
||||||
- Redact text (Via UI)
|
- Redact text (Via UI not just automated way)
|
||||||
- Add Forms
|
- Add Forms
|
||||||
- Annotations
|
- Annotations
|
||||||
- Multi page layout (Stich PDF pages together) support x rows y columns and custom page sizing
|
- Multi page layout (Stich PDF pages together) support x rows y columns and custom page sizing
|
||||||
|
|
|
@ -8,7 +8,7 @@ plugins {
|
||||||
}
|
}
|
||||||
|
|
||||||
group = 'stirling.software'
|
group = 'stirling.software'
|
||||||
version = '0.13.1'
|
version = '0.14.0'
|
||||||
sourceCompatibility = '17'
|
sourceCompatibility = '17'
|
||||||
|
|
||||||
repositories {
|
repositories {
|
||||||
|
@ -98,6 +98,8 @@ dependencies {
|
||||||
implementation 'com.github.vladimir-bukhtoyarov:bucket4j-core:7.6.0'
|
implementation 'com.github.vladimir-bukhtoyarov:bucket4j-core:7.6.0'
|
||||||
|
|
||||||
developmentOnly("org.springframework.boot:spring-boot-devtools")
|
developmentOnly("org.springframework.boot:spring-boot-devtools")
|
||||||
|
compileOnly 'org.projectlombok:lombok:1.18.28'
|
||||||
|
annotationProcessor 'org.projectlombok:lombok:1.18.28'
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -22,7 +22,6 @@ public class CleanUrlInterceptor implements HandlerInterceptor {
|
||||||
String queryString = request.getQueryString();
|
String queryString = request.getQueryString();
|
||||||
if (queryString != null && !queryString.isEmpty()) {
|
if (queryString != null && !queryString.isEmpty()) {
|
||||||
String requestURI = request.getRequestURI();
|
String requestURI = request.getRequestURI();
|
||||||
|
|
||||||
Map<String, String> parameters = new HashMap<>();
|
Map<String, String> parameters = new HashMap<>();
|
||||||
|
|
||||||
// Keep only the allowed parameters
|
// Keep only the allowed parameters
|
||||||
|
|
|
@ -13,18 +13,18 @@ import org.apache.pdfbox.pdmodel.graphics.form.PDFormXObject;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
import org.springframework.http.ResponseEntity;
|
import org.springframework.http.ResponseEntity;
|
||||||
|
import org.springframework.web.bind.annotation.ModelAttribute;
|
||||||
import org.springframework.web.bind.annotation.PostMapping;
|
import org.springframework.web.bind.annotation.PostMapping;
|
||||||
import org.springframework.web.bind.annotation.RequestParam;
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
import org.springframework.web.bind.annotation.RestController;
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
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.media.Schema;
|
|
||||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||||
|
import stirling.software.SPDF.model.api.general.CropPdfForm;
|
||||||
import stirling.software.SPDF.utils.WebResponseUtils;
|
import stirling.software.SPDF.utils.WebResponseUtils;
|
||||||
|
|
||||||
@RestController
|
@RestController
|
||||||
|
@RequestMapping("/api/v1/general")
|
||||||
@Tag(name = "General", description = "General APIs")
|
@Tag(name = "General", description = "General APIs")
|
||||||
public class CropController {
|
public class CropController {
|
||||||
|
|
||||||
|
@ -32,18 +32,13 @@ public class CropController {
|
||||||
|
|
||||||
@PostMapping(value = "/crop", consumes = "multipart/form-data")
|
@PostMapping(value = "/crop", consumes = "multipart/form-data")
|
||||||
@Operation(summary = "Crops a PDF document", description = "This operation takes an input PDF file and crops it according to the given coordinates. Input:PDF Output:PDF Type:SISO")
|
@Operation(summary = "Crops a PDF document", description = "This operation takes an input PDF file and crops it according to the given coordinates. Input:PDF Output:PDF Type:SISO")
|
||||||
public ResponseEntity<byte[]> cropPdf(
|
public ResponseEntity<byte[]> cropPdf(@ModelAttribute CropPdfForm form)
|
||||||
@Parameter(description = "The input PDF file", required = true) @RequestParam("fileInput") MultipartFile file,
|
|
||||||
@Parameter(description = "The x-coordinate of the top-left corner of the crop area", required = true, schema = @Schema(type = "number")) @RequestParam("x") float x,
|
|
||||||
@Parameter(description = "The y-coordinate of the top-left corner of the crop area", required = true, schema = @Schema(type = "number")) @RequestParam("y") float y,
|
|
||||||
@Parameter(description = "The width of the crop area", required = true, schema = @Schema(type = "number")) @RequestParam("width") float width,
|
|
||||||
@Parameter(description = "The height of the crop area", required = true, schema = @Schema(type = "number")) @RequestParam("height") float height)
|
|
||||||
throws IOException {
|
throws IOException {
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
PDDocument sourceDocument = PDDocument.load(new ByteArrayInputStream(form.getFileInput().getBytes()));
|
||||||
PDDocument sourceDocument = PDDocument.load(new ByteArrayInputStream(file.getBytes()));
|
|
||||||
|
|
||||||
PDDocument newDocument = new PDDocument();
|
PDDocument newDocument = new PDDocument();
|
||||||
|
|
||||||
|
@ -65,7 +60,7 @@ for (int i = 0; i < totalPages; i++) {
|
||||||
contentStream.saveGraphicsState();
|
contentStream.saveGraphicsState();
|
||||||
|
|
||||||
// Define the crop area
|
// Define the crop area
|
||||||
contentStream.addRect(x, y, width, height);
|
contentStream.addRect(form.getX(), form.getY(), form.getWidth(), form.getHeight());
|
||||||
contentStream.clip();
|
contentStream.clip();
|
||||||
|
|
||||||
// Draw the entire formXObject
|
// Draw the entire formXObject
|
||||||
|
@ -76,7 +71,7 @@ for (int i = 0; i < totalPages; i++) {
|
||||||
contentStream.close();
|
contentStream.close();
|
||||||
|
|
||||||
// Now, set the new page's media box to the cropped size
|
// Now, set the new page's media box to the cropped size
|
||||||
newPage.setMediaBox(new PDRectangle(x, y, width, height));
|
newPage.setMediaBox(new PDRectangle(form.getX(), form.getY(), form.getWidth(), form.getHeight()));
|
||||||
}
|
}
|
||||||
|
|
||||||
ByteArrayOutputStream baos = new ByteArrayOutputStream();
|
ByteArrayOutputStream baos = new ByteArrayOutputStream();
|
||||||
|
@ -85,7 +80,7 @@ newDocument.close();
|
||||||
sourceDocument.close();
|
sourceDocument.close();
|
||||||
|
|
||||||
byte[] pdfContent = baos.toByteArray();
|
byte[] pdfContent = baos.toByteArray();
|
||||||
return WebResponseUtils.bytesToWebResponse(pdfContent, file.getOriginalFilename().replaceFirst("[.][^.]+$", "") + "_cropped.pdf");
|
return WebResponseUtils.bytesToWebResponse(pdfContent, form.getFileInput().getOriginalFilename().replaceFirst("[.][^.]+$", "") + "_cropped.pdf");
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -15,19 +15,19 @@ import org.apache.pdfbox.pdmodel.PDPage;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
import org.springframework.http.ResponseEntity;
|
import org.springframework.http.ResponseEntity;
|
||||||
|
import org.springframework.web.bind.annotation.ModelAttribute;
|
||||||
import org.springframework.web.bind.annotation.PostMapping;
|
import org.springframework.web.bind.annotation.PostMapping;
|
||||||
import org.springframework.web.bind.annotation.RequestParam;
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
import org.springframework.web.bind.annotation.RequestPart;
|
|
||||||
import org.springframework.web.bind.annotation.RestController;
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
import org.springframework.web.multipart.MultipartFile;
|
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.media.Schema;
|
|
||||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||||
|
import stirling.software.SPDF.model.api.general.MergePdfsRequest;
|
||||||
import stirling.software.SPDF.utils.WebResponseUtils;
|
import stirling.software.SPDF.utils.WebResponseUtils;
|
||||||
|
|
||||||
@RestController
|
@RestController
|
||||||
|
@RequestMapping("/api/v1/general")
|
||||||
@Tag(name = "General", description = "General APIs")
|
@Tag(name = "General", description = "General APIs")
|
||||||
public class MergeController {
|
public class MergeController {
|
||||||
|
|
||||||
|
@ -88,20 +88,10 @@ private Comparator<MultipartFile> getSortComparator(String sortType) {
|
||||||
@PostMapping(consumes = "multipart/form-data", value = "/merge-pdfs")
|
@PostMapping(consumes = "multipart/form-data", value = "/merge-pdfs")
|
||||||
@Operation(summary = "Merge multiple PDF files into one",
|
@Operation(summary = "Merge multiple PDF files into one",
|
||||||
description = "This endpoint merges multiple PDF files into a single PDF file. The merged file will contain all pages from the input files in the order they were provided. Input:PDF Output:PDF Type:MISO")
|
description = "This endpoint merges multiple PDF files into a single PDF file. The merged file will contain all pages from the input files in the order they were provided. Input:PDF Output:PDF Type:MISO")
|
||||||
public ResponseEntity<byte[]> mergePdfs(
|
public ResponseEntity<byte[]> mergePdfs(@ModelAttribute MergePdfsRequest form) throws IOException {
|
||||||
@RequestPart(required = true, value = "fileInput") MultipartFile[] files,
|
|
||||||
@RequestParam(value = "sortType", defaultValue = "orderProvided")
|
|
||||||
@Parameter(schema = @Schema(description = "The type of sorting to be applied on the input files before merging.",
|
|
||||||
allowableValues = {
|
|
||||||
"orderProvided",
|
|
||||||
"byFileName",
|
|
||||||
"byDateModified",
|
|
||||||
"byDateCreated",
|
|
||||||
"byPDFTitle"
|
|
||||||
}))
|
|
||||||
String sortType) throws IOException {
|
|
||||||
|
|
||||||
Arrays.sort(files, getSortComparator(sortType));
|
MultipartFile[] files = form.getFileInput();
|
||||||
|
Arrays.sort(files, getSortComparator(form.getSortType()));
|
||||||
|
|
||||||
List<PDDocument> documents = new ArrayList<>();
|
List<PDDocument> documents = new ArrayList<>();
|
||||||
for (MultipartFile file : files) {
|
for (MultipartFile file : files) {
|
||||||
|
|
|
@ -14,18 +14,19 @@ import org.apache.pdfbox.util.Matrix;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
import org.springframework.http.ResponseEntity;
|
import org.springframework.http.ResponseEntity;
|
||||||
|
import org.springframework.web.bind.annotation.ModelAttribute;
|
||||||
import org.springframework.web.bind.annotation.PostMapping;
|
import org.springframework.web.bind.annotation.PostMapping;
|
||||||
import org.springframework.web.bind.annotation.RequestParam;
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
import org.springframework.web.bind.annotation.RestController;
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
import org.springframework.web.multipart.MultipartFile;
|
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.media.Schema;
|
|
||||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||||
|
import stirling.software.SPDF.model.api.general.MergeMultiplePagesRequest;
|
||||||
import stirling.software.SPDF.utils.WebResponseUtils;
|
import stirling.software.SPDF.utils.WebResponseUtils;
|
||||||
|
|
||||||
@RestController
|
@RestController
|
||||||
|
@RequestMapping("/api/v1/general")
|
||||||
@Tag(name = "General", description = "General APIs")
|
@Tag(name = "General", description = "General APIs")
|
||||||
public class MultiPageLayoutController {
|
public class MultiPageLayoutController {
|
||||||
|
|
||||||
|
@ -36,66 +37,71 @@ public class MultiPageLayoutController {
|
||||||
summary = "Merge multiple pages of a PDF document into a single page",
|
summary = "Merge multiple pages of a PDF document into a single page",
|
||||||
description = "This operation takes an input PDF file and the number of pages to merge into a single sheet in the output PDF file. Input:PDF Output:PDF Type:SISO"
|
description = "This operation takes an input PDF file and the number of pages to merge into a single sheet in the output PDF file. Input:PDF Output:PDF Type:SISO"
|
||||||
)
|
)
|
||||||
public ResponseEntity<byte[]> mergeMultiplePagesIntoOne(
|
public ResponseEntity<byte[]> mergeMultiplePagesIntoOne(@ModelAttribute MergeMultiplePagesRequest request)
|
||||||
@Parameter(description = "The input PDF file", required = true) @RequestParam("fileInput") MultipartFile file,
|
|
||||||
@Parameter(description = "The number of pages to fit onto a single sheet in the output PDF. Acceptable values are 2, 3, 4, 9, 16.", required = true, schema = @Schema(type = "integer", allowableValues = {
|
|
||||||
"2", "3", "4", "9", "16" })) @RequestParam("pagesPerSheet") int pagesPerSheet)
|
|
||||||
throws IOException {
|
throws IOException {
|
||||||
|
|
||||||
if (pagesPerSheet != 2 && pagesPerSheet != 3 && pagesPerSheet != (int) Math.sqrt(pagesPerSheet) * Math.sqrt(pagesPerSheet)) {
|
int pagesPerSheet = request.getPagesPerSheet();
|
||||||
throw new IllegalArgumentException("pagesPerSheet must be 2, 3 or a perfect square");
|
MultipartFile file = request.getFileInput();
|
||||||
}
|
|
||||||
|
|
||||||
int cols = pagesPerSheet == 2 || pagesPerSheet == 3 ? pagesPerSheet : (int) Math.sqrt(pagesPerSheet);
|
if (pagesPerSheet != 2 && pagesPerSheet != 3 && pagesPerSheet != (int) Math.sqrt(pagesPerSheet) * Math.sqrt(pagesPerSheet)) {
|
||||||
int rows = pagesPerSheet == 2 || pagesPerSheet == 3 ? 1 : (int) Math.sqrt(pagesPerSheet);
|
throw new IllegalArgumentException("pagesPerSheet must be 2, 3 or a perfect square");
|
||||||
|
}
|
||||||
|
|
||||||
PDDocument sourceDocument = PDDocument.load(file.getInputStream());
|
int cols = pagesPerSheet == 2 || pagesPerSheet == 3 ? pagesPerSheet : (int) Math.sqrt(pagesPerSheet);
|
||||||
PDDocument newDocument = new PDDocument();
|
int rows = pagesPerSheet == 2 || pagesPerSheet == 3 ? 1 : (int) Math.sqrt(pagesPerSheet);
|
||||||
PDPage newPage = new PDPage(PDRectangle.A4);
|
|
||||||
newDocument.addPage(newPage);
|
|
||||||
|
|
||||||
int totalPages = sourceDocument.getNumberOfPages();
|
PDDocument sourceDocument = PDDocument.load(file.getInputStream());
|
||||||
float cellWidth = newPage.getMediaBox().getWidth() / cols;
|
PDDocument newDocument = new PDDocument();
|
||||||
float cellHeight = newPage.getMediaBox().getHeight() / rows;
|
PDPage newPage = new PDPage(PDRectangle.A4);
|
||||||
|
newDocument.addPage(newPage);
|
||||||
|
|
||||||
PDPageContentStream contentStream = new PDPageContentStream(newDocument, newPage, PDPageContentStream.AppendMode.APPEND, true, true);
|
int totalPages = sourceDocument.getNumberOfPages();
|
||||||
|
float cellWidth = newPage.getMediaBox().getWidth() / cols;
|
||||||
|
float cellHeight = newPage.getMediaBox().getHeight() / rows;
|
||||||
|
|
||||||
LayerUtility layerUtility = new LayerUtility(newDocument);
|
PDPageContentStream contentStream = new PDPageContentStream(newDocument, newPage, PDPageContentStream.AppendMode.APPEND, true, true);
|
||||||
|
LayerUtility layerUtility = new LayerUtility(newDocument);
|
||||||
|
|
||||||
for (int i = 0; i < totalPages; i++) {
|
for (int i = 0; i < totalPages; i++) {
|
||||||
PDPage sourcePage = sourceDocument.getPage(i);
|
if (i != 0 && i % pagesPerSheet == 0) {
|
||||||
System.out.println("Reading page " + (i+1));
|
// Close the current content stream and create a new page and content stream
|
||||||
PDRectangle rect = sourcePage.getMediaBox();
|
contentStream.close();
|
||||||
float scaleWidth = cellWidth / rect.getWidth();
|
newPage = new PDPage(PDRectangle.A4);
|
||||||
float scaleHeight = cellHeight / rect.getHeight();
|
newDocument.addPage(newPage);
|
||||||
float scale = Math.min(scaleWidth, scaleHeight);
|
contentStream = new PDPageContentStream(newDocument, newPage, PDPageContentStream.AppendMode.APPEND, true, true);
|
||||||
System.out.println("Scale for page " + (i+1) + ": " + scale);
|
}
|
||||||
|
|
||||||
|
PDPage sourcePage = sourceDocument.getPage(i);
|
||||||
|
PDRectangle rect = sourcePage.getMediaBox();
|
||||||
|
float scaleWidth = cellWidth / rect.getWidth();
|
||||||
|
float scaleHeight = cellHeight / rect.getHeight();
|
||||||
|
float scale = Math.min(scaleWidth, scaleHeight);
|
||||||
|
|
||||||
|
int adjustedPageIndex = i % pagesPerSheet; // This will reset the index for every new page
|
||||||
|
int rowIndex = adjustedPageIndex / cols;
|
||||||
|
int colIndex = adjustedPageIndex % cols;
|
||||||
|
|
||||||
|
float x = colIndex * cellWidth + (cellWidth - rect.getWidth() * scale) / 2;
|
||||||
|
float y = newPage.getMediaBox().getHeight() - ((rowIndex + 1) * cellHeight - (cellHeight - rect.getHeight() * scale) / 2);
|
||||||
|
|
||||||
|
contentStream.saveGraphicsState();
|
||||||
|
contentStream.transform(Matrix.getTranslateInstance(x, y));
|
||||||
|
contentStream.transform(Matrix.getScaleInstance(scale, scale));
|
||||||
|
|
||||||
|
PDFormXObject formXObject = layerUtility.importPageAsForm(sourceDocument, i);
|
||||||
|
contentStream.drawForm(formXObject);
|
||||||
|
|
||||||
|
contentStream.restoreGraphicsState();
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
int rowIndex = i / cols;
|
contentStream.close(); // Close the final content stream
|
||||||
int colIndex = i % cols;
|
sourceDocument.close();
|
||||||
|
|
||||||
float x = colIndex * cellWidth + (cellWidth - rect.getWidth() * scale) / 2;
|
ByteArrayOutputStream baos = new ByteArrayOutputStream();
|
||||||
float y = newPage.getMediaBox().getHeight() - ((rowIndex + 1) * cellHeight - (cellHeight - rect.getHeight() * scale) / 2);
|
newDocument.save(baos);
|
||||||
|
newDocument.close();
|
||||||
|
|
||||||
contentStream.saveGraphicsState();
|
|
||||||
contentStream.transform(Matrix.getTranslateInstance(x, y));
|
|
||||||
contentStream.transform(Matrix.getScaleInstance(scale, scale));
|
|
||||||
|
|
||||||
PDFormXObject formXObject = layerUtility.importPageAsForm(sourceDocument, i);
|
|
||||||
contentStream.drawForm(formXObject);
|
|
||||||
|
|
||||||
contentStream.restoreGraphicsState();
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
contentStream.close();
|
|
||||||
sourceDocument.close();
|
|
||||||
|
|
||||||
ByteArrayOutputStream baos = new ByteArrayOutputStream();
|
|
||||||
newDocument.save(baos);
|
|
||||||
newDocument.close();
|
|
||||||
|
|
||||||
byte[] result = baos.toByteArray();
|
byte[] result = baos.toByteArray();
|
||||||
return WebResponseUtils.bytesToWebResponse(result, file.getOriginalFilename().replaceFirst("[.][^.]+$", "") + "_layoutChanged.pdf");
|
return WebResponseUtils.bytesToWebResponse(result, file.getOriginalFilename().replaceFirst("[.][^.]+$", "") + "_layoutChanged.pdf");
|
||||||
}
|
}
|
||||||
|
|
|
@ -9,7 +9,9 @@ import org.apache.pdfbox.pdmodel.PDPage;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
import org.springframework.http.ResponseEntity;
|
import org.springframework.http.ResponseEntity;
|
||||||
|
import org.springframework.web.bind.annotation.ModelAttribute;
|
||||||
import org.springframework.web.bind.annotation.PostMapping;
|
import org.springframework.web.bind.annotation.PostMapping;
|
||||||
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
import org.springframework.web.bind.annotation.RequestParam;
|
import org.springframework.web.bind.annotation.RequestParam;
|
||||||
import org.springframework.web.bind.annotation.RequestPart;
|
import org.springframework.web.bind.annotation.RequestPart;
|
||||||
import org.springframework.web.bind.annotation.RestController;
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
|
@ -17,12 +19,13 @@ 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 io.swagger.v3.oas.annotations.media.Schema;
|
|
||||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||||
|
import stirling.software.SPDF.model.SortTypes;
|
||||||
|
import stirling.software.SPDF.model.api.general.RearrangePagesRequest;
|
||||||
import stirling.software.SPDF.utils.GeneralUtils;
|
import stirling.software.SPDF.utils.GeneralUtils;
|
||||||
import stirling.software.SPDF.utils.WebResponseUtils;
|
import stirling.software.SPDF.utils.WebResponseUtils;
|
||||||
|
|
||||||
@RestController
|
@RestController
|
||||||
|
@RequestMapping("/api/v1/general")
|
||||||
@Tag(name = "General", description = "General APIs")
|
@Tag(name = "General", description = "General APIs")
|
||||||
public class RearrangePagesPDFController {
|
public class RearrangePagesPDFController {
|
||||||
|
|
||||||
|
@ -51,9 +54,7 @@ public class RearrangePagesPDFController {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private enum CustomMode {
|
|
||||||
REVERSE_ORDER, DUPLEX_SORT, BOOKLET_SORT, SIDE_STITCH_BOOKLET_SORT, ODD_EVEN_SPLIT, REMOVE_FIRST, REMOVE_LAST, REMOVE_FIRST_AND_LAST,
|
|
||||||
}
|
|
||||||
|
|
||||||
private List<Integer> removeFirst(int totalPages) {
|
private List<Integer> removeFirst(int totalPages) {
|
||||||
if (totalPages <= 1)
|
if (totalPages <= 1)
|
||||||
|
@ -137,9 +138,9 @@ public class RearrangePagesPDFController {
|
||||||
return newPageOrder;
|
return newPageOrder;
|
||||||
}
|
}
|
||||||
|
|
||||||
private List<Integer> processCustomMode(String customMode, int totalPages) {
|
private List<Integer> processSortTypes(String sortTypes, int totalPages) {
|
||||||
try {
|
try {
|
||||||
CustomMode mode = CustomMode.valueOf(customMode.toUpperCase());
|
SortTypes mode = SortTypes.valueOf(sortTypes.toUpperCase());
|
||||||
switch (mode) {
|
switch (mode) {
|
||||||
case REVERSE_ORDER:
|
case REVERSE_ORDER:
|
||||||
return reverseOrder(totalPages);
|
return reverseOrder(totalPages);
|
||||||
|
@ -168,16 +169,10 @@ public class RearrangePagesPDFController {
|
||||||
|
|
||||||
@PostMapping(consumes = "multipart/form-data", value = "/rearrange-pages")
|
@PostMapping(consumes = "multipart/form-data", value = "/rearrange-pages")
|
||||||
@Operation(summary = "Rearrange pages in a PDF file", description = "This endpoint rearranges pages in a given PDF file based on the specified page order or custom mode. Users can provide a page order as a comma-separated list of page numbers or page ranges, or a custom mode. Input:PDF Output:PDF")
|
@Operation(summary = "Rearrange pages in a PDF file", description = "This endpoint rearranges pages in a given PDF file based on the specified page order or custom mode. Users can provide a page order as a comma-separated list of page numbers or page ranges, or a custom mode. Input:PDF Output:PDF")
|
||||||
public ResponseEntity<byte[]> rearrangePages(
|
public ResponseEntity<byte[]> rearrangePages(@ModelAttribute RearrangePagesRequest request) throws IOException {
|
||||||
@RequestPart(required = true, value = "fileInput") @Parameter(description = "The input PDF file to rearrange pages") MultipartFile pdfFile,
|
MultipartFile pdfFile = request.getFileInput();
|
||||||
@RequestParam(required = false, value = "pageOrder") @Parameter(description = "The new page order as a comma-separated list of page numbers, page ranges (e.g., '1,3,5-7'), or functions in the format 'an+b' where 'a' is the multiplier of the page number 'n', and 'b' is a constant (e.g., '2n+1', '3n', '6n-5')") String pageOrder,
|
String pageOrder = request.getPageNumbers();
|
||||||
@RequestParam(required = false, value = "customMode") @Parameter(schema = @Schema(implementation = CustomMode.class, description = "The custom mode for page rearrangement. "
|
String sortType = request.getCustomMode();
|
||||||
+ "Valid values are:\n" + "REVERSE_ORDER: Reverses the order of all pages.\n"
|
|
||||||
+ "DUPLEX_SORT: Sorts pages as if all fronts were scanned then all backs in reverse (1, n, 2, n-1, ...). "
|
|
||||||
+ "BOOKLET_SORT: Arranges pages for booklet printing (last, first, second, second last, ...).\n"
|
|
||||||
+ "ODD_EVEN_SPLIT: Splits and arranges pages into odd and even numbered pages.\n"
|
|
||||||
+ "REMOVE_FIRST: Removes the first page.\n" + "REMOVE_LAST: Removes the last page.\n"
|
|
||||||
+ "REMOVE_FIRST_AND_LAST: Removes both the first and the last pages.\n")) String customMode) {
|
|
||||||
try {
|
try {
|
||||||
// Load the input PDF
|
// Load the input PDF
|
||||||
PDDocument document = PDDocument.load(pdfFile.getInputStream());
|
PDDocument document = PDDocument.load(pdfFile.getInputStream());
|
||||||
|
@ -185,15 +180,14 @@ public class RearrangePagesPDFController {
|
||||||
// Split the page order string into an array of page numbers or range of numbers
|
// Split the page order string into an array of page numbers or range of numbers
|
||||||
String[] pageOrderArr = pageOrder != null ? pageOrder.split(",") : new String[0];
|
String[] pageOrderArr = pageOrder != null ? pageOrder.split(",") : new String[0];
|
||||||
int totalPages = document.getNumberOfPages();
|
int totalPages = document.getNumberOfPages();
|
||||||
System.out.println("pageOrder=" + pageOrder);
|
|
||||||
System.out.println("customMode length =" + customMode.length());
|
|
||||||
List<Integer> newPageOrder;
|
List<Integer> newPageOrder;
|
||||||
if (customMode != null && customMode.length() > 0) {
|
if (sortType != null && sortType.length() > 0) {
|
||||||
newPageOrder = processCustomMode(customMode, totalPages);
|
newPageOrder = processSortTypes(sortType, totalPages);
|
||||||
} else {
|
} else {
|
||||||
newPageOrder = GeneralUtils.parsePageList(pageOrderArr, totalPages);
|
newPageOrder = GeneralUtils.parsePageList(pageOrderArr, totalPages);
|
||||||
}
|
}
|
||||||
|
logger.info("newPageOrder = " +newPageOrder);
|
||||||
|
logger.info("totalPages = " +totalPages);
|
||||||
// Create a new list to hold the pages in the new order
|
// Create a new list to hold the pages in the new order
|
||||||
List<PDPage> newPages = new ArrayList<>();
|
List<PDPage> newPages = new ArrayList<>();
|
||||||
for (int i = 0; i < newPageOrder.size(); i++) {
|
for (int i = 0; i < newPageOrder.size(); i++) {
|
||||||
|
|
|
@ -8,18 +8,19 @@ import org.apache.pdfbox.pdmodel.PDPageTree;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
import org.springframework.http.ResponseEntity;
|
import org.springframework.http.ResponseEntity;
|
||||||
|
import org.springframework.web.bind.annotation.ModelAttribute;
|
||||||
import org.springframework.web.bind.annotation.PostMapping;
|
import org.springframework.web.bind.annotation.PostMapping;
|
||||||
import org.springframework.web.bind.annotation.RequestParam;
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
import org.springframework.web.bind.annotation.RequestPart;
|
|
||||||
import org.springframework.web.bind.annotation.RestController;
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
import org.springframework.web.multipart.MultipartFile;
|
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.tags.Tag;
|
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||||
|
import stirling.software.SPDF.model.api.general.RotatePDFRequest;
|
||||||
import stirling.software.SPDF.utils.WebResponseUtils;
|
import stirling.software.SPDF.utils.WebResponseUtils;
|
||||||
|
|
||||||
@RestController
|
@RestController
|
||||||
|
@RequestMapping("/api/v1/general")
|
||||||
@Tag(name = "General", description = "General APIs")
|
@Tag(name = "General", description = "General APIs")
|
||||||
public class RotationController {
|
public class RotationController {
|
||||||
|
|
||||||
|
@ -31,13 +32,9 @@ public class RotationController {
|
||||||
description = "This endpoint rotates a given PDF file by a specified angle. The angle must be a multiple of 90. Input:PDF Output:PDF Type:SISO"
|
description = "This endpoint rotates a given PDF file by a specified angle. The angle must be a multiple of 90. Input:PDF Output:PDF Type:SISO"
|
||||||
)
|
)
|
||||||
public ResponseEntity<byte[]> rotatePDF(
|
public ResponseEntity<byte[]> rotatePDF(
|
||||||
@RequestPart(required = true, value = "fileInput")
|
@ModelAttribute RotatePDFRequest request) throws IOException {
|
||||||
@Parameter(description = "The PDF file to be rotated", required = true)
|
MultipartFile pdfFile = request.getFileInput();
|
||||||
MultipartFile pdfFile,
|
Integer angle = request.getAngle();
|
||||||
@RequestParam("angle")
|
|
||||||
@Parameter(description = "The angle by which to rotate the PDF file. This should be a multiple of 90.", example = "90", required = true)
|
|
||||||
Integer angle) throws IOException {
|
|
||||||
|
|
||||||
// Load the PDF document
|
// Load the PDF document
|
||||||
PDDocument document = PDDocument.load(pdfFile.getBytes());
|
PDDocument document = PDDocument.load(pdfFile.getBytes());
|
||||||
|
|
||||||
|
|
|
@ -15,17 +15,18 @@ import org.apache.pdfbox.util.Matrix;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
import org.springframework.http.ResponseEntity;
|
import org.springframework.http.ResponseEntity;
|
||||||
|
import org.springframework.web.bind.annotation.ModelAttribute;
|
||||||
import org.springframework.web.bind.annotation.PostMapping;
|
import org.springframework.web.bind.annotation.PostMapping;
|
||||||
import org.springframework.web.bind.annotation.RequestParam;
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
import org.springframework.web.bind.annotation.RestController;
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
import org.springframework.web.multipart.MultipartFile;
|
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.media.Schema;
|
|
||||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||||
|
import stirling.software.SPDF.model.api.general.ScalePagesRequest;
|
||||||
import stirling.software.SPDF.utils.WebResponseUtils;
|
import stirling.software.SPDF.utils.WebResponseUtils;
|
||||||
@RestController
|
@RestController
|
||||||
|
@RequestMapping("/api/v1/general")
|
||||||
@Tag(name = "General", description = "General APIs")
|
@Tag(name = "General", description = "General APIs")
|
||||||
public class ScalePagesController {
|
public class ScalePagesController {
|
||||||
|
|
||||||
|
@ -33,14 +34,10 @@ public class ScalePagesController {
|
||||||
|
|
||||||
@PostMapping(value = "/scale-pages", consumes = "multipart/form-data")
|
@PostMapping(value = "/scale-pages", consumes = "multipart/form-data")
|
||||||
@Operation(summary = "Change the size of a PDF page/document", description = "This operation takes an input PDF file and the size to scale the pages to in the output PDF file. Input:PDF Output:PDF Type:SISO")
|
@Operation(summary = "Change the size of a PDF page/document", description = "This operation takes an input PDF file and the size to scale the pages to in the output PDF file. Input:PDF Output:PDF Type:SISO")
|
||||||
public ResponseEntity<byte[]> scalePages(
|
public ResponseEntity<byte[]> scalePages(@ModelAttribute ScalePagesRequest request) throws IOException {
|
||||||
@Parameter(description = "The input PDF file", required = true) @RequestParam("fileInput") MultipartFile file,
|
MultipartFile file = request.getFileInput();
|
||||||
@Parameter(description = "The scale of pages in the output PDF. Acceptable values are A0-A10, B0-B9, LETTER, TABLOID, LEDGER, LEGAL, EXECUTIVE.", required = true, schema = @Schema(type = "string", allowableValues = {
|
String targetPDRectangle = request.getPageSize();
|
||||||
"A0", "A1", "A2", "A3", "A4", "A5", "A6", "A7", "A8", "A9", "A10", "B0", "B1", "B2", "B3", "B4",
|
float scaleFactor = request.getScaleFactor();
|
||||||
"B5", "B6", "B7", "B8", "B9", "LETTER", "TABLOID", "LEDGER", "LEGAL",
|
|
||||||
"EXECUTIVE" })) @RequestParam("pageSize") String targetPDRectangle,
|
|
||||||
@Parameter(description = "The scale of the content on the pages of the output PDF. Acceptable values are floats.", required = true, schema = @Schema(type = "integer")) @RequestParam("scaleFactor") float scaleFactor)
|
|
||||||
throws IOException {
|
|
||||||
|
|
||||||
Map<String, PDRectangle> sizeMap = new HashMap<>();
|
Map<String, PDRectangle> sizeMap = new HashMap<>();
|
||||||
// Add A0 - A10
|
// Add A0 - A10
|
||||||
|
|
|
@ -17,19 +17,19 @@ import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
import org.springframework.http.MediaType;
|
import org.springframework.http.MediaType;
|
||||||
import org.springframework.http.ResponseEntity;
|
import org.springframework.http.ResponseEntity;
|
||||||
|
import org.springframework.web.bind.annotation.ModelAttribute;
|
||||||
import org.springframework.web.bind.annotation.PostMapping;
|
import org.springframework.web.bind.annotation.PostMapping;
|
||||||
import org.springframework.web.bind.annotation.RequestParam;
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
import org.springframework.web.bind.annotation.RequestPart;
|
|
||||||
import org.springframework.web.bind.annotation.RestController;
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
import org.springframework.web.multipart.MultipartFile;
|
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.tags.Tag;
|
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||||
import stirling.software.SPDF.utils.GeneralUtils;
|
import stirling.software.SPDF.model.api.PDFWithPageNums;
|
||||||
import stirling.software.SPDF.utils.WebResponseUtils;
|
import stirling.software.SPDF.utils.WebResponseUtils;
|
||||||
|
|
||||||
@RestController
|
@RestController
|
||||||
|
@RequestMapping("/api/v1/general")
|
||||||
@Tag(name = "General", description = "General APIs")
|
@Tag(name = "General", description = "General APIs")
|
||||||
public class SplitPDFController {
|
public class SplitPDFController {
|
||||||
|
|
||||||
|
@ -38,35 +38,16 @@ 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. Input:PDF Output:PDF Type:SIMO")
|
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. Input:PDF Output:PDF Type:SIMO")
|
||||||
public ResponseEntity<byte[]> splitPdf(
|
public ResponseEntity<byte[]> splitPdf(@ModelAttribute PDFWithPageNums request) throws IOException {
|
||||||
@RequestPart(required = true, value = "fileInput")
|
MultipartFile file = request.getFileInput();
|
||||||
@Parameter(description = "The input PDF file to be split")
|
String pages = request.getPageNumbers();
|
||||||
MultipartFile file,
|
|
||||||
@RequestParam("pages")
|
|
||||||
@Parameter(description = "The pages to be included in separate documents. Specify individual page numbers (e.g., '1,3,5'), ranges (e.g., '1-3,5-7'), or 'all' for every page.")
|
|
||||||
String pages) throws IOException {
|
|
||||||
// parse user input
|
|
||||||
|
|
||||||
// open the pdf document
|
// open the pdf document
|
||||||
InputStream inputStream = file.getInputStream();
|
InputStream inputStream = file.getInputStream();
|
||||||
PDDocument document = PDDocument.load(inputStream);
|
PDDocument document = PDDocument.load(inputStream);
|
||||||
|
|
||||||
List<Integer> pageNumbers = new ArrayList<>();
|
List<Integer> pageNumbers = request.getPageNumbersList(document);
|
||||||
pages = pages.replaceAll("\\s+", ""); // remove whitespaces
|
if(!pageNumbers.contains(document.getNumberOfPages() - 1))
|
||||||
if (pages.toLowerCase().equals("all")) {
|
pageNumbers.add(document.getNumberOfPages()- 1);
|
||||||
for (int i = 0; i < document.getNumberOfPages(); i++) {
|
|
||||||
pageNumbers.add(i);
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
String[] splitPoints = pages.split(",");
|
|
||||||
for (String splitPoint : splitPoints) {
|
|
||||||
List<Integer> orderedPages = GeneralUtils.parsePageList(new String[] {splitPoint}, document.getNumberOfPages());
|
|
||||||
pageNumbers.addAll(orderedPages);
|
|
||||||
}
|
|
||||||
// Add the last page as a split point
|
|
||||||
pageNumbers.add(document.getNumberOfPages() - 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
logger.info("Splitting PDF into pages: {}", pageNumbers.stream().map(String::valueOf).collect(Collectors.joining(",")));
|
logger.info("Splitting PDF into pages: {}", pageNumbers.stream().map(String::valueOf).collect(Collectors.joining(",")));
|
||||||
|
|
||||||
// split the document
|
// split the document
|
||||||
|
|
|
@ -13,16 +13,17 @@ import org.apache.pdfbox.pdmodel.graphics.form.PDFormXObject;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
import org.springframework.http.ResponseEntity;
|
import org.springframework.http.ResponseEntity;
|
||||||
|
import org.springframework.web.bind.annotation.ModelAttribute;
|
||||||
import org.springframework.web.bind.annotation.PostMapping;
|
import org.springframework.web.bind.annotation.PostMapping;
|
||||||
import org.springframework.web.bind.annotation.RequestPart;
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
import org.springframework.web.bind.annotation.RestController;
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
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.tags.Tag;
|
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||||
|
import stirling.software.SPDF.model.api.PDFFile;
|
||||||
import stirling.software.SPDF.utils.WebResponseUtils;
|
import stirling.software.SPDF.utils.WebResponseUtils;
|
||||||
@RestController
|
@RestController
|
||||||
|
@RequestMapping("/api/v1/general")
|
||||||
@Tag(name = "General", description = "General APIs")
|
@Tag(name = "General", description = "General APIs")
|
||||||
public class ToSinglePageController {
|
public class ToSinglePageController {
|
||||||
|
|
||||||
|
@ -34,13 +35,10 @@ public class ToSinglePageController {
|
||||||
summary = "Convert a multi-page PDF into a single long page PDF",
|
summary = "Convert a multi-page PDF into a single long page PDF",
|
||||||
description = "This endpoint converts a multi-page PDF document into a single paged PDF document. The width of the single page will be same as the input's width, but the height will be the sum of all the pages' heights. Input:PDF Output:PDF Type:SISO"
|
description = "This endpoint converts a multi-page PDF document into a single paged PDF document. The width of the single page will be same as the input's width, but the height will be the sum of all the pages' heights. Input:PDF Output:PDF Type:SISO"
|
||||||
)
|
)
|
||||||
public ResponseEntity<byte[]> pdfToSinglePage(
|
public ResponseEntity<byte[]> pdfToSinglePage(@ModelAttribute PDFFile request) throws IOException {
|
||||||
@RequestPart(required = true, value = "fileInput")
|
|
||||||
@Parameter(description = "The input multi-page PDF file to be converted into a single page", required = true)
|
|
||||||
MultipartFile file) throws IOException {
|
|
||||||
|
|
||||||
// Load the source document
|
// Load the source document
|
||||||
PDDocument sourceDocument = PDDocument.load(file.getInputStream());
|
PDDocument sourceDocument = PDDocument.load(request.getFileInput().getInputStream());
|
||||||
|
|
||||||
// Calculate total height and max width
|
// Calculate total height and max width
|
||||||
float totalHeight = 0;
|
float totalHeight = 0;
|
||||||
|
@ -79,7 +77,7 @@ public class ToSinglePageController {
|
||||||
sourceDocument.close();
|
sourceDocument.close();
|
||||||
|
|
||||||
byte[] result = baos.toByteArray();
|
byte[] result = baos.toByteArray();
|
||||||
return WebResponseUtils.bytesToWebResponse(result, file.getOriginalFilename().replaceFirst("[.][^.]+$", "") + "_singlePage.pdf");
|
return WebResponseUtils.bytesToWebResponse(result, request.getFileInput().getOriginalFilename().replaceFirst("[.][^.]+$", "") + "_singlePage.pdf");
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -15,6 +15,7 @@ import org.springframework.stereotype.Controller;
|
||||||
import org.springframework.ui.Model;
|
import org.springframework.ui.Model;
|
||||||
import org.springframework.web.bind.annotation.PathVariable;
|
import org.springframework.web.bind.annotation.PathVariable;
|
||||||
import org.springframework.web.bind.annotation.PostMapping;
|
import org.springframework.web.bind.annotation.PostMapping;
|
||||||
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
import org.springframework.web.bind.annotation.RequestParam;
|
import org.springframework.web.bind.annotation.RequestParam;
|
||||||
import org.springframework.web.servlet.mvc.support.RedirectAttributes;
|
import org.springframework.web.servlet.mvc.support.RedirectAttributes;
|
||||||
import org.springframework.web.servlet.view.RedirectView;
|
import org.springframework.web.servlet.view.RedirectView;
|
||||||
|
@ -25,6 +26,7 @@ import stirling.software.SPDF.config.security.UserService;
|
||||||
import stirling.software.SPDF.model.User;
|
import stirling.software.SPDF.model.User;
|
||||||
|
|
||||||
@Controller
|
@Controller
|
||||||
|
@RequestMapping("/api/v1/user")
|
||||||
public class UserController {
|
public class UserController {
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
|
|
|
@ -14,8 +14,9 @@ import javax.xml.parsers.DocumentBuilder;
|
||||||
import javax.xml.parsers.DocumentBuilderFactory;
|
import javax.xml.parsers.DocumentBuilderFactory;
|
||||||
|
|
||||||
import org.springframework.http.ResponseEntity;
|
import org.springframework.http.ResponseEntity;
|
||||||
|
import org.springframework.web.bind.annotation.ModelAttribute;
|
||||||
import org.springframework.web.bind.annotation.PostMapping;
|
import org.springframework.web.bind.annotation.PostMapping;
|
||||||
import org.springframework.web.bind.annotation.RequestPart;
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
import org.springframework.web.bind.annotation.RestController;
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
import org.springframework.web.multipart.MultipartFile;
|
import org.springframework.web.multipart.MultipartFile;
|
||||||
import org.w3c.dom.Document;
|
import org.w3c.dom.Document;
|
||||||
|
@ -26,10 +27,12 @@ import org.xml.sax.InputSource;
|
||||||
import io.swagger.v3.oas.annotations.Hidden;
|
import io.swagger.v3.oas.annotations.Hidden;
|
||||||
import io.swagger.v3.oas.annotations.Operation;
|
import io.swagger.v3.oas.annotations.Operation;
|
||||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||||
|
import stirling.software.SPDF.model.api.GeneralFile;
|
||||||
import stirling.software.SPDF.utils.FileToPdf;
|
import stirling.software.SPDF.utils.FileToPdf;
|
||||||
import stirling.software.SPDF.utils.WebResponseUtils;
|
import stirling.software.SPDF.utils.WebResponseUtils;
|
||||||
|
|
||||||
@RestController
|
@RestController
|
||||||
|
@RequestMapping("/api/v1/convert")
|
||||||
@Tag(name = "Convert", description = "Convert APIs")
|
@Tag(name = "Convert", description = "Convert APIs")
|
||||||
public class ConvertEpubToPdf {
|
public class ConvertEpubToPdf {
|
||||||
//TODO
|
//TODO
|
||||||
|
@ -40,9 +43,9 @@ public class ConvertEpubToPdf {
|
||||||
description = "This endpoint takes an EPUB file input and converts it to a single PDF."
|
description = "This endpoint takes an EPUB file input and converts it to a single PDF."
|
||||||
)
|
)
|
||||||
public ResponseEntity<byte[]> epubToSinglePdf(
|
public ResponseEntity<byte[]> epubToSinglePdf(
|
||||||
@RequestPart(required = true, value = "fileInput") MultipartFile fileInput)
|
@ModelAttribute GeneralFile request)
|
||||||
throws Exception {
|
throws Exception {
|
||||||
|
MultipartFile fileInput = request.getFileInput();
|
||||||
if (fileInput == null) {
|
if (fileInput == null) {
|
||||||
throw new IllegalArgumentException("Please provide an EPUB file for conversion.");
|
throw new IllegalArgumentException("Please provide an EPUB file for conversion.");
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,30 +1,33 @@
|
||||||
package stirling.software.SPDF.controller.api.converters;
|
package stirling.software.SPDF.controller.api.converters;
|
||||||
|
|
||||||
import java.io.IOException;
|
|
||||||
|
|
||||||
import org.springframework.http.ResponseEntity;
|
import org.springframework.http.ResponseEntity;
|
||||||
|
import org.springframework.web.bind.annotation.ModelAttribute;
|
||||||
import org.springframework.web.bind.annotation.PostMapping;
|
import org.springframework.web.bind.annotation.PostMapping;
|
||||||
import org.springframework.web.bind.annotation.RequestPart;
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
import org.springframework.web.bind.annotation.RestController;
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
import org.springframework.web.multipart.MultipartFile;
|
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.tags.Tag;
|
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||||
|
import stirling.software.SPDF.model.api.GeneralFile;
|
||||||
import stirling.software.SPDF.utils.FileToPdf;
|
import stirling.software.SPDF.utils.FileToPdf;
|
||||||
import stirling.software.SPDF.utils.WebResponseUtils;
|
import stirling.software.SPDF.utils.WebResponseUtils;
|
||||||
|
|
||||||
@RestController
|
@RestController
|
||||||
@Tag(name = "Convert", description = "Convert APIs")
|
@Tag(name = "Convert", description = "Convert APIs")
|
||||||
|
@RequestMapping("/api/v1/convert")
|
||||||
public class ConvertHtmlToPDF {
|
public class ConvertHtmlToPDF {
|
||||||
|
|
||||||
|
|
||||||
@PostMapping(consumes = "multipart/form-data", value = "/html-to-pdf")
|
@PostMapping(consumes = "multipart/form-data", value = "/html/pdf")
|
||||||
@Operation(
|
@Operation(
|
||||||
summary = "Convert an HTML or ZIP (containing HTML and CSS) to PDF",
|
summary = "Convert an HTML or ZIP (containing HTML and CSS) to PDF",
|
||||||
description = "This endpoint takes an HTML or ZIP file input and converts it to a PDF format."
|
description = "This endpoint takes an HTML or ZIP file input and converts it to a PDF format."
|
||||||
)
|
)
|
||||||
public ResponseEntity<byte[]> HtmlToPdf(
|
public ResponseEntity<byte[]> HtmlToPdf(
|
||||||
@RequestPart(required = true, value = "fileInput") MultipartFile fileInput) throws IOException, InterruptedException {
|
@ModelAttribute GeneralFile request)
|
||||||
|
throws Exception {
|
||||||
|
MultipartFile fileInput = request.getFileInput();
|
||||||
|
|
||||||
if (fileInput == null) {
|
if (fileInput == null) {
|
||||||
throw new IllegalArgumentException("Please provide an HTML or ZIP file for conversion.");
|
throw new IllegalArgumentException("Please provide an HTML or ZIP file for conversion.");
|
||||||
|
|
|
@ -11,44 +11,35 @@ import org.springframework.http.HttpHeaders;
|
||||||
import org.springframework.http.HttpStatus;
|
import org.springframework.http.HttpStatus;
|
||||||
import org.springframework.http.MediaType;
|
import org.springframework.http.MediaType;
|
||||||
import org.springframework.http.ResponseEntity;
|
import org.springframework.http.ResponseEntity;
|
||||||
|
import org.springframework.web.bind.annotation.ModelAttribute;
|
||||||
import org.springframework.web.bind.annotation.PostMapping;
|
import org.springframework.web.bind.annotation.PostMapping;
|
||||||
import org.springframework.web.bind.annotation.RequestParam;
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
import org.springframework.web.bind.annotation.RequestPart;
|
|
||||||
import org.springframework.web.bind.annotation.RestController;
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
import org.springframework.web.multipart.MultipartFile;
|
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.media.Schema;
|
|
||||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||||
|
import stirling.software.SPDF.model.api.converters.ConvertToImageRequest;
|
||||||
|
import stirling.software.SPDF.model.api.converters.ConvertToPdfRequest;
|
||||||
import stirling.software.SPDF.utils.PdfUtils;
|
import stirling.software.SPDF.utils.PdfUtils;
|
||||||
import stirling.software.SPDF.utils.WebResponseUtils;
|
import stirling.software.SPDF.utils.WebResponseUtils;
|
||||||
@RestController
|
@RestController
|
||||||
|
@RequestMapping("/api/v1/convert")
|
||||||
@Tag(name = "Convert", description = "Convert APIs")
|
@Tag(name = "Convert", description = "Convert APIs")
|
||||||
public class ConvertImgPDFController {
|
public class ConvertImgPDFController {
|
||||||
|
|
||||||
private static final Logger logger = LoggerFactory.getLogger(ConvertImgPDFController.class);
|
private static final Logger logger = LoggerFactory.getLogger(ConvertImgPDFController.class);
|
||||||
|
|
||||||
@PostMapping(consumes = "multipart/form-data", value = "/pdf-to-img")
|
@PostMapping(consumes = "multipart/form-data", value = "/pdf/img")
|
||||||
@Operation(summary = "Convert PDF to image(s)",
|
@Operation(summary = "Convert PDF to image(s)",
|
||||||
description = "This endpoint converts a PDF file to image(s) with the specified image format, color type, and DPI. Users can choose to get a single image or multiple images. Input:PDF Output:Image Type:SI-Conditional")
|
description = "This endpoint converts a PDF file to image(s) with the specified image format, color type, and DPI. Users can choose to get a single image or multiple images. Input:PDF Output:Image Type:SI-Conditional")
|
||||||
public ResponseEntity<Resource> convertToImage(
|
public ResponseEntity<Resource> convertToImage(@ModelAttribute ConvertToImageRequest request) throws IOException {
|
||||||
@RequestPart(required = true, value = "fileInput")
|
MultipartFile file = request.getFileInput();
|
||||||
@Parameter(description = "The input PDF file to be converted")
|
String imageFormat = request.getImageFormat();
|
||||||
MultipartFile file,
|
String singleOrMultiple = request.getSingleOrMultiple();
|
||||||
@RequestParam("imageFormat")
|
String colorType = request.getColorType();
|
||||||
@Parameter(description = "The output image format", schema = @Schema(allowableValues = {"png", "jpeg", "jpg", "gif"}))
|
String dpi = request.getDpi();
|
||||||
String imageFormat,
|
|
||||||
@RequestParam("singleOrMultiple")
|
|
||||||
@Parameter(description = "Choose between a single image containing all pages or separate images for each page", schema = @Schema(allowableValues = {"single", "multiple"}))
|
|
||||||
String singleOrMultiple,
|
|
||||||
@RequestParam("colorType")
|
|
||||||
@Parameter(description = "The color type of the output image(s)", schema = @Schema(allowableValues = {"color", "greyscale", "blackwhite"}))
|
|
||||||
String colorType,
|
|
||||||
@RequestParam("dpi")
|
|
||||||
@Parameter(description = "The DPI (dots per inch) for the output image(s)")
|
|
||||||
String dpi) throws IOException {
|
|
||||||
|
|
||||||
byte[] pdfBytes = file.getBytes();
|
byte[] pdfBytes = file.getBytes();
|
||||||
ImageType colorTypeResult = ImageType.RGB;
|
ImageType colorTypeResult = ImageType.RGB;
|
||||||
if ("greyscale".equals(colorType)) {
|
if ("greyscale".equals(colorType)) {
|
||||||
|
@ -83,22 +74,15 @@ public class ConvertImgPDFController {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@PostMapping(consumes = "multipart/form-data", value = "/img-to-pdf")
|
@PostMapping(consumes = "multipart/form-data", value = "/img/pdf")
|
||||||
@Operation(summary = "Convert images to a PDF file",
|
@Operation(summary = "Convert images to a PDF file",
|
||||||
description = "This endpoint converts one or more images to a PDF file. Users can specify whether to stretch the images to fit the PDF page, and whether to automatically rotate the images. Input:Image Output:PDF Type:SISO?")
|
description = "This endpoint converts one or more images to a PDF file. Users can specify whether to stretch the images to fit the PDF page, and whether to automatically rotate the images. Input:Image Output:PDF Type:SISO?")
|
||||||
public ResponseEntity<byte[]> convertToPdf(
|
public ResponseEntity<byte[]> convertToPdf(@ModelAttribute ConvertToPdfRequest request) throws IOException {
|
||||||
@RequestPart(required = true, value = "fileInput")
|
MultipartFile[] file = request.getFileInput();
|
||||||
@Parameter(description = "The input images to be converted to a PDF file")
|
boolean stretchToFit = request.isStretchToFit();
|
||||||
MultipartFile[] file,
|
String colorType = request.getColorType();
|
||||||
@RequestParam(defaultValue = "false", name = "stretchToFit")
|
boolean autoRotate = request.isAutoRotate();
|
||||||
@Parameter(description = "Whether to stretch the images to fit the PDF page or maintain the aspect ratio", example = "false")
|
|
||||||
boolean stretchToFit,
|
|
||||||
@RequestParam("colorType")
|
|
||||||
@Parameter(description = "The color type of the output image(s)", schema = @Schema(allowableValues = {"color", "greyscale", "blackwhite"}))
|
|
||||||
String colorType,
|
|
||||||
@RequestParam(defaultValue = "false", name = "autoRotate")
|
|
||||||
@Parameter(description = "Whether to automatically rotate the images to better fit the PDF page", example = "true")
|
|
||||||
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("[.][^.]+$", "") + "_converted.pdf");
|
return WebResponseUtils.bytesToWebResponse(bytes, file[0].getOriginalFilename().replaceFirst("[.][^.]+$", "") + "_converted.pdf");
|
||||||
|
|
|
@ -1,33 +1,35 @@
|
||||||
package stirling.software.SPDF.controller.api.converters;
|
package stirling.software.SPDF.controller.api.converters;
|
||||||
|
|
||||||
import java.io.IOException;
|
|
||||||
|
|
||||||
import org.commonmark.node.Node;
|
import org.commonmark.node.Node;
|
||||||
import org.commonmark.parser.Parser;
|
import org.commonmark.parser.Parser;
|
||||||
import org.commonmark.renderer.html.HtmlRenderer;
|
import org.commonmark.renderer.html.HtmlRenderer;
|
||||||
import org.springframework.http.ResponseEntity;
|
import org.springframework.http.ResponseEntity;
|
||||||
|
import org.springframework.web.bind.annotation.ModelAttribute;
|
||||||
import org.springframework.web.bind.annotation.PostMapping;
|
import org.springframework.web.bind.annotation.PostMapping;
|
||||||
import org.springframework.web.bind.annotation.RequestPart;
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
import org.springframework.web.bind.annotation.RestController;
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
import org.springframework.web.multipart.MultipartFile;
|
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.tags.Tag;
|
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||||
|
import stirling.software.SPDF.model.api.GeneralFile;
|
||||||
import stirling.software.SPDF.utils.FileToPdf;
|
import stirling.software.SPDF.utils.FileToPdf;
|
||||||
import stirling.software.SPDF.utils.WebResponseUtils;
|
import stirling.software.SPDF.utils.WebResponseUtils;
|
||||||
|
|
||||||
@RestController
|
@RestController
|
||||||
@Tag(name = "Convert", description = "Convert APIs")
|
@Tag(name = "Convert", description = "Convert APIs")
|
||||||
|
@RequestMapping("/api/v1/convert")
|
||||||
public class ConvertMarkdownToPdf {
|
public class ConvertMarkdownToPdf {
|
||||||
|
|
||||||
@PostMapping(consumes = "multipart/form-data", value = "/markdown-to-pdf")
|
@PostMapping(consumes = "multipart/form-data", value = "/markdown/pdf")
|
||||||
@Operation(
|
@Operation(
|
||||||
summary = "Convert a Markdown file to PDF",
|
summary = "Convert a Markdown file to PDF",
|
||||||
description = "This endpoint takes a Markdown file input, converts it to HTML, and then to PDF format."
|
description = "This endpoint takes a Markdown file input, converts it to HTML, and then to PDF format."
|
||||||
)
|
)
|
||||||
public ResponseEntity<byte[]> markdownToPdf(
|
public ResponseEntity<byte[]> markdownToPdf(
|
||||||
@RequestPart(required = true, value = "fileInput") MultipartFile fileInput)
|
@ModelAttribute GeneralFile request)
|
||||||
throws IOException, InterruptedException {
|
throws Exception {
|
||||||
|
MultipartFile fileInput = request.getFileInput();
|
||||||
|
|
||||||
if (fileInput == null) {
|
if (fileInput == null) {
|
||||||
throw new IllegalArgumentException("Please provide a Markdown file for conversion.");
|
throw new IllegalArgumentException("Please provide a Markdown file for conversion.");
|
||||||
|
|
|
@ -10,20 +10,22 @@ import java.util.List;
|
||||||
|
|
||||||
import org.apache.commons.io.FilenameUtils;
|
import org.apache.commons.io.FilenameUtils;
|
||||||
import org.springframework.http.ResponseEntity;
|
import org.springframework.http.ResponseEntity;
|
||||||
|
import org.springframework.web.bind.annotation.ModelAttribute;
|
||||||
import org.springframework.web.bind.annotation.PostMapping;
|
import org.springframework.web.bind.annotation.PostMapping;
|
||||||
import org.springframework.web.bind.annotation.RequestPart;
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
import org.springframework.web.bind.annotation.RestController;
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
import org.springframework.web.multipart.MultipartFile;
|
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.tags.Tag;
|
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||||
|
import stirling.software.SPDF.model.api.GeneralFile;
|
||||||
import stirling.software.SPDF.utils.ProcessExecutor;
|
import stirling.software.SPDF.utils.ProcessExecutor;
|
||||||
import stirling.software.SPDF.utils.ProcessExecutor.ProcessExecutorResult;
|
import stirling.software.SPDF.utils.ProcessExecutor.ProcessExecutorResult;
|
||||||
import stirling.software.SPDF.utils.WebResponseUtils;
|
import stirling.software.SPDF.utils.WebResponseUtils;
|
||||||
|
|
||||||
@RestController
|
@RestController
|
||||||
@Tag(name = "Convert", description = "Convert APIs")
|
@Tag(name = "Convert", description = "Convert APIs")
|
||||||
|
@RequestMapping("/api/v1/convert")
|
||||||
public class ConvertOfficeController {
|
public class ConvertOfficeController {
|
||||||
|
|
||||||
public byte[] convertToPdf(MultipartFile inputFile) throws IOException, InterruptedException {
|
public byte[] convertToPdf(MultipartFile inputFile) throws IOException, InterruptedException {
|
||||||
|
@ -58,19 +60,14 @@ public class ConvertOfficeController {
|
||||||
return fileExtension.matches(extensionPattern);
|
return fileExtension.matches(extensionPattern);
|
||||||
}
|
}
|
||||||
|
|
||||||
@PostMapping(consumes = "multipart/form-data", value = "/file-to-pdf")
|
@PostMapping(consumes = "multipart/form-data", value = "/file/pdf")
|
||||||
@Operation(
|
@Operation(
|
||||||
summary = "Convert a file to a PDF using LibreOffice",
|
summary = "Convert a file to a PDF using LibreOffice",
|
||||||
description = "This endpoint converts a given file to a PDF using LibreOffice API Input:Any Output:PDF Type:SISO"
|
description = "This endpoint converts a given file to a PDF using LibreOffice API Input:Any Output:PDF Type:SISO"
|
||||||
)
|
)
|
||||||
public ResponseEntity<byte[]> processFileToPDF(
|
public ResponseEntity<byte[]> processFileToPDF(@ModelAttribute GeneralFile request)
|
||||||
@RequestPart(required = true, value = "fileInput")
|
throws Exception {
|
||||||
@Parameter(
|
MultipartFile inputFile = request.getFileInput();
|
||||||
description = "The input file to be converted to a PDF file using LibreOffice",
|
|
||||||
required = true
|
|
||||||
)
|
|
||||||
MultipartFile inputFile
|
|
||||||
) throws IOException, InterruptedException {
|
|
||||||
// unused but can start server instance if startup time is to long
|
// unused but can start server instance if startup time is to long
|
||||||
// LibreOfficeListener.getInstance().start();
|
// LibreOfficeListener.getInstance().start();
|
||||||
|
|
||||||
|
|
|
@ -3,69 +3,67 @@ package stirling.software.SPDF.controller.api.converters;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
|
||||||
import org.springframework.http.ResponseEntity;
|
import org.springframework.http.ResponseEntity;
|
||||||
|
import org.springframework.web.bind.annotation.ModelAttribute;
|
||||||
import org.springframework.web.bind.annotation.PostMapping;
|
import org.springframework.web.bind.annotation.PostMapping;
|
||||||
import org.springframework.web.bind.annotation.RequestParam;
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
import org.springframework.web.bind.annotation.RequestPart;
|
|
||||||
import org.springframework.web.bind.annotation.RestController;
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
import org.springframework.web.multipart.MultipartFile;
|
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.media.Schema;
|
|
||||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||||
|
import stirling.software.SPDF.model.api.PDFFile;
|
||||||
|
import stirling.software.SPDF.model.api.converters.PdfToPresentationRequest;
|
||||||
|
import stirling.software.SPDF.model.api.converters.PdfToTextOrRTFRequest;
|
||||||
|
import stirling.software.SPDF.model.api.converters.PdfToWordRequest;
|
||||||
import stirling.software.SPDF.utils.PDFToFile;
|
import stirling.software.SPDF.utils.PDFToFile;
|
||||||
|
|
||||||
@RestController
|
@RestController
|
||||||
|
@RequestMapping("/api/v1/convert")
|
||||||
@Tag(name = "Convert", description = "Convert APIs")
|
@Tag(name = "Convert", description = "Convert APIs")
|
||||||
public class ConvertPDFToOffice {
|
public class ConvertPDFToOffice {
|
||||||
|
|
||||||
@PostMapping(consumes = "multipart/form-data", value = "/pdf-to-html")
|
@PostMapping(consumes = "multipart/form-data", value = "/pdf/html")
|
||||||
@Operation(summary = "Convert PDF to HTML", description = "This endpoint converts a PDF file to HTML format. Input:PDF Output:HTML Type:SISO")
|
@Operation(summary = "Convert PDF to HTML", description = "This endpoint converts a PDF file to HTML format. Input:PDF Output:HTML Type:SISO")
|
||||||
public ResponseEntity<byte[]> processPdfToHTML(
|
public ResponseEntity<byte[]> processPdfToHTML(@ModelAttribute PDFFile request)
|
||||||
@RequestPart(required = true, value = "fileInput") @Parameter(description = "The input PDF file to be converted to HTML format", required = true) MultipartFile inputFile)
|
throws Exception {
|
||||||
throws IOException, InterruptedException {
|
MultipartFile inputFile = request.getFileInput();
|
||||||
PDFToFile pdfToFile = new PDFToFile();
|
PDFToFile pdfToFile = new PDFToFile();
|
||||||
return pdfToFile.processPdfToOfficeFormat(inputFile, "html", "writer_pdf_import");
|
return pdfToFile.processPdfToOfficeFormat(inputFile, "html", "writer_pdf_import");
|
||||||
}
|
}
|
||||||
|
|
||||||
@PostMapping(consumes = "multipart/form-data", value = "/pdf-to-presentation")
|
@PostMapping(consumes = "multipart/form-data", value = "/pdf/presentation")
|
||||||
@Operation(summary = "Convert PDF to Presentation format", description = "This endpoint converts a given PDF file to a Presentation format. Input:PDF Output:PPT Type:SISO")
|
@Operation(summary = "Convert PDF to Presentation format", description = "This endpoint converts a given PDF file to a Presentation format. Input:PDF Output:PPT Type:SISO")
|
||||||
public ResponseEntity<byte[]> processPdfToPresentation(
|
public ResponseEntity<byte[]> processPdfToPresentation(@ModelAttribute PdfToPresentationRequest request) throws IOException, InterruptedException {
|
||||||
@RequestPart(required = true, value = "fileInput") @Parameter(description = "The input PDF file") MultipartFile inputFile,
|
MultipartFile inputFile = request.getFileInput();
|
||||||
@RequestParam("outputFormat") @Parameter(description = "The output Presentation format", schema = @Schema(allowableValues = {
|
String outputFormat = request.getOutputFormat();
|
||||||
"ppt", "pptx", "odp" })) String outputFormat)
|
|
||||||
throws IOException, InterruptedException {
|
|
||||||
PDFToFile pdfToFile = new PDFToFile();
|
PDFToFile pdfToFile = new PDFToFile();
|
||||||
return pdfToFile.processPdfToOfficeFormat(inputFile, outputFormat, "impress_pdf_import");
|
return pdfToFile.processPdfToOfficeFormat(inputFile, outputFormat, "impress_pdf_import");
|
||||||
}
|
}
|
||||||
|
|
||||||
@PostMapping(consumes = "multipart/form-data", value = "/pdf-to-text")
|
@PostMapping(consumes = "multipart/form-data", value = "/pdf/text")
|
||||||
@Operation(summary = "Convert PDF to Text or RTF format", description = "This endpoint converts a given PDF file to Text or RTF format. Input:PDF Output:TXT Type:SISO")
|
@Operation(summary = "Convert PDF to Text or RTF format", description = "This endpoint converts a given PDF file to Text or RTF format. Input:PDF Output:TXT Type:SISO")
|
||||||
public ResponseEntity<byte[]> processPdfToRTForTXT(
|
public ResponseEntity<byte[]> processPdfToRTForTXT(@ModelAttribute PdfToTextOrRTFRequest request) throws IOException, InterruptedException {
|
||||||
@RequestPart(required = true, value = "fileInput") @Parameter(description = "The input PDF file") MultipartFile inputFile,
|
MultipartFile inputFile = request.getFileInput();
|
||||||
@RequestParam("outputFormat") @Parameter(description = "The output Text or RTF format", schema = @Schema(allowableValues = {
|
String outputFormat = request.getOutputFormat();
|
||||||
"rtf", "txt:Text" })) String outputFormat)
|
|
||||||
throws IOException, InterruptedException {
|
|
||||||
PDFToFile pdfToFile = new PDFToFile();
|
PDFToFile pdfToFile = new PDFToFile();
|
||||||
return pdfToFile.processPdfToOfficeFormat(inputFile, outputFormat, "writer_pdf_import");
|
return pdfToFile.processPdfToOfficeFormat(inputFile, outputFormat, "writer_pdf_import");
|
||||||
}
|
}
|
||||||
|
|
||||||
@PostMapping(consumes = "multipart/form-data", value = "/pdf-to-word")
|
@PostMapping(consumes = "multipart/form-data", value = "/pdf/word")
|
||||||
@Operation(summary = "Convert PDF to Word document", description = "This endpoint converts a given PDF file to a Word document format. Input:PDF Output:WORD Type:SISO")
|
@Operation(summary = "Convert PDF to Word document", description = "This endpoint converts a given PDF file to a Word document format. Input:PDF Output:WORD Type:SISO")
|
||||||
public ResponseEntity<byte[]> processPdfToWord(
|
public ResponseEntity<byte[]> processPdfToWord(@ModelAttribute PdfToWordRequest request) throws IOException, InterruptedException {
|
||||||
@RequestPart(required = true, value = "fileInput") @Parameter(description = "The input PDF file") MultipartFile inputFile,
|
MultipartFile inputFile = request.getFileInput();
|
||||||
@RequestParam("outputFormat") @Parameter(description = "The output Word document format", schema = @Schema(allowableValues = {
|
String outputFormat = request.getOutputFormat();
|
||||||
"doc", "docx", "odt" })) String outputFormat)
|
|
||||||
throws IOException, InterruptedException {
|
|
||||||
PDFToFile pdfToFile = new PDFToFile();
|
PDFToFile pdfToFile = new PDFToFile();
|
||||||
return pdfToFile.processPdfToOfficeFormat(inputFile, outputFormat, "writer_pdf_import");
|
return pdfToFile.processPdfToOfficeFormat(inputFile, outputFormat, "writer_pdf_import");
|
||||||
}
|
}
|
||||||
|
|
||||||
@PostMapping(consumes = "multipart/form-data", value = "/pdf-to-xml")
|
@PostMapping(consumes = "multipart/form-data", value = "/pdf/xml")
|
||||||
@Operation(summary = "Convert PDF to XML", description = "This endpoint converts a PDF file to an XML file. Input:PDF Output:XML Type:SISO")
|
@Operation(summary = "Convert PDF to XML", description = "This endpoint converts a PDF file to an XML file. Input:PDF Output:XML Type:SISO")
|
||||||
public ResponseEntity<byte[]> processPdfToXML(
|
public ResponseEntity<byte[]> processPdfToXML(@ModelAttribute PDFFile request)
|
||||||
@RequestPart(required = true, value = "fileInput") @Parameter(description = "The input PDF file to be converted to an XML file", required = true) MultipartFile inputFile)
|
throws Exception {
|
||||||
throws IOException, InterruptedException {
|
MultipartFile inputFile = request.getFileInput();
|
||||||
|
|
||||||
PDFToFile pdfToFile = new PDFToFile();
|
PDFToFile pdfToFile = new PDFToFile();
|
||||||
return pdfToFile.processPdfToOfficeFormat(inputFile, "xml", "writer_pdf_import");
|
return pdfToFile.processPdfToOfficeFormat(inputFile, "xml", "writer_pdf_import");
|
||||||
|
|
|
@ -1,37 +1,37 @@
|
||||||
package stirling.software.SPDF.controller.api.converters;
|
package stirling.software.SPDF.controller.api.converters;
|
||||||
|
|
||||||
import java.io.IOException;
|
|
||||||
import java.nio.file.Files;
|
import java.nio.file.Files;
|
||||||
import java.nio.file.Path;
|
import java.nio.file.Path;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import org.springframework.http.ResponseEntity;
|
import org.springframework.http.ResponseEntity;
|
||||||
|
import org.springframework.web.bind.annotation.ModelAttribute;
|
||||||
import org.springframework.web.bind.annotation.PostMapping;
|
import org.springframework.web.bind.annotation.PostMapping;
|
||||||
import org.springframework.web.bind.annotation.RequestPart;
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
import org.springframework.web.bind.annotation.RestController;
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
import org.springframework.web.multipart.MultipartFile;
|
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.tags.Tag;
|
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||||
|
import stirling.software.SPDF.model.api.PDFFile;
|
||||||
import stirling.software.SPDF.utils.ProcessExecutor;
|
import stirling.software.SPDF.utils.ProcessExecutor;
|
||||||
import stirling.software.SPDF.utils.ProcessExecutor.ProcessExecutorResult;
|
import stirling.software.SPDF.utils.ProcessExecutor.ProcessExecutorResult;
|
||||||
import stirling.software.SPDF.utils.WebResponseUtils;
|
import stirling.software.SPDF.utils.WebResponseUtils;
|
||||||
|
|
||||||
@RestController
|
@RestController
|
||||||
|
@RequestMapping("/api/v1/convert")
|
||||||
@Tag(name = "Convert", description = "Convert APIs")
|
@Tag(name = "Convert", description = "Convert APIs")
|
||||||
public class ConvertPDFToPDFA {
|
public class ConvertPDFToPDFA {
|
||||||
|
|
||||||
@PostMapping(consumes = "multipart/form-data", value = "/pdf-to-pdfa")
|
@PostMapping(consumes = "multipart/form-data", value = "/pdf/pdfa")
|
||||||
@Operation(
|
@Operation(
|
||||||
summary = "Convert a PDF to a PDF/A",
|
summary = "Convert a PDF to a PDF/A",
|
||||||
description = "This endpoint converts a PDF file to a PDF/A file. PDF/A is a format designed for long-term archiving of digital documents. Input:PDF Output:PDF Type:SISO"
|
description = "This endpoint converts a PDF file to a PDF/A file. PDF/A is a format designed for long-term archiving of digital documents. Input:PDF Output:PDF Type:SISO"
|
||||||
)
|
)
|
||||||
public ResponseEntity<byte[]> pdfToPdfA(
|
public ResponseEntity<byte[]> pdfToPdfA(@ModelAttribute PDFFile request)
|
||||||
@RequestPart(required = true, value = "fileInput")
|
throws Exception {
|
||||||
@Parameter(description = "The input PDF file to be converted to a PDF/A file", required = true)
|
MultipartFile inputFile = request.getFileInput();
|
||||||
MultipartFile inputFile) throws IOException, InterruptedException {
|
|
||||||
|
|
||||||
// Save the uploaded file to a temporary location
|
// Save the uploaded file to a temporary location
|
||||||
Path tempInputFile = Files.createTempFile("input_", ".pdf");
|
Path tempInputFile = Files.createTempFile("input_", ".pdf");
|
||||||
|
|
|
@ -7,13 +7,14 @@ import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import org.springframework.http.ResponseEntity;
|
import org.springframework.http.ResponseEntity;
|
||||||
|
import org.springframework.web.bind.annotation.ModelAttribute;
|
||||||
import org.springframework.web.bind.annotation.PostMapping;
|
import org.springframework.web.bind.annotation.PostMapping;
|
||||||
import org.springframework.web.bind.annotation.RequestParam;
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
import org.springframework.web.bind.annotation.RestController;
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
|
|
||||||
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.tags.Tag;
|
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||||
|
import stirling.software.SPDF.model.api.converters.UrlToPdfRequest;
|
||||||
import stirling.software.SPDF.utils.GeneralUtils;
|
import stirling.software.SPDF.utils.GeneralUtils;
|
||||||
import stirling.software.SPDF.utils.ProcessExecutor;
|
import stirling.software.SPDF.utils.ProcessExecutor;
|
||||||
import stirling.software.SPDF.utils.ProcessExecutor.ProcessExecutorResult;
|
import stirling.software.SPDF.utils.ProcessExecutor.ProcessExecutorResult;
|
||||||
|
@ -21,17 +22,16 @@ import stirling.software.SPDF.utils.WebResponseUtils;
|
||||||
|
|
||||||
@RestController
|
@RestController
|
||||||
@Tag(name = "Convert", description = "Convert APIs")
|
@Tag(name = "Convert", description = "Convert APIs")
|
||||||
|
@RequestMapping("/api/v1/convert")
|
||||||
public class ConvertWebsiteToPDF {
|
public class ConvertWebsiteToPDF {
|
||||||
|
|
||||||
@PostMapping(consumes = "multipart/form-data", value = "/url-to-pdf")
|
@PostMapping(consumes = "multipart/form-data", value = "/url/pdf")
|
||||||
@Operation(
|
@Operation(
|
||||||
summary = "Convert a URL to a PDF",
|
summary = "Convert a URL to a PDF",
|
||||||
description = "This endpoint fetches content from a URL and converts it to a PDF format."
|
description = "This endpoint fetches content from a URL and converts it to a PDF format."
|
||||||
)
|
)
|
||||||
public ResponseEntity<byte[]> urlToPdf(
|
public ResponseEntity<byte[]> urlToPdf(@ModelAttribute UrlToPdfRequest request) throws IOException, InterruptedException {
|
||||||
@RequestParam(required = true, value = "urlInput")
|
String URL = request.getUrlInput();
|
||||||
@Parameter(description = "The input URL to be converted to a PDF file", required = true)
|
|
||||||
String URL) throws IOException, InterruptedException {
|
|
||||||
|
|
||||||
// Validate the URL format
|
// Validate the URL format
|
||||||
if(!URL.matches("^https?://.*") || !GeneralUtils.isValidURL(URL)) {
|
if(!URL.matches("^https?://.*") || !GeneralUtils.isValidURL(URL)) {
|
||||||
|
|
|
@ -6,29 +6,35 @@ import org.apache.pdfbox.pdmodel.PDDocument;
|
||||||
import org.apache.pdfbox.pdmodel.PDPage;
|
import org.apache.pdfbox.pdmodel.PDPage;
|
||||||
import org.apache.pdfbox.pdmodel.common.PDRectangle;
|
import org.apache.pdfbox.pdmodel.common.PDRectangle;
|
||||||
import org.springframework.http.ResponseEntity;
|
import org.springframework.http.ResponseEntity;
|
||||||
|
import org.springframework.web.bind.annotation.ModelAttribute;
|
||||||
import org.springframework.web.bind.annotation.PostMapping;
|
import org.springframework.web.bind.annotation.PostMapping;
|
||||||
import org.springframework.web.bind.annotation.RequestPart;
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
import org.springframework.web.bind.annotation.RestController;
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
import org.springframework.web.multipart.MultipartFile;
|
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.media.Schema;
|
|
||||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||||
|
import stirling.software.SPDF.model.api.PDFComparisonAndCount;
|
||||||
|
import stirling.software.SPDF.model.api.PDFWithPageNums;
|
||||||
|
import stirling.software.SPDF.model.api.filter.ContainsTextRequest;
|
||||||
|
import stirling.software.SPDF.model.api.filter.FileSizeRequest;
|
||||||
|
import stirling.software.SPDF.model.api.filter.PageRotationRequest;
|
||||||
|
import stirling.software.SPDF.model.api.filter.PageSizeRequest;
|
||||||
import stirling.software.SPDF.utils.PdfUtils;
|
import stirling.software.SPDF.utils.PdfUtils;
|
||||||
import stirling.software.SPDF.utils.WebResponseUtils;
|
import stirling.software.SPDF.utils.WebResponseUtils;
|
||||||
|
|
||||||
@RestController
|
@RestController
|
||||||
|
@RequestMapping("/api/v1/filter")
|
||||||
@Tag(name = "Filter", description = "Filter APIs")
|
@Tag(name = "Filter", description = "Filter APIs")
|
||||||
public class FilterController {
|
public class FilterController {
|
||||||
|
|
||||||
@PostMapping(consumes = "multipart/form-data", value = "/filter-contains-text")
|
@PostMapping(consumes = "multipart/form-data", value = "/filter-contains-text")
|
||||||
@Operation(summary = "Checks if a PDF contains set text, returns true if does", description = "Input:PDF Output:Boolean Type:SISO")
|
@Operation(summary = "Checks if a PDF contains set text, returns true if does", description = "Input:PDF Output:Boolean Type:SISO")
|
||||||
public ResponseEntity<byte[]> containsText(
|
public ResponseEntity<byte[]> containsText(@ModelAttribute ContainsTextRequest request) throws IOException, InterruptedException {
|
||||||
@RequestPart(required = true, value = "fileInput") @Parameter(description = "The input PDF file to be converted to a PDF/A file", required = true) MultipartFile inputFile,
|
MultipartFile inputFile = request.getFileInput();
|
||||||
@Parameter(description = "The text to check for", required = true) String text,
|
String text = request.getText();
|
||||||
@Parameter(description = "The page number to check for text on accepts 'All', ranges like '1-4'", required = false) String pageNumber)
|
String pageNumber = request.getPageNumbers();
|
||||||
throws IOException, InterruptedException {
|
|
||||||
PDDocument pdfDocument = PDDocument.load(inputFile.getInputStream());
|
PDDocument pdfDocument = PDDocument.load(inputFile.getInputStream());
|
||||||
if (PdfUtils.hasText(pdfDocument, pageNumber, text))
|
if (PdfUtils.hasText(pdfDocument, pageNumber, text))
|
||||||
return WebResponseUtils.pdfDocToWebResponse(pdfDocument, inputFile.getOriginalFilename());
|
return WebResponseUtils.pdfDocToWebResponse(pdfDocument, inputFile.getOriginalFilename());
|
||||||
|
@ -38,10 +44,11 @@ public class FilterController {
|
||||||
// TODO
|
// TODO
|
||||||
@PostMapping(consumes = "multipart/form-data", value = "/filter-contains-image")
|
@PostMapping(consumes = "multipart/form-data", value = "/filter-contains-image")
|
||||||
@Operation(summary = "Checks if a PDF contains an image", description = "Input:PDF Output:Boolean Type:SISO")
|
@Operation(summary = "Checks if a PDF contains an image", description = "Input:PDF Output:Boolean Type:SISO")
|
||||||
public ResponseEntity<byte[]> containsImage(
|
public ResponseEntity<byte[]> containsImage(@ModelAttribute PDFWithPageNums request)
|
||||||
@RequestPart(required = true, value = "fileInput") @Parameter(description = "The input PDF file to be converted to a PDF/A file", required = true) MultipartFile inputFile,
|
|
||||||
@Parameter(description = "The page number to check for image on accepts 'All', ranges like '1-4'", required = false) String pageNumber)
|
|
||||||
throws IOException, InterruptedException {
|
throws IOException, InterruptedException {
|
||||||
|
MultipartFile inputFile = request.getFileInput();
|
||||||
|
String pageNumber = request.getPageNumbers();
|
||||||
|
|
||||||
PDDocument pdfDocument = PDDocument.load(inputFile.getInputStream());
|
PDDocument pdfDocument = PDDocument.load(inputFile.getInputStream());
|
||||||
if (PdfUtils.hasImages(pdfDocument, pageNumber))
|
if (PdfUtils.hasImages(pdfDocument, pageNumber))
|
||||||
return WebResponseUtils.pdfDocToWebResponse(pdfDocument, inputFile.getOriginalFilename());
|
return WebResponseUtils.pdfDocToWebResponse(pdfDocument, inputFile.getOriginalFilename());
|
||||||
|
@ -50,12 +57,10 @@ public class FilterController {
|
||||||
|
|
||||||
@PostMapping(consumes = "multipart/form-data", value = "/filter-page-count")
|
@PostMapping(consumes = "multipart/form-data", value = "/filter-page-count")
|
||||||
@Operation(summary = "Checks if a PDF is greater, less or equal to a setPageCount", description = "Input:PDF Output:Boolean Type:SISO")
|
@Operation(summary = "Checks if a PDF is greater, less or equal to a setPageCount", description = "Input:PDF Output:Boolean Type:SISO")
|
||||||
public ResponseEntity<byte[]> pageCount(
|
public ResponseEntity<byte[]> pageCount(@ModelAttribute PDFComparisonAndCount request) throws IOException, InterruptedException {
|
||||||
@RequestPart(required = true, value = "fileInput") @Parameter(description = "The input PDF file", required = true) MultipartFile inputFile,
|
MultipartFile inputFile = request.getFileInput();
|
||||||
@Parameter(description = "Page Count", required = true) String pageCount,
|
String pageCount = request.getPageCount();
|
||||||
@Parameter(description = "Comparison type", schema = @Schema(description = "The comparison type, accepts Greater, Equal, Less than", allowableValues = {
|
String comparator = request.getComparator();
|
||||||
"Greater", "Equal", "Less" })) String comparator)
|
|
||||||
throws IOException, InterruptedException {
|
|
||||||
// Load the PDF
|
// Load the PDF
|
||||||
PDDocument document = PDDocument.load(inputFile.getInputStream());
|
PDDocument document = PDDocument.load(inputFile.getInputStream());
|
||||||
int actualPageCount = document.getNumberOfPages();
|
int actualPageCount = document.getNumberOfPages();
|
||||||
|
@ -83,12 +88,10 @@ public class FilterController {
|
||||||
|
|
||||||
@PostMapping(consumes = "multipart/form-data", value = "/filter-page-size")
|
@PostMapping(consumes = "multipart/form-data", value = "/filter-page-size")
|
||||||
@Operation(summary = "Checks if a PDF is of a certain size", description = "Input:PDF Output:Boolean Type:SISO")
|
@Operation(summary = "Checks if a PDF is of a certain size", description = "Input:PDF Output:Boolean Type:SISO")
|
||||||
public ResponseEntity<byte[]> pageSize(
|
public ResponseEntity<byte[]> pageSize(@ModelAttribute PageSizeRequest request) throws IOException, InterruptedException {
|
||||||
@RequestPart(required = true, value = "fileInput") @Parameter(description = "The input PDF file", required = true) MultipartFile inputFile,
|
MultipartFile inputFile = request.getFileInput();
|
||||||
@Parameter(description = "Standard Page Size", required = true) String standardPageSize,
|
String standardPageSize = request.getStandardPageSize();
|
||||||
@Parameter(description = "Comparison type", schema = @Schema(description = "The comparison type, accepts Greater, Equal, Less than", allowableValues = {
|
String comparator = request.getComparator();
|
||||||
"Greater", "Equal", "Less" })) String comparator)
|
|
||||||
throws IOException, InterruptedException {
|
|
||||||
|
|
||||||
// Load the PDF
|
// Load the PDF
|
||||||
PDDocument document = PDDocument.load(inputFile.getInputStream());
|
PDDocument document = PDDocument.load(inputFile.getInputStream());
|
||||||
|
@ -126,12 +129,10 @@ public class FilterController {
|
||||||
|
|
||||||
@PostMapping(consumes = "multipart/form-data", value = "/filter-file-size")
|
@PostMapping(consumes = "multipart/form-data", value = "/filter-file-size")
|
||||||
@Operation(summary = "Checks if a PDF is a set file size", description = "Input:PDF Output:Boolean Type:SISO")
|
@Operation(summary = "Checks if a PDF is a set file size", description = "Input:PDF Output:Boolean Type:SISO")
|
||||||
public ResponseEntity<byte[]> fileSize(
|
public ResponseEntity<byte[]> fileSize(@ModelAttribute FileSizeRequest request) throws IOException, InterruptedException {
|
||||||
@RequestPart(required = true, value = "fileInput") @Parameter(description = "The input PDF file", required = true) MultipartFile inputFile,
|
MultipartFile inputFile = request.getFileInput();
|
||||||
@Parameter(description = "File Size", required = true) String fileSize,
|
String fileSize = request.getFileSize();
|
||||||
@Parameter(description = "Comparison type", schema = @Schema(description = "The comparison type, accepts Greater, Equal, Less than", allowableValues = {
|
String comparator = request.getComparator();
|
||||||
"Greater", "Equal", "Less" })) String comparator)
|
|
||||||
throws IOException, InterruptedException {
|
|
||||||
|
|
||||||
// Get the file size
|
// Get the file size
|
||||||
long actualFileSize = inputFile.getSize();
|
long actualFileSize = inputFile.getSize();
|
||||||
|
@ -159,12 +160,10 @@ public class FilterController {
|
||||||
|
|
||||||
@PostMapping(consumes = "multipart/form-data", value = "/filter-page-rotation")
|
@PostMapping(consumes = "multipart/form-data", value = "/filter-page-rotation")
|
||||||
@Operation(summary = "Checks if a PDF is of a certain rotation", description = "Input:PDF Output:Boolean Type:SISO")
|
@Operation(summary = "Checks if a PDF is of a certain rotation", description = "Input:PDF Output:Boolean Type:SISO")
|
||||||
public ResponseEntity<byte[]> pageRotation(
|
public ResponseEntity<byte[]> pageRotation(@ModelAttribute PageRotationRequest request) throws IOException, InterruptedException {
|
||||||
@RequestPart(required = true, value = "fileInput") @Parameter(description = "The input PDF file", required = true) MultipartFile inputFile,
|
MultipartFile inputFile = request.getFileInput();
|
||||||
@Parameter(description = "Rotation in degrees", required = true) int rotation,
|
int rotation = request.getRotation();
|
||||||
@Parameter(description = "Comparison type", schema = @Schema(description = "The comparison type, accepts Greater, Equal, Less than", allowableValues = {
|
String comparator = request.getComparator();
|
||||||
"Greater", "Equal", "Less" })) String comparator)
|
|
||||||
throws IOException, InterruptedException {
|
|
||||||
|
|
||||||
// Load the PDF
|
// Load the PDF
|
||||||
PDDocument document = PDDocument.load(inputFile.getInputStream());
|
PDDocument document = PDDocument.load(inputFile.getInputStream());
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
package stirling.software.SPDF.controller.api.other;
|
package stirling.software.SPDF.controller.api.misc;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
@ -11,18 +11,19 @@ import org.apache.pdfbox.text.TextPosition;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
import org.springframework.http.ResponseEntity;
|
import org.springframework.http.ResponseEntity;
|
||||||
|
import org.springframework.web.bind.annotation.ModelAttribute;
|
||||||
import org.springframework.web.bind.annotation.PostMapping;
|
import org.springframework.web.bind.annotation.PostMapping;
|
||||||
import org.springframework.web.bind.annotation.RequestParam;
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
import org.springframework.web.bind.annotation.RequestPart;
|
|
||||||
import org.springframework.web.bind.annotation.RestController;
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
import org.springframework.web.multipart.MultipartFile;
|
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.tags.Tag;
|
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||||
|
import stirling.software.SPDF.model.api.misc.ExtractHeaderRequest;
|
||||||
import stirling.software.SPDF.utils.WebResponseUtils;
|
import stirling.software.SPDF.utils.WebResponseUtils;
|
||||||
@RestController
|
@RestController
|
||||||
@Tag(name = "Other", description = "Other APIs")
|
@RequestMapping("/api/v1/misc")
|
||||||
|
@Tag(name = "Misc", description = "Miscellaneous APIs")
|
||||||
public class AutoRenameController {
|
public class AutoRenameController {
|
||||||
|
|
||||||
private static final Logger logger = LoggerFactory.getLogger(AutoRenameController.class);
|
private static final Logger logger = LoggerFactory.getLogger(AutoRenameController.class);
|
||||||
|
@ -32,10 +33,9 @@ public class AutoRenameController {
|
||||||
|
|
||||||
@PostMapping(consumes = "multipart/form-data", value = "/auto-rename")
|
@PostMapping(consumes = "multipart/form-data", value = "/auto-rename")
|
||||||
@Operation(summary = "Extract header from PDF file", description = "This endpoint accepts a PDF file and attempts to extract its title or header based on heuristics. Input:PDF Output:PDF Type:SISO")
|
@Operation(summary = "Extract header from PDF file", description = "This endpoint accepts a PDF file and attempts to extract its title or header based on heuristics. Input:PDF Output:PDF Type:SISO")
|
||||||
public ResponseEntity<byte[]> extractHeader(
|
public ResponseEntity<byte[]> extractHeader(@ModelAttribute ExtractHeaderRequest request) throws Exception {
|
||||||
@RequestPart(value = "fileInput") @Parameter(description = "The input PDF file from which the header is to be extracted.", required = true) MultipartFile file,
|
MultipartFile file = request.getFileInput();
|
||||||
@RequestParam(required = false, defaultValue = "false") @Parameter(description = "Flag indicating whether to use the first text as a fallback if no suitable title is found. Defaults to false.", required = false) Boolean useFirstTextAsFallback)
|
Boolean useFirstTextAsFallback = request.isUseFirstTextAsFallback();
|
||||||
throws Exception {
|
|
||||||
|
|
||||||
PDDocument document = PDDocument.load(file.getInputStream());
|
PDDocument document = PDDocument.load(file.getInputStream());
|
||||||
PDFTextStripper reader = new PDFTextStripper() {
|
PDFTextStripper reader = new PDFTextStripper() {
|
|
@ -1,4 +1,4 @@
|
||||||
package stirling.software.SPDF.controller.api.other;
|
package stirling.software.SPDF.controller.api.misc;
|
||||||
import java.awt.image.BufferedImage;
|
import java.awt.image.BufferedImage;
|
||||||
import java.awt.image.DataBufferByte;
|
import java.awt.image.DataBufferByte;
|
||||||
import java.awt.image.DataBufferInt;
|
import java.awt.image.DataBufferInt;
|
||||||
|
@ -16,8 +16,9 @@ import org.apache.pdfbox.pdmodel.PDDocument;
|
||||||
import org.apache.pdfbox.rendering.PDFRenderer;
|
import org.apache.pdfbox.rendering.PDFRenderer;
|
||||||
import org.springframework.http.MediaType;
|
import org.springframework.http.MediaType;
|
||||||
import org.springframework.http.ResponseEntity;
|
import org.springframework.http.ResponseEntity;
|
||||||
|
import org.springframework.web.bind.annotation.ModelAttribute;
|
||||||
import org.springframework.web.bind.annotation.PostMapping;
|
import org.springframework.web.bind.annotation.PostMapping;
|
||||||
import org.springframework.web.bind.annotation.RequestParam;
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
import org.springframework.web.bind.annotation.RestController;
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
import org.springframework.web.multipart.MultipartFile;
|
import org.springframework.web.multipart.MultipartFile;
|
||||||
|
|
||||||
|
@ -30,20 +31,22 @@ import com.google.zxing.Result;
|
||||||
import com.google.zxing.common.HybridBinarizer;
|
import com.google.zxing.common.HybridBinarizer;
|
||||||
|
|
||||||
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.tags.Tag;
|
||||||
|
import stirling.software.SPDF.model.api.misc.AutoSplitPdfRequest;
|
||||||
import stirling.software.SPDF.utils.WebResponseUtils;
|
import stirling.software.SPDF.utils.WebResponseUtils;
|
||||||
|
|
||||||
@RestController
|
@RestController
|
||||||
|
@RequestMapping("/api/v1/misc")
|
||||||
|
@Tag(name = "Misc", description = "Miscellaneous APIs")
|
||||||
public class AutoSplitPdfController {
|
public class AutoSplitPdfController {
|
||||||
|
|
||||||
private static final String QR_CONTENT = "https://github.com/Frooodle/Stirling-PDF";
|
private static final String QR_CONTENT = "https://github.com/Frooodle/Stirling-PDF";
|
||||||
|
|
||||||
@PostMapping(value = "/auto-split-pdf", consumes = "multipart/form-data")
|
@PostMapping(value = "/auto-split-pdf", consumes = "multipart/form-data")
|
||||||
@Operation(summary = "Auto split PDF pages into separate documents", description = "This endpoint accepts a PDF file, scans each page for a specific QR code, and splits the document at the QR code boundaries. The output is a zip file containing each separate PDF document. Input:PDF Output:ZIP Type:SISO")
|
@Operation(summary = "Auto split PDF pages into separate documents", description = "This endpoint accepts a PDF file, scans each page for a specific QR code, and splits the document at the QR code boundaries. The output is a zip file containing each separate PDF document. Input:PDF Output:ZIP Type:SISO")
|
||||||
public ResponseEntity<byte[]> autoSplitPdf(
|
public ResponseEntity<byte[]> autoSplitPdf(@ModelAttribute AutoSplitPdfRequest request) throws IOException {
|
||||||
@RequestParam("fileInput") @Parameter(description = "The input PDF file which needs to be split into separate documents based on QR code boundaries.", required = true) MultipartFile file,
|
MultipartFile file = request.getFileInput();
|
||||||
@RequestParam(value ="duplexMode",defaultValue = "false") @Parameter(description = "Flag indicating if the duplex mode is active, where the page after the divider also gets removed.", required = false) boolean duplexMode)
|
boolean duplexMode = request.isDuplexMode();
|
||||||
throws IOException {
|
|
||||||
|
|
||||||
InputStream inputStream = file.getInputStream();
|
InputStream inputStream = file.getInputStream();
|
||||||
PDDocument document = PDDocument.load(inputStream);
|
PDDocument document = PDDocument.load(inputStream);
|
|
@ -1,4 +1,4 @@
|
||||||
package stirling.software.SPDF.controller.api.other;
|
package stirling.software.SPDF.controller.api.misc;
|
||||||
|
|
||||||
import java.awt.image.BufferedImage;
|
import java.awt.image.BufferedImage;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
@ -20,22 +20,23 @@ import org.apache.pdfbox.rendering.PDFRenderer;
|
||||||
import org.apache.pdfbox.text.PDFTextStripper;
|
import org.apache.pdfbox.text.PDFTextStripper;
|
||||||
import org.springframework.http.HttpStatus;
|
import org.springframework.http.HttpStatus;
|
||||||
import org.springframework.http.ResponseEntity;
|
import org.springframework.http.ResponseEntity;
|
||||||
|
import org.springframework.web.bind.annotation.ModelAttribute;
|
||||||
import org.springframework.web.bind.annotation.PostMapping;
|
import org.springframework.web.bind.annotation.PostMapping;
|
||||||
import org.springframework.web.bind.annotation.RequestParam;
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
import org.springframework.web.bind.annotation.RequestPart;
|
|
||||||
import org.springframework.web.bind.annotation.RestController;
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
import org.springframework.web.multipart.MultipartFile;
|
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.tags.Tag;
|
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||||
|
import stirling.software.SPDF.model.api.misc.RemoveBlankPagesRequest;
|
||||||
import stirling.software.SPDF.utils.PdfUtils;
|
import stirling.software.SPDF.utils.PdfUtils;
|
||||||
import stirling.software.SPDF.utils.ProcessExecutor;
|
import stirling.software.SPDF.utils.ProcessExecutor;
|
||||||
import stirling.software.SPDF.utils.ProcessExecutor.ProcessExecutorResult;
|
import stirling.software.SPDF.utils.ProcessExecutor.ProcessExecutorResult;
|
||||||
import stirling.software.SPDF.utils.WebResponseUtils;
|
import stirling.software.SPDF.utils.WebResponseUtils;
|
||||||
|
|
||||||
@RestController
|
@RestController
|
||||||
@Tag(name = "Other", description = "Other APIs")
|
@RequestMapping("/api/v1/misc")
|
||||||
|
@Tag(name = "Misc", description = "Miscellaneous APIs")
|
||||||
public class BlankPageController {
|
public class BlankPageController {
|
||||||
|
|
||||||
@PostMapping(consumes = "multipart/form-data", value = "/remove-blanks")
|
@PostMapping(consumes = "multipart/form-data", value = "/remove-blanks")
|
||||||
|
@ -43,16 +44,10 @@ public class BlankPageController {
|
||||||
summary = "Remove blank pages from a PDF file",
|
summary = "Remove blank pages from a PDF file",
|
||||||
description = "This endpoint removes blank pages from a given PDF file. Users can specify the threshold and white percentage to tune the detection of blank pages. Input:PDF Output:PDF Type:SISO"
|
description = "This endpoint removes blank pages from a given PDF file. Users can specify the threshold and white percentage to tune the detection of blank pages. Input:PDF Output:PDF Type:SISO"
|
||||||
)
|
)
|
||||||
public ResponseEntity<byte[]> removeBlankPages(
|
public ResponseEntity<byte[]> removeBlankPages(@ModelAttribute RemoveBlankPagesRequest request) throws IOException, InterruptedException {
|
||||||
@RequestPart(required = true, value = "fileInput")
|
MultipartFile inputFile = request.getFileInput();
|
||||||
@Parameter(description = "The input PDF file from which blank pages will be removed", required = true)
|
int threshold = request.getThreshold();
|
||||||
MultipartFile inputFile,
|
float whitePercent = request.getWhitePercent();
|
||||||
@RequestParam(defaultValue = "10", name = "threshold")
|
|
||||||
@Parameter(description = "The threshold value to determine blank pages", example = "10")
|
|
||||||
int threshold,
|
|
||||||
@RequestParam(defaultValue = "99.9", name = "whitePercent")
|
|
||||||
@Parameter(description = "The percentage of white color on a page to consider it as blank", example = "99.9")
|
|
||||||
float whitePercent) throws IOException, InterruptedException {
|
|
||||||
|
|
||||||
PDDocument document = null;
|
PDDocument document = null;
|
||||||
try {
|
try {
|
|
@ -1,4 +1,4 @@
|
||||||
package stirling.software.SPDF.controller.api.other;
|
package stirling.software.SPDF.controller.api.misc;
|
||||||
|
|
||||||
import java.awt.Image;
|
import java.awt.Image;
|
||||||
import java.awt.image.BufferedImage;
|
import java.awt.image.BufferedImage;
|
||||||
|
@ -22,35 +22,34 @@ import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
import org.springframework.http.ResponseEntity;
|
import org.springframework.http.ResponseEntity;
|
||||||
|
import org.springframework.web.bind.annotation.ModelAttribute;
|
||||||
import org.springframework.web.bind.annotation.PostMapping;
|
import org.springframework.web.bind.annotation.PostMapping;
|
||||||
import org.springframework.web.bind.annotation.RequestParam;
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
import org.springframework.web.bind.annotation.RequestPart;
|
|
||||||
import org.springframework.web.bind.annotation.RestController;
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
import org.springframework.web.multipart.MultipartFile;
|
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.media.Schema;
|
|
||||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||||
|
import stirling.software.SPDF.model.api.misc.OptimizePdfRequest;
|
||||||
import stirling.software.SPDF.utils.GeneralUtils;
|
import stirling.software.SPDF.utils.GeneralUtils;
|
||||||
import stirling.software.SPDF.utils.ProcessExecutor;
|
import stirling.software.SPDF.utils.ProcessExecutor;
|
||||||
import stirling.software.SPDF.utils.ProcessExecutor.ProcessExecutorResult;
|
import stirling.software.SPDF.utils.ProcessExecutor.ProcessExecutorResult;
|
||||||
import stirling.software.SPDF.utils.WebResponseUtils;
|
import stirling.software.SPDF.utils.WebResponseUtils;
|
||||||
|
|
||||||
@RestController
|
@RestController
|
||||||
@Tag(name = "Other", description = "Other APIs")
|
@RequestMapping("/api/v1/misc")
|
||||||
|
@Tag(name = "Misc", description = "Miscellaneous APIs")
|
||||||
public class CompressController {
|
public class CompressController {
|
||||||
|
|
||||||
private static final Logger logger = LoggerFactory.getLogger(CompressController.class);
|
private static final Logger logger = LoggerFactory.getLogger(CompressController.class);
|
||||||
|
|
||||||
@PostMapping(consumes = "multipart/form-data", value = "/compress-pdf")
|
@PostMapping(consumes = "multipart/form-data", value = "/compress-pdf")
|
||||||
@Operation(summary = "Optimize PDF file", description = "This endpoint accepts a PDF file and optimizes it based on the provided parameters. Input:PDF Output:PDF Type:SISO")
|
@Operation(summary = "Optimize PDF file", description = "This endpoint accepts a PDF file and optimizes it based on the provided parameters. Input:PDF Output:PDF Type:SISO")
|
||||||
public ResponseEntity<byte[]> optimizePdf(
|
public ResponseEntity<byte[]> optimizePdf(@ModelAttribute OptimizePdfRequest request) throws Exception {
|
||||||
@RequestPart(value = "fileInput") @Parameter(description = "The input PDF file to be optimized.", required = true) MultipartFile inputFile,
|
MultipartFile inputFile = request.getFileInput();
|
||||||
@RequestParam(required = false, value = "optimizeLevel") @Parameter(description = "The level of optimization to apply to the PDF file. Higher values indicate greater compression but may reduce quality.", schema = @Schema(allowableValues = {
|
Integer optimizeLevel = request.getOptimizeLevel();
|
||||||
"1", "2", "3", "4", "5" })) Integer optimizeLevel,
|
String expectedOutputSizeString = request.getExpectedOutputSize();
|
||||||
@RequestParam(value = "expectedOutputSize", required = false) @Parameter(description = "The expected output size, e.g. '100MB', '25KB', etc.", required = false) String expectedOutputSizeString)
|
|
||||||
throws Exception {
|
|
||||||
|
|
||||||
if(expectedOutputSizeString == null && optimizeLevel == null) {
|
if(expectedOutputSizeString == null && optimizeLevel == null) {
|
||||||
throw new Exception("Both expected output size and optimize level are not specified");
|
throw new Exception("Both expected output size and optimize level are not specified");
|
|
@ -1,4 +1,4 @@
|
||||||
package stirling.software.SPDF.controller.api.other;
|
package stirling.software.SPDF.controller.api.misc;
|
||||||
|
|
||||||
import java.awt.image.BufferedImage;
|
import java.awt.image.BufferedImage;
|
||||||
import java.io.ByteArrayInputStream;
|
import java.io.ByteArrayInputStream;
|
||||||
|
@ -24,20 +24,21 @@ import org.slf4j.LoggerFactory;
|
||||||
import org.springframework.http.MediaType;
|
import org.springframework.http.MediaType;
|
||||||
import org.springframework.http.ResponseEntity;
|
import org.springframework.http.ResponseEntity;
|
||||||
import org.springframework.web.bind.annotation.PostMapping;
|
import org.springframework.web.bind.annotation.PostMapping;
|
||||||
import org.springframework.web.bind.annotation.RequestParam;
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
import org.springframework.web.bind.annotation.RequestPart;
|
|
||||||
import org.springframework.web.bind.annotation.RestController;
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
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.media.Content;
|
||||||
|
import io.swagger.v3.oas.annotations.media.Schema;
|
||||||
|
import io.swagger.v3.oas.annotations.parameters.RequestBody;
|
||||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||||
|
import stirling.software.SPDF.model.api.misc.ExtractImageScansRequest;
|
||||||
import stirling.software.SPDF.utils.ProcessExecutor;
|
import stirling.software.SPDF.utils.ProcessExecutor;
|
||||||
import stirling.software.SPDF.utils.ProcessExecutor.ProcessExecutorResult;
|
import stirling.software.SPDF.utils.ProcessExecutor.ProcessExecutorResult;
|
||||||
import stirling.software.SPDF.utils.WebResponseUtils;
|
import stirling.software.SPDF.utils.WebResponseUtils;
|
||||||
|
|
||||||
@RestController
|
@RestController
|
||||||
@Tag(name = "Other", description = "Other APIs")
|
@RequestMapping("/api/v1/misc")
|
||||||
|
@Tag(name = "Misc", description = "Miscellaneous APIs")
|
||||||
public class ExtractImageScansController {
|
public class ExtractImageScansController {
|
||||||
|
|
||||||
private static final Logger logger = LoggerFactory.getLogger(ExtractImageScansController.class);
|
private static final Logger logger = LoggerFactory.getLogger(ExtractImageScansController.class);
|
||||||
|
@ -46,26 +47,16 @@ public class ExtractImageScansController {
|
||||||
@Operation(summary = "Extract image scans from an input file",
|
@Operation(summary = "Extract image scans from an input file",
|
||||||
description = "This endpoint extracts image scans from a given file based on certain parameters. Users can specify angle threshold, tolerance, minimum area, minimum contour area, and border size. Input:PDF Output:IMAGE/ZIP Type:SIMO")
|
description = "This endpoint extracts image scans from a given file based on certain parameters. Users can specify angle threshold, tolerance, minimum area, minimum contour area, and border size. Input:PDF Output:IMAGE/ZIP Type:SIMO")
|
||||||
public ResponseEntity<byte[]> extractImageScans(
|
public ResponseEntity<byte[]> extractImageScans(
|
||||||
@RequestPart(required = true, value = "fileInput")
|
@RequestBody(
|
||||||
@Parameter(description = "The input file containing image scans")
|
description = "Form data containing file and extraction parameters",
|
||||||
MultipartFile inputFile,
|
required = true,
|
||||||
@RequestParam(name = "angle_threshold", defaultValue = "5")
|
content = @Content(
|
||||||
@Parameter(description = "The angle threshold for the image scan extraction", example = "5")
|
mediaType = "multipart/form-data",
|
||||||
int angleThreshold,
|
schema = @Schema(implementation = ExtractImageScansRequest.class) // This should represent your form's structure
|
||||||
@RequestParam(name = "tolerance", defaultValue = "20")
|
)
|
||||||
@Parameter(description = "The tolerance for the image scan extraction", example = "20")
|
)
|
||||||
int tolerance,
|
ExtractImageScansRequest form) throws IOException, InterruptedException {
|
||||||
@RequestParam(name = "min_area", defaultValue = "8000")
|
String fileName = form.getFileInput().getOriginalFilename();
|
||||||
@Parameter(description = "The minimum area for the image scan extraction", example = "8000")
|
|
||||||
int minArea,
|
|
||||||
@RequestParam(name = "min_contour_area", defaultValue = "500")
|
|
||||||
@Parameter(description = "The minimum contour area for the image scan extraction", example = "500")
|
|
||||||
int minContourArea,
|
|
||||||
@RequestParam(name = "border_size", defaultValue = "1")
|
|
||||||
@Parameter(description = "The border size for the image scan extraction", example = "1")
|
|
||||||
int borderSize) throws IOException, InterruptedException {
|
|
||||||
|
|
||||||
String fileName = inputFile.getOriginalFilename();
|
|
||||||
String extension = fileName.substring(fileName.lastIndexOf(".") + 1);
|
String extension = fileName.substring(fileName.lastIndexOf(".") + 1);
|
||||||
|
|
||||||
List<String> images = new ArrayList<>();
|
List<String> images = new ArrayList<>();
|
||||||
|
@ -73,7 +64,7 @@ public class ExtractImageScansController {
|
||||||
// Check if input file is a PDF
|
// Check if input file is a PDF
|
||||||
if (extension.equalsIgnoreCase("pdf")) {
|
if (extension.equalsIgnoreCase("pdf")) {
|
||||||
// Load PDF document
|
// Load PDF document
|
||||||
try (PDDocument document = PDDocument.load(new ByteArrayInputStream(inputFile.getBytes()))) {
|
try (PDDocument document = PDDocument.load(new ByteArrayInputStream(form.getFileInput().getBytes()))) {
|
||||||
PDFRenderer pdfRenderer = new PDFRenderer(document);
|
PDFRenderer pdfRenderer = new PDFRenderer(document);
|
||||||
int pageCount = document.getNumberOfPages();
|
int pageCount = document.getNumberOfPages();
|
||||||
images = new ArrayList<>();
|
images = new ArrayList<>();
|
||||||
|
@ -93,7 +84,7 @@ public class ExtractImageScansController {
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
Path tempInputFile = Files.createTempFile("input_", "." + extension);
|
Path tempInputFile = Files.createTempFile("input_", "." + extension);
|
||||||
Files.copy(inputFile.getInputStream(), tempInputFile, StandardCopyOption.REPLACE_EXISTING);
|
Files.copy(form.getFileInput().getInputStream(), tempInputFile, StandardCopyOption.REPLACE_EXISTING);
|
||||||
// Add input file path to images list
|
// Add input file path to images list
|
||||||
images.add(tempInputFile.toString());
|
images.add(tempInputFile.toString());
|
||||||
}
|
}
|
||||||
|
@ -109,11 +100,11 @@ public class ExtractImageScansController {
|
||||||
"./scripts/split_photos.py",
|
"./scripts/split_photos.py",
|
||||||
images.get(i),
|
images.get(i),
|
||||||
tempDir.toString(),
|
tempDir.toString(),
|
||||||
"--angle_threshold", String.valueOf(angleThreshold),
|
"--angle_threshold", String.valueOf(form.getAngleThreshold()),
|
||||||
"--tolerance", String.valueOf(tolerance),
|
"--tolerance", String.valueOf(form.getTolerance()),
|
||||||
"--min_area", String.valueOf(minArea),
|
"--min_area", String.valueOf(form.getMinArea()),
|
||||||
"--min_contour_area", String.valueOf(minContourArea),
|
"--min_contour_area", String.valueOf(form.getMinContourArea()),
|
||||||
"--border_size", String.valueOf(borderSize)
|
"--border_size", String.valueOf(form.getBorderSize())
|
||||||
));
|
));
|
||||||
|
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
package stirling.software.SPDF.controller.api.other;
|
package stirling.software.SPDF.controller.api.misc;
|
||||||
|
|
||||||
import java.awt.Graphics2D;
|
import java.awt.Graphics2D;
|
||||||
import java.awt.Image;
|
import java.awt.Image;
|
||||||
|
@ -20,19 +20,19 @@ import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
import org.springframework.http.MediaType;
|
import org.springframework.http.MediaType;
|
||||||
import org.springframework.http.ResponseEntity;
|
import org.springframework.http.ResponseEntity;
|
||||||
|
import org.springframework.web.bind.annotation.ModelAttribute;
|
||||||
import org.springframework.web.bind.annotation.PostMapping;
|
import org.springframework.web.bind.annotation.PostMapping;
|
||||||
import org.springframework.web.bind.annotation.RequestParam;
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
import org.springframework.web.bind.annotation.RequestPart;
|
|
||||||
import org.springframework.web.bind.annotation.RestController;
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
import org.springframework.web.multipart.MultipartFile;
|
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.media.Schema;
|
|
||||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||||
|
import stirling.software.SPDF.model.api.PDFWithImageFormatRequest;
|
||||||
import stirling.software.SPDF.utils.WebResponseUtils;
|
import stirling.software.SPDF.utils.WebResponseUtils;
|
||||||
@RestController
|
@RestController
|
||||||
@Tag(name = "Other", description = "Other APIs")
|
@RequestMapping("/api/v1/misc")
|
||||||
|
@Tag(name = "Misc", description = "Miscellaneous APIs")
|
||||||
public class ExtractImagesController {
|
public class ExtractImagesController {
|
||||||
|
|
||||||
private static final Logger logger = LoggerFactory.getLogger(ExtractImagesController.class);
|
private static final Logger logger = LoggerFactory.getLogger(ExtractImagesController.class);
|
||||||
|
@ -40,13 +40,9 @@ public class ExtractImagesController {
|
||||||
@PostMapping(consumes = "multipart/form-data", value = "/extract-images")
|
@PostMapping(consumes = "multipart/form-data", value = "/extract-images")
|
||||||
@Operation(summary = "Extract images from a PDF file",
|
@Operation(summary = "Extract images from a PDF file",
|
||||||
description = "This endpoint extracts images from a given PDF file and returns them in a zip file. Users can specify the output image format. Input:PDF Output:IMAGE/ZIP Type:SIMO")
|
description = "This endpoint extracts images from a given PDF file and returns them in a zip file. Users can specify the output image format. Input:PDF Output:IMAGE/ZIP Type:SIMO")
|
||||||
public ResponseEntity<byte[]> extractImages(
|
public ResponseEntity<byte[]> extractImages(@ModelAttribute PDFWithImageFormatRequest request) throws IOException {
|
||||||
@RequestPart(required = true, value = "fileInput")
|
MultipartFile file = request.getFileInput();
|
||||||
@Parameter(description = "The input PDF file containing images")
|
String format = request.getFormat();
|
||||||
MultipartFile file,
|
|
||||||
@RequestParam("format")
|
|
||||||
@Parameter(description = "The output image format e.g., 'png', 'jpeg', or 'gif'", schema = @Schema(allowableValues = {"png", "jpeg", "gif"}))
|
|
||||||
String format) throws IOException {
|
|
||||||
|
|
||||||
System.out.println(System.currentTimeMillis() + "file=" + file.getName() + ", format=" + format);
|
System.out.println(System.currentTimeMillis() + "file=" + file.getName() + ", format=" + format);
|
||||||
PDDocument document = PDDocument.load(file.getBytes());
|
PDDocument document = PDDocument.load(file.getBytes());
|
|
@ -1,4 +1,4 @@
|
||||||
package stirling.software.SPDF.controller.api.other;
|
package stirling.software.SPDF.controller.api.misc;
|
||||||
|
|
||||||
import java.awt.Color;
|
import java.awt.Color;
|
||||||
import java.awt.geom.AffineTransform;
|
import java.awt.geom.AffineTransform;
|
||||||
|
@ -30,19 +30,21 @@ import org.apache.pdfbox.rendering.PDFRenderer;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
import org.springframework.http.ResponseEntity;
|
import org.springframework.http.ResponseEntity;
|
||||||
|
import org.springframework.web.bind.annotation.ModelAttribute;
|
||||||
import org.springframework.web.bind.annotation.PostMapping;
|
import org.springframework.web.bind.annotation.PostMapping;
|
||||||
import org.springframework.web.bind.annotation.RequestPart;
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
import org.springframework.web.bind.annotation.RestController;
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
import org.springframework.web.multipart.MultipartFile;
|
import org.springframework.web.multipart.MultipartFile;
|
||||||
|
|
||||||
import io.swagger.v3.oas.annotations.Hidden;
|
import io.swagger.v3.oas.annotations.Hidden;
|
||||||
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.tags.Tag;
|
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||||
|
import stirling.software.SPDF.model.api.PDFFile;
|
||||||
import stirling.software.SPDF.utils.WebResponseUtils;
|
import stirling.software.SPDF.utils.WebResponseUtils;
|
||||||
|
|
||||||
@RestController
|
@RestController
|
||||||
@Tag(name = "Other", description = "Other APIs")
|
@RequestMapping("/api/v1/misc")
|
||||||
|
@Tag(name = "Misc", description = "Miscellaneous APIs")
|
||||||
public class FakeScanControllerWIP {
|
public class FakeScanControllerWIP {
|
||||||
|
|
||||||
private static final Logger logger = LoggerFactory.getLogger(FakeScanControllerWIP.class);
|
private static final Logger logger = LoggerFactory.getLogger(FakeScanControllerWIP.class);
|
||||||
|
@ -54,10 +56,8 @@ public class FakeScanControllerWIP {
|
||||||
summary = "Repair a PDF file",
|
summary = "Repair a PDF file",
|
||||||
description = "This endpoint repairs a given PDF file by running Ghostscript command. The PDF is first saved to a temporary location, repaired, read back, and then returned as a response."
|
description = "This endpoint repairs a given PDF file by running Ghostscript command. The PDF is first saved to a temporary location, repaired, read back, and then returned as a response."
|
||||||
)
|
)
|
||||||
public ResponseEntity<byte[]> repairPdf(
|
public ResponseEntity<byte[]> repairPdf(@ModelAttribute PDFFile request) throws IOException {
|
||||||
@RequestPart(required = true, value = "fileInput")
|
MultipartFile inputFile = request.getFileInput();
|
||||||
@Parameter(description = "The input PDF file to be repaired", required = true)
|
|
||||||
MultipartFile inputFile) throws IOException, InterruptedException {
|
|
||||||
|
|
||||||
PDDocument document = PDDocument.load(inputFile.getBytes());
|
PDDocument document = PDDocument.load(inputFile.getBytes());
|
||||||
PDFRenderer pdfRenderer = new PDFRenderer(document);
|
PDFRenderer pdfRenderer = new PDFRenderer(document);
|
|
@ -1,4 +1,4 @@
|
||||||
package stirling.software.SPDF.controller.api.other;
|
package stirling.software.SPDF.controller.api.misc;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.text.ParseException;
|
import java.text.ParseException;
|
||||||
|
@ -11,19 +11,20 @@ import org.apache.pdfbox.cos.COSName;
|
||||||
import org.apache.pdfbox.pdmodel.PDDocument;
|
import org.apache.pdfbox.pdmodel.PDDocument;
|
||||||
import org.apache.pdfbox.pdmodel.PDDocumentInformation;
|
import org.apache.pdfbox.pdmodel.PDDocumentInformation;
|
||||||
import org.springframework.http.ResponseEntity;
|
import org.springframework.http.ResponseEntity;
|
||||||
|
import org.springframework.web.bind.annotation.ModelAttribute;
|
||||||
import org.springframework.web.bind.annotation.PostMapping;
|
import org.springframework.web.bind.annotation.PostMapping;
|
||||||
import org.springframework.web.bind.annotation.RequestParam;
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
import org.springframework.web.bind.annotation.RequestPart;
|
|
||||||
import org.springframework.web.bind.annotation.RestController;
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
import org.springframework.web.multipart.MultipartFile;
|
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.tags.Tag;
|
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||||
|
import stirling.software.SPDF.model.api.misc.MetadataRequest;
|
||||||
import stirling.software.SPDF.utils.WebResponseUtils;
|
import stirling.software.SPDF.utils.WebResponseUtils;
|
||||||
|
|
||||||
@RestController
|
@RestController
|
||||||
@Tag(name = "Other", description = "Other APIs")
|
@RequestMapping("/api/v1/misc")
|
||||||
|
@Tag(name = "Misc", description = "Miscellaneous APIs")
|
||||||
public class MetadataController {
|
public class MetadataController {
|
||||||
|
|
||||||
|
|
||||||
|
@ -41,44 +42,28 @@ public class MetadataController {
|
||||||
@PostMapping(consumes = "multipart/form-data", value = "/update-metadata")
|
@PostMapping(consumes = "multipart/form-data", value = "/update-metadata")
|
||||||
@Operation(summary = "Update metadata of a PDF file",
|
@Operation(summary = "Update metadata of a PDF file",
|
||||||
description = "This endpoint allows you to update the metadata of a given PDF file. You can add, modify, or delete standard and custom metadata fields. Input:PDF Output:PDF Type:SISO")
|
description = "This endpoint allows you to update the metadata of a given PDF file. You can add, modify, or delete standard and custom metadata fields. Input:PDF Output:PDF Type:SISO")
|
||||||
public ResponseEntity<byte[]> metadata(
|
public ResponseEntity<byte[]> metadata(@ModelAttribute MetadataRequest request) throws IOException {
|
||||||
@RequestPart(required = true, value = "fileInput")
|
|
||||||
@Parameter(description = "The input PDF file to update metadata")
|
// Extract PDF file from the request object
|
||||||
MultipartFile pdfFile,
|
MultipartFile pdfFile = request.getFileInput();
|
||||||
@RequestParam(value = "deleteAll", required = false, defaultValue = "false")
|
|
||||||
@Parameter(description = "Delete all metadata if set to true")
|
|
||||||
Boolean deleteAll,
|
|
||||||
@RequestParam(value = "author", required = false)
|
|
||||||
@Parameter(description = "The author of the document")
|
|
||||||
String author,
|
|
||||||
@RequestParam(value = "creationDate", required = false)
|
|
||||||
@Parameter(description = "The creation date of the document (format: yyyy/MM/dd HH:mm:ss)")
|
|
||||||
String creationDate,
|
|
||||||
@RequestParam(value = "creator", required = false)
|
|
||||||
@Parameter(description = "The creator of the document")
|
|
||||||
String creator,
|
|
||||||
@RequestParam(value = "keywords", required = false)
|
|
||||||
@Parameter(description = "The keywords for the document")
|
|
||||||
String keywords,
|
|
||||||
@RequestParam(value = "modificationDate", required = false)
|
|
||||||
@Parameter(description = "The modification date of the document (format: yyyy/MM/dd HH:mm:ss)")
|
|
||||||
String modificationDate,
|
|
||||||
@RequestParam(value = "producer", required = false)
|
|
||||||
@Parameter(description = "The producer of the document")
|
|
||||||
String producer,
|
|
||||||
@RequestParam(value = "subject", required = false)
|
|
||||||
@Parameter(description = "The subject of the document")
|
|
||||||
String subject,
|
|
||||||
@RequestParam(value = "title", required = false)
|
|
||||||
@Parameter(description = "The title of the document")
|
|
||||||
String title,
|
|
||||||
@RequestParam(value = "trapped", required = false)
|
|
||||||
@Parameter(description = "The trapped status of the document")
|
|
||||||
String trapped,
|
|
||||||
@Parameter(description = "Map list of key and value of custom parameters, note these must start with customKey and customValue if they are non standard")
|
|
||||||
@RequestParam Map<String, String> allRequestParams)
|
|
||||||
throws IOException {
|
|
||||||
|
|
||||||
|
// Extract metadata information
|
||||||
|
Boolean deleteAll = request.isDeleteAll();
|
||||||
|
String author = request.getAuthor();
|
||||||
|
String creationDate = request.getCreationDate();
|
||||||
|
String creator = request.getCreator();
|
||||||
|
String keywords = request.getKeywords();
|
||||||
|
String modificationDate = request.getModificationDate();
|
||||||
|
String producer = request.getProducer();
|
||||||
|
String subject = request.getSubject();
|
||||||
|
String title = request.getTitle();
|
||||||
|
String trapped = request.getTrapped();
|
||||||
|
|
||||||
|
// Extract additional custom parameters
|
||||||
|
Map<String, String> allRequestParams = request.getAllRequestParams();
|
||||||
|
if(allRequestParams == null) {
|
||||||
|
allRequestParams = new java.util.HashMap<String, String>();
|
||||||
|
}
|
||||||
// Load the PDF file into a PDDocument
|
// Load the PDF file into a PDDocument
|
||||||
PDDocument document = PDDocument.load(pdfFile.getBytes());
|
PDDocument document = PDDocument.load(pdfFile.getBytes());
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
package stirling.software.SPDF.controller.api.other;
|
package stirling.software.SPDF.controller.api.misc;
|
||||||
|
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.FileOutputStream;
|
import java.io.FileOutputStream;
|
||||||
|
@ -18,22 +18,22 @@ import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
import org.springframework.http.MediaType;
|
import org.springframework.http.MediaType;
|
||||||
import org.springframework.http.ResponseEntity;
|
import org.springframework.http.ResponseEntity;
|
||||||
|
import org.springframework.web.bind.annotation.ModelAttribute;
|
||||||
import org.springframework.web.bind.annotation.PostMapping;
|
import org.springframework.web.bind.annotation.PostMapping;
|
||||||
import org.springframework.web.bind.annotation.RequestParam;
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
import org.springframework.web.bind.annotation.RequestPart;
|
|
||||||
import org.springframework.web.bind.annotation.RestController;
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
import org.springframework.web.multipart.MultipartFile;
|
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.media.Schema;
|
|
||||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||||
|
import stirling.software.SPDF.model.api.misc.ProcessPdfWithOcrRequest;
|
||||||
import stirling.software.SPDF.utils.ProcessExecutor;
|
import stirling.software.SPDF.utils.ProcessExecutor;
|
||||||
import stirling.software.SPDF.utils.ProcessExecutor.ProcessExecutorResult;
|
import stirling.software.SPDF.utils.ProcessExecutor.ProcessExecutorResult;
|
||||||
import stirling.software.SPDF.utils.WebResponseUtils;
|
import stirling.software.SPDF.utils.WebResponseUtils;
|
||||||
|
|
||||||
@RestController
|
@RestController
|
||||||
@Tag(name = "Other", description = "Other APIs")
|
@RequestMapping("/api/v1/misc")
|
||||||
|
@Tag(name = "Misc", description = "Miscellaneous APIs")
|
||||||
public class OCRController {
|
public class OCRController {
|
||||||
|
|
||||||
private static final Logger logger = LoggerFactory.getLogger(OCRController.class);
|
private static final Logger logger = LoggerFactory.getLogger(OCRController.class);
|
||||||
|
@ -51,35 +51,16 @@ public class OCRController {
|
||||||
@PostMapping(consumes = "multipart/form-data", value = "/ocr-pdf")
|
@PostMapping(consumes = "multipart/form-data", value = "/ocr-pdf")
|
||||||
@Operation(summary = "Process a PDF file with OCR",
|
@Operation(summary = "Process a PDF file with OCR",
|
||||||
description = "This endpoint processes a PDF file using OCR (Optical Character Recognition). Users can specify languages, sidecar, deskew, clean, cleanFinal, ocrType, ocrRenderType, and removeImagesAfter options. Input:PDF Output:PDF Type:SI-Conditional")
|
description = "This endpoint processes a PDF file using OCR (Optical Character Recognition). Users can specify languages, sidecar, deskew, clean, cleanFinal, ocrType, ocrRenderType, and removeImagesAfter options. Input:PDF Output:PDF Type:SI-Conditional")
|
||||||
public ResponseEntity<byte[]> processPdfWithOCR(
|
public ResponseEntity<byte[]> processPdfWithOCR(@ModelAttribute ProcessPdfWithOcrRequest request) throws IOException, InterruptedException {
|
||||||
@RequestPart(required = true, value = "fileInput")
|
MultipartFile inputFile = request.getFileInput();
|
||||||
@Parameter(description = "The input PDF file to be processed with OCR")
|
List<String> selectedLanguages = request.getLanguages();
|
||||||
MultipartFile inputFile,
|
Boolean sidecar = request.isSidecar();
|
||||||
@RequestParam("languages")
|
Boolean deskew = request.isDeskew();
|
||||||
@Parameter(description = "List of languages to use in OCR processing")
|
Boolean clean = request.isClean();
|
||||||
List<String> selectedLanguages,
|
Boolean cleanFinal = request.isCleanFinal();
|
||||||
@RequestParam(name = "sidecar", required = false)
|
String ocrType = request.getOcrType();
|
||||||
@Parameter(description = "Include OCR text in a sidecar text file if set to true")
|
String ocrRenderType = request.getOcrRenderType();
|
||||||
Boolean sidecar,
|
Boolean removeImagesAfter = request.isRemoveImagesAfter();
|
||||||
@RequestParam(name = "deskew", required = false)
|
|
||||||
@Parameter(description = "Deskew the input file if set to true")
|
|
||||||
Boolean deskew,
|
|
||||||
@RequestParam(name = "clean", required = false)
|
|
||||||
@Parameter(description = "Clean the input file if set to true")
|
|
||||||
Boolean clean,
|
|
||||||
@RequestParam(name = "clean-final", required = false)
|
|
||||||
@Parameter(description = "Clean the final output if set to true")
|
|
||||||
Boolean cleanFinal,
|
|
||||||
@RequestParam(name = "ocrType", required = false)
|
|
||||||
@Parameter(description = "Specify the OCR type, e.g., 'skip-text', 'force-ocr', or 'Normal'", schema = @Schema(allowableValues = {"skip-text", "force-ocr", "Normal"}))
|
|
||||||
String ocrType,
|
|
||||||
@RequestParam(name = "ocrRenderType", required = false, defaultValue = "hocr")
|
|
||||||
@Parameter(description = "Specify the OCR render type, either 'hocr' or 'sandwich'", schema = @Schema(allowableValues = {"hocr", "sandwich"}))
|
|
||||||
String ocrRenderType,
|
|
||||||
@RequestParam(name = "removeImagesAfter", required = false)
|
|
||||||
@Parameter(description = "Remove images from the output PDF if set to true")
|
|
||||||
Boolean removeImagesAfter) throws IOException, InterruptedException {
|
|
||||||
|
|
||||||
// --output-type pdfa
|
// --output-type pdfa
|
||||||
if (selectedLanguages == null || selectedLanguages.isEmpty()) {
|
if (selectedLanguages == null || selectedLanguages.isEmpty()) {
|
||||||
throw new IOException("Please select at least one language.");
|
throw new IOException("Please select at least one language.");
|
|
@ -1,4 +1,4 @@
|
||||||
package stirling.software.SPDF.controller.api.other;
|
package stirling.software.SPDF.controller.api.misc;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
|
||||||
|
@ -6,20 +6,21 @@ import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
import org.springframework.http.HttpStatus;
|
import org.springframework.http.HttpStatus;
|
||||||
import org.springframework.http.ResponseEntity;
|
import org.springframework.http.ResponseEntity;
|
||||||
|
import org.springframework.web.bind.annotation.ModelAttribute;
|
||||||
import org.springframework.web.bind.annotation.PostMapping;
|
import org.springframework.web.bind.annotation.PostMapping;
|
||||||
import org.springframework.web.bind.annotation.RequestParam;
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
import org.springframework.web.bind.annotation.RequestPart;
|
|
||||||
import org.springframework.web.bind.annotation.RestController;
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
import org.springframework.web.multipart.MultipartFile;
|
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.tags.Tag;
|
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||||
|
import stirling.software.SPDF.model.api.misc.OverlayImageRequest;
|
||||||
import stirling.software.SPDF.utils.PdfUtils;
|
import stirling.software.SPDF.utils.PdfUtils;
|
||||||
import stirling.software.SPDF.utils.WebResponseUtils;
|
import stirling.software.SPDF.utils.WebResponseUtils;
|
||||||
|
|
||||||
@RestController
|
@RestController
|
||||||
@Tag(name = "Other", description = "Other APIs")
|
@RequestMapping("/api/v1/misc")
|
||||||
|
@Tag(name = "Misc", description = "Miscellaneous APIs")
|
||||||
public class OverlayImageController {
|
public class OverlayImageController {
|
||||||
|
|
||||||
private static final Logger logger = LoggerFactory.getLogger(OverlayImageController.class);
|
private static final Logger logger = LoggerFactory.getLogger(OverlayImageController.class);
|
||||||
|
@ -29,22 +30,12 @@ public class OverlayImageController {
|
||||||
summary = "Overlay image onto a PDF file",
|
summary = "Overlay image onto a PDF file",
|
||||||
description = "This endpoint overlays an image onto a PDF file at the specified coordinates. The image can be overlaid on every page of the PDF if specified. Input:PDF/IMAGE Output:PDF Type:MF-SISO"
|
description = "This endpoint overlays an image onto a PDF file at the specified coordinates. The image can be overlaid on every page of the PDF if specified. Input:PDF/IMAGE Output:PDF Type:MF-SISO"
|
||||||
)
|
)
|
||||||
public ResponseEntity<byte[]> overlayImage(
|
public ResponseEntity<byte[]> overlayImage(@ModelAttribute OverlayImageRequest request) {
|
||||||
@RequestPart(required = true, value = "fileInput")
|
MultipartFile pdfFile = request.getFileInput();
|
||||||
@Parameter(description = "The input PDF file to overlay the image onto.", required = true)
|
MultipartFile imageFile = request.getImageFile();
|
||||||
MultipartFile pdfFile,
|
float x = request.getX();
|
||||||
@RequestParam("fileInput2")
|
float y = request.getY();
|
||||||
@Parameter(description = "The image file to be overlaid onto the PDF.", required = true)
|
boolean everyPage = request.isEveryPage();
|
||||||
MultipartFile imageFile,
|
|
||||||
@RequestParam("x")
|
|
||||||
@Parameter(description = "The x-coordinate at which to place the top-left corner of the image.", example = "0")
|
|
||||||
float x,
|
|
||||||
@RequestParam("y")
|
|
||||||
@Parameter(description = "The y-coordinate at which to place the top-left corner of the image.", example = "0")
|
|
||||||
float y,
|
|
||||||
@RequestParam("everyPage")
|
|
||||||
@Parameter(description = "Whether to overlay the image onto every page of the PDF.", example = "false")
|
|
||||||
boolean everyPage) {
|
|
||||||
try {
|
try {
|
||||||
byte[] pdfBytes = pdfFile.getBytes();
|
byte[] pdfBytes = pdfFile.getBytes();
|
||||||
byte[] imageBytes = imageFile.getBytes();
|
byte[] imageBytes = imageFile.getBytes();
|
|
@ -1,4 +1,4 @@
|
||||||
package stirling.software.SPDF.controller.api.other;
|
package stirling.software.SPDF.controller.api.misc;
|
||||||
|
|
||||||
import java.io.ByteArrayOutputStream;
|
import java.io.ByteArrayOutputStream;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
@ -13,34 +13,34 @@ import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
import org.springframework.http.MediaType;
|
import org.springframework.http.MediaType;
|
||||||
import org.springframework.http.ResponseEntity;
|
import org.springframework.http.ResponseEntity;
|
||||||
|
import org.springframework.web.bind.annotation.ModelAttribute;
|
||||||
import org.springframework.web.bind.annotation.PostMapping;
|
import org.springframework.web.bind.annotation.PostMapping;
|
||||||
import org.springframework.web.bind.annotation.RequestParam;
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
import org.springframework.web.bind.annotation.RestController;
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
import org.springframework.web.multipart.MultipartFile;
|
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.media.Schema;
|
|
||||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||||
|
import stirling.software.SPDF.model.api.misc.AddPageNumbersRequest;
|
||||||
import stirling.software.SPDF.utils.GeneralUtils;
|
import stirling.software.SPDF.utils.GeneralUtils;
|
||||||
import stirling.software.SPDF.utils.WebResponseUtils;
|
import stirling.software.SPDF.utils.WebResponseUtils;
|
||||||
|
|
||||||
@RestController
|
@RestController
|
||||||
@Tag(name = "Other", description = "Other APIs")
|
@RequestMapping("/api/v1/misc")
|
||||||
|
@Tag(name = "Misc", description = "Miscellaneous APIs")
|
||||||
public class PageNumbersController {
|
public class PageNumbersController {
|
||||||
|
|
||||||
private static final Logger logger = LoggerFactory.getLogger(PageNumbersController.class);
|
private static final Logger logger = LoggerFactory.getLogger(PageNumbersController.class);
|
||||||
|
|
||||||
@PostMapping(value = "/add-page-numbers", consumes = "multipart/form-data")
|
@PostMapping(value = "/add-page-numbers", consumes = "multipart/form-data")
|
||||||
@Operation(summary = "Add page numbers to a PDF document", description = "This operation takes an input PDF file and adds page numbers to it. Input:PDF Output:PDF Type:SISO")
|
@Operation(summary = "Add page numbers to a PDF document", description = "This operation takes an input PDF file and adds page numbers to it. Input:PDF Output:PDF Type:SISO")
|
||||||
public ResponseEntity<byte[]> addPageNumbers(
|
public ResponseEntity<byte[]> addPageNumbers(@ModelAttribute AddPageNumbersRequest request) throws IOException {
|
||||||
@Parameter(description = "The input PDF file", required = true) @RequestParam("fileInput") MultipartFile file,
|
MultipartFile file = request.getFileInput();
|
||||||
@Parameter(description = "Custom margin: small/medium/large", required = true, schema = @Schema(type = "string", allowableValues = {"small", "medium", "large"})) @RequestParam("customMargin") String customMargin,
|
String customMargin = request.getCustomMargin();
|
||||||
@Parameter(description = "Position: 1 of 9 positions", required = true, schema = @Schema(type = "integer", minimum = "1", maximum = "9")) @RequestParam("position") int position,
|
int position = request.getPosition();
|
||||||
@Parameter(description = "Starting number", required = true, schema = @Schema(type = "integer", minimum = "1")) @RequestParam("startingNumber") int startingNumber,
|
int startingNumber = request.getStartingNumber();
|
||||||
@Parameter(description = "Which pages to number, default all", required = false, schema = @Schema(type = "string")) @RequestParam(value = "pagesToNumber", required = false) String pagesToNumber,
|
String pagesToNumber = request.getPagesToNumber();
|
||||||
@Parameter(description = "Custom text: defaults to just number but can have things like \"Page {n} of {p}\"", required = false, schema = @Schema(type = "string")) @RequestParam(value = "customText", required = false) String customText)
|
String customText = request.getCustomText();
|
||||||
throws IOException {
|
|
||||||
int pageNumber = startingNumber;
|
int pageNumber = startingNumber;
|
||||||
byte[] fileBytes = file.getBytes();
|
byte[] fileBytes = file.getBytes();
|
||||||
PDDocument document = PDDocument.load(fileBytes);
|
PDDocument document = PDDocument.load(fileBytes);
|
|
@ -1,4 +1,4 @@
|
||||||
package stirling.software.SPDF.controller.api.other;
|
package stirling.software.SPDF.controller.api.misc;
|
||||||
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.nio.file.Files;
|
import java.nio.file.Files;
|
||||||
|
@ -9,20 +9,22 @@ import java.util.List;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
import org.springframework.http.ResponseEntity;
|
import org.springframework.http.ResponseEntity;
|
||||||
|
import org.springframework.web.bind.annotation.ModelAttribute;
|
||||||
import org.springframework.web.bind.annotation.PostMapping;
|
import org.springframework.web.bind.annotation.PostMapping;
|
||||||
import org.springframework.web.bind.annotation.RequestPart;
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
import org.springframework.web.bind.annotation.RestController;
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
import org.springframework.web.multipart.MultipartFile;
|
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.tags.Tag;
|
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||||
|
import stirling.software.SPDF.model.api.PDFFile;
|
||||||
import stirling.software.SPDF.utils.ProcessExecutor;
|
import stirling.software.SPDF.utils.ProcessExecutor;
|
||||||
import stirling.software.SPDF.utils.ProcessExecutor.ProcessExecutorResult;
|
import stirling.software.SPDF.utils.ProcessExecutor.ProcessExecutorResult;
|
||||||
import stirling.software.SPDF.utils.WebResponseUtils;
|
import stirling.software.SPDF.utils.WebResponseUtils;
|
||||||
|
|
||||||
@RestController
|
@RestController
|
||||||
@Tag(name = "Other", description = "Other APIs")
|
@RequestMapping("/api/v1/misc")
|
||||||
|
@Tag(name = "Misc", description = "Miscellaneous APIs")
|
||||||
public class RepairController {
|
public class RepairController {
|
||||||
|
|
||||||
private static final Logger logger = LoggerFactory.getLogger(RepairController.class);
|
private static final Logger logger = LoggerFactory.getLogger(RepairController.class);
|
||||||
|
@ -32,11 +34,8 @@ public class RepairController {
|
||||||
summary = "Repair a PDF file",
|
summary = "Repair a PDF file",
|
||||||
description = "This endpoint repairs a given PDF file by running Ghostscript command. The PDF is first saved to a temporary location, repaired, read back, and then returned as a response. Input:PDF Output:PDF Type:SISO"
|
description = "This endpoint repairs a given PDF file by running Ghostscript command. The PDF is first saved to a temporary location, repaired, read back, and then returned as a response. Input:PDF Output:PDF Type:SISO"
|
||||||
)
|
)
|
||||||
public ResponseEntity<byte[]> repairPdf(
|
public ResponseEntity<byte[]> repairPdf(@ModelAttribute PDFFile request) throws IOException, InterruptedException {
|
||||||
@RequestPart(required = true, value = "fileInput")
|
MultipartFile inputFile = request.getFileInput();
|
||||||
@Parameter(description = "The input PDF file to be repaired", required = true)
|
|
||||||
MultipartFile inputFile) throws IOException, InterruptedException {
|
|
||||||
|
|
||||||
// Save the uploaded file to a temporary location
|
// Save the uploaded file to a temporary location
|
||||||
Path tempInputFile = Files.createTempFile("input_", ".pdf");
|
Path tempInputFile = Files.createTempFile("input_", ".pdf");
|
||||||
inputFile.transferTo(tempInputFile.toFile());
|
inputFile.transferTo(tempInputFile.toFile());
|
|
@ -1,4 +1,4 @@
|
||||||
package stirling.software.SPDF.controller.api.other;
|
package stirling.software.SPDF.controller.api.misc;
|
||||||
|
|
||||||
import java.nio.charset.StandardCharsets;
|
import java.nio.charset.StandardCharsets;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
|
@ -9,22 +9,24 @@ import org.apache.pdfbox.pdmodel.interactive.action.PDActionJavaScript;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
import org.springframework.http.ResponseEntity;
|
import org.springframework.http.ResponseEntity;
|
||||||
|
import org.springframework.web.bind.annotation.ModelAttribute;
|
||||||
import org.springframework.web.bind.annotation.PostMapping;
|
import org.springframework.web.bind.annotation.PostMapping;
|
||||||
import org.springframework.web.bind.annotation.RequestPart;
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
import org.springframework.web.bind.annotation.RestController;
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
import org.springframework.web.multipart.MultipartFile;
|
import org.springframework.web.multipart.MultipartFile;
|
||||||
|
|
||||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||||
|
import stirling.software.SPDF.model.api.PDFFile;
|
||||||
import stirling.software.SPDF.utils.WebResponseUtils;
|
import stirling.software.SPDF.utils.WebResponseUtils;
|
||||||
@RestController
|
@RestController
|
||||||
@Tag(name = "Other", description = "Other APIs")
|
@RequestMapping("/api/v1/misc")
|
||||||
|
@Tag(name = "Misc", description = "Miscellaneous APIs")
|
||||||
public class ShowJavascript {
|
public class ShowJavascript {
|
||||||
|
|
||||||
private static final Logger logger = LoggerFactory.getLogger(ShowJavascript.class);
|
private static final Logger logger = LoggerFactory.getLogger(ShowJavascript.class);
|
||||||
@PostMapping(consumes = "multipart/form-data", value = "/show-javascript")
|
@PostMapping(consumes = "multipart/form-data", value = "/show-javascript")
|
||||||
public ResponseEntity<byte[]> extractHeader(
|
public ResponseEntity<byte[]> extractHeader(@ModelAttribute PDFFile request) throws Exception {
|
||||||
@RequestPart(value = "fileInput") MultipartFile inputFile) throws Exception {
|
MultipartFile inputFile = request.getFileInput();
|
||||||
|
|
||||||
String script = "";
|
String script = "";
|
||||||
|
|
||||||
try (PDDocument document = PDDocument.load(inputFile.getInputStream())) {
|
try (PDDocument document = PDDocument.load(inputFile.getInputStream())) {
|
|
@ -37,9 +37,9 @@ import org.springframework.http.ResponseEntity;
|
||||||
import org.springframework.scheduling.annotation.Scheduled;
|
import org.springframework.scheduling.annotation.Scheduled;
|
||||||
import org.springframework.util.LinkedMultiValueMap;
|
import org.springframework.util.LinkedMultiValueMap;
|
||||||
import org.springframework.util.MultiValueMap;
|
import org.springframework.util.MultiValueMap;
|
||||||
|
import org.springframework.web.bind.annotation.ModelAttribute;
|
||||||
import org.springframework.web.bind.annotation.PostMapping;
|
import org.springframework.web.bind.annotation.PostMapping;
|
||||||
import org.springframework.web.bind.annotation.RequestParam;
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
import org.springframework.web.bind.annotation.RequestPart;
|
|
||||||
import org.springframework.web.bind.annotation.RestController;
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
import org.springframework.web.client.RestTemplate;
|
import org.springframework.web.client.RestTemplate;
|
||||||
import org.springframework.web.multipart.MultipartFile;
|
import org.springframework.web.multipart.MultipartFile;
|
||||||
|
@ -51,9 +51,11 @@ import io.swagger.v3.oas.annotations.tags.Tag;
|
||||||
import stirling.software.SPDF.model.ApplicationProperties;
|
import stirling.software.SPDF.model.ApplicationProperties;
|
||||||
import stirling.software.SPDF.model.PipelineConfig;
|
import stirling.software.SPDF.model.PipelineConfig;
|
||||||
import stirling.software.SPDF.model.PipelineOperation;
|
import stirling.software.SPDF.model.PipelineOperation;
|
||||||
|
import stirling.software.SPDF.model.api.HandleDataRequest;
|
||||||
import stirling.software.SPDF.utils.WebResponseUtils;
|
import stirling.software.SPDF.utils.WebResponseUtils;
|
||||||
|
|
||||||
@RestController
|
@RestController
|
||||||
|
@RequestMapping("/api/v1/pipeline")
|
||||||
@Tag(name = "Pipeline", description = "Pipeline APIs")
|
@Tag(name = "Pipeline", description = "Pipeline APIs")
|
||||||
public class PipelineController {
|
public class PipelineController {
|
||||||
|
|
||||||
|
@ -418,8 +420,9 @@ public class PipelineController {
|
||||||
}
|
}
|
||||||
|
|
||||||
@PostMapping("/handleData")
|
@PostMapping("/handleData")
|
||||||
public ResponseEntity<byte[]> handleData(@RequestPart("fileInput") MultipartFile[] files,
|
public ResponseEntity<byte[]> handleData(@ModelAttribute HandleDataRequest request) {
|
||||||
@RequestParam("json") String jsonString) {
|
MultipartFile[] files = request.getFileInputs();
|
||||||
|
String jsonString = request.getJsonString();
|
||||||
logger.info("Received POST request to /handleData with {} files", files.length);
|
logger.info("Received POST request to /handleData with {} files", files.length);
|
||||||
try {
|
try {
|
||||||
List<Resource> outputFiles = handleFiles(files, jsonString);
|
List<Resource> outputFiles = handleFiles(files, jsonString);
|
||||||
|
|
|
@ -44,19 +44,19 @@ import org.bouncycastle.util.io.pem.PemReader;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
import org.springframework.http.ResponseEntity;
|
import org.springframework.http.ResponseEntity;
|
||||||
|
import org.springframework.web.bind.annotation.ModelAttribute;
|
||||||
import org.springframework.web.bind.annotation.PostMapping;
|
import org.springframework.web.bind.annotation.PostMapping;
|
||||||
import org.springframework.web.bind.annotation.RequestParam;
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
import org.springframework.web.bind.annotation.RequestPart;
|
|
||||||
import org.springframework.web.bind.annotation.RestController;
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
import org.springframework.web.multipart.MultipartFile;
|
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.media.Schema;
|
|
||||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||||
|
import stirling.software.SPDF.model.api.security.SignPDFWithCertRequest;
|
||||||
import stirling.software.SPDF.utils.WebResponseUtils;
|
import stirling.software.SPDF.utils.WebResponseUtils;
|
||||||
|
|
||||||
@RestController
|
@RestController
|
||||||
|
@RequestMapping("/api/v1/security")
|
||||||
@Tag(name = "Security", description = "Security APIs")
|
@Tag(name = "Security", description = "Security APIs")
|
||||||
public class CertSignController {
|
public class CertSignController {
|
||||||
|
|
||||||
|
@ -68,30 +68,18 @@ public class CertSignController {
|
||||||
|
|
||||||
@PostMapping(consumes = "multipart/form-data", value = "/cert-sign")
|
@PostMapping(consumes = "multipart/form-data", value = "/cert-sign")
|
||||||
@Operation(summary = "Sign PDF with a Digital Certificate", description = "This endpoint accepts a PDF file, a digital certificate and related information to sign the PDF. It then returns the digitally signed PDF file. Input:PDF Output:PDF Type:MF-SISO")
|
@Operation(summary = "Sign PDF with a Digital Certificate", description = "This endpoint accepts a PDF file, a digital certificate and related information to sign the PDF. It then returns the digitally signed PDF file. Input:PDF Output:PDF Type:MF-SISO")
|
||||||
public ResponseEntity<byte[]> signPDF2(
|
public ResponseEntity<byte[]> signPDFWithCert(@ModelAttribute SignPDFWithCertRequest request) throws Exception {
|
||||||
@RequestPart(required = true, value = "fileInput") @Parameter(description = "The input PDF file to be signed") MultipartFile pdf,
|
MultipartFile pdf = request.getFileInput();
|
||||||
|
String certType = request.getCertType();
|
||||||
@RequestParam(value = "certType", required = false) @Parameter(description = "The type of the digital certificate", schema = @Schema(allowableValues = {
|
MultipartFile privateKeyFile = request.getPrivateKeyFile();
|
||||||
"PKCS12", "PEM" })) String certType,
|
MultipartFile certFile = request.getCertFile();
|
||||||
|
MultipartFile p12File = request.getP12File();
|
||||||
@RequestParam(value = "key", required = false) @Parameter(description = "The private key for the digital certificate (required for PEM type certificates)") MultipartFile privateKeyFile,
|
String password = request.getPassword();
|
||||||
|
Boolean showSignature = request.isShowSignature();
|
||||||
@RequestParam(value = "cert", required = false) @Parameter(description = "The digital certificate (required for PEM type certificates)") MultipartFile certFile,
|
String reason = request.getReason();
|
||||||
|
String location = request.getLocation();
|
||||||
@RequestParam(value = "p12", required = false) @Parameter(description = "The PKCS12 keystore file (required for PKCS12 type certificates)") MultipartFile p12File,
|
String name = request.getName();
|
||||||
|
Integer pageNumber = request.getPageNumber();
|
||||||
@RequestParam(value = "password", required = false) @Parameter(description = "The password for the keystore or the private key") String password,
|
|
||||||
|
|
||||||
@RequestParam(value = "showSignature", required = false) @Parameter(description = "Whether to visually show the signature in the PDF file") Boolean showSignature,
|
|
||||||
|
|
||||||
@RequestParam(value = "reason", required = false) @Parameter(description = "The reason for signing the PDF") String reason,
|
|
||||||
|
|
||||||
@RequestParam(value = "location", required = false) @Parameter(description = "The location where the PDF is signed") String location,
|
|
||||||
|
|
||||||
@RequestParam(value = "name", required = false) @Parameter(description = "The name of the signer") String name,
|
|
||||||
|
|
||||||
@RequestParam(value = "pageNumber", required = false) @Parameter(description = "The page number where the signature should be visible. This is required if showSignature is set to true") Integer pageNumber)
|
|
||||||
throws Exception {
|
|
||||||
|
|
||||||
PrivateKey privateKey = null;
|
PrivateKey privateKey = null;
|
||||||
X509Certificate cert = null;
|
X509Certificate cert = null;
|
||||||
|
|
|
@ -60,8 +60,9 @@ import org.apache.xmpbox.xml.XmpParsingException;
|
||||||
import org.apache.xmpbox.xml.XmpSerializer;
|
import org.apache.xmpbox.xml.XmpSerializer;
|
||||||
import org.springframework.http.MediaType;
|
import org.springframework.http.MediaType;
|
||||||
import org.springframework.http.ResponseEntity;
|
import org.springframework.http.ResponseEntity;
|
||||||
|
import org.springframework.web.bind.annotation.ModelAttribute;
|
||||||
import org.springframework.web.bind.annotation.PostMapping;
|
import org.springframework.web.bind.annotation.PostMapping;
|
||||||
import org.springframework.web.bind.annotation.RequestPart;
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
import org.springframework.web.bind.annotation.RestController;
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
import org.springframework.web.multipart.MultipartFile;
|
import org.springframework.web.multipart.MultipartFile;
|
||||||
|
|
||||||
|
@ -70,10 +71,11 @@ import com.fasterxml.jackson.databind.node.ArrayNode;
|
||||||
import com.fasterxml.jackson.databind.node.ObjectNode;
|
import com.fasterxml.jackson.databind.node.ObjectNode;
|
||||||
|
|
||||||
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.tags.Tag;
|
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||||
|
import stirling.software.SPDF.model.api.PDFFile;
|
||||||
import stirling.software.SPDF.utils.WebResponseUtils;
|
import stirling.software.SPDF.utils.WebResponseUtils;
|
||||||
@RestController
|
@RestController
|
||||||
|
@RequestMapping("/api/v1/security")
|
||||||
@Tag(name = "Security", description = "Security APIs")
|
@Tag(name = "Security", description = "Security APIs")
|
||||||
public class GetInfoOnPDF {
|
public class GetInfoOnPDF {
|
||||||
|
|
||||||
|
@ -81,11 +83,9 @@ public class GetInfoOnPDF {
|
||||||
|
|
||||||
@PostMapping(consumes = "multipart/form-data", value = "/get-info-on-pdf")
|
@PostMapping(consumes = "multipart/form-data", value = "/get-info-on-pdf")
|
||||||
@Operation(summary = "Summary here", description = "desc. Input:PDF Output:JSON Type:SISO")
|
@Operation(summary = "Summary here", description = "desc. Input:PDF Output:JSON Type:SISO")
|
||||||
public ResponseEntity<byte[]> getPdfInfo(
|
public ResponseEntity<byte[]> getPdfInfo(@ModelAttribute PDFFile request)
|
||||||
@RequestPart(required = true, value = "fileInput")
|
|
||||||
@Parameter(description = "The input PDF file to get info on", required = true) MultipartFile inputFile)
|
|
||||||
throws IOException {
|
throws IOException {
|
||||||
|
MultipartFile inputFile = request.getFileInput();
|
||||||
try (
|
try (
|
||||||
PDDocument pdfBoxDoc = PDDocument.load(inputFile.getInputStream());
|
PDDocument pdfBoxDoc = PDDocument.load(inputFile.getInputStream());
|
||||||
) {
|
) {
|
||||||
|
|
|
@ -8,18 +8,19 @@ import org.apache.pdfbox.pdmodel.encryption.StandardProtectionPolicy;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
import org.springframework.http.ResponseEntity;
|
import org.springframework.http.ResponseEntity;
|
||||||
|
import org.springframework.web.bind.annotation.ModelAttribute;
|
||||||
import org.springframework.web.bind.annotation.PostMapping;
|
import org.springframework.web.bind.annotation.PostMapping;
|
||||||
import org.springframework.web.bind.annotation.RequestParam;
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
import org.springframework.web.bind.annotation.RequestPart;
|
|
||||||
import org.springframework.web.bind.annotation.RestController;
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
import org.springframework.web.multipart.MultipartFile;
|
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.media.Schema;
|
|
||||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||||
|
import stirling.software.SPDF.model.api.security.AddPasswordRequest;
|
||||||
|
import stirling.software.SPDF.model.api.security.PDFPasswordRequest;
|
||||||
import stirling.software.SPDF.utils.WebResponseUtils;
|
import stirling.software.SPDF.utils.WebResponseUtils;
|
||||||
@RestController
|
@RestController
|
||||||
|
@RequestMapping("/api/v1/security")
|
||||||
@Tag(name = "Security", description = "Security APIs")
|
@Tag(name = "Security", description = "Security APIs")
|
||||||
public class PasswordController {
|
public class PasswordController {
|
||||||
|
|
||||||
|
@ -31,13 +32,12 @@ public class PasswordController {
|
||||||
summary = "Remove password from a PDF file",
|
summary = "Remove password from a PDF file",
|
||||||
description = "This endpoint removes the password from a protected PDF file. Users need to provide the existing password. Input:PDF Output:PDF Type:SISO"
|
description = "This endpoint removes the password from a protected PDF file. Users need to provide the existing password. Input:PDF Output:PDF Type:SISO"
|
||||||
)
|
)
|
||||||
public ResponseEntity<byte[]> removePassword(
|
public ResponseEntity<byte[]> removePassword(@ModelAttribute PDFPasswordRequest request) throws IOException {
|
||||||
@RequestPart(required = true, value = "fileInput")
|
MultipartFile fileInput = request.getFileInput();
|
||||||
@Parameter(description = "The input PDF file from which the password should be removed", required = true)
|
String password = request.getPassword();
|
||||||
MultipartFile fileInput,
|
|
||||||
@RequestParam(name = "password")
|
|
||||||
@Parameter(description = "The password of the PDF file", required = true)
|
|
||||||
String password) throws IOException {
|
|
||||||
PDDocument document = PDDocument.load(fileInput.getBytes(), password);
|
PDDocument document = PDDocument.load(fileInput.getBytes(), password);
|
||||||
document.setAllSecurityToBeRemoved(true);
|
document.setAllSecurityToBeRemoved(true);
|
||||||
return WebResponseUtils.pdfDocToWebResponse(document, fileInput.getOriginalFilename().replaceFirst("[.][^.]+$", "") + "_password_removed.pdf");
|
return WebResponseUtils.pdfDocToWebResponse(document, fileInput.getOriginalFilename().replaceFirst("[.][^.]+$", "") + "_password_removed.pdf");
|
||||||
|
@ -48,44 +48,19 @@ public class PasswordController {
|
||||||
summary = "Add password to a PDF file",
|
summary = "Add password to a PDF file",
|
||||||
description = "This endpoint adds password protection to a PDF file. Users can specify a set of permissions that should be applied to the file. Input:PDF Output:PDF"
|
description = "This endpoint adds password protection to a PDF file. Users can specify a set of permissions that should be applied to the file. Input:PDF Output:PDF"
|
||||||
)
|
)
|
||||||
public ResponseEntity<byte[]> addPassword(
|
public ResponseEntity<byte[]> addPassword(@ModelAttribute AddPasswordRequest request) throws IOException {
|
||||||
@RequestPart(required = true, value = "fileInput")
|
MultipartFile fileInput = request.getFileInput();
|
||||||
@Parameter(description = "The input PDF file to which the password should be added", required = true)
|
String ownerPassword = request.getOwnerPassword();
|
||||||
MultipartFile fileInput,
|
String password = request.getPassword();
|
||||||
@RequestParam(value = "", name = "ownerPassword", required = false, defaultValue = "")
|
int keyLength = request.getKeyLength();
|
||||||
@Parameter(description = "The owner password to be added to the PDF file (Restricts what can be done with the document once it is opened)")
|
boolean canAssembleDocument = request.isCanAssembleDocument();
|
||||||
String ownerPassword,
|
boolean canExtractContent = request.isCanExtractContent();
|
||||||
@RequestParam( name = "password", required = false, defaultValue = "")
|
boolean canExtractForAccessibility = request.isCanExtractForAccessibility();
|
||||||
@Parameter(description = "The password to be added to the PDF file (Restricts the opening of the document itself.)")
|
boolean canFillInForm = request.isCanFillInForm();
|
||||||
String password,
|
boolean canModify = request.isCanModify();
|
||||||
@RequestParam( name = "keyLength", required = false, defaultValue = "256")
|
boolean canModifyAnnotations = request.isCanModifyAnnotations();
|
||||||
@Parameter(description = "The length of the encryption key", schema = @Schema(allowableValues = {"40", "128", "256"}))
|
boolean canPrint = request.isCanPrint();
|
||||||
int keyLength,
|
boolean canPrintFaithful = request.isCanPrintFaithful();
|
||||||
@RequestParam( name = "canAssembleDocument", required = false)
|
|
||||||
@Parameter(description = "Whether the document assembly is allowed", example = "false")
|
|
||||||
boolean canAssembleDocument,
|
|
||||||
@RequestParam( name = "canExtractContent", required = false)
|
|
||||||
@Parameter(description = "Whether content extraction for accessibility is allowed", example = "false")
|
|
||||||
boolean canExtractContent,
|
|
||||||
@RequestParam( name = "canExtractForAccessibility", required = false)
|
|
||||||
@Parameter(description = "Whether content extraction for accessibility is allowed", example = "false")
|
|
||||||
boolean canExtractForAccessibility,
|
|
||||||
@RequestParam( name = "canFillInForm", required = false)
|
|
||||||
@Parameter(description = "Whether form filling is allowed", example = "false")
|
|
||||||
boolean canFillInForm,
|
|
||||||
@RequestParam( name = "canModify", required = false)
|
|
||||||
@Parameter(description = "Whether the document modification is allowed", example = "false")
|
|
||||||
boolean canModify,
|
|
||||||
@RequestParam( name = "canModifyAnnotations", required = false)
|
|
||||||
@Parameter(description = "Whether modification of annotations is allowed", example = "false")
|
|
||||||
boolean canModifyAnnotations,
|
|
||||||
@RequestParam(name = "canPrint", required = false)
|
|
||||||
@Parameter(description = "Whether printing of the document is allowed", example = "false")
|
|
||||||
boolean canPrint,
|
|
||||||
@RequestParam( name = "canPrintFaithful", required = false)
|
|
||||||
@Parameter(description = "Whether faithful printing is allowed", example = "false")
|
|
||||||
boolean canPrintFaithful
|
|
||||||
) throws IOException {
|
|
||||||
|
|
||||||
PDDocument document = PDDocument.load(fileInput.getBytes());
|
PDDocument document = PDDocument.load(fileInput.getBytes());
|
||||||
AccessPermission ap = new AccessPermission();
|
AccessPermission ap = new AccessPermission();
|
||||||
|
|
|
@ -18,19 +18,20 @@ import org.apache.pdfbox.rendering.PDFRenderer;
|
||||||
import org.slf4j.Logger;
|
import org.slf4j.Logger;
|
||||||
import org.slf4j.LoggerFactory;
|
import org.slf4j.LoggerFactory;
|
||||||
import org.springframework.http.ResponseEntity;
|
import org.springframework.http.ResponseEntity;
|
||||||
|
import org.springframework.web.bind.annotation.ModelAttribute;
|
||||||
import org.springframework.web.bind.annotation.PostMapping;
|
import org.springframework.web.bind.annotation.PostMapping;
|
||||||
import org.springframework.web.bind.annotation.RequestParam;
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
import org.springframework.web.bind.annotation.RestController;
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
import org.springframework.web.multipart.MultipartFile;
|
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.media.Schema;
|
|
||||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||||
import stirling.software.SPDF.model.PDFText;
|
import stirling.software.SPDF.model.PDFText;
|
||||||
|
import stirling.software.SPDF.model.api.security.RedactPdfRequest;
|
||||||
import stirling.software.SPDF.pdf.TextFinder;
|
import stirling.software.SPDF.pdf.TextFinder;
|
||||||
import stirling.software.SPDF.utils.WebResponseUtils;
|
import stirling.software.SPDF.utils.WebResponseUtils;
|
||||||
@RestController
|
@RestController
|
||||||
|
@RequestMapping("/api/v1/security")
|
||||||
@Tag(name = "Security", description = "Security APIs")
|
@Tag(name = "Security", description = "Security APIs")
|
||||||
public class RedactController {
|
public class RedactController {
|
||||||
|
|
||||||
|
@ -40,14 +41,14 @@ public class RedactController {
|
||||||
@PostMapping(value = "/auto-redact", consumes = "multipart/form-data")
|
@PostMapping(value = "/auto-redact", consumes = "multipart/form-data")
|
||||||
@Operation(summary = "Redacts listOfText in a PDF document",
|
@Operation(summary = "Redacts listOfText in a PDF document",
|
||||||
description = "This operation takes an input PDF file and redacts the provided listOfText. Input:PDF, Output:PDF, Type:SISO")
|
description = "This operation takes an input PDF file and redacts the provided listOfText. Input:PDF, Output:PDF, Type:SISO")
|
||||||
public ResponseEntity<byte[]> redactPdf(
|
public ResponseEntity<byte[]> redactPdf(@ModelAttribute RedactPdfRequest request) throws Exception {
|
||||||
@Parameter(description = "The input PDF file", required = true) @RequestParam("fileInput") MultipartFile file,
|
MultipartFile file = request.getFileInput();
|
||||||
@Parameter(description = "List of listOfText to redact from the PDF", required = true, schema = @Schema(type = "string")) @RequestParam("listOfText") String listOfTextString,
|
String listOfTextString = request.getListOfText();
|
||||||
@RequestParam(value = "useRegex", required = false) boolean useRegex,
|
boolean useRegex = request.isUseRegex();
|
||||||
@RequestParam(value = "wholeWordSearch", required = false) boolean wholeWordSearchBool,
|
boolean wholeWordSearchBool = request.isWholeWordSearch();
|
||||||
@RequestParam(value = "redactColor", required = false, defaultValue = "#000000") String colorString,
|
String colorString = request.getRedactColor();
|
||||||
@RequestParam(value = "customPadding", required = false) float customPadding,
|
float customPadding = request.getCustomPadding();
|
||||||
@RequestParam(value = "convertPDFToImage", required = false) boolean convertPDFToImage) throws Exception {
|
boolean convertPDFToImage = request.isConvertPDFToImage();
|
||||||
|
|
||||||
System.out.println(listOfTextString);
|
System.out.println(listOfTextString);
|
||||||
String[] listOfText = listOfTextString.split("\n");
|
String[] listOfText = listOfTextString.split("\n");
|
||||||
|
|
|
@ -20,41 +20,32 @@ import org.apache.pdfbox.pdmodel.interactive.annotation.PDAnnotationWidget;
|
||||||
import org.apache.pdfbox.pdmodel.interactive.form.PDAcroForm;
|
import org.apache.pdfbox.pdmodel.interactive.form.PDAcroForm;
|
||||||
import org.apache.pdfbox.pdmodel.interactive.form.PDField;
|
import org.apache.pdfbox.pdmodel.interactive.form.PDField;
|
||||||
import org.springframework.http.ResponseEntity;
|
import org.springframework.http.ResponseEntity;
|
||||||
|
import org.springframework.web.bind.annotation.ModelAttribute;
|
||||||
import org.springframework.web.bind.annotation.PostMapping;
|
import org.springframework.web.bind.annotation.PostMapping;
|
||||||
import org.springframework.web.bind.annotation.RequestParam;
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
import org.springframework.web.bind.annotation.RequestPart;
|
|
||||||
import org.springframework.web.bind.annotation.RestController;
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
import org.springframework.web.multipart.MultipartFile;
|
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.tags.Tag;
|
||||||
|
import stirling.software.SPDF.model.api.security.SanitizePdfRequest;
|
||||||
import stirling.software.SPDF.utils.WebResponseUtils;
|
import stirling.software.SPDF.utils.WebResponseUtils;
|
||||||
|
|
||||||
@RestController
|
@RestController
|
||||||
|
@RequestMapping("/api/v1/security")
|
||||||
|
@Tag(name = "Security", description = "Security APIs")
|
||||||
public class SanitizeController {
|
public class SanitizeController {
|
||||||
|
|
||||||
@PostMapping(consumes = "multipart/form-data", value = "/sanitize-pdf")
|
@PostMapping(consumes = "multipart/form-data", value = "/sanitize-pdf")
|
||||||
@Operation(summary = "Sanitize a PDF file",
|
@Operation(summary = "Sanitize a PDF file",
|
||||||
description = "This endpoint processes a PDF file and removes specific elements based on the provided options. Input:PDF Output:PDF Type:SISO")
|
description = "This endpoint processes a PDF file and removes specific elements based on the provided options. Input:PDF Output:PDF Type:SISO")
|
||||||
public ResponseEntity<byte[]> sanitizePDF(
|
public ResponseEntity<byte[]> sanitizePDF(@ModelAttribute SanitizePdfRequest request) throws IOException {
|
||||||
@RequestPart(required = true, value = "fileInput")
|
MultipartFile inputFile = request.getFileInput();
|
||||||
@Parameter(description = "The input PDF file to be sanitized")
|
boolean removeJavaScript = request.isRemoveJavaScript();
|
||||||
MultipartFile inputFile,
|
boolean removeEmbeddedFiles = request.isRemoveEmbeddedFiles();
|
||||||
@RequestParam(name = "removeJavaScript", required = false, defaultValue = "false")
|
boolean removeMetadata = request.isRemoveMetadata();
|
||||||
@Parameter(description = "Remove JavaScript actions from the PDF if set to true")
|
boolean removeLinks = request.isRemoveLinks();
|
||||||
Boolean removeJavaScript,
|
boolean removeFonts = request.isRemoveFonts();
|
||||||
@RequestParam(name = "removeEmbeddedFiles", required = false, defaultValue = "false")
|
|
||||||
@Parameter(description = "Remove embedded files from the PDF if set to true")
|
|
||||||
Boolean removeEmbeddedFiles,
|
|
||||||
@RequestParam(name = "removeMetadata", required = false, defaultValue = "false")
|
|
||||||
@Parameter(description = "Remove metadata from the PDF if set to true")
|
|
||||||
Boolean removeMetadata,
|
|
||||||
@RequestParam(name = "removeLinks", required = false, defaultValue = "false")
|
|
||||||
@Parameter(description = "Remove links from the PDF if set to true")
|
|
||||||
Boolean removeLinks,
|
|
||||||
@RequestParam(name = "removeFonts", required = false, defaultValue = "false")
|
|
||||||
@Parameter(description = "Remove fonts from the PDF if set to true")
|
|
||||||
Boolean removeFonts) throws IOException {
|
|
||||||
|
|
||||||
try (PDDocument document = PDDocument.load(inputFile.getInputStream())) {
|
try (PDDocument document = PDDocument.load(inputFile.getInputStream())) {
|
||||||
if (removeJavaScript) {
|
if (removeJavaScript) {
|
||||||
|
|
|
@ -22,40 +22,35 @@ import org.apache.pdfbox.pdmodel.graphics.state.PDExtendedGraphicsState;
|
||||||
import org.apache.pdfbox.util.Matrix;
|
import org.apache.pdfbox.util.Matrix;
|
||||||
import org.springframework.core.io.ClassPathResource;
|
import org.springframework.core.io.ClassPathResource;
|
||||||
import org.springframework.http.ResponseEntity;
|
import org.springframework.http.ResponseEntity;
|
||||||
|
import org.springframework.web.bind.annotation.ModelAttribute;
|
||||||
import org.springframework.web.bind.annotation.PostMapping;
|
import org.springframework.web.bind.annotation.PostMapping;
|
||||||
import org.springframework.web.bind.annotation.RequestParam;
|
import org.springframework.web.bind.annotation.RequestMapping;
|
||||||
import org.springframework.web.bind.annotation.RequestPart;
|
|
||||||
import org.springframework.web.bind.annotation.RestController;
|
import org.springframework.web.bind.annotation.RestController;
|
||||||
import org.springframework.web.multipart.MultipartFile;
|
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.media.Schema;
|
|
||||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||||
|
import stirling.software.SPDF.model.api.security.AddWatermarkRequest;
|
||||||
import stirling.software.SPDF.utils.WebResponseUtils;
|
import stirling.software.SPDF.utils.WebResponseUtils;
|
||||||
|
|
||||||
@RestController
|
@RestController
|
||||||
|
@RequestMapping("/api/v1/security")
|
||||||
@Tag(name = "Security", description = "Security APIs")
|
@Tag(name = "Security", description = "Security APIs")
|
||||||
public class WatermarkController {
|
public class WatermarkController {
|
||||||
|
|
||||||
@PostMapping(consumes = "multipart/form-data", value = "/add-watermark")
|
@PostMapping(consumes = "multipart/form-data", value = "/add-watermark")
|
||||||
@Operation(summary = "Add watermark to a PDF file", description = "This endpoint adds a watermark to a given PDF file. Users can specify the watermark type (text or image), rotation, opacity, width spacer, and height spacer. Input:PDF Output:PDF Type:SISO")
|
@Operation(summary = "Add watermark to a PDF file", description = "This endpoint adds a watermark to a given PDF file. Users can specify the watermark type (text or image), rotation, opacity, width spacer, and height spacer. Input:PDF Output:PDF Type:SISO")
|
||||||
public ResponseEntity<byte[]> addWatermark(
|
public ResponseEntity<byte[]> addWatermark(@ModelAttribute AddWatermarkRequest request) throws IOException, Exception {
|
||||||
@RequestPart(required = true, value = "fileInput") @Parameter(description = "The input PDF file to add a watermark") MultipartFile pdfFile,
|
MultipartFile pdfFile = request.getFileInput();
|
||||||
@RequestParam(required = true) @Parameter(description = "The watermark type (text or image)") String watermarkType,
|
String watermarkType = request.getWatermarkType();
|
||||||
@RequestParam(required = false) @Parameter(description = "The watermark text") String watermarkText,
|
String watermarkText = request.getWatermarkText();
|
||||||
@RequestPart(required = false) @Parameter(description = "The watermark image") MultipartFile watermarkImage,
|
MultipartFile watermarkImage = request.getWatermarkImage();
|
||||||
|
String alphabet = request.getAlphabet();
|
||||||
@RequestParam(defaultValue = "roman", name = "alphabet") @Parameter(description = "The selected alphabet",
|
float fontSize = request.getFontSize();
|
||||||
schema = @Schema(type = "string",
|
float rotation = request.getRotation();
|
||||||
allowableValues = {"roman","arabic","japanese","korean","chinese"},
|
float opacity = request.getOpacity();
|
||||||
defaultValue = "roman")) String alphabet,
|
int widthSpacer = request.getWidthSpacer();
|
||||||
@RequestParam(defaultValue = "30", name = "fontSize") @Parameter(description = "The font size of the watermark text", example = "30") float fontSize,
|
int heightSpacer = request.getHeightSpacer();
|
||||||
@RequestParam(defaultValue = "0", name = "rotation") @Parameter(description = "The rotation of the watermark in degrees", example = "0") float rotation,
|
|
||||||
@RequestParam(defaultValue = "0.5", name = "opacity") @Parameter(description = "The opacity of the watermark (0.0 - 1.0)", example = "0.5") float opacity,
|
|
||||||
@RequestParam(defaultValue = "50", name = "widthSpacer") @Parameter(description = "The width spacer between watermark elements", example = "50") int widthSpacer,
|
|
||||||
@RequestParam(defaultValue = "50", name = "heightSpacer") @Parameter(description = "The height spacer between watermark elements", example = "50") int heightSpacer)
|
|
||||||
throws IOException, Exception {
|
|
||||||
|
|
||||||
// Load the input PDF
|
// Load the input PDF
|
||||||
PDDocument document = PDDocument.load(pdfFile.getInputStream());
|
PDDocument document = PDDocument.load(pdfFile.getInputStream());
|
||||||
|
|
|
@ -21,6 +21,7 @@ import org.springframework.stereotype.Controller;
|
||||||
import org.springframework.ui.Model;
|
import org.springframework.ui.Model;
|
||||||
import org.springframework.web.bind.annotation.GetMapping;
|
import org.springframework.web.bind.annotation.GetMapping;
|
||||||
|
|
||||||
|
import com.fasterxml.jackson.core.type.TypeReference;
|
||||||
import com.fasterxml.jackson.databind.ObjectMapper;
|
import com.fasterxml.jackson.databind.ObjectMapper;
|
||||||
|
|
||||||
import io.swagger.v3.oas.annotations.Hidden;
|
import io.swagger.v3.oas.annotations.Hidden;
|
||||||
|
@ -51,7 +52,8 @@ public class GeneralWebController {
|
||||||
}
|
}
|
||||||
List<Map<String, String>> pipelineConfigsWithNames = new ArrayList<>();
|
List<Map<String, String>> pipelineConfigsWithNames = new ArrayList<>();
|
||||||
for (String config : pipelineConfigs) {
|
for (String config : pipelineConfigs) {
|
||||||
Map<String, Object> jsonContent = new ObjectMapper().readValue(config, Map.class);
|
Map<String, Object> jsonContent = new ObjectMapper().readValue(config, new TypeReference<Map<String, Object>>(){});
|
||||||
|
|
||||||
String name = (String) jsonContent.get("name");
|
String name = (String) jsonContent.get("name");
|
||||||
Map<String, String> configWithName = new HashMap<>();
|
Map<String, String> configWithName = new HashMap<>();
|
||||||
configWithName.put("json", config);
|
configWithName.put("json", config);
|
||||||
|
@ -138,6 +140,23 @@ public class GeneralWebController {
|
||||||
return "sign";
|
return "sign";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@GetMapping("/multi-page-layout")
|
||||||
|
@Hidden
|
||||||
|
public String multiPageLayoutForm(Model model) {
|
||||||
|
model.addAttribute("currentPage", "multi-page-layout");
|
||||||
|
return "multi-page-layout";
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@GetMapping("/scale-pages")
|
||||||
|
@Hidden
|
||||||
|
public String scalePagesFrom(Model model) {
|
||||||
|
model.addAttribute("currentPage", "scale-pages");
|
||||||
|
return "scale-pages";
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
@Autowired
|
@Autowired
|
||||||
private ResourceLoader resourceLoader;
|
private ResourceLoader resourceLoader;
|
||||||
|
|
||||||
|
|
|
@ -15,19 +15,19 @@ import io.swagger.v3.oas.annotations.Hidden;
|
||||||
import io.swagger.v3.oas.annotations.tags.Tag;
|
import io.swagger.v3.oas.annotations.tags.Tag;
|
||||||
|
|
||||||
@Controller
|
@Controller
|
||||||
@Tag(name = "Other", description = "Other APIs")
|
@Tag(name = "Misc", description = "Miscellaneous APIs")
|
||||||
public class OtherWebController {
|
public class OtherWebController {
|
||||||
@GetMapping("/compress-pdf")
|
@GetMapping("/compress-pdf")
|
||||||
@Hidden
|
@Hidden
|
||||||
public String compressPdfForm(Model model) {
|
public String compressPdfForm(Model model) {
|
||||||
model.addAttribute("currentPage", "compress-pdf");
|
model.addAttribute("currentPage", "compress-pdf");
|
||||||
return "other/compress-pdf";
|
return "misc/compress-pdf";
|
||||||
}
|
}
|
||||||
|
|
||||||
@GetMapping("/extract-image-scans")
|
@GetMapping("/extract-image-scans")
|
||||||
@Hidden
|
@Hidden
|
||||||
public ModelAndView extractImageScansForm() {
|
public ModelAndView extractImageScansForm() {
|
||||||
ModelAndView modelAndView = new ModelAndView("other/extract-image-scans");
|
ModelAndView modelAndView = new ModelAndView("misc/extract-image-scans");
|
||||||
modelAndView.addObject("currentPage", "extract-image-scans");
|
modelAndView.addObject("currentPage", "extract-image-scans");
|
||||||
return modelAndView;
|
return modelAndView;
|
||||||
}
|
}
|
||||||
|
@ -36,7 +36,7 @@ public class OtherWebController {
|
||||||
@Hidden
|
@Hidden
|
||||||
public String extractJavascriptForm(Model model) {
|
public String extractJavascriptForm(Model model) {
|
||||||
model.addAttribute("currentPage", "show-javascript");
|
model.addAttribute("currentPage", "show-javascript");
|
||||||
return "other/show-javascript";
|
return "misc/show-javascript";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -44,21 +44,21 @@ public class OtherWebController {
|
||||||
@Hidden
|
@Hidden
|
||||||
public String addPageNumbersForm(Model model) {
|
public String addPageNumbersForm(Model model) {
|
||||||
model.addAttribute("currentPage", "add-page-numbers");
|
model.addAttribute("currentPage", "add-page-numbers");
|
||||||
return "other/add-page-numbers";
|
return "misc/add-page-numbers";
|
||||||
}
|
}
|
||||||
|
|
||||||
@GetMapping("/extract-images")
|
@GetMapping("/extract-images")
|
||||||
@Hidden
|
@Hidden
|
||||||
public String extractImagesForm(Model model) {
|
public String extractImagesForm(Model model) {
|
||||||
model.addAttribute("currentPage", "extract-images");
|
model.addAttribute("currentPage", "extract-images");
|
||||||
return "other/extract-images";
|
return "misc/extract-images";
|
||||||
}
|
}
|
||||||
|
|
||||||
@GetMapping("/flatten")
|
@GetMapping("/flatten")
|
||||||
@Hidden
|
@Hidden
|
||||||
public String flattenForm(Model model) {
|
public String flattenForm(Model model) {
|
||||||
model.addAttribute("currentPage", "flatten");
|
model.addAttribute("currentPage", "flatten");
|
||||||
return "other/flatten";
|
return "misc/flatten";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@ -67,14 +67,14 @@ public class OtherWebController {
|
||||||
@Hidden
|
@Hidden
|
||||||
public String addWatermarkForm(Model model) {
|
public String addWatermarkForm(Model model) {
|
||||||
model.addAttribute("currentPage", "change-metadata");
|
model.addAttribute("currentPage", "change-metadata");
|
||||||
return "other/change-metadata";
|
return "misc/change-metadata";
|
||||||
}
|
}
|
||||||
|
|
||||||
@GetMapping("/compare")
|
@GetMapping("/compare")
|
||||||
@Hidden
|
@Hidden
|
||||||
public String compareForm(Model model) {
|
public String compareForm(Model model) {
|
||||||
model.addAttribute("currentPage", "compare");
|
model.addAttribute("currentPage", "compare");
|
||||||
return "other/compare";
|
return "misc/compare";
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<String> getAvailableTesseractLanguages() {
|
public List<String> getAvailableTesseractLanguages() {
|
||||||
|
@ -90,7 +90,7 @@ public class OtherWebController {
|
||||||
@GetMapping("/ocr-pdf")
|
@GetMapping("/ocr-pdf")
|
||||||
@Hidden
|
@Hidden
|
||||||
public ModelAndView ocrPdfPage() {
|
public ModelAndView ocrPdfPage() {
|
||||||
ModelAndView modelAndView = new ModelAndView("other/ocr-pdf");
|
ModelAndView modelAndView = new ModelAndView("misc/ocr-pdf");
|
||||||
List<String> languages = getAvailableTesseractLanguages();
|
List<String> languages = getAvailableTesseractLanguages();
|
||||||
Collections.sort(languages);
|
Collections.sort(languages);
|
||||||
modelAndView.addObject("languages", languages);
|
modelAndView.addObject("languages", languages);
|
||||||
|
@ -103,56 +103,43 @@ public class OtherWebController {
|
||||||
@Hidden
|
@Hidden
|
||||||
public String overlayImage(Model model) {
|
public String overlayImage(Model model) {
|
||||||
model.addAttribute("currentPage", "add-image");
|
model.addAttribute("currentPage", "add-image");
|
||||||
return "other/add-image";
|
return "misc/add-image";
|
||||||
}
|
}
|
||||||
|
|
||||||
@GetMapping("/adjust-contrast")
|
@GetMapping("/adjust-contrast")
|
||||||
@Hidden
|
@Hidden
|
||||||
public String contrast(Model model) {
|
public String contrast(Model model) {
|
||||||
model.addAttribute("currentPage", "adjust-contrast");
|
model.addAttribute("currentPage", "adjust-contrast");
|
||||||
return "other/adjust-contrast";
|
return "misc/adjust-contrast";
|
||||||
}
|
}
|
||||||
|
|
||||||
@GetMapping("/repair")
|
@GetMapping("/repair")
|
||||||
@Hidden
|
@Hidden
|
||||||
public String repairForm(Model model) {
|
public String repairForm(Model model) {
|
||||||
model.addAttribute("currentPage", "repair");
|
model.addAttribute("currentPage", "repair");
|
||||||
return "other/repair";
|
return "misc/repair";
|
||||||
}
|
}
|
||||||
|
|
||||||
@GetMapping("/remove-blanks")
|
@GetMapping("/remove-blanks")
|
||||||
@Hidden
|
@Hidden
|
||||||
public String removeBlanksForm(Model model) {
|
public String removeBlanksForm(Model model) {
|
||||||
model.addAttribute("currentPage", "remove-blanks");
|
model.addAttribute("currentPage", "remove-blanks");
|
||||||
return "other/remove-blanks";
|
return "misc/remove-blanks";
|
||||||
}
|
|
||||||
|
|
||||||
@GetMapping("/multi-page-layout")
|
|
||||||
@Hidden
|
|
||||||
public String multiPageLayoutForm(Model model) {
|
|
||||||
model.addAttribute("currentPage", "multi-page-layout");
|
|
||||||
return "other/multi-page-layout";
|
|
||||||
}
|
|
||||||
|
|
||||||
@GetMapping("/scale-pages")
|
|
||||||
@Hidden
|
|
||||||
public String scalePagesFrom(Model model) {
|
|
||||||
model.addAttribute("currentPage", "scale-pages");
|
|
||||||
return "other/scale-pages";
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@GetMapping("/auto-crop")
|
@GetMapping("/auto-crop")
|
||||||
@Hidden
|
@Hidden
|
||||||
public String autoCropForm(Model model) {
|
public String autoCropForm(Model model) {
|
||||||
model.addAttribute("currentPage", "auto-crop");
|
model.addAttribute("currentPage", "auto-crop");
|
||||||
return "other/auto-crop";
|
return "misc/auto-crop";
|
||||||
}
|
}
|
||||||
|
|
||||||
@GetMapping("/auto-rename")
|
@GetMapping("/auto-rename")
|
||||||
@Hidden
|
@Hidden
|
||||||
public String autoRenameForm(Model model) {
|
public String autoRenameForm(Model model) {
|
||||||
model.addAttribute("currentPage", "auto-rename");
|
model.addAttribute("currentPage", "auto-rename");
|
||||||
return "other/auto-rename";
|
return "misc/auto-rename";
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,4 @@
|
||||||
|
package stirling.software.SPDF.model;
|
||||||
|
public enum SortTypes {
|
||||||
|
REVERSE_ORDER, DUPLEX_SORT, BOOKLET_SORT, SIDE_STITCH_BOOKLET_SORT, ODD_EVEN_SPLIT, REMOVE_FIRST, REMOVE_LAST, REMOVE_FIRST_AND_LAST,
|
||||||
|
}
|
|
@ -0,0 +1,17 @@
|
||||||
|
package stirling.software.SPDF.model.api;
|
||||||
|
|
||||||
|
import org.springframework.web.multipart.MultipartFile;
|
||||||
|
|
||||||
|
import io.swagger.v3.oas.annotations.media.Schema;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.EqualsAndHashCode;
|
||||||
|
import lombok.NoArgsConstructor;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
@EqualsAndHashCode
|
||||||
|
@NoArgsConstructor
|
||||||
|
public class GeneralFile {
|
||||||
|
|
||||||
|
@Schema(description = "The input file")
|
||||||
|
private MultipartFile fileInput;
|
||||||
|
}
|
|
@ -0,0 +1,20 @@
|
||||||
|
package stirling.software.SPDF.model.api;
|
||||||
|
|
||||||
|
import org.springframework.web.multipart.MultipartFile;
|
||||||
|
|
||||||
|
import io.swagger.v3.oas.annotations.media.Schema;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.EqualsAndHashCode;
|
||||||
|
import lombok.NoArgsConstructor;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
@NoArgsConstructor
|
||||||
|
@EqualsAndHashCode
|
||||||
|
public class HandleDataRequest {
|
||||||
|
|
||||||
|
@Schema(description = "The input files")
|
||||||
|
private MultipartFile[] fileInputs;
|
||||||
|
|
||||||
|
@Schema(description = "JSON String")
|
||||||
|
private String jsonString;
|
||||||
|
}
|
|
@ -0,0 +1,16 @@
|
||||||
|
package stirling.software.SPDF.model.api;
|
||||||
|
|
||||||
|
import org.springframework.web.multipart.MultipartFile;
|
||||||
|
|
||||||
|
import io.swagger.v3.oas.annotations.media.Schema;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.EqualsAndHashCode;
|
||||||
|
import lombok.NoArgsConstructor;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
@NoArgsConstructor
|
||||||
|
@EqualsAndHashCode
|
||||||
|
public class ImageFile {
|
||||||
|
@Schema(description = "The input image file")
|
||||||
|
private MultipartFile fileInput;
|
||||||
|
}
|
|
@ -0,0 +1,15 @@
|
||||||
|
package stirling.software.SPDF.model.api;
|
||||||
|
|
||||||
|
import org.springframework.web.multipart.MultipartFile;
|
||||||
|
|
||||||
|
import io.swagger.v3.oas.annotations.media.Schema;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.EqualsAndHashCode;
|
||||||
|
import lombok.NoArgsConstructor;
|
||||||
|
@Data
|
||||||
|
@NoArgsConstructor
|
||||||
|
@EqualsAndHashCode
|
||||||
|
public class MultiplePDFFiles {
|
||||||
|
@Schema(description = "The input PDF files", type = "array", format = "binary")
|
||||||
|
private MultipartFile[] fileInput;
|
||||||
|
}
|
|
@ -0,0 +1,16 @@
|
||||||
|
package stirling.software.SPDF.model.api;
|
||||||
|
|
||||||
|
import io.swagger.v3.oas.annotations.media.Schema;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.EqualsAndHashCode;
|
||||||
|
import lombok.NoArgsConstructor;
|
||||||
|
@Data
|
||||||
|
@NoArgsConstructor
|
||||||
|
@EqualsAndHashCode(callSuper=true)
|
||||||
|
public class PDFComparison extends PDFFile {
|
||||||
|
|
||||||
|
@Schema(description = "The comparison type, accepts Greater, Equal, Less than", allowableValues = {
|
||||||
|
"Greater", "Equal", "Less" })
|
||||||
|
private String comparator;
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,15 @@
|
||||||
|
package stirling.software.SPDF.model.api;
|
||||||
|
|
||||||
|
import io.swagger.v3.oas.annotations.media.Schema;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.EqualsAndHashCode;
|
||||||
|
import lombok.NoArgsConstructor;
|
||||||
|
@Data
|
||||||
|
@NoArgsConstructor
|
||||||
|
@EqualsAndHashCode(callSuper=true)
|
||||||
|
public class PDFComparisonAndCount extends PDFComparison {
|
||||||
|
@Schema(description = "Count")
|
||||||
|
private String pageCount;
|
||||||
|
|
||||||
|
|
||||||
|
}
|
13
src/main/java/stirling/software/SPDF/model/api/PDFFile.java
Normal file
13
src/main/java/stirling/software/SPDF/model/api/PDFFile.java
Normal file
|
@ -0,0 +1,13 @@
|
||||||
|
package stirling.software.SPDF.model.api;
|
||||||
|
|
||||||
|
import org.springframework.web.multipart.MultipartFile;
|
||||||
|
|
||||||
|
import io.swagger.v3.oas.annotations.media.Schema;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.EqualsAndHashCode;
|
||||||
|
@Data
|
||||||
|
@EqualsAndHashCode
|
||||||
|
public class PDFFile {
|
||||||
|
@Schema(description = "The input PDF file")
|
||||||
|
private MultipartFile fileInput;
|
||||||
|
}
|
|
@ -0,0 +1,14 @@
|
||||||
|
package stirling.software.SPDF.model.api;
|
||||||
|
|
||||||
|
import io.swagger.v3.oas.annotations.media.Schema;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.EqualsAndHashCode;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
@EqualsAndHashCode(callSuper=true)
|
||||||
|
public class PDFWithImageFormatRequest extends PDFFile {
|
||||||
|
|
||||||
|
@Schema(description = "The output image format e.g., 'png', 'jpeg', or 'gif'",
|
||||||
|
allowableValues = { "png", "jpeg", "gif" })
|
||||||
|
private String format;
|
||||||
|
}
|
|
@ -0,0 +1,39 @@
|
||||||
|
package stirling.software.SPDF.model.api;
|
||||||
|
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import org.apache.pdfbox.pdmodel.PDDocument;
|
||||||
|
|
||||||
|
import io.swagger.v3.oas.annotations.media.Schema;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.EqualsAndHashCode;
|
||||||
|
import lombok.NoArgsConstructor;
|
||||||
|
import stirling.software.SPDF.utils.GeneralUtils;
|
||||||
|
@Data
|
||||||
|
@NoArgsConstructor
|
||||||
|
@EqualsAndHashCode(callSuper=true)
|
||||||
|
public class PDFWithPageNums extends PDFFile {
|
||||||
|
|
||||||
|
@Schema(description = "The pages to select, Supports ranges (e.g., '1,3,5-9'), or 'all' or functions in the format 'an+b' where 'a' is the multiplier of the page number 'n', and 'b' is a constant (e.g., '2n+1', '3n', '6n-5')\"")
|
||||||
|
private String pageNumbers;
|
||||||
|
|
||||||
|
|
||||||
|
public List<Integer> getPageNumbersList(){
|
||||||
|
int pageCount = 0;
|
||||||
|
try {
|
||||||
|
pageCount = PDDocument.load(getFileInput().getInputStream()).getNumberOfPages();
|
||||||
|
} catch (IOException e) {
|
||||||
|
// TODO Auto-generated catch block
|
||||||
|
e.printStackTrace();
|
||||||
|
}
|
||||||
|
return GeneralUtils.parsePageString(pageNumbers, pageCount);
|
||||||
|
|
||||||
|
}
|
||||||
|
public List<Integer> getPageNumbersList(PDDocument doc){
|
||||||
|
int pageCount = 0;
|
||||||
|
pageCount = doc.getNumberOfPages();
|
||||||
|
return GeneralUtils.parsePageString(pageNumbers, pageCount);
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,16 @@
|
||||||
|
package stirling.software.SPDF.model.api;
|
||||||
|
|
||||||
|
import io.swagger.v3.oas.annotations.media.Schema;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.EqualsAndHashCode;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
@EqualsAndHashCode(callSuper=true)
|
||||||
|
public class PDFWithPageSize extends PDFFile {
|
||||||
|
|
||||||
|
@Schema(description = "The scale of pages in the output PDF. Acceptable values are A0-A6, LETTER, LEGAL.",
|
||||||
|
allowableValues = {
|
||||||
|
"A0", "A1", "A2", "A3", "A4", "A5", "A6", "LETTER", "LEGAL"
|
||||||
|
})
|
||||||
|
private String pageSize;
|
||||||
|
}
|
|
@ -0,0 +1,23 @@
|
||||||
|
package stirling.software.SPDF.model.api.converters;
|
||||||
|
|
||||||
|
import io.swagger.v3.oas.annotations.media.Schema;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.EqualsAndHashCode;
|
||||||
|
import stirling.software.SPDF.model.api.PDFFile;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
@EqualsAndHashCode(callSuper=true)
|
||||||
|
public class ConvertToImageRequest extends PDFFile {
|
||||||
|
|
||||||
|
@Schema(description = "The output image format", allowableValues = {"png", "jpeg", "jpg", "gif"})
|
||||||
|
private String imageFormat;
|
||||||
|
|
||||||
|
@Schema(description = "Choose between a single image containing all pages or separate images for each page", allowableValues = {"single", "multiple"})
|
||||||
|
private String singleOrMultiple;
|
||||||
|
|
||||||
|
@Schema(description = "The color type of the output image(s)", allowableValues = {"color", "greyscale", "blackwhite"})
|
||||||
|
private String colorType;
|
||||||
|
|
||||||
|
@Schema(description = "The DPI (dots per inch) for the output image(s)")
|
||||||
|
private String dpi;
|
||||||
|
}
|
|
@ -0,0 +1,24 @@
|
||||||
|
package stirling.software.SPDF.model.api.converters;
|
||||||
|
|
||||||
|
import org.springframework.web.multipart.MultipartFile;
|
||||||
|
|
||||||
|
import io.swagger.v3.oas.annotations.media.Schema;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.EqualsAndHashCode;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
@EqualsAndHashCode
|
||||||
|
public class ConvertToPdfRequest {
|
||||||
|
|
||||||
|
@Schema(description = "The input images to be converted to a PDF file")
|
||||||
|
private MultipartFile[] fileInput;
|
||||||
|
|
||||||
|
@Schema(description = "Whether to stretch the images to fit the PDF page or maintain the aspect ratio", example = "false")
|
||||||
|
private boolean stretchToFit;
|
||||||
|
|
||||||
|
@Schema(description = "The color type of the output image(s)", allowableValues = {"color", "greyscale", "blackwhite"})
|
||||||
|
private String colorType;
|
||||||
|
|
||||||
|
@Schema(description = "Whether to automatically rotate the images to better fit the PDF page", example = "true")
|
||||||
|
private boolean autoRotate;
|
||||||
|
}
|
|
@ -0,0 +1,14 @@
|
||||||
|
package stirling.software.SPDF.model.api.converters;
|
||||||
|
|
||||||
|
import io.swagger.v3.oas.annotations.media.Schema;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.EqualsAndHashCode;
|
||||||
|
import stirling.software.SPDF.model.api.PDFFile;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
@EqualsAndHashCode(callSuper=true)
|
||||||
|
public class PdfToPresentationRequest extends PDFFile {
|
||||||
|
|
||||||
|
@Schema(description = "The output Presentation format", allowableValues = {"ppt", "pptx", "odp"})
|
||||||
|
private String outputFormat;
|
||||||
|
}
|
|
@ -0,0 +1,14 @@
|
||||||
|
package stirling.software.SPDF.model.api.converters;
|
||||||
|
|
||||||
|
import io.swagger.v3.oas.annotations.media.Schema;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.EqualsAndHashCode;
|
||||||
|
import stirling.software.SPDF.model.api.PDFFile;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
@EqualsAndHashCode(callSuper=true)
|
||||||
|
public class PdfToTextOrRTFRequest extends PDFFile {
|
||||||
|
|
||||||
|
@Schema(description = "The output Text or RTF format", allowableValues = {"rtf", "txt:Text"})
|
||||||
|
private String outputFormat;
|
||||||
|
}
|
|
@ -0,0 +1,14 @@
|
||||||
|
package stirling.software.SPDF.model.api.converters;
|
||||||
|
|
||||||
|
import io.swagger.v3.oas.annotations.media.Schema;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.EqualsAndHashCode;
|
||||||
|
import stirling.software.SPDF.model.api.PDFFile;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
@EqualsAndHashCode(callSuper=true)
|
||||||
|
public class PdfToWordRequest extends PDFFile {
|
||||||
|
|
||||||
|
@Schema(description = "The output Word document format", allowableValues = {"doc", "docx", "odt"})
|
||||||
|
private String outputFormat;
|
||||||
|
}
|
|
@ -0,0 +1,13 @@
|
||||||
|
package stirling.software.SPDF.model.api.converters;
|
||||||
|
|
||||||
|
import io.swagger.v3.oas.annotations.media.Schema;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.EqualsAndHashCode;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
@EqualsAndHashCode
|
||||||
|
public class UrlToPdfRequest {
|
||||||
|
|
||||||
|
@Schema(description = "The input URL to be converted to a PDF file", required = true)
|
||||||
|
private String urlInput;
|
||||||
|
}
|
|
@ -0,0 +1,14 @@
|
||||||
|
package stirling.software.SPDF.model.api.filter;
|
||||||
|
|
||||||
|
import io.swagger.v3.oas.annotations.media.Schema;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.EqualsAndHashCode;
|
||||||
|
import stirling.software.SPDF.model.api.PDFWithPageNums;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
@EqualsAndHashCode(callSuper=true)
|
||||||
|
public class ContainsTextRequest extends PDFWithPageNums {
|
||||||
|
|
||||||
|
@Schema(description = "The text to check for", required = true)
|
||||||
|
private String text;
|
||||||
|
}
|
|
@ -0,0 +1,16 @@
|
||||||
|
package stirling.software.SPDF.model.api.filter;
|
||||||
|
|
||||||
|
import io.swagger.v3.oas.annotations.media.Schema;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.EqualsAndHashCode;
|
||||||
|
import stirling.software.SPDF.model.api.PDFComparison;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
@EqualsAndHashCode(callSuper=true)
|
||||||
|
public class FileSizeRequest extends PDFComparison {
|
||||||
|
|
||||||
|
@Schema(description = "File Size", required = true)
|
||||||
|
private String fileSize;
|
||||||
|
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,15 @@
|
||||||
|
package stirling.software.SPDF.model.api.filter;
|
||||||
|
|
||||||
|
import io.swagger.v3.oas.annotations.media.Schema;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.EqualsAndHashCode;
|
||||||
|
import stirling.software.SPDF.model.api.PDFComparison;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
@EqualsAndHashCode(callSuper=true)
|
||||||
|
public class PageRotationRequest extends PDFComparison {
|
||||||
|
|
||||||
|
@Schema(description = "Rotation in degrees", required = true)
|
||||||
|
private int rotation;
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,16 @@
|
||||||
|
package stirling.software.SPDF.model.api.filter;
|
||||||
|
|
||||||
|
import io.swagger.v3.oas.annotations.media.Schema;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.EqualsAndHashCode;
|
||||||
|
import stirling.software.SPDF.model.api.PDFComparison;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
@EqualsAndHashCode(callSuper=true)
|
||||||
|
public class PageSizeRequest extends PDFComparison {
|
||||||
|
|
||||||
|
@Schema(description = "Standard Page Size", required = true)
|
||||||
|
private String standardPageSize;
|
||||||
|
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,24 @@
|
||||||
|
package stirling.software.SPDF.model.api.general;
|
||||||
|
import io.swagger.v3.oas.annotations.media.Schema;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.EqualsAndHashCode;
|
||||||
|
import stirling.software.SPDF.model.api.PDFFile;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
@EqualsAndHashCode(callSuper=true)
|
||||||
|
public class CropPdfForm extends PDFFile {
|
||||||
|
|
||||||
|
|
||||||
|
@Schema(description = "The x-coordinate of the top-left corner of the crop area", type = "number")
|
||||||
|
private float x;
|
||||||
|
|
||||||
|
@Schema(description = "The y-coordinate of the top-left corner of the crop area", type = "number")
|
||||||
|
private float y;
|
||||||
|
|
||||||
|
@Schema(description = "The width of the crop area", type = "number")
|
||||||
|
private float width;
|
||||||
|
|
||||||
|
@Schema(description = "The height of the crop area", type = "number")
|
||||||
|
private float height;
|
||||||
|
}
|
||||||
|
|
|
@ -0,0 +1,15 @@
|
||||||
|
package stirling.software.SPDF.model.api.general;
|
||||||
|
|
||||||
|
import io.swagger.v3.oas.annotations.media.Schema;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.EqualsAndHashCode;
|
||||||
|
import stirling.software.SPDF.model.api.PDFFile;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
@EqualsAndHashCode(callSuper=true)
|
||||||
|
public class MergeMultiplePagesRequest extends PDFFile {
|
||||||
|
|
||||||
|
@Schema(description = "The number of pages to fit onto a single sheet in the output PDF.",
|
||||||
|
type = "integer", allowableValues = {"2", "3", "4", "9", "16"})
|
||||||
|
private int pagesPerSheet;
|
||||||
|
}
|
|
@ -0,0 +1,22 @@
|
||||||
|
package stirling.software.SPDF.model.api.general;
|
||||||
|
|
||||||
|
import io.swagger.v3.oas.annotations.media.Schema;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.EqualsAndHashCode;
|
||||||
|
import stirling.software.SPDF.model.api.MultiplePDFFiles;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
@EqualsAndHashCode(callSuper=true)
|
||||||
|
public class MergePdfsRequest extends MultiplePDFFiles {
|
||||||
|
|
||||||
|
@Schema(description = "The type of sorting to be applied on the input files before merging.",
|
||||||
|
allowableValues = {
|
||||||
|
"orderProvided",
|
||||||
|
"byFileName",
|
||||||
|
"byDateModified",
|
||||||
|
"byDateCreated",
|
||||||
|
"byPDFTitle"
|
||||||
|
},
|
||||||
|
defaultValue = "orderProvided")
|
||||||
|
private String sortType = "orderProvided";
|
||||||
|
}
|
|
@ -0,0 +1,23 @@
|
||||||
|
package stirling.software.SPDF.model.api.general;
|
||||||
|
|
||||||
|
import io.swagger.v3.oas.annotations.media.Schema;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.EqualsAndHashCode;
|
||||||
|
import stirling.software.SPDF.model.SortTypes;
|
||||||
|
import stirling.software.SPDF.model.api.PDFWithPageNums;
|
||||||
|
@Data
|
||||||
|
@EqualsAndHashCode(callSuper=true)
|
||||||
|
public class RearrangePagesRequest extends PDFWithPageNums {
|
||||||
|
|
||||||
|
@Schema(implementation = SortTypes.class, description = "The custom mode for page rearrangement. Valid values are:\n"
|
||||||
|
+ "REVERSE_ORDER: Reverses the order of all pages.\n"
|
||||||
|
+ "DUPLEX_SORT: Sorts pages as if all fronts were scanned then all backs in reverse (1, n, 2, n-1, ...). "
|
||||||
|
+ "BOOKLET_SORT: Arranges pages for booklet printing (last, first, second, second last, ...).\n"
|
||||||
|
+ "ODD_EVEN_SPLIT: Splits and arranges pages into odd and even numbered pages.\n"
|
||||||
|
+ "REMOVE_FIRST: Removes the first page.\n" + "REMOVE_LAST: Removes the last page.\n"
|
||||||
|
+ "REMOVE_FIRST_AND_LAST: Removes both the first and the last pages.\n")
|
||||||
|
private String customMode;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
}
|
|
@ -0,0 +1,14 @@
|
||||||
|
package stirling.software.SPDF.model.api.general;
|
||||||
|
|
||||||
|
import io.swagger.v3.oas.annotations.media.Schema;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.EqualsAndHashCode;
|
||||||
|
import stirling.software.SPDF.model.api.PDFFile;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
@EqualsAndHashCode(callSuper=true)
|
||||||
|
public class RotatePDFRequest extends PDFFile {
|
||||||
|
|
||||||
|
@Schema(description = "The angle by which to rotate the PDF file. This should be a multiple of 90.", example = "90")
|
||||||
|
private Integer angle;
|
||||||
|
}
|
|
@ -0,0 +1,15 @@
|
||||||
|
package stirling.software.SPDF.model.api.general;
|
||||||
|
|
||||||
|
import io.swagger.v3.oas.annotations.media.Schema;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.EqualsAndHashCode;
|
||||||
|
import stirling.software.SPDF.model.api.PDFFile;
|
||||||
|
import stirling.software.SPDF.model.api.PDFWithPageSize;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
@EqualsAndHashCode(callSuper=true)
|
||||||
|
public class ScalePagesRequest extends PDFWithPageSize {
|
||||||
|
|
||||||
|
@Schema(description = "The scale of the content on the pages of the output PDF. Acceptable values are floats.")
|
||||||
|
private float scaleFactor;
|
||||||
|
}
|
|
@ -0,0 +1,26 @@
|
||||||
|
package stirling.software.SPDF.model.api.misc;
|
||||||
|
|
||||||
|
import io.swagger.v3.oas.annotations.media.Schema;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.EqualsAndHashCode;
|
||||||
|
import stirling.software.SPDF.model.api.PDFWithPageNums;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
@EqualsAndHashCode(callSuper=true)
|
||||||
|
public class AddPageNumbersRequest extends PDFWithPageNums {
|
||||||
|
|
||||||
|
@Schema(description = "Custom margin: small/medium/large", allowableValues = {"small", "medium", "large"})
|
||||||
|
private String customMargin;
|
||||||
|
|
||||||
|
@Schema(description = "Position: 1 of 9 positions", minimum = "1", maximum = "9")
|
||||||
|
private int position;
|
||||||
|
|
||||||
|
@Schema(description = "Starting number", minimum = "1")
|
||||||
|
private int startingNumber;
|
||||||
|
|
||||||
|
@Schema(description = "Which pages to number, default all")
|
||||||
|
private String pagesToNumber;
|
||||||
|
|
||||||
|
@Schema(description = "Custom text: defaults to just number but can have things like \"Page {n} of {p}\"")
|
||||||
|
private String customText;
|
||||||
|
}
|
|
@ -0,0 +1,14 @@
|
||||||
|
package stirling.software.SPDF.model.api.misc;
|
||||||
|
|
||||||
|
import io.swagger.v3.oas.annotations.media.Schema;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.EqualsAndHashCode;
|
||||||
|
import stirling.software.SPDF.model.api.PDFFile;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
@EqualsAndHashCode(callSuper=true)
|
||||||
|
public class AutoSplitPdfRequest extends PDFFile {
|
||||||
|
|
||||||
|
@Schema(description = "Flag indicating if the duplex mode is active, where the page after the divider also gets removed.", required = false, defaultValue = "false")
|
||||||
|
private boolean duplexMode;
|
||||||
|
}
|
|
@ -0,0 +1,14 @@
|
||||||
|
package stirling.software.SPDF.model.api.misc;
|
||||||
|
|
||||||
|
import io.swagger.v3.oas.annotations.media.Schema;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.EqualsAndHashCode;
|
||||||
|
import stirling.software.SPDF.model.api.PDFFile;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
@EqualsAndHashCode(callSuper=true)
|
||||||
|
public class ExtractHeaderRequest extends PDFFile {
|
||||||
|
|
||||||
|
@Schema(description = "Flag indicating whether to use the first text as a fallback if no suitable title is found. Defaults to false.", required = false, defaultValue = "false")
|
||||||
|
private boolean useFirstTextAsFallback;
|
||||||
|
}
|
|
@ -0,0 +1,29 @@
|
||||||
|
package stirling.software.SPDF.model.api.misc;
|
||||||
|
|
||||||
|
import org.springframework.web.multipart.MultipartFile;
|
||||||
|
|
||||||
|
import io.swagger.v3.oas.annotations.media.Schema;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.EqualsAndHashCode;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
@EqualsAndHashCode
|
||||||
|
public class ExtractImageScansRequest {
|
||||||
|
@Schema(description = "The input file containing image scans", required = true)
|
||||||
|
private MultipartFile fileInput;
|
||||||
|
|
||||||
|
@Schema(description = "The angle threshold for the image scan extraction", defaultValue = "5", example = "5")
|
||||||
|
private int angleThreshold = 5;
|
||||||
|
|
||||||
|
@Schema(description = "The tolerance for the image scan extraction", defaultValue = "20", example = "20")
|
||||||
|
private int tolerance = 20;
|
||||||
|
|
||||||
|
@Schema(description = "The minimum area for the image scan extraction", defaultValue = "8000", example = "8000")
|
||||||
|
private int minArea = 8000;
|
||||||
|
|
||||||
|
@Schema(description = "The minimum contour area for the image scan extraction", defaultValue = "500", example = "500")
|
||||||
|
private int minContourArea = 500;
|
||||||
|
|
||||||
|
@Schema(description = "The border size for the image scan extraction", defaultValue = "1", example = "1")
|
||||||
|
private int borderSize =1;
|
||||||
|
}
|
|
@ -0,0 +1,46 @@
|
||||||
|
package stirling.software.SPDF.model.api.misc;
|
||||||
|
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
|
import io.swagger.v3.oas.annotations.media.Schema;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.EqualsAndHashCode;
|
||||||
|
import stirling.software.SPDF.model.api.PDFFile;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
@EqualsAndHashCode(callSuper=true)
|
||||||
|
public class MetadataRequest extends PDFFile {
|
||||||
|
|
||||||
|
@Schema(description = "Delete all metadata if set to true")
|
||||||
|
private boolean deleteAll;
|
||||||
|
|
||||||
|
@Schema(description = "The author of the document")
|
||||||
|
private String author;
|
||||||
|
|
||||||
|
@Schema(description = "The creation date of the document (format: yyyy/MM/dd HH:mm:ss)")
|
||||||
|
private String creationDate;
|
||||||
|
|
||||||
|
@Schema(description = "The creator of the document")
|
||||||
|
private String creator;
|
||||||
|
|
||||||
|
@Schema(description = "The keywords for the document")
|
||||||
|
private String keywords;
|
||||||
|
|
||||||
|
@Schema(description = "The modification date of the document (format: yyyy/MM/dd HH:mm:ss)")
|
||||||
|
private String modificationDate;
|
||||||
|
|
||||||
|
@Schema(description = "The producer of the document")
|
||||||
|
private String producer;
|
||||||
|
|
||||||
|
@Schema(description = "The subject of the document")
|
||||||
|
private String subject;
|
||||||
|
|
||||||
|
@Schema(description = "The title of the document")
|
||||||
|
private String title;
|
||||||
|
|
||||||
|
@Schema(description = "The trapped status of the document")
|
||||||
|
private String trapped;
|
||||||
|
|
||||||
|
@Schema(description = "Map list of key and value of custom parameters. Note these must start with customKey and customValue if they are non-standard")
|
||||||
|
private Map<String, String> allRequestParams;
|
||||||
|
}
|
|
@ -0,0 +1,18 @@
|
||||||
|
package stirling.software.SPDF.model.api.misc;
|
||||||
|
|
||||||
|
import io.swagger.v3.oas.annotations.media.Schema;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.EqualsAndHashCode;
|
||||||
|
import stirling.software.SPDF.model.api.PDFFile;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
@EqualsAndHashCode(callSuper=true)
|
||||||
|
public class OptimizePdfRequest extends PDFFile {
|
||||||
|
|
||||||
|
@Schema(description = "The level of optimization to apply to the PDF file. Higher values indicate greater compression but may reduce quality.",
|
||||||
|
allowableValues = { "1", "2", "3", "4", "5" })
|
||||||
|
private Integer optimizeLevel;
|
||||||
|
|
||||||
|
@Schema(description = "The expected output size, e.g. '100MB', '25KB', etc.")
|
||||||
|
private String expectedOutputSize;
|
||||||
|
}
|
|
@ -0,0 +1,25 @@
|
||||||
|
package stirling.software.SPDF.model.api.misc;
|
||||||
|
|
||||||
|
import org.springframework.web.multipart.MultipartFile;
|
||||||
|
|
||||||
|
import io.swagger.v3.oas.annotations.media.Schema;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.EqualsAndHashCode;
|
||||||
|
import stirling.software.SPDF.model.api.PDFFile;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
@EqualsAndHashCode(callSuper=true)
|
||||||
|
public class OverlayImageRequest extends PDFFile {
|
||||||
|
|
||||||
|
@Schema(description = "The image file to be overlaid onto the PDF.")
|
||||||
|
private MultipartFile imageFile;
|
||||||
|
|
||||||
|
@Schema(description = "The x-coordinate at which to place the top-left corner of the image.", example = "0")
|
||||||
|
private float x;
|
||||||
|
|
||||||
|
@Schema(description = "The y-coordinate at which to place the top-left corner of the image.", example = "0")
|
||||||
|
private float y;
|
||||||
|
|
||||||
|
@Schema(description = "Whether to overlay the image onto every page of the PDF.", example = "false")
|
||||||
|
private boolean everyPage;
|
||||||
|
}
|
|
@ -0,0 +1,37 @@
|
||||||
|
package stirling.software.SPDF.model.api.misc;
|
||||||
|
|
||||||
|
import java.util.List;
|
||||||
|
|
||||||
|
import io.swagger.v3.oas.annotations.media.Schema;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.EqualsAndHashCode;
|
||||||
|
import stirling.software.SPDF.model.api.PDFFile;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
@EqualsAndHashCode(callSuper=true)
|
||||||
|
public class ProcessPdfWithOcrRequest extends PDFFile {
|
||||||
|
|
||||||
|
@Schema(description = "List of languages to use in OCR processing")
|
||||||
|
private List<String> languages;
|
||||||
|
|
||||||
|
@Schema(description = "Include OCR text in a sidecar text file if set to true")
|
||||||
|
private boolean sidecar;
|
||||||
|
|
||||||
|
@Schema(description = "Deskew the input file if set to true")
|
||||||
|
private boolean deskew;
|
||||||
|
|
||||||
|
@Schema(description = "Clean the input file if set to true")
|
||||||
|
private boolean clean;
|
||||||
|
|
||||||
|
@Schema(description = "Clean the final output if set to true")
|
||||||
|
private boolean cleanFinal;
|
||||||
|
|
||||||
|
@Schema(description = "Specify the OCR type, e.g., 'skip-text', 'force-ocr', or 'Normal'", allowableValues = {"skip-text", "force-ocr", "Normal"})
|
||||||
|
private String ocrType;
|
||||||
|
|
||||||
|
@Schema(description = "Specify the OCR render type, either 'hocr' or 'sandwich'", allowableValues = {"hocr", "sandwich"}, defaultValue = "hocr")
|
||||||
|
private String ocrRenderType = "hocr";
|
||||||
|
|
||||||
|
@Schema(description = "Remove images from the output PDF if set to true")
|
||||||
|
private boolean removeImagesAfter;
|
||||||
|
}
|
|
@ -0,0 +1,17 @@
|
||||||
|
package stirling.software.SPDF.model.api.misc;
|
||||||
|
|
||||||
|
import io.swagger.v3.oas.annotations.media.Schema;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.EqualsAndHashCode;
|
||||||
|
import stirling.software.SPDF.model.api.PDFFile;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
@EqualsAndHashCode(callSuper=true)
|
||||||
|
public class RemoveBlankPagesRequest extends PDFFile {
|
||||||
|
|
||||||
|
@Schema(description = "The threshold value to determine blank pages", example = "10", defaultValue = "10")
|
||||||
|
private int threshold = 10;
|
||||||
|
|
||||||
|
@Schema(description = "The percentage of white color on a page to consider it as blank", example = "99.9", defaultValue = "99.9")
|
||||||
|
private float whitePercent = 99.9f;
|
||||||
|
}
|
|
@ -0,0 +1,44 @@
|
||||||
|
package stirling.software.SPDF.model.api.security;
|
||||||
|
|
||||||
|
import io.swagger.v3.oas.annotations.media.Schema;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.EqualsAndHashCode;
|
||||||
|
import stirling.software.SPDF.model.api.PDFFile;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
@EqualsAndHashCode(callSuper=true)
|
||||||
|
public class AddPasswordRequest extends PDFFile {
|
||||||
|
|
||||||
|
@Schema(description = "The owner password to be added to the PDF file (Restricts what can be done with the document once it is opened)", defaultValue = "")
|
||||||
|
private String ownerPassword;
|
||||||
|
|
||||||
|
@Schema(description = "The password to be added to the PDF file (Restricts the opening of the document itself.)", defaultValue = "")
|
||||||
|
private String password;
|
||||||
|
|
||||||
|
@Schema(description = "The length of the encryption key", allowableValues = {"40", "128", "256"}, defaultValue = "256")
|
||||||
|
private int keyLength = 256;
|
||||||
|
|
||||||
|
@Schema(description = "Whether the document assembly is allowed", example = "false")
|
||||||
|
private boolean canAssembleDocument;
|
||||||
|
|
||||||
|
@Schema(description = "Whether content extraction for accessibility is allowed", example = "false")
|
||||||
|
private boolean canExtractContent;
|
||||||
|
|
||||||
|
@Schema(description = "Whether content extraction for accessibility is allowed", example = "false")
|
||||||
|
private boolean canExtractForAccessibility;
|
||||||
|
|
||||||
|
@Schema(description = "Whether form filling is allowed", example = "false")
|
||||||
|
private boolean canFillInForm;
|
||||||
|
|
||||||
|
@Schema(description = "Whether the document modification is allowed", example = "false")
|
||||||
|
private boolean canModify;
|
||||||
|
|
||||||
|
@Schema(description = "Whether modification of annotations is allowed", example = "false")
|
||||||
|
private boolean canModifyAnnotations;
|
||||||
|
|
||||||
|
@Schema(description = "Whether printing of the document is allowed", example = "false")
|
||||||
|
private boolean canPrint;
|
||||||
|
|
||||||
|
@Schema(description = "Whether faithful printing is allowed", example = "false")
|
||||||
|
private boolean canPrintFaithful;
|
||||||
|
}
|
|
@ -0,0 +1,44 @@
|
||||||
|
package stirling.software.SPDF.model.api.security;
|
||||||
|
|
||||||
|
import org.springframework.web.multipart.MultipartFile;
|
||||||
|
|
||||||
|
import io.swagger.v3.oas.annotations.media.Schema;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.EqualsAndHashCode;
|
||||||
|
import stirling.software.SPDF.model.api.PDFFile;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
@EqualsAndHashCode(callSuper=true)
|
||||||
|
public class AddWatermarkRequest extends PDFFile {
|
||||||
|
|
||||||
|
@Schema(description = "The watermark type (text or image)",
|
||||||
|
allowableValues = {"text", "image"},
|
||||||
|
required = true)
|
||||||
|
private String watermarkType;
|
||||||
|
|
||||||
|
@Schema(description = "The watermark text")
|
||||||
|
private String watermarkText;
|
||||||
|
|
||||||
|
@Schema(description = "The watermark image")
|
||||||
|
private MultipartFile watermarkImage;
|
||||||
|
|
||||||
|
@Schema(description = "The selected alphabet",
|
||||||
|
allowableValues = {"roman", "arabic", "japanese", "korean", "chinese"},
|
||||||
|
defaultValue = "roman")
|
||||||
|
private String alphabet = "roman";
|
||||||
|
|
||||||
|
@Schema(description = "The font size of the watermark text", example = "30")
|
||||||
|
private float fontSize = 30;
|
||||||
|
|
||||||
|
@Schema(description = "The rotation of the watermark in degrees", example = "0")
|
||||||
|
private float rotation = 0;
|
||||||
|
|
||||||
|
@Schema(description = "The opacity of the watermark (0.0 - 1.0)", example = "0.5")
|
||||||
|
private float opacity;
|
||||||
|
|
||||||
|
@Schema(description = "The width spacer between watermark elements", example = "50")
|
||||||
|
private int widthSpacer;
|
||||||
|
|
||||||
|
@Schema(description = "The height spacer between watermark elements", example = "50")
|
||||||
|
private int heightSpacer;
|
||||||
|
}
|
|
@ -0,0 +1,14 @@
|
||||||
|
package stirling.software.SPDF.model.api.security;
|
||||||
|
|
||||||
|
import io.swagger.v3.oas.annotations.media.Schema;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.EqualsAndHashCode;
|
||||||
|
import stirling.software.SPDF.model.api.PDFFile;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
@EqualsAndHashCode(callSuper=true)
|
||||||
|
public class PDFPasswordRequest extends PDFFile {
|
||||||
|
|
||||||
|
@Schema(description = "The password of the PDF file", required = true)
|
||||||
|
private String password;
|
||||||
|
}
|
|
@ -0,0 +1,29 @@
|
||||||
|
package stirling.software.SPDF.model.api.security;
|
||||||
|
|
||||||
|
import io.swagger.v3.oas.annotations.media.Schema;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.EqualsAndHashCode;
|
||||||
|
import stirling.software.SPDF.model.api.PDFFile;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
@EqualsAndHashCode(callSuper=true)
|
||||||
|
public class RedactPdfRequest extends PDFFile {
|
||||||
|
|
||||||
|
@Schema(description = "List of text to redact from the PDF", type = "string", required = true)
|
||||||
|
private String listOfText;
|
||||||
|
|
||||||
|
@Schema(description = "Whether to use regex for the listOfText", defaultValue = "false")
|
||||||
|
private boolean useRegex;
|
||||||
|
|
||||||
|
@Schema(description = "Whether to use whole word search", defaultValue = "false")
|
||||||
|
private boolean wholeWordSearch;
|
||||||
|
|
||||||
|
@Schema(description = "The color for redaction", defaultValue = "#000000")
|
||||||
|
private String redactColor = "#000000";
|
||||||
|
|
||||||
|
@Schema(description = "Custom padding for redaction", type = "number")
|
||||||
|
private float customPadding;
|
||||||
|
|
||||||
|
@Schema(description = "Convert the redacted PDF to an image", defaultValue = "false")
|
||||||
|
private boolean convertPDFToImage;
|
||||||
|
}
|
|
@ -0,0 +1,26 @@
|
||||||
|
package stirling.software.SPDF.model.api.security;
|
||||||
|
|
||||||
|
import io.swagger.v3.oas.annotations.media.Schema;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.EqualsAndHashCode;
|
||||||
|
import stirling.software.SPDF.model.api.PDFFile;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
@EqualsAndHashCode(callSuper=true)
|
||||||
|
public class SanitizePdfRequest extends PDFFile {
|
||||||
|
|
||||||
|
@Schema(description = "Remove JavaScript actions from the PDF", defaultValue = "false")
|
||||||
|
private boolean removeJavaScript;
|
||||||
|
|
||||||
|
@Schema(description = "Remove embedded files from the PDF", defaultValue = "false")
|
||||||
|
private boolean removeEmbeddedFiles;
|
||||||
|
|
||||||
|
@Schema(description = "Remove metadata from the PDF", defaultValue = "false")
|
||||||
|
private boolean removeMetadata;
|
||||||
|
|
||||||
|
@Schema(description = "Remove links from the PDF", defaultValue = "false")
|
||||||
|
private boolean removeLinks;
|
||||||
|
|
||||||
|
@Schema(description = "Remove fonts from the PDF", defaultValue = "false")
|
||||||
|
private boolean removeFonts;
|
||||||
|
}
|
|
@ -0,0 +1,43 @@
|
||||||
|
package stirling.software.SPDF.model.api.security;
|
||||||
|
|
||||||
|
import org.springframework.web.multipart.MultipartFile;
|
||||||
|
|
||||||
|
import io.swagger.v3.oas.annotations.media.Schema;
|
||||||
|
import lombok.Data;
|
||||||
|
import lombok.EqualsAndHashCode;
|
||||||
|
import stirling.software.SPDF.model.api.PDFFile;
|
||||||
|
|
||||||
|
@Data
|
||||||
|
@EqualsAndHashCode(callSuper=true)
|
||||||
|
public class SignPDFWithCertRequest extends PDFFile {
|
||||||
|
|
||||||
|
@Schema(description = "The type of the digital certificate", allowableValues = { "PKCS12", "PEM" })
|
||||||
|
private String certType;
|
||||||
|
|
||||||
|
@Schema(description = "The private key for the digital certificate (required for PEM type certificates)")
|
||||||
|
private MultipartFile privateKeyFile;
|
||||||
|
|
||||||
|
@Schema(description = "The digital certificate (required for PEM type certificates)")
|
||||||
|
private MultipartFile certFile;
|
||||||
|
|
||||||
|
@Schema(description = "The PKCS12 keystore file (required for PKCS12 type certificates)")
|
||||||
|
private MultipartFile p12File;
|
||||||
|
|
||||||
|
@Schema(description = "The password for the keystore or the private key")
|
||||||
|
private String password;
|
||||||
|
|
||||||
|
@Schema(description = "Whether to visually show the signature in the PDF file")
|
||||||
|
private boolean showSignature;
|
||||||
|
|
||||||
|
@Schema(description = "The reason for signing the PDF")
|
||||||
|
private String reason;
|
||||||
|
|
||||||
|
@Schema(description = "The location where the PDF is signed")
|
||||||
|
private String location;
|
||||||
|
|
||||||
|
@Schema(description = "The name of the signer")
|
||||||
|
private String name;
|
||||||
|
|
||||||
|
@Schema(description = "The page number where the signature should be visible. This is required if showSignature is set to true")
|
||||||
|
private Integer pageNumber;
|
||||||
|
}
|
|
@ -75,6 +75,9 @@ public class GeneralUtils {
|
||||||
return null;
|
return null;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public static List<Integer> parsePageString(String pageOrder, int totalPages) {
|
||||||
|
return parsePageList(pageOrder.split(","), totalPages);
|
||||||
|
}
|
||||||
public static List<Integer> parsePageList(String[] pageOrderArr, int totalPages) {
|
public static List<Integer> parsePageList(String[] pageOrderArr, int totalPages) {
|
||||||
List<Integer> newPageOrder = new ArrayList<>();
|
List<Integer> newPageOrder = new ArrayList<>();
|
||||||
|
|
||||||
|
|
|
@ -37,3 +37,11 @@ spring.datasource.username=sa
|
||||||
spring.datasource.password=
|
spring.datasource.password=
|
||||||
spring.h2.console.enabled=true
|
spring.h2.console.enabled=true
|
||||||
spring.jpa.hibernate.ddl-auto=update
|
spring.jpa.hibernate.ddl-auto=update
|
||||||
|
|
||||||
|
# Change the default URL path for OpenAPI JSON
|
||||||
|
springdoc.api-docs.path=/v1/api-docs
|
||||||
|
|
||||||
|
# Set the URL of the OpenAPI JSON for the Swagger UI
|
||||||
|
springdoc.swagger-ui.url=/v1/api-docs
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -35,9 +35,6 @@ delete=Delete
|
||||||
username=Username
|
username=Username
|
||||||
password=Password
|
password=Password
|
||||||
welcome=Welcome
|
welcome=Welcome
|
||||||
##########################
|
|
||||||
### TODO: Translate ###
|
|
||||||
##########################
|
|
||||||
property=Property
|
property=Property
|
||||||
black=Black
|
black=Black
|
||||||
white=White
|
white=White
|
||||||
|
@ -46,7 +43,11 @@ green=Green
|
||||||
blue=Blue
|
blue=Blue
|
||||||
custom=Custom...
|
custom=Custom...
|
||||||
|
|
||||||
|
changedCredsMessage=Credentials changed!
|
||||||
|
notAuthenticatedMessage=User not authenticated.
|
||||||
|
userNotFoundMessage=User not found.
|
||||||
|
incorrectPasswordMessage=Current password is incorrect.
|
||||||
|
usernameExistsMessage=New Username already exists.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -74,6 +75,19 @@ settings.zipThreshold=\u0645\u0644\u0641\u0627\u062A \u0645\u0636\u063A\u0648\u0
|
||||||
settings.signOut=Sign Out
|
settings.signOut=Sign Out
|
||||||
settings.accountSettings=Account Settings
|
settings.accountSettings=Account Settings
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
changeCreds.title=Change Credentials
|
||||||
|
changeCreds.header=Update Your Account Details
|
||||||
|
changeCreds.changeUserAndPassword=You are using default login credentials. Please enter a new password (and username if wanted)
|
||||||
|
changeCreds.newUsername=New Username
|
||||||
|
changeCreds.oldPassword=Current Password
|
||||||
|
changeCreds.newPassword=New Password
|
||||||
|
changeCreds.confirmNewPassword=Confirm New Password
|
||||||
|
changeCreds.submit=Submit Changes
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
account.title=Account Settings
|
account.title=Account Settings
|
||||||
account.accountSettings=Account Settings
|
account.accountSettings=Account Settings
|
||||||
account.adminSettings=Admin Settings - View and Add Users
|
account.adminSettings=Admin Settings - View and Add Users
|
||||||
|
@ -105,6 +119,7 @@ adminUserSettings.role=Role
|
||||||
adminUserSettings.actions=Actions
|
adminUserSettings.actions=Actions
|
||||||
adminUserSettings.apiUser=Limited API User
|
adminUserSettings.apiUser=Limited API User
|
||||||
adminUserSettings.webOnlyUser=Web Only User
|
adminUserSettings.webOnlyUser=Web Only User
|
||||||
|
adminUserSettings.forceChange=Force user to change username/password on login
|
||||||
adminUserSettings.submit=Save User
|
adminUserSettings.submit=Save User
|
||||||
|
|
||||||
#############
|
#############
|
||||||
|
@ -333,9 +348,6 @@ login.signinTitle=Please sign in
|
||||||
#auto-redact
|
#auto-redact
|
||||||
autoRedact.title=Auto Redact
|
autoRedact.title=Auto Redact
|
||||||
autoRedact.header=Auto Redact
|
autoRedact.header=Auto Redact
|
||||||
##########################
|
|
||||||
### TODO: Translate ###
|
|
||||||
##########################
|
|
||||||
autoRedact.colorLabel=Colour
|
autoRedact.colorLabel=Colour
|
||||||
autoRedact.textsToRedactLabel=Text to Redact (line-separated)
|
autoRedact.textsToRedactLabel=Text to Redact (line-separated)
|
||||||
autoRedact.textsToRedactPlaceholder=e.g. \nConfidential \nTop-Secret
|
autoRedact.textsToRedactPlaceholder=e.g. \nConfidential \nTop-Secret
|
||||||
|
@ -756,13 +768,6 @@ changeMetadata.selectText.5=\u0625\u0636\u0627\u0641\u0629 \u0625\u062F\u062E\u0
|
||||||
changeMetadata.submit=\u062A\u063A\u064A\u064A\u0631
|
changeMetadata.submit=\u062A\u063A\u064A\u064A\u0631
|
||||||
|
|
||||||
|
|
||||||
#xlsToPdf
|
|
||||||
xlsToPdf.title=\u062A\u062D\u0648\u064A\u0644 Excel \u0625\u0644\u0649 PDF
|
|
||||||
xlsToPdf.header=\u062A\u062D\u0648\u064A\u0644 Excel \u0625\u0644\u0649 PDF
|
|
||||||
xlsToPdf.selectText.1=\u062D\u062F\u062F \u0648\u0631\u0642\u0629 \u0625\u0643\u0633\u0644 XLS \u0623\u0648 XLSX \u0644\u0644\u062A\u062D\u0648\u064A\u0644
|
|
||||||
xlsToPdf.convert=\u062A\u062D\u0648\u064A\u0644
|
|
||||||
|
|
||||||
|
|
||||||
#pdfToPDFA
|
#pdfToPDFA
|
||||||
pdfToPDFA.title=PDF \u0625\u0644\u0649 PDF / A
|
pdfToPDFA.title=PDF \u0625\u0644\u0649 PDF / A
|
||||||
pdfToPDFA.header=PDF \u0625\u0644\u0649 PDF / A
|
pdfToPDFA.header=PDF \u0625\u0644\u0649 PDF / A
|
||||||
|
|
|
@ -35,7 +35,6 @@ delete=Esborra
|
||||||
username=Usuari
|
username=Usuari
|
||||||
password=Contrasenya
|
password=Contrasenya
|
||||||
welcome=Benvingut
|
welcome=Benvingut
|
||||||
|
|
||||||
property=Propietat
|
property=Propietat
|
||||||
black=Negre
|
black=Negre
|
||||||
white=Blanc
|
white=Blanc
|
||||||
|
@ -44,7 +43,11 @@ green=Verd
|
||||||
blue=Blau
|
blue=Blau
|
||||||
custom=Personalitzat...
|
custom=Personalitzat...
|
||||||
|
|
||||||
|
changedCredsMessage=Credentials changed!
|
||||||
|
notAuthenticatedMessage=User not authenticated.
|
||||||
|
userNotFoundMessage=User not found.
|
||||||
|
incorrectPasswordMessage=Current password is incorrect.
|
||||||
|
usernameExistsMessage=New Username already exists.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -72,6 +75,19 @@ settings.zipThreshold=Comprimiu els fitxers quan el nombre de fitxers baixats su
|
||||||
settings.signOut=Sortir
|
settings.signOut=Sortir
|
||||||
settings.accountSettings=Account Settings
|
settings.accountSettings=Account Settings
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
changeCreds.title=Change Credentials
|
||||||
|
changeCreds.header=Update Your Account Details
|
||||||
|
changeCreds.changeUserAndPassword=You are using default login credentials. Please enter a new password (and username if wanted)
|
||||||
|
changeCreds.newUsername=New Username
|
||||||
|
changeCreds.oldPassword=Current Password
|
||||||
|
changeCreds.newPassword=New Password
|
||||||
|
changeCreds.confirmNewPassword=Confirm New Password
|
||||||
|
changeCreds.submit=Submit Changes
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
account.title=Opcions del compte
|
account.title=Opcions del compte
|
||||||
account.accountSettings=Opcions del compte
|
account.accountSettings=Opcions del compte
|
||||||
account.adminSettings=Opcions d'Admin - Veure i afegir usuaris
|
account.adminSettings=Opcions d'Admin - Veure i afegir usuaris
|
||||||
|
@ -103,6 +119,7 @@ adminUserSettings.role=Rol
|
||||||
adminUserSettings.actions=Accions
|
adminUserSettings.actions=Accions
|
||||||
adminUserSettings.apiUser=Usuari amb API limitada
|
adminUserSettings.apiUser=Usuari amb API limitada
|
||||||
adminUserSettings.webOnlyUser=Usuari només WEB
|
adminUserSettings.webOnlyUser=Usuari només WEB
|
||||||
|
adminUserSettings.forceChange=Force user to change username/password on login
|
||||||
adminUserSettings.submit=Desar Usuari
|
adminUserSettings.submit=Desar Usuari
|
||||||
|
|
||||||
#############
|
#############
|
||||||
|
@ -331,9 +348,6 @@ login.signinTitle=Autenticat
|
||||||
#auto-redact
|
#auto-redact
|
||||||
autoRedact.title=Auto Redact
|
autoRedact.title=Auto Redact
|
||||||
autoRedact.header=Auto Redact
|
autoRedact.header=Auto Redact
|
||||||
##########################
|
|
||||||
### TODO: Translate ###
|
|
||||||
##########################
|
|
||||||
autoRedact.colorLabel=Colour
|
autoRedact.colorLabel=Colour
|
||||||
autoRedact.textsToRedactLabel=Text to Redact (line-separated)
|
autoRedact.textsToRedactLabel=Text to Redact (line-separated)
|
||||||
autoRedact.textsToRedactPlaceholder=e.g. \nConfidential \nTop-Secret
|
autoRedact.textsToRedactPlaceholder=e.g. \nConfidential \nTop-Secret
|
||||||
|
@ -754,13 +768,6 @@ changeMetadata.selectText.5=Afegir entrada personalizada
|
||||||
changeMetadata.submit=Canvia
|
changeMetadata.submit=Canvia
|
||||||
|
|
||||||
|
|
||||||
#xlsToPdf
|
|
||||||
xlsToPdf.title=Excel a PDF
|
|
||||||
xlsToPdf.header=Excel a PDF
|
|
||||||
xlsToPdf.selectText.1=Selecciona arxiu XLS o XLSX a convertir
|
|
||||||
xlsToPdf.convert=Converteix
|
|
||||||
|
|
||||||
|
|
||||||
#pdfToPDFA
|
#pdfToPDFA
|
||||||
pdfToPDFA.title=PDF a PDF/A
|
pdfToPDFA.title=PDF a PDF/A
|
||||||
pdfToPDFA.header=PDF a PDF/A
|
pdfToPDFA.header=PDF a PDF/A
|
||||||
|
|
|
@ -4,7 +4,6 @@
|
||||||
# the direction that the language is written (ltr=left to right, rtl = right to left)
|
# the direction that the language is written (ltr=left to right, rtl = right to left)
|
||||||
language.direction=ltr
|
language.direction=ltr
|
||||||
|
|
||||||
|
|
||||||
pdfPrompt=PDF auswählen
|
pdfPrompt=PDF auswählen
|
||||||
multiPdfPrompt=PDFs auswählen(2+)
|
multiPdfPrompt=PDFs auswählen(2+)
|
||||||
multiPdfDropPrompt=Wählen Sie alle gewünschten PDFs aus (oder ziehen Sie sie per Drag & Drop hierhin)
|
multiPdfDropPrompt=Wählen Sie alle gewünschten PDFs aus (oder ziehen Sie sie per Drag & Drop hierhin)
|
||||||
|
@ -44,6 +43,13 @@ green=Grün
|
||||||
blue=Blau
|
blue=Blau
|
||||||
custom=benutzerdefiniert...
|
custom=benutzerdefiniert...
|
||||||
|
|
||||||
|
changedCredsMessage=Credentials changed!
|
||||||
|
notAuthenticatedMessage=User not authenticated.
|
||||||
|
userNotFoundMessage=User not found.
|
||||||
|
incorrectPasswordMessage=Current password is incorrect.
|
||||||
|
usernameExistsMessage=New Username already exists.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#############
|
#############
|
||||||
# NAVBAR #
|
# NAVBAR #
|
||||||
|
@ -55,7 +61,6 @@ navbar.darkmode=Dark Mode
|
||||||
navbar.pageOps=Seitenoperationen
|
navbar.pageOps=Seitenoperationen
|
||||||
navbar.settings=Einstellungen
|
navbar.settings=Einstellungen
|
||||||
|
|
||||||
|
|
||||||
#############
|
#############
|
||||||
# SETTINGS #
|
# SETTINGS #
|
||||||
#############
|
#############
|
||||||
|
@ -71,11 +76,23 @@ settings.signOut=Abmelden
|
||||||
settings.accountSettings=Kontoeinstellungen
|
settings.accountSettings=Kontoeinstellungen
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
changeCreds.title=Change Credentials
|
||||||
|
changeCreds.header=Update Your Account Details
|
||||||
|
changeCreds.changeUserAndPassword=You are using default login credentials. Please enter a new password (and username if wanted)
|
||||||
|
changeCreds.newUsername=New Username
|
||||||
|
changeCreds.oldPassword=Current Password
|
||||||
|
changeCreds.newPassword=New Password
|
||||||
|
changeCreds.confirmNewPassword=Confirm New Password
|
||||||
|
changeCreds.submit=Submit Changes
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
account.title=Kontoeinstellungen
|
account.title=Kontoeinstellungen
|
||||||
account.accountSettings=Kontoeinstellungen
|
account.accountSettings=Kontoeinstellungen
|
||||||
account.adminSettings=Admin Einstellungen - Benutzer anzeigen und hinzufügen
|
account.adminSettings=Admin Einstellungen - Benutzer anzeigen und hinzufügen
|
||||||
account.userControlSettings=Benutzerkontrolle
|
account.userControlSettings=Benutzerkontrolle
|
||||||
account.changeUsername=Benutzername ändern
|
account.changeUsername=Passwort ändern
|
||||||
account.changeUsername=Passwort ändern
|
account.changeUsername=Passwort ändern
|
||||||
account.password=Bestätigungspasswort
|
account.password=Bestätigungspasswort
|
||||||
account.oldPassword=Altes Passwort
|
account.oldPassword=Altes Passwort
|
||||||
|
@ -102,9 +119,9 @@ adminUserSettings.role=Rolle
|
||||||
adminUserSettings.actions=Aktion
|
adminUserSettings.actions=Aktion
|
||||||
adminUserSettings.apiUser=Eingeschränkter API-Benutzer
|
adminUserSettings.apiUser=Eingeschränkter API-Benutzer
|
||||||
adminUserSettings.webOnlyUser=Nur Web-Benutzer
|
adminUserSettings.webOnlyUser=Nur Web-Benutzer
|
||||||
|
adminUserSettings.forceChange=Force user to change username/password on login
|
||||||
adminUserSettings.submit=Benutzer speichern
|
adminUserSettings.submit=Benutzer speichern
|
||||||
|
|
||||||
|
|
||||||
#############
|
#############
|
||||||
# HOME-PAGE #
|
# HOME-PAGE #
|
||||||
#############
|
#############
|
||||||
|
@ -115,17 +132,14 @@ home.multiTool.title=PDF-Multitool
|
||||||
home.multiTool.desc=Seiten zusammenführen, drehen, neu anordnen und entfernen
|
home.multiTool.desc=Seiten zusammenführen, drehen, neu anordnen und entfernen
|
||||||
multiTool.tags=Multi Tool,Multi operation,UI,click drag,front end,client side
|
multiTool.tags=Multi Tool,Multi operation,UI,click drag,front end,client side
|
||||||
|
|
||||||
|
|
||||||
home.merge.title=Zusammenführen
|
home.merge.title=Zusammenführen
|
||||||
home.merge.desc=Mehrere PDF-Dateien zu einer einzigen zusammenführen.
|
home.merge.desc=Mehrere PDF-Dateien zu einer einzigen zusammenführen.
|
||||||
merge.tags=merge,Page operations,Back end,server side
|
merge.tags=merge,Page operations,Back end,server side
|
||||||
|
|
||||||
|
|
||||||
home.split.title=Aufteilen
|
home.split.title=Aufteilen
|
||||||
home.split.desc=PDFs in mehrere Dokumente aufteilen.
|
home.split.desc=PDFs in mehrere Dokumente aufteilen.
|
||||||
split.tags=Page operations,divide,Multi Page,cut,server side
|
split.tags=Page operations,divide,Multi Page,cut,server side
|
||||||
|
|
||||||
|
|
||||||
home.rotate.title=Drehen
|
home.rotate.title=Drehen
|
||||||
home.rotate.desc=Drehen Sie Ihre PDFs ganz einfach.
|
home.rotate.desc=Drehen Sie Ihre PDFs ganz einfach.
|
||||||
rotate.tags=server side
|
rotate.tags=server side
|
||||||
|
@ -135,12 +149,10 @@ home.imageToPdf.title=Bild zu PDF
|
||||||
home.imageToPdf.desc=Konvertieren Sie ein Bild (PNG, JPEG, GIF) in ein PDF.
|
home.imageToPdf.desc=Konvertieren Sie ein Bild (PNG, JPEG, GIF) in ein PDF.
|
||||||
imageToPdf.tags=conversion,img,jpg,picture,photo
|
imageToPdf.tags=conversion,img,jpg,picture,photo
|
||||||
|
|
||||||
|
|
||||||
home.pdfToImage.title=PDF zu Bild
|
home.pdfToImage.title=PDF zu Bild
|
||||||
home.pdfToImage.desc=Konvertieren Sie ein PDF in ein Bild (PNG, JPEG, GIF).
|
home.pdfToImage.desc=Konvertieren Sie ein PDF in ein Bild (PNG, JPEG, GIF).
|
||||||
pdfToImage.tags=conversion,img,jpg,picture,photo
|
pdfToImage.tags=conversion,img,jpg,picture,photo
|
||||||
|
|
||||||
|
|
||||||
home.pdfOrganiser.title=Organisieren
|
home.pdfOrganiser.title=Organisieren
|
||||||
home.pdfOrganiser.desc=Seiten entfernen und Seitenreihenfolge ändern.
|
home.pdfOrganiser.desc=Seiten entfernen und Seitenreihenfolge ändern.
|
||||||
pdfOrganiser.tags=duplex,even,odd,sort,move
|
pdfOrganiser.tags=duplex,even,odd,sort,move
|
||||||
|
@ -150,12 +162,10 @@ home.addImage.title=Bild einfügen
|
||||||
home.addImage.desc=Fügt ein Bild an eine bestimmte Stelle im PDF ein (in Arbeit).
|
home.addImage.desc=Fügt ein Bild an eine bestimmte Stelle im PDF ein (in Arbeit).
|
||||||
addImage.tags=img,jpg,picture,photo
|
addImage.tags=img,jpg,picture,photo
|
||||||
|
|
||||||
|
|
||||||
home.watermark.title=Wasserzeichen hinzufügen
|
home.watermark.title=Wasserzeichen hinzufügen
|
||||||
home.watermark.desc=Fügen Sie ein eigenes Wasserzeichen zu Ihrem PDF hinzu.
|
home.watermark.desc=Fügen Sie ein eigenes Wasserzeichen zu Ihrem PDF hinzu.
|
||||||
watermark.tags=Text,repeating,label,own,copyright,trademark,img,jpg,picture,photo
|
watermark.tags=Text,repeating,label,own,copyright,trademark,img,jpg,picture,photo
|
||||||
|
|
||||||
|
|
||||||
home.permissions.title=Berechtigungen ändern
|
home.permissions.title=Berechtigungen ändern
|
||||||
home.permissions.desc=Die Berechtigungen für Ihr PDF-Dokument verändern.
|
home.permissions.desc=Die Berechtigungen für Ihr PDF-Dokument verändern.
|
||||||
permissions.tags=read,write,edit,print
|
permissions.tags=read,write,edit,print
|
||||||
|
@ -165,17 +175,14 @@ home.removePages.title=Entfernen
|
||||||
home.removePages.desc=Ungewollte Seiten aus dem PDF entfernen.
|
home.removePages.desc=Ungewollte Seiten aus dem PDF entfernen.
|
||||||
removePages.tags=Remove pages,delete pages
|
removePages.tags=Remove pages,delete pages
|
||||||
|
|
||||||
|
|
||||||
home.addPassword.title=Passwort hinzufügen
|
home.addPassword.title=Passwort hinzufügen
|
||||||
home.addPassword.desc=Das PDF mit einem Passwort verschlüsseln.
|
home.addPassword.desc=Das PDF mit einem Passwort verschlüsseln.
|
||||||
addPassword.tags=secure,security
|
addPassword.tags=secure,security
|
||||||
|
|
||||||
|
|
||||||
home.removePassword.title=Passwort entfernen
|
home.removePassword.title=Passwort entfernen
|
||||||
home.removePassword.desc=Den Passwortschutz eines PDFs entfernen.
|
home.removePassword.desc=Den Passwortschutz eines PDFs entfernen.
|
||||||
removePassword.tags=secure,Decrypt,security,unpassword,delete password
|
removePassword.tags=secure,Decrypt,security,unpassword,delete password
|
||||||
|
|
||||||
|
|
||||||
home.compressPdfs.title=Komprimieren
|
home.compressPdfs.title=Komprimieren
|
||||||
home.compressPdfs.desc=PDF komprimieren um die Dateigröße zu reduzieren.
|
home.compressPdfs.desc=PDF komprimieren um die Dateigröße zu reduzieren.
|
||||||
compressPdfs.tags=squish,small,tiny
|
compressPdfs.tags=squish,small,tiny
|
||||||
|
@ -185,12 +192,10 @@ home.changeMetadata.title=Metadaten ändern
|
||||||
home.changeMetadata.desc=Ändern/Entfernen/Hinzufügen von Metadaten aus einem PDF-Dokument
|
home.changeMetadata.desc=Ändern/Entfernen/Hinzufügen von Metadaten aus einem PDF-Dokument
|
||||||
changeMetadata.tags==Title,author,date,creation,time,publisher,producer,stats
|
changeMetadata.tags==Title,author,date,creation,time,publisher,producer,stats
|
||||||
|
|
||||||
|
|
||||||
home.fileToPDF.title=Datei in PDF konvertieren
|
home.fileToPDF.title=Datei in PDF konvertieren
|
||||||
home.fileToPDF.desc=Konvertieren Sie nahezu jede Datei in PDF (DOCX, PNG, XLS, PPT, TXT und mehr)
|
home.fileToPDF.desc=Konvertieren Sie nahezu jede Datei in PDF (DOCX, PNG, XLS, PPT, TXT und mehr)
|
||||||
fileToPDF.tags=transformation,format,document,picture,slide,text,conversion,office,docs,word,excel,powerpoint
|
fileToPDF.tags=transformation,format,document,picture,slide,text,conversion,office,docs,word,excel,powerpoint
|
||||||
|
|
||||||
|
|
||||||
home.ocr.title=Führe OCR auf PDF- und/oder Cleanup-Scans aus
|
home.ocr.title=Führe OCR auf PDF- und/oder Cleanup-Scans aus
|
||||||
home.ocr.desc=Cleanup scannt und erkennt Text aus Bildern in einer PDF-Datei und fügt ihn erneut als Text hinzu.
|
home.ocr.desc=Cleanup scannt und erkennt Text aus Bildern in einer PDF-Datei und fügt ihn erneut als Text hinzu.
|
||||||
ocr.tags=recognition,text,image,scan,read,identify,detection,editable
|
ocr.tags=recognition,text,image,scan,read,identify,detection,editable
|
||||||
|
@ -200,27 +205,22 @@ home.extractImages.title=Bilder extrahieren
|
||||||
home.extractImages.desc=Extrahiert alle Bilder aus einer PDF-Datei und speichert sie als Zip-Archiv
|
home.extractImages.desc=Extrahiert alle Bilder aus einer PDF-Datei und speichert sie als Zip-Archiv
|
||||||
extractImages.tags=picture,photo,save,archive,zip,capture,grab
|
extractImages.tags=picture,photo,save,archive,zip,capture,grab
|
||||||
|
|
||||||
|
|
||||||
home.pdfToPDFA.title=PDF zu PDF/A konvertieren
|
home.pdfToPDFA.title=PDF zu PDF/A konvertieren
|
||||||
home.pdfToPDFA.desc=PDF zu PDF/A für Langzeitarchivierung konvertieren
|
home.pdfToPDFA.desc=PDF zu PDF/A für Langzeitarchivierung konvertieren
|
||||||
pdfToPDFA.tags=archive,long-term,standard,conversion,storage,preservation
|
pdfToPDFA.tags=archive,long-term,standard,conversion,storage,preservation
|
||||||
|
|
||||||
|
|
||||||
home.PDFToWord.title=PDF zu Word
|
home.PDFToWord.title=PDF zu Word
|
||||||
home.PDFToWord.desc=PDF in Word-Formate konvertieren (DOC, DOCX und ODT)
|
home.PDFToWord.desc=PDF in Word-Formate konvertieren (DOC, DOCX und ODT)
|
||||||
PDFToWord.tags=doc,docx,odt,word,transformation,format,conversion,office,microsoft,docfile
|
PDFToWord.tags=doc,docx,odt,word,transformation,format,conversion,office,microsoft,docfile
|
||||||
|
|
||||||
|
|
||||||
home.PDFToPresentation.title=PDF zu Präsentation
|
home.PDFToPresentation.title=PDF zu Präsentation
|
||||||
home.PDFToPresentation.desc=PDF in Präsentationsformate konvertieren (PPT, PPTX und ODP)
|
home.PDFToPresentation.desc=PDF in Präsentationsformate konvertieren (PPT, PPTX und ODP)
|
||||||
PDFToPresentation.tags=slides,show,office,microsoft
|
PDFToPresentation.tags=slides,show,office,microsoft
|
||||||
|
|
||||||
|
|
||||||
home.PDFToText.title=PDF in Text/RTF
|
home.PDFToText.title=PDF in Text/RTF
|
||||||
home.PDFToText.desc=PDF in Text- oder RTF-Format konvertieren
|
home.PDFToText.desc=PDF in Text- oder RTF-Format konvertieren
|
||||||
PDFToText.tags=richformat,richtextformat,rich text format
|
PDFToText.tags=richformat,richtextformat,rich text format
|
||||||
|
|
||||||
|
|
||||||
home.PDFToHTML.title=PDF in HTML
|
home.PDFToHTML.title=PDF in HTML
|
||||||
home.PDFToHTML.desc=PDF in HTML-Format konvertieren
|
home.PDFToHTML.desc=PDF in HTML-Format konvertieren
|
||||||
PDFToHTML.tags=web content,browser friendly
|
PDFToHTML.tags=web content,browser friendly
|
||||||
|
@ -230,92 +230,74 @@ home.PDFToXML.title=PDF in XML
|
||||||
home.PDFToXML.desc=PDF in XML-Format konvertieren
|
home.PDFToXML.desc=PDF in XML-Format konvertieren
|
||||||
PDFToXML.tags=data-extraction,structured-content,interop,transformation,convert
|
PDFToXML.tags=data-extraction,structured-content,interop,transformation,convert
|
||||||
|
|
||||||
|
|
||||||
home.ScannerImageSplit.title=Gescannte Fotos erkennen/aufteilen
|
home.ScannerImageSplit.title=Gescannte Fotos erkennen/aufteilen
|
||||||
home.ScannerImageSplit.desc=Teilt mehrere Fotos innerhalb eines Fotos/PDF
|
home.ScannerImageSplit.desc=Teilt mehrere Fotos innerhalb eines Fotos/PDF
|
||||||
ScannerImageSplit.tags=separate,auto-detect,scans,multi-photo,organize
|
ScannerImageSplit.tags=separate,auto-detect,scans,multi-photo,organize
|
||||||
|
|
||||||
|
|
||||||
home.sign.title=Signieren
|
home.sign.title=Signieren
|
||||||
home.sign.desc=Fügt PDF-Signaturen durch Zeichnung, Text oder Bild hinzu
|
home.sign.desc=Fügt PDF-Signaturen durch Zeichnung, Text oder Bild hinzu
|
||||||
sign.tags=authorize,initials,drawn-signature,text-sign,image-signature
|
sign.tags=authorize,initials,drawn-signature,text-sign,image-signature
|
||||||
|
|
||||||
|
|
||||||
home.flatten.title=Abflachen
|
home.flatten.title=Abflachen
|
||||||
home.flatten.desc=Alle interaktiven Elemente und Formulare aus einem PDF entfernen
|
home.flatten.desc=Alle interaktiven Elemente und Formulare aus einem PDF entfernen
|
||||||
flatten.tags=static,deactivate,non-interactive,streamline
|
flatten.tags=static,deactivate,non-interactive,streamline
|
||||||
|
|
||||||
|
|
||||||
home.repair.title=Reparatur
|
home.repair.title=Reparatur
|
||||||
home.repair.desc=Versucht, ein beschädigtes/kaputtes PDF zu reparieren
|
home.repair.desc=Versucht, ein beschädigtes/kaputtes PDF zu reparieren
|
||||||
repair.tags=fix,restore,correction,recover
|
repair.tags=fix,restore,correction,recover
|
||||||
|
|
||||||
|
|
||||||
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
|
||||||
removeBlanks.tags=cleanup,streamline,non-content,organize
|
removeBlanks.tags=cleanup,streamline,non-content,organize
|
||||||
|
|
||||||
|
|
||||||
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
|
||||||
compare.tags=differentiate,contrast,changes,analysis
|
compare.tags=differentiate,contrast,changes,analysis
|
||||||
|
|
||||||
|
|
||||||
home.certSign.title=Mit Zertifikat signieren
|
home.certSign.title=Mit Zertifikat signieren
|
||||||
home.certSign.desc=Ein PDF mit einem Zertifikat/Schlüssel (PEM/P12) signieren
|
home.certSign.desc=Ein PDF mit einem Zertifikat/Schlüssel (PEM/P12) signieren
|
||||||
certSign.tags=authenticate,PEM,P12,official,encrypt
|
certSign.tags=authenticate,PEM,P12,official,encrypt
|
||||||
|
|
||||||
|
|
||||||
home.pageLayout.title=Mehrseitiges Layout
|
home.pageLayout.title=Mehrseitiges Layout
|
||||||
home.pageLayout.desc=Mehrere Seiten eines PDF zu einer Seite zusammenführen
|
home.pageLayout.desc=Mehrere Seiten eines PDF zu einer Seite zusammenführen
|
||||||
pageLayout.tags=merge,composite,single-view,organize
|
pageLayout.tags=merge,composite,single-view,organize
|
||||||
|
|
||||||
|
|
||||||
home.scalePages.title=Seitengröße/Skalierung anpassen
|
home.scalePages.title=Seitengröße/Skalierung anpassen
|
||||||
home.scalePages.desc=Größe/Skalierung der Seite und/oder des Inhalts ändern
|
home.scalePages.desc=Größe/Skalierung der Seite und/oder des Inhalts ändern
|
||||||
scalePages.tags=resize,modify,dimension,adapt
|
scalePages.tags=resize,modify,dimension,adapt
|
||||||
|
|
||||||
|
|
||||||
home.pipeline.title=Pipeline (Fortgeschritten)
|
home.pipeline.title=Pipeline (Fortgeschritten)
|
||||||
home.pipeline.desc=Mehrere Aktionen auf ein PDF anwenden, definiert durch einen Pipeline Skript
|
home.pipeline.desc=Mehrere Aktionen auf ein PDF anwenden, definiert durch einen Pipeline Skript
|
||||||
pipeline.tags=automate,sequence,scripted,batch-process
|
pipeline.tags=automate,sequence,scripted,batch-process
|
||||||
|
|
||||||
|
|
||||||
home.add-page-numbers.title=Seitenzahlen hinzufügen
|
home.add-page-numbers.title=Seitenzahlen hinzufügen
|
||||||
home.add-page-numbers.desc=Hinzufügen von Seitenzahlen an einer bestimmten Stelle
|
home.add-page-numbers.desc=Hinzufügen von Seitenzahlen an einer bestimmten Stelle
|
||||||
add-page-numbers.tags=paginate,label,organize,index
|
add-page-numbers.tags=paginate,label,organize,index
|
||||||
|
|
||||||
|
|
||||||
home.auto-rename.title=PDF automatisch umbenennen
|
home.auto-rename.title=PDF automatisch umbenennen
|
||||||
home.auto-rename.desc=PDF-Datei anhand von erkannten Kopfzeilen umbenennen
|
home.auto-rename.desc=PDF-Datei anhand von erkannten Kopfzeilen umbenennen
|
||||||
auto-rename.tags=auto-detect,header-based,organize,relabel
|
auto-rename.tags=auto-detect,header-based,organize,relabel
|
||||||
|
|
||||||
|
|
||||||
home.adjust-contrast.title=Farben/Kontrast anpassen
|
home.adjust-contrast.title=Farben/Kontrast anpassen
|
||||||
home.adjust-contrast.desc=Kontrast, Sättigung und Helligkeit einer PDF anpassen
|
home.adjust-contrast.desc=Kontrast, Sättigung und Helligkeit einer PDF anpassen
|
||||||
adjust-contrast.tags=color-correction,tune,modify,enhance
|
adjust-contrast.tags=color-correction,tune,modify,enhance
|
||||||
|
|
||||||
|
|
||||||
home.crop.title=PDF zuschneiden
|
home.crop.title=PDF zuschneiden
|
||||||
home.crop.desc=PDF zuschneiden um die Größe zu verändern (Text bleibt erhalten!)
|
home.crop.desc=PDF zuschneiden um die Größe zu verändern (Text bleibt erhalten!)
|
||||||
crop.tags=trim,shrink,edit,shape
|
crop.tags=trim,shrink,edit,shape
|
||||||
|
|
||||||
|
|
||||||
home.autoSplitPDF.title=PDF automatisch teilen
|
home.autoSplitPDF.title=PDF automatisch teilen
|
||||||
home.autoSplitPDF.desc=Physisch gescannte PDF anhand von Splitter-Seiten und QR-Codes aufteilen
|
home.autoSplitPDF.desc=Physisch gescannte PDF anhand von Splitter-Seiten und QR-Codes aufteilen
|
||||||
autoSplitPDF.tags=QR-based,separate,scan-segment,organize
|
autoSplitPDF.tags=QR-based,separate,scan-segment,organize
|
||||||
|
|
||||||
|
|
||||||
home.sanitizePdf.title=PDF Bereinigen
|
home.sanitizePdf.title=PDF Bereinigen
|
||||||
home.sanitizePdf.desc=Entfernen von Skripten und anderen Elementen aus PDF-Dateien
|
home.sanitizePdf.desc=Entfernen von Skripten und anderen Elementen aus PDF-Dateien
|
||||||
sanitizePdf.tags=clean,secure,safe,remove-threats
|
sanitizePdf.tags=clean,secure,safe,remove-threats
|
||||||
|
|
||||||
|
|
||||||
home.URLToPDF.title=URL/Website zu PDF
|
home.URLToPDF.title=URL/Website zu PDF
|
||||||
home.URLToPDF.desc=Konvertiert jede http(s)URL zu PDF
|
home.URLToPDF.desc=Konvertiert jede http(s)URL zu PDF
|
||||||
URLToPDF.tags=web-capture,save-page,web-to-doc,archive
|
URLToPDF.tags=web-capture,save-page,web-to-doc,archive
|
||||||
|
|
||||||
|
|
||||||
home.HTMLToPDF.title=HTML zu PDF
|
home.HTMLToPDF.title=HTML zu PDF
|
||||||
home.HTMLToPDF.desc=Konvertiert jede HTML-Datei oder Zip-Archiv zu PDF
|
home.HTMLToPDF.desc=Konvertiert jede HTML-Datei oder Zip-Archiv zu PDF
|
||||||
HTMLToPDF.tags=markup,web-content,transformation,convert
|
HTMLToPDF.tags=markup,web-content,transformation,convert
|
||||||
|
@ -345,12 +327,10 @@ home.showJS.title=Javascript anzeigen
|
||||||
home.showJS.desc=Alle Javascript Funktionen in einer PDF anzeigen
|
home.showJS.desc=Alle Javascript Funktionen in einer PDF anzeigen
|
||||||
showJS.tags=JS
|
showJS.tags=JS
|
||||||
|
|
||||||
|
|
||||||
home.autoRedact.title=Automatisch zensieren/schwärzen
|
home.autoRedact.title=Automatisch zensieren/schwärzen
|
||||||
home.autoRedact.desc=Automatisches zensiertes (Schwärzen) von Text in einer PDF-Datei basierend auf dem eingegebenen Text
|
home.autoRedact.desc=Automatisches zensiertes (Schwärzen) von Text in einer PDF-Datei basierend auf dem eingegebenen Text
|
||||||
showJS.tags=JS
|
showJS.tags=JS
|
||||||
|
|
||||||
|
|
||||||
###########################
|
###########################
|
||||||
# #
|
# #
|
||||||
# WEB PAGES #
|
# WEB PAGES #
|
||||||
|
@ -412,6 +392,7 @@ MarkdownToPDF.help=In Arbeit
|
||||||
MarkdownToPDF.credit=Verwendet WeasyPrint
|
MarkdownToPDF.credit=Verwendet WeasyPrint
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
#url-to-pdf
|
#url-to-pdf
|
||||||
URLToPDF.title=URL zu PDF
|
URLToPDF.title=URL zu PDF
|
||||||
URLToPDF.header=URL zu PDF
|
URLToPDF.header=URL zu PDF
|
||||||
|
@ -787,13 +768,6 @@ changeMetadata.selectText.5=Benutzerdefinierten Metadateneintrag hinzufügen
|
||||||
changeMetadata.submit=Ändern
|
changeMetadata.submit=Ändern
|
||||||
|
|
||||||
|
|
||||||
#xlsToPdf
|
|
||||||
xlsToPdf.title=Excel in PDF
|
|
||||||
xlsToPdf.header=Excel in PDF
|
|
||||||
xlsToPdf.selectText.1=XLS- oder XLSX-Excel-Tabelle zum Konvertieren auswählen
|
|
||||||
xlsToPdf.convert=konvertieren
|
|
||||||
|
|
||||||
|
|
||||||
#pdfToPDFA
|
#pdfToPDFA
|
||||||
pdfToPDFA.title=PDF zu PDF/A
|
pdfToPDFA.title=PDF zu PDF/A
|
||||||
pdfToPDFA.header=PDF zu PDF/A
|
pdfToPDFA.header=PDF zu PDF/A
|
||||||
|
|
|
@ -56,7 +56,7 @@ usernameExistsMessage=New Username already exists.
|
||||||
#############
|
#############
|
||||||
navbar.convert=Convert
|
navbar.convert=Convert
|
||||||
navbar.security=Security
|
navbar.security=Security
|
||||||
navbar.other=Other
|
navbar.other=Miscellaneous
|
||||||
navbar.darkmode=Dark Mode
|
navbar.darkmode=Dark Mode
|
||||||
navbar.pageOps=Page Operations
|
navbar.pageOps=Page Operations
|
||||||
navbar.settings=Settings
|
navbar.settings=Settings
|
||||||
|
|
|
@ -35,9 +35,6 @@ delete=Delete
|
||||||
username=Username
|
username=Username
|
||||||
password=Password
|
password=Password
|
||||||
welcome=Welcome
|
welcome=Welcome
|
||||||
##########################
|
|
||||||
### TODO: Translate ###
|
|
||||||
##########################
|
|
||||||
property=Property
|
property=Property
|
||||||
black=Black
|
black=Black
|
||||||
white=White
|
white=White
|
||||||
|
@ -46,7 +43,11 @@ green=Green
|
||||||
blue=Blue
|
blue=Blue
|
||||||
custom=Custom...
|
custom=Custom...
|
||||||
|
|
||||||
|
changedCredsMessage=Credentials changed!
|
||||||
|
notAuthenticatedMessage=User not authenticated.
|
||||||
|
userNotFoundMessage=User not found.
|
||||||
|
incorrectPasswordMessage=Current password is incorrect.
|
||||||
|
usernameExistsMessage=New Username already exists.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -55,7 +56,7 @@ custom=Custom...
|
||||||
#############
|
#############
|
||||||
navbar.convert=Convert
|
navbar.convert=Convert
|
||||||
navbar.security=Security
|
navbar.security=Security
|
||||||
navbar.other=Other
|
navbar.other=Miscellaneous
|
||||||
navbar.darkmode=Dark Mode
|
navbar.darkmode=Dark Mode
|
||||||
navbar.pageOps=Page Operations
|
navbar.pageOps=Page Operations
|
||||||
navbar.settings=Settings
|
navbar.settings=Settings
|
||||||
|
@ -74,6 +75,19 @@ settings.zipThreshold=Zip files when the number of downloaded files exceeds
|
||||||
settings.signOut=Sign Out
|
settings.signOut=Sign Out
|
||||||
settings.accountSettings=Account Settings
|
settings.accountSettings=Account Settings
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
changeCreds.title=Change Credentials
|
||||||
|
changeCreds.header=Update Your Account Details
|
||||||
|
changeCreds.changeUserAndPassword=You are using default login credentials. Please enter a new password (and username if wanted)
|
||||||
|
changeCreds.newUsername=New Username
|
||||||
|
changeCreds.oldPassword=Current Password
|
||||||
|
changeCreds.newPassword=New Password
|
||||||
|
changeCreds.confirmNewPassword=Confirm New Password
|
||||||
|
changeCreds.submit=Submit Changes
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
account.title=Account Settings
|
account.title=Account Settings
|
||||||
account.accountSettings=Account Settings
|
account.accountSettings=Account Settings
|
||||||
account.adminSettings=Admin Settings - View and Add Users
|
account.adminSettings=Admin Settings - View and Add Users
|
||||||
|
@ -105,6 +119,7 @@ adminUserSettings.role=Role
|
||||||
adminUserSettings.actions=Actions
|
adminUserSettings.actions=Actions
|
||||||
adminUserSettings.apiUser=Limited API User
|
adminUserSettings.apiUser=Limited API User
|
||||||
adminUserSettings.webOnlyUser=Web Only User
|
adminUserSettings.webOnlyUser=Web Only User
|
||||||
|
adminUserSettings.forceChange=Force user to change username/password on login
|
||||||
adminUserSettings.submit=Save User
|
adminUserSettings.submit=Save User
|
||||||
|
|
||||||
#############
|
#############
|
||||||
|
@ -333,9 +348,6 @@ login.signinTitle=Please sign in
|
||||||
#auto-redact
|
#auto-redact
|
||||||
autoRedact.title=Auto Redact
|
autoRedact.title=Auto Redact
|
||||||
autoRedact.header=Auto Redact
|
autoRedact.header=Auto Redact
|
||||||
##########################
|
|
||||||
### TODO: Translate ###
|
|
||||||
##########################
|
|
||||||
autoRedact.colorLabel=Color
|
autoRedact.colorLabel=Color
|
||||||
autoRedact.textsToRedactLabel=Text to Redact (line-separated)
|
autoRedact.textsToRedactLabel=Text to Redact (line-separated)
|
||||||
autoRedact.textsToRedactPlaceholder=e.g. \nConfidential \nTop-Secret
|
autoRedact.textsToRedactPlaceholder=e.g. \nConfidential \nTop-Secret
|
||||||
|
@ -756,13 +768,6 @@ changeMetadata.selectText.5=Add Custom Metadata Entry
|
||||||
changeMetadata.submit=Change
|
changeMetadata.submit=Change
|
||||||
|
|
||||||
|
|
||||||
#xlsToPdf
|
|
||||||
xlsToPdf.title=Excel to PDF
|
|
||||||
xlsToPdf.header=Excel to PDF
|
|
||||||
xlsToPdf.selectText.1=Select XLS or XLSX Excel sheet to convert
|
|
||||||
xlsToPdf.convert=convert
|
|
||||||
|
|
||||||
|
|
||||||
#pdfToPDFA
|
#pdfToPDFA
|
||||||
pdfToPDFA.title=PDF To PDF/A
|
pdfToPDFA.title=PDF To PDF/A
|
||||||
pdfToPDFA.header=PDF To PDF/A
|
pdfToPDFA.header=PDF To PDF/A
|
||||||
|
|
|
@ -35,9 +35,6 @@ delete=Delete
|
||||||
username=Username
|
username=Username
|
||||||
password=Password
|
password=Password
|
||||||
welcome=Welcome
|
welcome=Welcome
|
||||||
##########################
|
|
||||||
### TODO: Translate ###
|
|
||||||
##########################
|
|
||||||
property=Property
|
property=Property
|
||||||
black=Black
|
black=Black
|
||||||
white=White
|
white=White
|
||||||
|
@ -46,7 +43,11 @@ green=Green
|
||||||
blue=Blue
|
blue=Blue
|
||||||
custom=Custom...
|
custom=Custom...
|
||||||
|
|
||||||
|
changedCredsMessage=Credentials changed!
|
||||||
|
notAuthenticatedMessage=User not authenticated.
|
||||||
|
userNotFoundMessage=User not found.
|
||||||
|
incorrectPasswordMessage=Current password is incorrect.
|
||||||
|
usernameExistsMessage=New Username already exists.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -74,6 +75,19 @@ settings.zipThreshold=Ficheros ZIP cuando excede el número de ficheros descarga
|
||||||
settings.signOut=Sign Out
|
settings.signOut=Sign Out
|
||||||
settings.accountSettings=Account Settings
|
settings.accountSettings=Account Settings
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
changeCreds.title=Change Credentials
|
||||||
|
changeCreds.header=Update Your Account Details
|
||||||
|
changeCreds.changeUserAndPassword=You are using default login credentials. Please enter a new password (and username if wanted)
|
||||||
|
changeCreds.newUsername=New Username
|
||||||
|
changeCreds.oldPassword=Current Password
|
||||||
|
changeCreds.newPassword=New Password
|
||||||
|
changeCreds.confirmNewPassword=Confirm New Password
|
||||||
|
changeCreds.submit=Submit Changes
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
account.title=Account Settings
|
account.title=Account Settings
|
||||||
account.accountSettings=Account Settings
|
account.accountSettings=Account Settings
|
||||||
account.adminSettings=Admin Settings - View and Add Users
|
account.adminSettings=Admin Settings - View and Add Users
|
||||||
|
@ -105,6 +119,7 @@ adminUserSettings.role=Role
|
||||||
adminUserSettings.actions=Actions
|
adminUserSettings.actions=Actions
|
||||||
adminUserSettings.apiUser=Limited API User
|
adminUserSettings.apiUser=Limited API User
|
||||||
adminUserSettings.webOnlyUser=Web Only User
|
adminUserSettings.webOnlyUser=Web Only User
|
||||||
|
adminUserSettings.forceChange=Force user to change username/password on login
|
||||||
adminUserSettings.submit=Save User
|
adminUserSettings.submit=Save User
|
||||||
|
|
||||||
#############
|
#############
|
||||||
|
@ -333,9 +348,6 @@ login.signinTitle=Please sign in
|
||||||
#auto-redact
|
#auto-redact
|
||||||
autoRedact.title=Auto Redact
|
autoRedact.title=Auto Redact
|
||||||
autoRedact.header=Auto Redact
|
autoRedact.header=Auto Redact
|
||||||
##########################
|
|
||||||
### TODO: Translate ###
|
|
||||||
##########################
|
|
||||||
autoRedact.colorLabel=Colour
|
autoRedact.colorLabel=Colour
|
||||||
autoRedact.textsToRedactLabel=Text to Redact (line-separated)
|
autoRedact.textsToRedactLabel=Text to Redact (line-separated)
|
||||||
autoRedact.textsToRedactPlaceholder=e.g. \nConfidential \nTop-Secret
|
autoRedact.textsToRedactPlaceholder=e.g. \nConfidential \nTop-Secret
|
||||||
|
@ -756,13 +768,6 @@ changeMetadata.selectText.5=Agregar entrada de metadatos personalizados
|
||||||
changeMetadata.submit=Cambiar
|
changeMetadata.submit=Cambiar
|
||||||
|
|
||||||
|
|
||||||
#xlsToPdf
|
|
||||||
xlsToPdf.title=Excel a PDF
|
|
||||||
xlsToPdf.header=Excel a PDF
|
|
||||||
xlsToPdf.selectText.1=Seleccionar hoja de cálculo de Excel XLS o XLSX para convertir
|
|
||||||
xlsToPdf.convert=Convertir
|
|
||||||
|
|
||||||
|
|
||||||
#pdfToPDFA
|
#pdfToPDFA
|
||||||
pdfToPDFA.title=PDF a PDF/A
|
pdfToPDFA.title=PDF a PDF/A
|
||||||
pdfToPDFA.header=PDF a PDF/A
|
pdfToPDFA.header=PDF a PDF/A
|
||||||
|
|
|
@ -35,9 +35,6 @@ delete=ezabatu
|
||||||
username=Erabiltzaile izena
|
username=Erabiltzaile izena
|
||||||
password=Pasahitza
|
password=Pasahitza
|
||||||
welcome=Ongi etorria
|
welcome=Ongi etorria
|
||||||
##########################
|
|
||||||
### TODO: Translate ###
|
|
||||||
##########################
|
|
||||||
property=Propietate
|
property=Propietate
|
||||||
black=Beltza
|
black=Beltza
|
||||||
white=Txuria
|
white=Txuria
|
||||||
|
@ -46,7 +43,11 @@ green=Berdea
|
||||||
blue=Urdina
|
blue=Urdina
|
||||||
custom=Pertsonalizatu...
|
custom=Pertsonalizatu...
|
||||||
|
|
||||||
|
changedCredsMessage=Credentials changed!
|
||||||
|
notAuthenticatedMessage=User not authenticated.
|
||||||
|
userNotFoundMessage=User not found.
|
||||||
|
incorrectPasswordMessage=Current password is incorrect.
|
||||||
|
usernameExistsMessage=New Username already exists.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -74,6 +75,19 @@ settings.zipThreshold=ZIP fitxategiak deskargatutako fitxategi kopurua gainditze
|
||||||
settings.signOut=Saioa itxi
|
settings.signOut=Saioa itxi
|
||||||
settings.accountSettings=Kontuaren ezarpenak
|
settings.accountSettings=Kontuaren ezarpenak
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
changeCreds.title=Change Credentials
|
||||||
|
changeCreds.header=Update Your Account Details
|
||||||
|
changeCreds.changeUserAndPassword=You are using default login credentials. Please enter a new password (and username if wanted)
|
||||||
|
changeCreds.newUsername=New Username
|
||||||
|
changeCreds.oldPassword=Current Password
|
||||||
|
changeCreds.newPassword=New Password
|
||||||
|
changeCreds.confirmNewPassword=Confirm New Password
|
||||||
|
changeCreds.submit=Submit Changes
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
account.title=Kontuaren ezarpenak
|
account.title=Kontuaren ezarpenak
|
||||||
account.accountSettings=Kontuaren ezarpenak
|
account.accountSettings=Kontuaren ezarpenak
|
||||||
account.adminSettings=Admin ezarpenak - Ikusi eta gehitu Erabiltzaileak
|
account.adminSettings=Admin ezarpenak - Ikusi eta gehitu Erabiltzaileak
|
||||||
|
@ -105,6 +119,7 @@ adminUserSettings.role=Rol
|
||||||
adminUserSettings.actions=Ekintzak
|
adminUserSettings.actions=Ekintzak
|
||||||
adminUserSettings.apiUser=APIren erabiltzaile mugatua
|
adminUserSettings.apiUser=APIren erabiltzaile mugatua
|
||||||
adminUserSettings.webOnlyUser=Web-erabiltzailea bakarrik
|
adminUserSettings.webOnlyUser=Web-erabiltzailea bakarrik
|
||||||
|
adminUserSettings.forceChange=Force user to change username/password on login
|
||||||
adminUserSettings.submit=Gorde Erabiltzailea
|
adminUserSettings.submit=Gorde Erabiltzailea
|
||||||
|
|
||||||
#############
|
#############
|
||||||
|
@ -333,9 +348,6 @@ login.signinTitle=Mesedez, hasi saioa
|
||||||
#auto-redact
|
#auto-redact
|
||||||
autoRedact.title=Auto Idatzi
|
autoRedact.title=Auto Idatzi
|
||||||
autoRedact.header=Auto Idatzi
|
autoRedact.header=Auto Idatzi
|
||||||
##########################
|
|
||||||
### TODO: Translate ###
|
|
||||||
##########################
|
|
||||||
autoRedact.colorLabel=Kolorea
|
autoRedact.colorLabel=Kolorea
|
||||||
autoRedact.textsToRedactLabel=Idazteko testua (lerro bidez bereizia)
|
autoRedact.textsToRedactLabel=Idazteko testua (lerro bidez bereizia)
|
||||||
autoRedact.textsToRedactPlaceholder=adib. \nKonfidentziala \nTop-Secret
|
autoRedact.textsToRedactPlaceholder=adib. \nKonfidentziala \nTop-Secret
|
||||||
|
@ -418,7 +430,7 @@ addPageNumbers.selectText.5=Orrialde kopurua
|
||||||
addPageNumbers.selectText.6=Testu pertsonalizatua
|
addPageNumbers.selectText.6=Testu pertsonalizatua
|
||||||
addPageNumbers.customTextDesc=Testu pertsonalizatua
|
addPageNumbers.customTextDesc=Testu pertsonalizatua
|
||||||
addPageNumbers.numberPagesDesc=Zein orri numeratu, lehenetsita 'denak', 1-5 edo 2,5,9 etab onartzen ditu
|
addPageNumbers.numberPagesDesc=Zein orri numeratu, lehenetsita 'denak', 1-5 edo 2,5,9 etab onartzen ditu
|
||||||
addPageNumbers.customNumberDesc=Lehenetsoa {n}-ra, '{n} orria {total}-tik', 'Text-{n}', '{filename}-{n}' ere onartzen du
|
addPageNumbers.customNumberDesc=Lehenetsoa {n}-ra, '{n} orria {total}-tik', 'Text-{n}', '{filename}-{n}' ere onartzen du
|
||||||
addPageNumbers.submit=Gehitu orrialde-zenbakiak
|
addPageNumbers.submit=Gehitu orrialde-zenbakiak
|
||||||
|
|
||||||
|
|
||||||
|
@ -756,13 +768,6 @@ changeMetadata.selectText.5=Gehitu metadatu pertsonalizatuen sarrera
|
||||||
changeMetadata.submit=Aldatu
|
changeMetadata.submit=Aldatu
|
||||||
|
|
||||||
|
|
||||||
#xlsToPdf
|
|
||||||
xlsToPdf.title=Excela PDF bihurtu
|
|
||||||
xlsToPdf.header=Excela PDF bihurtu
|
|
||||||
xlsToPdf.selectText.1=Hautatu Excel XLSren edo XLSXren kalkulu-orria bihurtzeko
|
|
||||||
xlsToPdf.convert=Bikurtu
|
|
||||||
|
|
||||||
|
|
||||||
#pdfToPDFA
|
#pdfToPDFA
|
||||||
pdfToPDFA.title=PDFa PDF/A bihurtu
|
pdfToPDFA.title=PDFa PDF/A bihurtu
|
||||||
pdfToPDFA.header=PDFa PDF/A bihurtu
|
pdfToPDFA.header=PDFa PDF/A bihurtu
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
###########
|
###########
|
||||||
# Generic #
|
# Generic #
|
||||||
###########
|
###########
|
||||||
# the direction that the language is written (ltr = left to right, rtl = right to left)
|
# the direction that the language is written (ltr=left to right, rtl = right to left)
|
||||||
language.direction=ltr
|
language.direction=ltr
|
||||||
|
|
||||||
pdfPrompt=Sélectionnez le(s) PDF
|
pdfPrompt=Sélectionnez le(s) PDF
|
||||||
|
@ -43,7 +43,11 @@ green=Vert
|
||||||
blue=Bleu
|
blue=Bleu
|
||||||
custom=Personnalisé\u2026
|
custom=Personnalisé\u2026
|
||||||
|
|
||||||
|
changedCredsMessage=Credentials changed!
|
||||||
|
notAuthenticatedMessage=User not authenticated.
|
||||||
|
userNotFoundMessage=User not found.
|
||||||
|
incorrectPasswordMessage=Current password is incorrect.
|
||||||
|
usernameExistsMessage=New Username already exists.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -71,11 +75,25 @@ settings.zipThreshold=Compresser les fichiers en ZIP lorsque le nombre de fichie
|
||||||
settings.signOut=Déconnexion
|
settings.signOut=Déconnexion
|
||||||
settings.accountSettings=Paramètres du compte
|
settings.accountSettings=Paramètres du compte
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
changeCreds.title=Change Credentials
|
||||||
|
changeCreds.header=Update Your Account Details
|
||||||
|
changeCreds.changeUserAndPassword=You are using default login credentials. Please enter a new password (and username if wanted)
|
||||||
|
changeCreds.newUsername=New Username
|
||||||
|
changeCreds.oldPassword=Current Password
|
||||||
|
changeCreds.newPassword=New Password
|
||||||
|
changeCreds.confirmNewPassword=Confirm New Password
|
||||||
|
changeCreds.submit=Submit Changes
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
account.title=Paramètres du compte
|
account.title=Paramètres du compte
|
||||||
account.accountSettings=Paramètres du compte
|
account.accountSettings=Paramètres du compte
|
||||||
account.adminSettings=Paramètres d\u2019administration \u2013 Voir et ajouter des utilisateurs
|
account.adminSettings=Paramètres d\u2019administration \u2013 Voir et ajouter des utilisateurs
|
||||||
account.userControlSettings=Contrôle des paramètres des utilisateurs
|
account.userControlSettings=Contrôle des paramètres des utilisateurs
|
||||||
account.changeUsername=Modifier le nom d\u2019utilisateur
|
account.changeUsername=Modifier le nom d\u2019utilisateur
|
||||||
|
account.changeUsername=Modifier le nom d\u2019utilisateur
|
||||||
account.password=Mot de passe de confirmation
|
account.password=Mot de passe de confirmation
|
||||||
account.oldPassword=Ancien mot de passe
|
account.oldPassword=Ancien mot de passe
|
||||||
account.newPassword=Nouveau mot de passe
|
account.newPassword=Nouveau mot de passe
|
||||||
|
@ -101,6 +119,7 @@ adminUserSettings.role=Rôle
|
||||||
adminUserSettings.actions=Actions
|
adminUserSettings.actions=Actions
|
||||||
adminUserSettings.apiUser=Utilisateur API limité
|
adminUserSettings.apiUser=Utilisateur API limité
|
||||||
adminUserSettings.webOnlyUser=Utilisateur Web uniquement
|
adminUserSettings.webOnlyUser=Utilisateur Web uniquement
|
||||||
|
adminUserSettings.forceChange=Force user to change username/password on login
|
||||||
adminUserSettings.submit=Ajouter
|
adminUserSettings.submit=Ajouter
|
||||||
|
|
||||||
#############
|
#############
|
||||||
|
@ -306,7 +325,7 @@ PdfToSinglePage.tags=fusionner,merge,une seule page,single page
|
||||||
|
|
||||||
home.showJS.title=Afficher le JavaScript
|
home.showJS.title=Afficher le JavaScript
|
||||||
home.showJS.desc=Recherche et affiche tout JavaScript injecté dans un PDF.
|
home.showJS.desc=Recherche et affiche tout JavaScript injecté dans un PDF.
|
||||||
showJS.tags=afficher,javascript,js
|
showJS.tags=caviarder,redact,auto
|
||||||
|
|
||||||
home.autoRedact.title=Caviarder automatiquement
|
home.autoRedact.title=Caviarder automatiquement
|
||||||
home.autoRedact.desc=Caviardez automatiquement les informations sensibles d\u2019un PDF.
|
home.autoRedact.desc=Caviardez automatiquement les informations sensibles d\u2019un PDF.
|
||||||
|
@ -538,7 +557,7 @@ ScannerImageSplit.selectText.8=Définit la surface de contour minimale pour une
|
||||||
ScannerImageSplit.selectText.9=Taille de la bordure
|
ScannerImageSplit.selectText.9=Taille de la bordure
|
||||||
ScannerImageSplit.selectText.10=Définit la taille de la bordure ajoutée et supprimée pour éviter les bordures blanches dans la sortie (par défaut\u00a0: 1).
|
ScannerImageSplit.selectText.10=Définit la taille de la bordure ajoutée et supprimée pour éviter les bordures blanches dans la sortie (par défaut\u00a0: 1).
|
||||||
|
|
||||||
|
|
||||||
#OCR
|
#OCR
|
||||||
ocr.title=OCR / Nettoyage des numérisations
|
ocr.title=OCR / Nettoyage des numérisations
|
||||||
ocr.header=OCR (Reconnaissance optique de caractères) / Nettoyage des numérisations
|
ocr.header=OCR (Reconnaissance optique de caractères) / Nettoyage des numérisations
|
||||||
|
@ -627,7 +646,7 @@ rotate.selectAngle=Angle de rotation (par multiples de 90\u202fdegrés)
|
||||||
rotate.submit=Pivoter
|
rotate.submit=Pivoter
|
||||||
|
|
||||||
|
|
||||||
#split
|
#merge
|
||||||
split.title=Diviser
|
split.title=Diviser
|
||||||
split.header=Diviser
|
split.header=Diviser
|
||||||
split.desc.1=Les numéros que vous sélectionnez sont le numéro de page sur lequel vous souhaitez faire une division
|
split.desc.1=Les numéros que vous sélectionnez sont le numéro de page sur lequel vous souhaitez faire une division
|
||||||
|
@ -642,17 +661,17 @@ split.splitPages=Pages sur lesquelles diviser
|
||||||
split.submit=Diviser
|
split.submit=Diviser
|
||||||
|
|
||||||
|
|
||||||
#imageToPDF
|
#merge
|
||||||
imageToPDF.title=Image en PDF
|
imageToPDF.title=Image en PDF
|
||||||
imageToPDF.header=Image en PDF
|
imageToPDF.header=Image en PDF
|
||||||
|
imageToPDF.submit=Convertir
|
||||||
imageToPDF.selectText.1=Étirer pour adapter
|
imageToPDF.selectText.1=Étirer pour adapter
|
||||||
imageToPDF.selectText.2=Rotation automatique du PDF
|
imageToPDF.selectText.2=Rotation automatique du PDF
|
||||||
imageToPDF.selectText.3=Logique multi-fichiers (uniquement activée si vous travaillez avec plusieurs images)
|
imageToPDF.selectText.3=Logique multi-fichiers (uniquement activée si vous travaillez avec plusieurs images)
|
||||||
imageToPDF.selectText.4=Fusionner en un seul PDF
|
imageToPDF.selectText.4=Fusionner en un seul PDF
|
||||||
imageToPDF.selectText.5=Convertir en PDF séparés
|
imageToPDF.selectText.5=Convertir en PDF séparés
|
||||||
imageToPDF.submit=Convertir
|
|
||||||
|
|
||||||
|
|
||||||
#pdfToImage
|
#pdfToImage
|
||||||
pdfToImage.title=Image en PDF
|
pdfToImage.title=Image en PDF
|
||||||
pdfToImage.header=Image en PDF
|
pdfToImage.header=Image en PDF
|
||||||
|
|
|
@ -35,9 +35,6 @@ delete=Elimina
|
||||||
username=Username
|
username=Username
|
||||||
password=Password
|
password=Password
|
||||||
welcome=Benvenuto
|
welcome=Benvenuto
|
||||||
##########################
|
|
||||||
### TODO: Translate ###
|
|
||||||
##########################
|
|
||||||
property=Proprietà
|
property=Proprietà
|
||||||
black=Nero
|
black=Nero
|
||||||
white=Bianco
|
white=Bianco
|
||||||
|
@ -46,7 +43,11 @@ green=Verde
|
||||||
blue=Blu
|
blue=Blu
|
||||||
custom=Personalizzato
|
custom=Personalizzato
|
||||||
|
|
||||||
|
changedCredsMessage=Credentials changed!
|
||||||
|
notAuthenticatedMessage=User not authenticated.
|
||||||
|
userNotFoundMessage=User not found.
|
||||||
|
incorrectPasswordMessage=Current password is incorrect.
|
||||||
|
usernameExistsMessage=New Username already exists.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -74,6 +75,19 @@ settings.zipThreshold=Comprimi file in .zip quando il numero di download supera
|
||||||
settings.signOut=Logout
|
settings.signOut=Logout
|
||||||
settings.accountSettings=Impostazioni Account
|
settings.accountSettings=Impostazioni Account
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
changeCreds.title=Change Credentials
|
||||||
|
changeCreds.header=Update Your Account Details
|
||||||
|
changeCreds.changeUserAndPassword=You are using default login credentials. Please enter a new password (and username if wanted)
|
||||||
|
changeCreds.newUsername=New Username
|
||||||
|
changeCreds.oldPassword=Current Password
|
||||||
|
changeCreds.newPassword=New Password
|
||||||
|
changeCreds.confirmNewPassword=Confirm New Password
|
||||||
|
changeCreds.submit=Submit Changes
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
account.title=Impostazioni Account
|
account.title=Impostazioni Account
|
||||||
account.accountSettings=Impostazioni Account
|
account.accountSettings=Impostazioni Account
|
||||||
account.adminSettings=Impostazioni Admin - Aggiungi e Vedi Utenti
|
account.adminSettings=Impostazioni Admin - Aggiungi e Vedi Utenti
|
||||||
|
@ -105,6 +119,7 @@ adminUserSettings.role=Ruolo
|
||||||
adminUserSettings.actions=Azioni
|
adminUserSettings.actions=Azioni
|
||||||
adminUserSettings.apiUser=Utente API limitato
|
adminUserSettings.apiUser=Utente API limitato
|
||||||
adminUserSettings.webOnlyUser=Utente solo Web
|
adminUserSettings.webOnlyUser=Utente solo Web
|
||||||
|
adminUserSettings.forceChange=Force user to change username/password on login
|
||||||
adminUserSettings.submit=Salva utente
|
adminUserSettings.submit=Salva utente
|
||||||
|
|
||||||
#############
|
#############
|
||||||
|
@ -333,9 +348,6 @@ login.signinTitle=Per favore accedi
|
||||||
#auto-redact
|
#auto-redact
|
||||||
autoRedact.title=Redazione automatica
|
autoRedact.title=Redazione automatica
|
||||||
autoRedact.header=Redazione automatica
|
autoRedact.header=Redazione automatica
|
||||||
##########################
|
|
||||||
### TODO: Translate ###
|
|
||||||
##########################
|
|
||||||
autoRedact.colorLabel=Colore
|
autoRedact.colorLabel=Colore
|
||||||
autoRedact.textsToRedactLabel=Testo da oscurare (separato da righe)
|
autoRedact.textsToRedactLabel=Testo da oscurare (separato da righe)
|
||||||
autoRedact.textsToRedactPlaceholder=per esempio. \nConfidenziale \nTop-Secret
|
autoRedact.textsToRedactPlaceholder=per esempio. \nConfidenziale \nTop-Secret
|
||||||
|
@ -756,13 +768,6 @@ changeMetadata.selectText.5=Aggiungi proprietà personalizzata:
|
||||||
changeMetadata.submit=Cambia Proprietà
|
changeMetadata.submit=Cambia Proprietà
|
||||||
|
|
||||||
|
|
||||||
#xlsToPdf
|
|
||||||
xlsToPdf.title=Da Excel a PDF
|
|
||||||
xlsToPdf.header=Da Excel a PDF
|
|
||||||
xlsToPdf.selectText.1=Seleziona un foglio XLS o XLSX da convertire
|
|
||||||
xlsToPdf.convert=Converti
|
|
||||||
|
|
||||||
|
|
||||||
#pdfToPDFA
|
#pdfToPDFA
|
||||||
pdfToPDFA.title=Da PDF a PDF/A
|
pdfToPDFA.title=Da PDF a PDF/A
|
||||||
pdfToPDFA.header=Da PDF a PDF/A
|
pdfToPDFA.header=Da PDF a PDF/A
|
||||||
|
|
|
@ -35,9 +35,6 @@ delete=削除
|
||||||
username=ユーザー名
|
username=ユーザー名
|
||||||
password=パスワード
|
password=パスワード
|
||||||
welcome=ようこそ
|
welcome=ようこそ
|
||||||
##########################
|
|
||||||
### TODO: Translate ###
|
|
||||||
##########################
|
|
||||||
property=プロパティ
|
property=プロパティ
|
||||||
black=黒
|
black=黒
|
||||||
white=白
|
white=白
|
||||||
|
@ -46,7 +43,11 @@ green=緑
|
||||||
blue=青
|
blue=青
|
||||||
custom=カスタム...
|
custom=カスタム...
|
||||||
|
|
||||||
|
changedCredsMessage=Credentials changed!
|
||||||
|
notAuthenticatedMessage=User not authenticated.
|
||||||
|
userNotFoundMessage=User not found.
|
||||||
|
incorrectPasswordMessage=Current password is incorrect.
|
||||||
|
usernameExistsMessage=New Username already exists.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -74,6 +75,19 @@ settings.zipThreshold=このファイル数を超えたときにファイルを
|
||||||
settings.signOut=サインアウト
|
settings.signOut=サインアウト
|
||||||
settings.accountSettings=アカウント設定
|
settings.accountSettings=アカウント設定
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
changeCreds.title=Change Credentials
|
||||||
|
changeCreds.header=Update Your Account Details
|
||||||
|
changeCreds.changeUserAndPassword=You are using default login credentials. Please enter a new password (and username if wanted)
|
||||||
|
changeCreds.newUsername=New Username
|
||||||
|
changeCreds.oldPassword=Current Password
|
||||||
|
changeCreds.newPassword=New Password
|
||||||
|
changeCreds.confirmNewPassword=Confirm New Password
|
||||||
|
changeCreds.submit=Submit Changes
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
account.title=アカウント設定
|
account.title=アカウント設定
|
||||||
account.accountSettings=アカウント設定
|
account.accountSettings=アカウント設定
|
||||||
account.adminSettings=管理者設定 - ユーザーの表示と追加
|
account.adminSettings=管理者設定 - ユーザーの表示と追加
|
||||||
|
@ -105,6 +119,7 @@ adminUserSettings.role=役割
|
||||||
adminUserSettings.actions=アクション
|
adminUserSettings.actions=アクション
|
||||||
adminUserSettings.apiUser=限定されたAPIユーザー
|
adminUserSettings.apiUser=限定されたAPIユーザー
|
||||||
adminUserSettings.webOnlyUser=ウェブ専用ユーザー
|
adminUserSettings.webOnlyUser=ウェブ専用ユーザー
|
||||||
|
adminUserSettings.forceChange=Force user to change username/password on login
|
||||||
adminUserSettings.submit=ユーザーの保存
|
adminUserSettings.submit=ユーザーの保存
|
||||||
|
|
||||||
#############
|
#############
|
||||||
|
@ -333,9 +348,6 @@ login.signinTitle=サインインしてください
|
||||||
#auto-redact
|
#auto-redact
|
||||||
autoRedact.title=自動塗りつぶし
|
autoRedact.title=自動塗りつぶし
|
||||||
autoRedact.header=自動塗りつぶし
|
autoRedact.header=自動塗りつぶし
|
||||||
##########################
|
|
||||||
### TODO: Translate ###
|
|
||||||
##########################
|
|
||||||
autoRedact.colorLabel=カラー
|
autoRedact.colorLabel=カラー
|
||||||
autoRedact.textsToRedactLabel=編集するテキスト (line-separated)
|
autoRedact.textsToRedactLabel=編集するテキスト (line-separated)
|
||||||
autoRedact.textsToRedactPlaceholder=例 \n機密 \n極秘
|
autoRedact.textsToRedactPlaceholder=例 \n機密 \n極秘
|
||||||
|
@ -756,13 +768,6 @@ changeMetadata.selectText.5=カスタムメタデータの追加
|
||||||
changeMetadata.submit=変更
|
changeMetadata.submit=変更
|
||||||
|
|
||||||
|
|
||||||
#xlsToPdf
|
|
||||||
xlsToPdf.title=ExcelをPDFに変換
|
|
||||||
xlsToPdf.header=ExcelをPDFに変換
|
|
||||||
xlsToPdf.selectText.1=変換するXLSまたはXLSX Execlシートを選択
|
|
||||||
xlsToPdf.convert=変換
|
|
||||||
|
|
||||||
|
|
||||||
#pdfToPDFA
|
#pdfToPDFA
|
||||||
pdfToPDFA.title=PDFをPDF/Aに変換
|
pdfToPDFA.title=PDFをPDF/Aに変換
|
||||||
pdfToPDFA.header=PDFをPDF/Aに変換
|
pdfToPDFA.header=PDFをPDF/Aに変換
|
||||||
|
|
|
@ -35,9 +35,6 @@ delete=Delete
|
||||||
username=Username
|
username=Username
|
||||||
password=Password
|
password=Password
|
||||||
welcome=Welcome
|
welcome=Welcome
|
||||||
##########################
|
|
||||||
### TODO: Translate ###
|
|
||||||
##########################
|
|
||||||
property=Property
|
property=Property
|
||||||
black=Black
|
black=Black
|
||||||
white=White
|
white=White
|
||||||
|
@ -46,7 +43,11 @@ green=Green
|
||||||
blue=Blue
|
blue=Blue
|
||||||
custom=Custom...
|
custom=Custom...
|
||||||
|
|
||||||
|
changedCredsMessage=Credentials changed!
|
||||||
|
notAuthenticatedMessage=User not authenticated.
|
||||||
|
userNotFoundMessage=User not found.
|
||||||
|
incorrectPasswordMessage=Current password is incorrect.
|
||||||
|
usernameExistsMessage=New Username already exists.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -74,6 +75,19 @@ settings.zipThreshold=다운로드한 파일 수가 초과된 경우 파일 압
|
||||||
settings.signOut=Sign Out
|
settings.signOut=Sign Out
|
||||||
settings.accountSettings=Account Settings
|
settings.accountSettings=Account Settings
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
changeCreds.title=Change Credentials
|
||||||
|
changeCreds.header=Update Your Account Details
|
||||||
|
changeCreds.changeUserAndPassword=You are using default login credentials. Please enter a new password (and username if wanted)
|
||||||
|
changeCreds.newUsername=New Username
|
||||||
|
changeCreds.oldPassword=Current Password
|
||||||
|
changeCreds.newPassword=New Password
|
||||||
|
changeCreds.confirmNewPassword=Confirm New Password
|
||||||
|
changeCreds.submit=Submit Changes
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
account.title=Account Settings
|
account.title=Account Settings
|
||||||
account.accountSettings=Account Settings
|
account.accountSettings=Account Settings
|
||||||
account.adminSettings=Admin Settings - View and Add Users
|
account.adminSettings=Admin Settings - View and Add Users
|
||||||
|
@ -105,6 +119,7 @@ adminUserSettings.role=Role
|
||||||
adminUserSettings.actions=Actions
|
adminUserSettings.actions=Actions
|
||||||
adminUserSettings.apiUser=Limited API User
|
adminUserSettings.apiUser=Limited API User
|
||||||
adminUserSettings.webOnlyUser=Web Only User
|
adminUserSettings.webOnlyUser=Web Only User
|
||||||
|
adminUserSettings.forceChange=Force user to change username/password on login
|
||||||
adminUserSettings.submit=Save User
|
adminUserSettings.submit=Save User
|
||||||
|
|
||||||
#############
|
#############
|
||||||
|
@ -333,9 +348,6 @@ login.signinTitle=Please sign in
|
||||||
#auto-redact
|
#auto-redact
|
||||||
autoRedact.title=Auto Redact
|
autoRedact.title=Auto Redact
|
||||||
autoRedact.header=Auto Redact
|
autoRedact.header=Auto Redact
|
||||||
##########################
|
|
||||||
### TODO: Translate ###
|
|
||||||
##########################
|
|
||||||
autoRedact.colorLabel=Colour
|
autoRedact.colorLabel=Colour
|
||||||
autoRedact.textsToRedactLabel=Text to Redact (line-separated)
|
autoRedact.textsToRedactLabel=Text to Redact (line-separated)
|
||||||
autoRedact.textsToRedactPlaceholder=e.g. \nConfidential \nTop-Secret
|
autoRedact.textsToRedactPlaceholder=e.g. \nConfidential \nTop-Secret
|
||||||
|
@ -756,13 +768,6 @@ changeMetadata.selectText.5=사용자 정의 메타데이터 항목 추가
|
||||||
changeMetadata.submit=변경
|
changeMetadata.submit=변경
|
||||||
|
|
||||||
|
|
||||||
#xlsToPdf
|
|
||||||
xlsToPdf.title=Excel to PDF
|
|
||||||
xlsToPdf.header=Excel을 PDF로 변환
|
|
||||||
xlsToPdf.selectText.1=변환할 XLS 또는 XLSX Excel 시트 선택
|
|
||||||
xlsToPdf.convert=변환하기
|
|
||||||
|
|
||||||
|
|
||||||
#pdfToPDFA
|
#pdfToPDFA
|
||||||
pdfToPDFA.title=PDF To PDF/A
|
pdfToPDFA.title=PDF To PDF/A
|
||||||
pdfToPDFA.header=PDF를 PDF/A로 변환
|
pdfToPDFA.header=PDF를 PDF/A로 변환
|
||||||
|
|
|
@ -35,9 +35,6 @@ delete=Verwijderen
|
||||||
username=Gebruikersnaam
|
username=Gebruikersnaam
|
||||||
password=Wachtwoord
|
password=Wachtwoord
|
||||||
welcome=Welkom
|
welcome=Welkom
|
||||||
##########################
|
|
||||||
### TODO: Translate ###
|
|
||||||
##########################
|
|
||||||
property=Property
|
property=Property
|
||||||
black=Black
|
black=Black
|
||||||
white=White
|
white=White
|
||||||
|
@ -46,7 +43,11 @@ green=Green
|
||||||
blue=Blue
|
blue=Blue
|
||||||
custom=Custom...
|
custom=Custom...
|
||||||
|
|
||||||
|
changedCredsMessage=Credentials changed!
|
||||||
|
notAuthenticatedMessage=User not authenticated.
|
||||||
|
userNotFoundMessage=User not found.
|
||||||
|
incorrectPasswordMessage=Current password is incorrect.
|
||||||
|
usernameExistsMessage=New Username already exists.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
@ -74,6 +75,19 @@ settings.zipThreshold=Zip bestanden wanneer het aantal gedownloade bestanden ove
|
||||||
settings.signOut=Uitloggen
|
settings.signOut=Uitloggen
|
||||||
settings.accountSettings=Account instellingen
|
settings.accountSettings=Account instellingen
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
changeCreds.title=Change Credentials
|
||||||
|
changeCreds.header=Update Your Account Details
|
||||||
|
changeCreds.changeUserAndPassword=You are using default login credentials. Please enter a new password (and username if wanted)
|
||||||
|
changeCreds.newUsername=New Username
|
||||||
|
changeCreds.oldPassword=Current Password
|
||||||
|
changeCreds.newPassword=New Password
|
||||||
|
changeCreds.confirmNewPassword=Confirm New Password
|
||||||
|
changeCreds.submit=Submit Changes
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
account.title=Account instellingen
|
account.title=Account instellingen
|
||||||
account.accountSettings=Account instellingen
|
account.accountSettings=Account instellingen
|
||||||
account.adminSettings=Beheerdersinstellingen - Gebruikers bekijken en toevoegen
|
account.adminSettings=Beheerdersinstellingen - Gebruikers bekijken en toevoegen
|
||||||
|
@ -105,6 +119,7 @@ adminUserSettings.role=Rol
|
||||||
adminUserSettings.actions=Acties
|
adminUserSettings.actions=Acties
|
||||||
adminUserSettings.apiUser=Beperkte API gebruiker
|
adminUserSettings.apiUser=Beperkte API gebruiker
|
||||||
adminUserSettings.webOnlyUser=Alleen web gebruiker
|
adminUserSettings.webOnlyUser=Alleen web gebruiker
|
||||||
|
adminUserSettings.forceChange=Force user to change username/password on login
|
||||||
adminUserSettings.submit=Sla gebruiker op
|
adminUserSettings.submit=Sla gebruiker op
|
||||||
|
|
||||||
#############
|
#############
|
||||||
|
@ -333,9 +348,6 @@ login.signinTitle=Please sign in
|
||||||
#auto-redact
|
#auto-redact
|
||||||
autoRedact.title=Auto Redact
|
autoRedact.title=Auto Redact
|
||||||
autoRedact.header=Auto Redact
|
autoRedact.header=Auto Redact
|
||||||
##########################
|
|
||||||
### TODO: Translate ###
|
|
||||||
##########################
|
|
||||||
autoRedact.colorLabel=Colour
|
autoRedact.colorLabel=Colour
|
||||||
autoRedact.textsToRedactLabel=Text to Redact (line-separated)
|
autoRedact.textsToRedactLabel=Text to Redact (line-separated)
|
||||||
autoRedact.textsToRedactPlaceholder=e.g. \nConfidential \nTop-Secret
|
autoRedact.textsToRedactPlaceholder=e.g. \nConfidential \nTop-Secret
|
||||||
|
@ -756,13 +768,6 @@ changeMetadata.selectText.5=Voeg aangepaste metadata-invoer toe
|
||||||
changeMetadata.submit=Wijzigen
|
changeMetadata.submit=Wijzigen
|
||||||
|
|
||||||
|
|
||||||
#xlsToPdf
|
|
||||||
xlsToPdf.title=Excel naar PDF
|
|
||||||
xlsToPdf.header=Excel naar PDF
|
|
||||||
xlsToPdf.selectText.1=Selecteer XLS of XLSX Excel-blad om te converteren
|
|
||||||
xlsToPdf.convert=Converteren
|
|
||||||
|
|
||||||
|
|
||||||
#pdfToPDFA
|
#pdfToPDFA
|
||||||
pdfToPDFA.title=PDF naar PDF/A
|
pdfToPDFA.title=PDF naar PDF/A
|
||||||
pdfToPDFA.header=PDF naar PDF/A
|
pdfToPDFA.header=PDF naar PDF/A
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue