mirror of
https://github.com/Stirling-Tools/Stirling-PDF.git
synced 2025-06-22 23:45:02 +00:00

# Description of Changes Create new tool to remove read-only properties of form fields. - Added new html file to provide a page for the tool (misc/unlock-pdf-forms.html), as well as new endpoint (/unlock-pdf-forms) under config/EndpointConfiguration.java - Added the tool to the list of "view & edit" tools under the home page in home-legacy.html and navElements.html - Mapped the frontend in controller/web/OtherWebController.java - Created a new controller (controller/api/misc/UnlockPDFFormsController.java) to handle AcroForm /Ff flags, /Lock tags and XFA Forms, removing the read-only properties of all form fields of a PDF document. - Added language entries to all the language files, to correctly display the tool's title, header,description, etc. Closes #2965 --- ## Checklist ### General - [x] I have read the [Contribution Guidelines](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/CONTRIBUTING.md) - [x] I have read the [Stirling-PDF Developer Guide](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/DeveloperGuide.md) (if applicable) - [ ] I have read the [How to add new languages to Stirling-PDF](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/HowToAddNewLanguage.md) (if applicable) - [x] I have performed a self-review of my own code - [x] My changes generate no new warnings ### Documentation - [ ] I have updated relevant docs on [Stirling-PDF's doc repo](https://github.com/Stirling-Tools/Stirling-Tools.github.io/blob/main/docs/) (if functionality has heavily changed) - [ ] I have read the section [Add New Translation Tags](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/HowToAddNewLanguage.md#add-new-translation-tags) (for new translation tags only) ### UI Changes - [x] Screenshots or videos demonstrating the UI changes are attached (e.g., as comments or direct attachments in the PR)    ### Testing (if applicable) - [x] I have tested my changes locally. Refer to the [Testing Guide](https://github.com/Stirling-Tools/Stirling-PDF/blob/main/DeveloperGuide.md#6-testing) for more details. --------- Co-authored-by: Anthony Stirling <77850077+Frooodle@users.noreply.github.com>
195 lines
5.7 KiB
Java
195 lines
5.7 KiB
Java
package stirling.software.SPDF.controller.web;
|
|
|
|
import java.io.File;
|
|
import java.util.Arrays;
|
|
import java.util.Collections;
|
|
import java.util.List;
|
|
|
|
import org.springframework.stereotype.Controller;
|
|
import org.springframework.ui.Model;
|
|
import org.springframework.web.bind.annotation.GetMapping;
|
|
import org.springframework.web.servlet.ModelAndView;
|
|
|
|
import io.swagger.v3.oas.annotations.Hidden;
|
|
import io.swagger.v3.oas.annotations.tags.Tag;
|
|
|
|
import lombok.RequiredArgsConstructor;
|
|
|
|
import stirling.software.SPDF.model.ApplicationProperties;
|
|
import stirling.software.SPDF.utils.CheckProgramInstall;
|
|
|
|
@Controller
|
|
@Tag(name = "Misc", description = "Miscellaneous APIs")
|
|
@RequiredArgsConstructor
|
|
public class OtherWebController {
|
|
|
|
private final ApplicationProperties applicationProperties;
|
|
|
|
@GetMapping("/compress-pdf")
|
|
@Hidden
|
|
public String compressPdfForm(Model model) {
|
|
model.addAttribute("currentPage", "compress-pdf");
|
|
return "misc/compress-pdf";
|
|
}
|
|
|
|
@GetMapping("/replace-and-invert-color-pdf")
|
|
@Hidden
|
|
public String replaceAndInvertColorPdfForm(Model model) {
|
|
model.addAttribute("currentPage", "replace-invert-color-pdf");
|
|
return "misc/replace-color";
|
|
}
|
|
|
|
@GetMapping("/extract-image-scans")
|
|
@Hidden
|
|
public ModelAndView extractImageScansForm() {
|
|
ModelAndView modelAndView = new ModelAndView("misc/extract-image-scans");
|
|
boolean isPython = CheckProgramInstall.isPythonAvailable();
|
|
modelAndView.addObject("isPython", isPython);
|
|
modelAndView.addObject("currentPage", "extract-image-scans");
|
|
return modelAndView;
|
|
}
|
|
|
|
@GetMapping("/show-javascript")
|
|
@Hidden
|
|
public String extractJavascriptForm(Model model) {
|
|
model.addAttribute("currentPage", "show-javascript");
|
|
return "misc/show-javascript";
|
|
}
|
|
|
|
@GetMapping("/stamp")
|
|
@Hidden
|
|
public String stampForm(Model model) {
|
|
model.addAttribute("currentPage", "stamp");
|
|
return "misc/stamp";
|
|
}
|
|
|
|
@GetMapping("/add-page-numbers")
|
|
@Hidden
|
|
public String addPageNumbersForm(Model model) {
|
|
model.addAttribute("currentPage", "add-page-numbers");
|
|
return "misc/add-page-numbers";
|
|
}
|
|
|
|
@GetMapping("/fake-scan")
|
|
@Hidden
|
|
public String fakeScanForm(Model model) {
|
|
model.addAttribute("currentPage", "fake-scan");
|
|
return "misc/fake-scan";
|
|
}
|
|
|
|
@GetMapping("/extract-images")
|
|
@Hidden
|
|
public String extractImagesForm(Model model) {
|
|
model.addAttribute("currentPage", "extract-images");
|
|
return "misc/extract-images";
|
|
}
|
|
|
|
@GetMapping("/flatten")
|
|
@Hidden
|
|
public String flattenForm(Model model) {
|
|
model.addAttribute("currentPage", "flatten");
|
|
return "misc/flatten";
|
|
}
|
|
|
|
@GetMapping("/change-metadata")
|
|
@Hidden
|
|
public String addWatermarkForm(Model model) {
|
|
model.addAttribute("currentPage", "change-metadata");
|
|
return "misc/change-metadata";
|
|
}
|
|
|
|
@GetMapping("/unlock-pdf-forms")
|
|
@Hidden
|
|
public String unlockPDFForms(Model model) {
|
|
model.addAttribute("currentPage", "unlock-pdf-forms");
|
|
return "misc/unlock-pdf-forms";
|
|
}
|
|
|
|
@GetMapping("/compare")
|
|
@Hidden
|
|
public String compareForm(Model model) {
|
|
model.addAttribute("currentPage", "compare");
|
|
return "misc/compare";
|
|
}
|
|
|
|
@GetMapping("/print-file")
|
|
@Hidden
|
|
public String printFileForm(Model model) {
|
|
model.addAttribute("currentPage", "print-file");
|
|
return "misc/print-file";
|
|
}
|
|
|
|
public List<String> getAvailableTesseractLanguages() {
|
|
String tessdataDir = applicationProperties.getSystem().getTessdataDir();
|
|
File[] files = new File(tessdataDir).listFiles();
|
|
if (files == null) {
|
|
return Collections.emptyList();
|
|
}
|
|
return Arrays.stream(files)
|
|
.filter(file -> file.getName().endsWith(".traineddata"))
|
|
.map(file -> file.getName().replace(".traineddata", ""))
|
|
.filter(lang -> !"osd".equalsIgnoreCase(lang))
|
|
.sorted()
|
|
.toList();
|
|
}
|
|
|
|
@GetMapping("/ocr-pdf")
|
|
@Hidden
|
|
public ModelAndView ocrPdfPage() {
|
|
ModelAndView modelAndView = new ModelAndView("misc/ocr-pdf");
|
|
List<String> languages = getAvailableTesseractLanguages();
|
|
modelAndView.addObject("languages", languages);
|
|
modelAndView.addObject("currentPage", "ocr-pdf");
|
|
return modelAndView;
|
|
}
|
|
|
|
@GetMapping("/add-image")
|
|
@Hidden
|
|
public String overlayImage(Model model) {
|
|
model.addAttribute("currentPage", "add-image");
|
|
return "misc/add-image";
|
|
}
|
|
|
|
@GetMapping("/adjust-contrast")
|
|
@Hidden
|
|
public String contrast(Model model) {
|
|
model.addAttribute("currentPage", "adjust-contrast");
|
|
return "misc/adjust-contrast";
|
|
}
|
|
|
|
@GetMapping("/repair")
|
|
@Hidden
|
|
public String repairForm(Model model) {
|
|
model.addAttribute("currentPage", "repair");
|
|
return "misc/repair";
|
|
}
|
|
|
|
@GetMapping("/remove-blanks")
|
|
@Hidden
|
|
public String removeBlanksForm(Model model) {
|
|
model.addAttribute("currentPage", "remove-blanks");
|
|
return "misc/remove-blanks";
|
|
}
|
|
|
|
@GetMapping("/remove-annotations")
|
|
@Hidden
|
|
public String removeAnnotationsForm(Model model) {
|
|
model.addAttribute("currentPage", "remove-annotations");
|
|
return "misc/remove-annotations";
|
|
}
|
|
|
|
@GetMapping("/auto-crop")
|
|
@Hidden
|
|
public String autoCropForm(Model model) {
|
|
model.addAttribute("currentPage", "auto-crop");
|
|
return "misc/auto-crop";
|
|
}
|
|
|
|
@GetMapping("/auto-rename")
|
|
@Hidden
|
|
public String autoRenameForm(Model model) {
|
|
model.addAttribute("currentPage", "auto-rename");
|
|
return "misc/auto-rename";
|
|
}
|
|
}
|