Я использую pdfbox 2.0.12 для генерации отчетов.
Я хочу создать 2 версии за один раз, с частично похожим содержанием.
(то есть: создать 1-3 страницы, клонировать, добавить больше страниц в каждую версию, сохранить)
Как правильно скопировать PDDocument в новый PDDocument?
Мои файлы довольно простые, просто текст и изображение на странице.
В существующих вопросах StackO [1] используется код из pdfbox 1.8, или что-то еще, что не работает сегодня.
Функция multipdf.PDCloneUtility помечена как устаревшая для публичного использования, а также не для использования сгенерированным PDF: s.
Я не смог найти пример в дереве PDFbox, который делает это.
Я использую функцию importPage. Это почти работает, за исключением некоторой путаницы со шрифтами.
Скопированные страницы имеют верный макет (некоторые строки и изображение), но текст содержит только точки, поскольку не может найти используемые шрифты.
ДОБАВЛЕННЫЕ страницы в скопированном документе используют копии тех же шрифтов, текст в порядке.
При просмотре ресурсов шрифтов в Adobe Reader, в скопированном документе, использованные шрифты перечислены 2 раза:
Roboto-Regular (встроенное подмножество)
Тип: TrueType (CID)
Кодировка: Идентичность-H
Roboto-Regular
Тип: TrueType (CID)
Кодировка: Идентичность-H
Фактический шрифт: неизвестен
(и т.д.)
При открытии скопированного документа появляется предупреждение
«Не удается найти или создать шрифт Roboto-Bold. Некоторые символы могут отображаться или печататься неправильно»
В исходном документе шрифты перечислены один раз, точно так же, как первая запись выше.
Мой код:
// Close content stream before copying
myContentStream.endText();
myContentStream.close();
// Copy pages
PDDocument result = new PDDocument();
result.setDocumentInformation(doc.getDocumentInformation());
int pageCount = doc.getNumberOfPages();
for (int i = 0; i < pageCount; ++i) {
PDPage page = doc.getPage(i);
PDPage importedPage = result.importPage(page);
// This is mentioned in importPage docs, bizarrely it's said to copy resources
importedPage.setRotation(page.getRotation());
// while this seems intuitive
importedPage.setResources(page.getResources());
}
// Fonts are recreated for copy by reloading from file
copy_plainfont = PDType0Font.load(result, new java.io.ByteArrayInputStream(plainfont_bytes));
//....etc
Я перепробовал все комбинации с и без importPage.setRotation / setResources.
Я также попытался использовать doc.getDocumentCatalog (). GetPages () и прокручивать это. Тот же результат.
* * Тысяча сорок-девять [1]
я смотрел на
pdfbox: как клонировать страницу
Может ли дублирование PDF с PDFBox быть маленьким, как с iText?
и еще полдюжины разной неуместности.
Благодарен за любые советы
/ Расм