Кажется, что проблема «дублирования» исходит из нескольких страниц, потому что каждая страница содержит свои собственные метаданные шрифта.Если вы перебираете страницы и получаете имена шрифтов, то вы увидите дубликаты в выводе, если шрифт используется более чем на одной странице.
Что-то кажется очень неправильным в деталях вопроса.Ни один из исходных файлов не имеет шрифта ZapfDingbats
, так откуда он появился в объединенном документе?
Сначала я написал несколько вспомогательных методов:
static String mergePdfs(InputStream is1, InputStream is2) throws IOException {
PDFMergerUtility pdfMerger = new PDFMergerUtility();
pdfMerger.addSource(is1);
pdfMerger.addSource(is2);
String destFile = System.getProperty("java.io.tmpdir") + System.nanoTime() + ".pdf";
pdfMerger.setDestinationFileName(destFile);
pdfMerger.mergeDocuments(MemoryUsageSetting.setupMainMemoryOnly());
return destFile;
}
static List<String> getFontNames(PDDocument doc) throws IOException {
List<String> result = new ArrayList<>();
for (int i=0; i < doc.getNumberOfPages(); i++){
PDPage page = doc.getPage(i);
PDResources res = page.getResources();
for (COSName fontName : res.getFontNames()) {
result.add(res.getFont(fontName).toString());
}
}
return result;
}
Затем я создал3 теста PDF документов.Первые 2, test-pdf-1.pdf
и test-pdf-2.pdf
содержат по одной странице каждая и используют те же два шрифта: PDTrueTypeFont BAAAAA+ArialMT
и PDTrueTypeFont CAAAAA+Roboto-Black
.Третий, test-pdf-3.pdf
, содержит 2 страницы из первых двух документов и был создан с помощью текстового редактора, а не с помощью PDFBox.
А затем добавлен следующий тестовый код:
Class clazz = Test.class;
String src1, src2, src3;
src1 = "/test-pdf-1.pdf";
src2 = "/test-pdf-2.pdf";
src3 = "/test-pdf-3.pdf";
InputStream is1, is2, is3;
is1 = clazz.getResourceAsStream(src1);
is2 = clazz.getResourceAsStream(src2);
String merged = mergePdfs(is1, is2);
PDDocument doc1, doc2, doc3, doc4;
is1 = clazz.getResourceAsStream(src1);
doc1 = PDDocument.load(is1);
is2 = clazz.getResourceAsStream(src2);
doc2 = PDDocument.load(is2);
is3 = clazz.getResourceAsStream(src3);
doc3 = PDDocument.load(is3);
doc4 = PDDocument.load(new File(merged));
System.out.println(src1 + " >\n\t" + getFontNames(doc1));
System.out.println(src2 + " >\n\t" + getFontNames(doc2));
System.out.println(src3 + " >\n\t" + getFontNames(doc3));
System.out.println(merged + " >\n\t" + getFontNames(doc4));
Вывод выглядит следующим образом (я усек последнее имя файла для удобства чтения и сравнения):
/test-pdf-1.pdf >
[PDTrueTypeFont BAAAAA+ArialMT, PDTrueTypeFont CAAAAA+Roboto-Black]
/test-pdf-2.pdf >
[PDTrueTypeFont BAAAAA+ArialMT, PDTrueTypeFont CAAAAA+Roboto-Black]
/test-pdf-3.pdf >
[PDTrueTypeFont BAAAAA+ArialMT, PDTrueTypeFont CAAAAA+Roboto-Black, PDTrueTypeFont BAAAAA+ArialMT, PDTrueTypeFont CAAAAA+Roboto-Black]
C:\Temp\..9.pdf >
[PDTrueTypeFont BAAAAA+ArialMT, PDTrueTypeFont CAAAAA+Roboto-Black, PDTrueTypeFont BAAAAA+ArialMT, PDTrueTypeFont CAAAAA+Roboto-Black]
Вы можете видеть, что оба файла, созданные слиянием PDFBox, "C: \ temp \ 7193671804393899.pdf "(сокращенно в выходных данных для удобочитаемости) и файл" test-pdf-3.pdf ", созданный с помощью редактора, имеют одинаковый вывод для шрифтов, показывая каждый шрифт дважды, по одному для каждой страницы.
Открытие объединенного файла в Acrobat Reader подтверждает, что существует только одна копия шрифтов:
Fonts">