Skip to content

Commit

Permalink
Add: Option to remove the digital signature when merging (#1424)
Browse files Browse the repository at this point in the history
  • Loading branch information
Ludy87 committed Jun 9, 2024
1 parent 2e11b63 commit 7543f49
Show file tree
Hide file tree
Showing 35 changed files with 105 additions and 15 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -10,11 +10,16 @@
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;

import org.apache.pdfbox.Loader;
import org.apache.pdfbox.multipdf.PDFMergerUtility;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDDocumentCatalog;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.interactive.form.PDAcroForm;
import org.apache.pdfbox.pdmodel.interactive.form.PDField;
import org.apache.pdfbox.pdmodel.interactive.form.PDSignatureField;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.ResponseEntity;
Expand All @@ -38,6 +43,7 @@ public class MergeController {

private static final Logger logger = LoggerFactory.getLogger(MergeController.class);

// Merges a list of PDDocument objects into a single PDDocument
public PDDocument mergeDocuments(List<PDDocument> documents) throws IOException {
PDDocument mergedDoc = new PDDocument();
for (PDDocument doc : documents) {
Expand All @@ -48,6 +54,7 @@ public PDDocument mergeDocuments(List<PDDocument> documents) throws IOException
return mergedDoc;
}

// Returns a comparator for sorting MultipartFile arrays based on the given sort type
private Comparator<MultipartFile> getSortComparator(String sortType) {
switch (sortType) {
case "byFileName":
Expand Down Expand Up @@ -108,37 +115,78 @@ private Comparator<MultipartFile> getSortComparator(String sortType) {
"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(@ModelAttribute MergePdfsRequest form)
throws IOException {
List<File> filesToDelete = new ArrayList<File>();
List<File> filesToDelete = new ArrayList<>(); // List of temporary files to delete
ByteArrayOutputStream docOutputstream =
new ByteArrayOutputStream(); // Stream for the merged document
PDDocument mergedDocument = null;

boolean removeCertSign = form.isRemoveCertSign();

try {
MultipartFile[] files = form.getFileInput();
Arrays.sort(files, getSortComparator(form.getSortType()));

PDFMergerUtility mergedDoc = new PDFMergerUtility();
ByteArrayOutputStream docOutputstream = new ByteArrayOutputStream();
Arrays.sort(
files,
getSortComparator(
form.getSortType())); // Sort files based on the given sort type

PDFMergerUtility mergerUtility = new PDFMergerUtility();
for (MultipartFile multipartFile : files) {
File tempFile = GeneralUtils.convertMultipartFileToFile(multipartFile);
filesToDelete.add(tempFile);
mergedDoc.addSource(tempFile);
File tempFile =
GeneralUtils.convertMultipartFileToFile(
multipartFile); // Convert MultipartFile to File
filesToDelete.add(tempFile); // Add temp file to the list for later deletion
mergerUtility.addSource(tempFile); // Add source file to the merger utility
}
mergerUtility.setDestinationStream(
docOutputstream); // Set the output stream for the merged document
mergerUtility.mergeDocuments(null); // Merge the documents

mergedDoc.setDestinationFileName(
files[0].getOriginalFilename().replaceFirst("[.][^.]+$", "") + "_merged.pdf");
mergedDoc.setDestinationStream(docOutputstream);
byte[] mergedPdfBytes = docOutputstream.toByteArray(); // Get merged document bytes

mergedDoc.mergeDocuments(null);
// Load the merged PDF document
mergedDocument = Loader.loadPDF(mergedPdfBytes);

// Remove signatures if removeCertSign is true
if (removeCertSign) {
PDDocumentCatalog catalog = mergedDocument.getDocumentCatalog();
PDAcroForm acroForm = catalog.getAcroForm();
if (acroForm != null) {
List<PDField> fieldsToRemove =
acroForm.getFields().stream()
.filter(field -> field instanceof PDSignatureField)
.collect(Collectors.toList());

if (!fieldsToRemove.isEmpty()) {
acroForm.flatten(
fieldsToRemove,
false); // Flatten the fields, effectively removing them
}
}
}

// Save the modified document to a new ByteArrayOutputStream
ByteArrayOutputStream baos = new ByteArrayOutputStream();
mergedDocument.save(baos);

String mergedFileName =
files[0].getOriginalFilename().replaceFirst("[.][^.]+$", "")
+ "_merged_unsigned.pdf";
return WebResponseUtils.bytesToWebResponse(
docOutputstream.toByteArray(), mergedDoc.getDestinationFileName());
baos.toByteArray(), mergedFileName); // Return the modified PDF

} catch (Exception ex) {
logger.error("Error in merge pdf process", ex);
throw ex;
} finally {
for (File file : filesToDelete) {
if (file != null) {
Files.deleteIfExists(file.toPath());
Files.deleteIfExists(file.toPath()); // Delete temporary files
}
}
docOutputstream.close();
if (mergedDocument != null) {
mergedDocument.close(); // Close the merged document
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -21,4 +21,10 @@ public class MergePdfsRequest extends MultiplePDFFiles {
},
defaultValue = "orderProvided")
private String sortType = "orderProvided";

@Schema(
description =
"Flag indicating whether to remove certification signatures from the merged PDF. If true, all certification signatures will be removed from the final merged document.",
example = "true")
private boolean isRemoveCertSign;
}
1 change: 1 addition & 0 deletions src/main/resources/messages_ar_AR.properties
Original file line number Diff line number Diff line change
Expand Up @@ -803,6 +803,7 @@ merge.title=دمج
merge.header=دمج ملفات PDF متعددة (2+)
merge.sortByName=Sort by name
merge.sortByDate=Sort by date
merge.removeCertSign=Remove digital signature in the merged file?
merge.submit=دمج


Expand Down
1 change: 1 addition & 0 deletions src/main/resources/messages_bg_BG.properties
Original file line number Diff line number Diff line change
Expand Up @@ -803,6 +803,7 @@ merge.title=Обединяване
merge.header=Обединяване на множество PDF файлове (2+)
merge.sortByName=Сортиране по име
merge.sortByDate=Сортиране по дата
merge.removeCertSign=Remove digital signature in the merged file?
merge.submit=Обединяване


Expand Down
1 change: 1 addition & 0 deletions src/main/resources/messages_ca_CA.properties
Original file line number Diff line number Diff line change
Expand Up @@ -803,6 +803,7 @@ merge.title=Fusiona
merge.header=Fusiona múltiples PDFs (2+)
merge.sortByName=Sort by name
merge.sortByDate=Sort by date
merge.removeCertSign=Remove digital signature in the merged file?
merge.submit=Fusiona


Expand Down
1 change: 1 addition & 0 deletions src/main/resources/messages_cs_CZ.properties
Original file line number Diff line number Diff line change
Expand Up @@ -803,6 +803,7 @@ merge.title=Sloučit
merge.header=Sloučit více PDF (2+)
merge.sortByName=Seřadit podle názvu
merge.sortByDate=Seřadit podle data
merge.removeCertSign=Remove digital signature in the merged file?
merge.submit=Sloučit


Expand Down
1 change: 1 addition & 0 deletions src/main/resources/messages_de_DE.properties
Original file line number Diff line number Diff line change
Expand Up @@ -803,6 +803,7 @@ merge.title=Zusammenführen
merge.header=Mehrere PDFs zusammenführen (2+)
merge.sortByName=Nach Namen sortieren
merge.sortByDate=Nach Datum sortieren
merge.removeCertSign=Digitale Signatur in der zusammengeführten Datei entfernen?
merge.submit=Zusammenführen


Expand Down
1 change: 1 addition & 0 deletions src/main/resources/messages_el_GR.properties
Original file line number Diff line number Diff line change
Expand Up @@ -803,6 +803,7 @@ merge.title=Συγχώνευση
merge.header=Συγχώνευση πολλαπλών PDFs (2+)
merge.sortByName=Ταξινόμηση με βάση το Όνομα
merge.sortByDate=Ταξινόμηση με βάση την Ημερομηνία
merge.removeCertSign=Remove digital signature in the merged file?
merge.submit=Συγχώνευση


Expand Down
1 change: 1 addition & 0 deletions src/main/resources/messages_en_GB.properties
Original file line number Diff line number Diff line change
Expand Up @@ -803,6 +803,7 @@ merge.title=Merge
merge.header=Merge multiple PDFs (2+)
merge.sortByName=Sort by name
merge.sortByDate=Sort by date
merge.removeCertSign=Remove digital signature in the merged file?
merge.submit=Merge


Expand Down
1 change: 1 addition & 0 deletions src/main/resources/messages_en_US.properties
Original file line number Diff line number Diff line change
Expand Up @@ -803,6 +803,7 @@ merge.title=Merge
merge.header=Merge multiple PDFs (2+)
merge.sortByName=Sort by name
merge.sortByDate=Sort by date
merge.removeCertSign=Remove digital signature in the merged file?
merge.submit=Merge


Expand Down
1 change: 1 addition & 0 deletions src/main/resources/messages_es_ES.properties
Original file line number Diff line number Diff line change
Expand Up @@ -803,6 +803,7 @@ merge.title=Unir
merge.header=Unir múltiples PDFs (2+)
merge.sortByName=Ordenar por nombre
merge.sortByDate=Ordenar por fecha
merge.removeCertSign=Remove digital signature in the merged file?
merge.submit=Unir


Expand Down
1 change: 1 addition & 0 deletions src/main/resources/messages_eu_ES.properties
Original file line number Diff line number Diff line change
Expand Up @@ -803,6 +803,7 @@ merge.title=Elkartu
merge.header=Elkartu zenbait PDF (2+)
merge.sortByName=Sort by nameOrdenatu izenaren arabera
merge.sortByDate=Ordenatu dataren arabera
merge.removeCertSign=Remove digital signature in the merged file?
merge.submit=Elkartu


Expand Down
1 change: 1 addition & 0 deletions src/main/resources/messages_fr_FR.properties
Original file line number Diff line number Diff line change
Expand Up @@ -803,6 +803,7 @@ merge.title=Fusionner
merge.header=Fusionner plusieurs PDF
merge.sortByName=Trier par nom
merge.sortByDate=Trier par date
merge.removeCertSign=Remove digital signature in the merged file?
merge.submit=Fusionner


Expand Down
1 change: 1 addition & 0 deletions src/main/resources/messages_hi_IN.properties
Original file line number Diff line number Diff line change
Expand Up @@ -803,6 +803,7 @@ merge.title=मर्ज
merge.header=एक से अधिक PDF एक साथ मर्ज करें (2+)
merge.sortByName=नाम से क्रमबद्ध करें
merge.sortByDate=तारीख से क्रमबद्ध करें
merge.removeCertSign=Remove digital signature in the merged file?
merge.submit=मर्ज करें


Expand Down
1 change: 1 addition & 0 deletions src/main/resources/messages_hr_HR.properties
Original file line number Diff line number Diff line change
Expand Up @@ -803,6 +803,7 @@ merge.title=Spajanje
merge.header=Spajanje više PDF-ova (2+)
merge.sortByName=Poredaj po imenu
merge.sortByDate=Poredaj po datumu
merge.removeCertSign=Remove digital signature in the merged file?
merge.submit=Spajanje


Expand Down
1 change: 1 addition & 0 deletions src/main/resources/messages_hu_HU.properties
Original file line number Diff line number Diff line change
Expand Up @@ -803,6 +803,7 @@ merge.title=Összevonás
merge.header=Több PDF összevonása (2+)
merge.sortByName=Név szerinti rendezés
merge.sortByDate=Dátum szerinti rendezés
merge.removeCertSign=Remove digital signature in the merged file?
merge.submit=Összevonás


Expand Down
1 change: 1 addition & 0 deletions src/main/resources/messages_id_ID.properties
Original file line number Diff line number Diff line change
Expand Up @@ -803,6 +803,7 @@ merge.title=Gabungkan
merge.header=Gabungkan beberapa PDFs (2+)
merge.sortByName=Sortir berdasarkan nama
merge.sortByDate=Sortir berdasrkan tanggal
merge.removeCertSign=Remove digital signature in the merged file?
merge.submit=Gabungkan


Expand Down
1 change: 1 addition & 0 deletions src/main/resources/messages_it_IT.properties
Original file line number Diff line number Diff line change
Expand Up @@ -803,6 +803,7 @@ merge.title=Unisci
merge.header=Unisci 2 o più PDF
merge.sortByName=Ordina per nome
merge.sortByDate=Ordina per data
merge.removeCertSign=Remove digital signature in the merged file?
merge.submit=Unisci


Expand Down
1 change: 1 addition & 0 deletions src/main/resources/messages_ja_JP.properties
Original file line number Diff line number Diff line change
Expand Up @@ -803,6 +803,7 @@ merge.title=結合
merge.header=複数のPDFを結合 (2ファイル以上)
merge.sortByName=名前で並べ替え
merge.sortByDate=日付で並べ替え
merge.removeCertSign=Remove digital signature in the merged file?
merge.submit=結合


Expand Down
1 change: 1 addition & 0 deletions src/main/resources/messages_ko_KR.properties
Original file line number Diff line number Diff line change
Expand Up @@ -803,6 +803,7 @@ merge.title=병합
merge.header=여러 개의 PDF 병합 (2개 이상)
merge.sortByName=이름순 정렬
merge.sortByDate=날짜순 정렬
merge.removeCertSign=Remove digital signature in the merged file?
merge.submit=병합


Expand Down
1 change: 1 addition & 0 deletions src/main/resources/messages_nl_NL.properties
Original file line number Diff line number Diff line change
Expand Up @@ -803,6 +803,7 @@ merge.title=Samenvoegen
merge.header=Meerdere PDF's samenvoegen (2+)
merge.sortByName=Sorteer op naam
merge.sortByDate=Sorteer op datum
merge.removeCertSign=Remove digital signature in the merged file?
merge.submit=Samenvoegen


Expand Down
1 change: 1 addition & 0 deletions src/main/resources/messages_no_NB.properties
Original file line number Diff line number Diff line change
Expand Up @@ -803,6 +803,7 @@ merge.title=Slå sammen
merge.header=Slå sammen flere PDF-er (2+)
merge.sortByName=Sorter etter navn
merge.sortByDate=Sorter etter dato
merge.removeCertSign=Remove digital signature in the merged file?
merge.submit=Slå sammen


Expand Down
1 change: 1 addition & 0 deletions src/main/resources/messages_pl_PL.properties
Original file line number Diff line number Diff line change
Expand Up @@ -803,6 +803,7 @@ merge.title=Połącz
merge.header=Połącz wiele dokumentów PDF (2+)
merge.sortByName=Sort by name
merge.sortByDate=Sort by date
merge.removeCertSign=Remove digital signature in the merged file?
merge.submit=Połącz


Expand Down
1 change: 1 addition & 0 deletions src/main/resources/messages_pt_BR.properties
Original file line number Diff line number Diff line change
Expand Up @@ -803,6 +803,7 @@ merge.title=Mesclar
merge.header=Mesclar Vários PDFs (2+)
merge.sortByName=Sort by name
merge.sortByDate=Sort by date
merge.removeCertSign=Remove digital signature in the merged file?
merge.submit=Mesclar


Expand Down
1 change: 1 addition & 0 deletions src/main/resources/messages_pt_PT.properties
Original file line number Diff line number Diff line change
Expand Up @@ -803,6 +803,7 @@ merge.title=Juntar
merge.header=Juntar Vários PDFs (2+)
merge.sortByName=Ordenar por nome
merge.sortByDate=Ordenar por data
merge.removeCertSign=Remove digital signature in the merged file?
merge.submit=Juntar


Expand Down
1 change: 1 addition & 0 deletions src/main/resources/messages_ro_RO.properties
Original file line number Diff line number Diff line change
Expand Up @@ -803,6 +803,7 @@ merge.title=Unire
merge.header=Unirea mai multor PDF-uri (2+)
merge.sortByName=Sort by name
merge.sortByDate=Sort by date
merge.removeCertSign=Remove digital signature in the merged file?
merge.submit=Unire


Expand Down
1 change: 1 addition & 0 deletions src/main/resources/messages_ru_RU.properties
Original file line number Diff line number Diff line change
Expand Up @@ -803,6 +803,7 @@ merge.title=Объединить
merge.header=Объединение нескольких PDF-файлов (2+)
merge.sortByName=Сортировка по имени
merge.sortByDate=Сортировка по дате
merge.removeCertSign=Remove digital signature in the merged file?
merge.submit=Объединить


Expand Down
1 change: 1 addition & 0 deletions src/main/resources/messages_sk_SK.properties
Original file line number Diff line number Diff line change
Expand Up @@ -803,6 +803,7 @@ merge.title=Zlúčiť
merge.header=Zlúčiť viacero PDF (2+)
merge.sortByName=Zoradiť podľa názvu
merge.sortByDate=Zoradiť podľa dátumu
merge.removeCertSign=Remove digital signature in the merged file?
merge.submit=Zlúčiť


Expand Down
1 change: 1 addition & 0 deletions src/main/resources/messages_sr_LATN_RS.properties
Original file line number Diff line number Diff line change
Expand Up @@ -803,6 +803,7 @@ merge.title=Spajanje
merge.header=Spajanje više PDF fajlova (2+)
merge.sortByName=Sortiraj po imenu
merge.sortByDate=Sortiraj po datumu
merge.removeCertSign=Remove digital signature in the merged file?
merge.submit=Spajanje


Expand Down
1 change: 1 addition & 0 deletions src/main/resources/messages_sv_SE.properties
Original file line number Diff line number Diff line change
Expand Up @@ -803,6 +803,7 @@ merge.title=Sammanfoga
merge.header=Slå samman flera PDF-filer (2+)
merge.sortByName=Sort by name
merge.sortByDate=Sort by date
merge.removeCertSign=Remove digital signature in the merged file?
merge.submit=Slå samman


Expand Down
1 change: 1 addition & 0 deletions src/main/resources/messages_tr_TR.properties
Original file line number Diff line number Diff line change
Expand Up @@ -803,6 +803,7 @@ merge.title=Birleştir
merge.header=Çoklu PDF'leri Birleştir (2+)
merge.sortByName=İsme göre sırala
merge.sortByDate=Tarihe göre sırala
merge.removeCertSign=Remove digital signature in the merged file?
merge.submit=Birleştir


Expand Down
1 change: 1 addition & 0 deletions src/main/resources/messages_uk_UA.properties
Original file line number Diff line number Diff line change
Expand Up @@ -803,6 +803,7 @@ merge.title=Об'єднати
merge.header=Об'єднання кількох PDF-файлів (2+)
merge.sortByName=Сортування за ім'ям
merge.sortByDate=Сортування за датою
merge.removeCertSign=Remove digital signature in the merged file?
merge.submit=Об'єднати


Expand Down
1 change: 1 addition & 0 deletions src/main/resources/messages_zh_CN.properties
Original file line number Diff line number Diff line change
Expand Up @@ -803,6 +803,7 @@ merge.title=合并
merge.header=合并多个PDF(2个以上)。
merge.sortByName=按名称排序
merge.sortByDate=按日期排序
merge.removeCertSign=Remove digital signature in the merged file?
merge.submit=合并


Expand Down
1 change: 1 addition & 0 deletions src/main/resources/messages_zh_TW.properties
Original file line number Diff line number Diff line change
Expand Up @@ -803,6 +803,7 @@ merge.title=合併
merge.header=合併多個 PDF
merge.sortByName=依名稱排序
merge.sortByDate=依日期排序
merge.removeCertSign=Remove digital signature in the merged file?
merge.submit=合併


Expand Down
Loading

0 comments on commit 7543f49

Please sign in to comment.