feat(#3453): Add initial structure for Remove Header/Footer feature

- Add backend API controller with dummy request model
- Register endpoint in appropriate backend groups
- Add test .txt file support for endpoint testing
- Create homepage/navbar card for the feature
- Implement frontend page structure for the feature
- Set up dummy API to test backend–frontend integration
This commit is contained in:
André Antunes Santos 2025-05-15 23:16:28 +01:00
parent 3c507eb303
commit b5bdf5b1c2
12 changed files with 147 additions and 2 deletions

View File

@ -120,6 +120,7 @@ public class EndpointConfiguration {
addEndpointToGroup("PageOps", "scale-pages");
addEndpointToGroup("PageOps", "adjust-contrast");
addEndpointToGroup("PageOps", "crop");
addEndpointToGroup("PageOps", "removeHeaderFooter");
addEndpointToGroup("PageOps", "auto-split-pdf");
addEndpointToGroup("PageOps", "extract-page");
addEndpointToGroup("PageOps", "pdf-to-single-page");
@ -236,6 +237,7 @@ public class EndpointConfiguration {
addEndpointToGroup("Java", "auto-split-pdf");
addEndpointToGroup("Java", "sanitize-pdf");
addEndpointToGroup("Java", "crop");
addEndpointToGroup("Java", "removeHeaderFooter");
addEndpointToGroup("Java", "get-info-on-pdf");
addEndpointToGroup("Java", "extract-page");
addEndpointToGroup("Java", "pdf-to-single-page");

View File

@ -0,0 +1,34 @@
package stirling.software.SPDF.controller.api;
import org.springframework.web.bind.annotation.ModelAttribute;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import io.swagger.v3.oas.annotations.Operation;
import io.swagger.v3.oas.annotations.tags.Tag;
import lombok.RequiredArgsConstructor;
import stirling.software.SPDF.model.api.general.RemoveHeaderFooterForm;
@RestController
@RequestMapping("/api/v1/general")
@Tag(name = "General", description = "General APIs")
@RequiredArgsConstructor
public class RemoveHeaderFooterController {
// private final CustomPDFDocumentFactory pdfDocumentFactory;
@PostMapping(value = "/remove-header-footer", consumes = "multipart/form-data")
@Operation(
summary = "Removes headers and/or footers from a PDF document",
description = "Remove header and/or footer")
public String removeHeaderFooter(@ModelAttribute RemoveHeaderFooterForm form) {
// Print the received message
System.out.println("Received message: " + form.getMessage());
// Respond with a message
return "footer Removed";
}
}

View File

@ -298,6 +298,13 @@ public class GeneralWebController {
return "crop";
}
@GetMapping("/remove-header-footer")
@Hidden
public String removeHeaderFooterForm(Model model) {
model.addAttribute("currentPage", "remove-header-footer");
return "remove-header-footer";
}
@GetMapping("/auto-split-pdf")
@Hidden
public String autoSPlitPDFForm(Model model) {

View File

@ -0,0 +1,13 @@
package stirling.software.SPDF.model.api.general;
import io.swagger.v3.oas.annotations.media.Schema;
import lombok.Data;
@Data
// @EqualsAndHashCode(callSuper = true)
public class RemoveHeaderFooterForm {
@Schema(description = "Test Message", type = "string")
private String message;
}

View File

@ -751,6 +751,10 @@ home.validateSignature.title=Validate PDF Signature
home.validateSignature.desc=Verify digital signatures and certificates in PDF documents
validateSignature.tags=signature,verify,validate,pdf,certificate,digital signature,Validate Signature,Validate certificate
home.remove-header-footer.title=Remove PDF Headers and Footers
home.remove-header-footer.desc=Remove the headers and/or footers from a PDF document
remove-header-footer.tags=remove headers, remove footers, remove, header, footer
#replace-invert-color
replace-color.title=Advanced Colour options
replace-color.header=Replace-Invert Colour PDF
@ -996,6 +1000,10 @@ crop.title=Crop
crop.header=Crop PDF
crop.submit=Submit
#remove-header-footer
remove-header-footer.title=Remove Header/Footer
remove-header-footer.header=Remove Header/Footer
remove-header-footer.submit=Remove
#autoSplitPDF
autoSplitPDF.title=Auto Split PDF

View File

@ -19,6 +19,11 @@
<div
th:replace="~{fragments/navbarEntry :: navbarEntry('crop', 'crop', 'home.crop.title', 'home.crop.desc', 'crop.tags', 'organize')}">
</div>
<div
th:replace="~{fragments/navbarEntry :: navbarEntry('remove-header-footer', 'toolbar', 'home.remove-header-footer.title', 'home.remove-header-footer.desc', 'remove-header-footer.tags', 'organize')}">
</div>
<div
th:replace="~{fragments/navbarEntry :: navbarEntry('pdf-organizer', 'format_list_bulleted', 'home.pdfOrganiser.title', 'home.pdfOrganiser.desc', 'pdfOrganiser.tags', 'organize')}">
</div>

View File

@ -122,6 +122,9 @@
<div
th:replace="~{fragments/card :: card(id='crop', cardTitle=#{home.crop.title}, cardText=#{home.crop.desc}, cardLink='crop', toolIcon='crop', tags=#{crop.tags}, toolGroup='organize')}">
</div>
<div
th:replace="~{fragments/card :: card(id='remove-header-footer', cardTitle=#{home.remove-header-footer.title}, cardText=#{home.remove-header-footer.desc}, cardLink='remove-header-footer', toolIcon='page_header', tags=#{remove-header-footer.tags}, toolGroup='organize')}">
</div>
<div
th:replace="~{fragments/card :: card(id='pdf-organizer', cardTitle=#{home.pdfOrganiser.title}, cardText=#{home.pdfOrganiser.desc}, cardLink='pdf-organizer', toolIcon='format_list_bulleted', tags=#{pdfOrganiser.tags}, toolGroup='organize')}">
</div>

View File

@ -0,0 +1,70 @@
<!DOCTYPE html>
<html th:lang="${#locale.language}" th:dir="#{language.direction}" th:data-language="${#locale.toString()}" xmlns:th="https://www.thymeleaf.org">
<head>
<th:block th:insert="~{fragments/common :: head(title=#{remove-header-footer.title}, header=#{remove-header-footer.header})}"></th:block>
</head>
<body>
<div id="page-container">
<div id="content-wrap">
<th:block th:insert="~{fragments/navbar.html :: navbar}"></th:block>
<br><br>
<div class="container">
<div class="row justify-content-center">
<div class="col-md-6 bg-card">
<div class="tool-header">
<span class="material-symbols-rounded tool-header-icon organize">toolbar</span>
<span class="tool-header-text" th:text="#{remove-header-footer.header}"></span>
</div>
<br><br>
<span>remove_header_footer test</span>
<form id="removeHeaderFooterForm" th:action="@{/api/v1/general/remove-header-footer}" method="post">
<div class="form-group">
<label for="msgInput">Input text</label>
<input type="text" id="msgInput" name="message" class="form-control" placeholder="Enter your message" required>
</div>
<button type="submit" id="submitBtn" class="btn btn-primary" th:text="#{remove-header-footer.submit}"></button>
</form>
<div id="responseContainer" class="mt-3"></div>
</div>
</div>
<script>
document.getElementById('removeHeaderFooterForm').addEventListener('submit', async function (event) {
event.preventDefault(); // Prevent the default form submission
const form = event.target;
const formData = new FormData(form);
const responseContainer = document.getElementById('responseContainer');
try {
// Send the form data to the server using fetch
const response = await fetch(form.action, {
method: form.method,
body: formData,
});
// Parse the response as text
const responseText = await response.text();
// Display the response in the response container
responseContainer.textContent = responseText;
responseContainer.className = 'alert alert-success'; // Add a success style
} catch (error) {
// Handle errors and display an error message
responseContainer.textContent = 'An error occurred. Please try again.';
responseContainer.className = 'alert alert-danger'; // Add an error style
}
});
</script>
<script type="module" th:src="@{'/pdfjs-legacy/pdf.mjs'}"></script>
<!--
<script type="module" th:src="@{'/js/pages/crop.js'}"></script>
-->
</div>
</div>
<th:block th:insert="~{fragments/footer.html :: footer}"></th:block>
</div>
</body>
</html>

View File

@ -128,7 +128,7 @@ ui:
languages: [] # If empty, all languages are enabled. To display only German and Polish ["de_DE", "pl_PL"]. British English is always enabled.
endpoints: # All the possible endpoints are disabled
toRemove: [crop, merge-pdfs, multi-page-layout, overlay-pdfs, pdf-to-single-page, rearrange-pages, remove-image-pdf, remove-pages, rotate-pdf, scale-pages, split-by-size-or-count, split-pages, split-pdf-by-chapters, split-pdf-by-sections, add-password, add-watermark, auto-redact, cert-sign, get-info-on-pdf, redact, remove-cert-sign, remove-password, sanitize-pdf, validate-signature, file-to-pdf, html-to-pdf, img-to-pdf, markdown-to-pdf, pdf-to-csv, pdf-to-html, pdf-to-img, pdf-to-markdown, pdf-to-pdfa, pdf-to-presentation, pdf-to-text, pdf-to-word, pdf-to-xml, url-to-pdf, add-image, add-page-numbers, add-stamp, auto-rename, auto-split-pdf, compress-pdf, decompress-pdf, extract-image-scans, extract-images, flatten, ocr-pdf, remove-blanks, repair, replace-invert-pdf, show-javascript, update-metadata, filter-contains-image, filter-contains-text, filter-file-size, filter-page-count, filter-page-rotation, filter-page-size] # list endpoints to disable (e.g. ['img-to-pdf', 'remove-pages'])
toRemove: [crop, merge-pdfs, multi-page-layout, overlay-pdfs, pdf-to-single-page, rearrange-pages, remove-image-pdf, remove-pages, rotate-pdf, scale-pages, split-by-size-or-count, split-pages, split-pdf-by-chapters, split-pdf-by-sections, add-password, add-watermark, auto-redact, cert-sign, get-info-on-pdf, redact, remove-cert-sign, remove-password, sanitize-pdf, validate-signature, file-to-pdf, html-to-pdf, img-to-pdf, markdown-to-pdf, pdf-to-csv, pdf-to-html, pdf-to-img, pdf-to-markdown, pdf-to-pdfa, pdf-to-presentation, pdf-to-text, pdf-to-word, pdf-to-xml, url-to-pdf, add-image, add-page-numbers, add-stamp, auto-rename, auto-split-pdf, compress-pdf, decompress-pdf, extract-image-scans, extract-images, flatten, ocr-pdf, remove-blanks, repair, replace-invert-pdf, show-javascript, update-metadata, filter-contains-image, filter-contains-text, filter-file-size, filter-page-count, filter-page-rotation, filter-page-size, remove-header-footer] # list endpoints to disable (e.g. ['img-to-pdf', 'remove-pages'])
groupsToRemove: [] # list groups to disable (e.g. ['LibreOffice'])
metrics:

View File

@ -58,3 +58,4 @@
/api/v1/general/multi-page-layout
/api/v1/general/merge-pdfs
/api/v1/general/crop
/api/v1/general/remove-header-footer

View File

@ -51,3 +51,4 @@
/swagger-ui/index.html
/licenses
/releases
/remove-header-footer

View File

@ -62,4 +62,5 @@
/stamp
/validate-signature
/view-pdf
/swagger-ui/index.html
/swagger-ui/index.html
/remove-header-footer