Каков правильный путь к глубокому клонированию PDPage? - PullRequest
0 голосов
/ 08 апреля 2019

Я работаю с PDFBOX v2, я пытаюсь клонировать первый PDPage PDDocument, чтобы сохранить его в качестве шаблона для новых PDPages.На этой первой странице есть несколько полей acroform, которые мне нужно заполнить.

Я пробовал некоторые методы, но кто-то хочет, чтобы я достиг.

1) Скопируйте содержимое первой страницы и добавьте его в документ.когда мне нужна новая страницаЭто копирует страницу, но поле acroform связано с полями других страниц, и если я изменю значение поля с первой страницы, это будет показано на других страницах.

//Save in variable first page content
COSDictionary pageContent = (COSDictionary)doc.getPage(0).getCOSObject();
...

//when i need insert new page
doc.addPage(new PDPage(pageContent));

2) Клонируйте содержимое первой страницы изатем добавьте в документ, как первый метод.Эта копия страницы, но никакое поле не копируется: /

PDFCloneUtility cloner = new PDFCloneUtility(doc);
COSDictionary pageContent = (COSDictionary)cloner.cloneForNewDocument(doc.getPage(0).getCOSObject());

...

//when i need insert new page
doc.addPage(new PDPage(pageContent));

Тогда, как правильно сделать глубокую копию PDPage, получая поля акроформы независимо от первой страницы?

Спасибо!

1 Ответ

0 голосов
/ 10 апреля 2019

Я получил решение!

1) Начните с пустого шаблона PDF, только 1 страница. Откройте шаблон документа, заполните общие данные и сохраните как байт [] в памяти.


PDDocument templatedoc = PDDocument.load(new File(path));           
PDDocumentCatalog catalog = templatedoc.getDocumentCatalog();           

PDAcroFrom acroForm = catalog.getAcroForm());

... fill acroForm common data of all pages ...

ByteArrayOutputStream basicTemplate = new ByteArrayOutputStream();          
templatedoc.save(basicTemplate);

byte[] filledBasicTemplate = basicTemplate.toByteArray();

2) Создать новый документ для каждой необходимой страницы.


List<PDDocument> documents = new ArrayList<PDDocument>();
PDDocument activeDoc;

for(int i = 0; i < 5; i++) {
  activeDoc = PDDocument.load(filledBasicTemplate);
  documents.add(activeDoc);

  ... fill acroform or you need in each page ...

}

3) Импортируйте все первые страницы нового документа в окончательный документ и сохраните окончательный документ.


PDDocument finalDoc = new PDDocument();

for(PDDocument currentDoc : documents) {
   ... fill common things like page numbers ...
   finalDoc.importPage(currentDoc.getPage(0));
}

finalDoc.save(new File(path));


... close all documents after save the final document ...

Возможно, это не самый оптимизированный код, но он работает.

...