Как клонировать сгенерированный PDDocument в pdfbox 2.0.x? - PullRequest
0 голосов
/ 01 ноября 2018

Я использую 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?
и еще полдюжины разной неуместности.

Благодарен за любые советы

/ Расм

...