mirror of
https://github.com/Frooodle/Stirling-PDF.git
synced 2025-09-12 17:52:13 +02:00
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:
parent
3c507eb303
commit
b5bdf5b1c2
@ -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");
|
||||
|
@ -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";
|
||||
}
|
||||
}
|
@ -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) {
|
||||
|
@ -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;
|
||||
}
|
@ -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
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
|
@ -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>
|
@ -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:
|
||||
|
@ -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
|
||||
|
@ -51,3 +51,4 @@
|
||||
/swagger-ui/index.html
|
||||
/licenses
|
||||
/releases
|
||||
/remove-header-footer
|
||||
|
@ -62,4 +62,5 @@
|
||||
/stamp
|
||||
/validate-signature
|
||||
/view-pdf
|
||||
/swagger-ui/index.html
|
||||
/swagger-ui/index.html
|
||||
/remove-header-footer
|
||||
|
Loading…
Reference in New Issue
Block a user