
< /p>
Мне нужно добавить аннотацию:
Sample comment
во вложенном теге Annot в теге P. Вот так (я сделал вручную в Adobe Acrobat):

Я могу импортировать XML-файл XFDF в PDF-файл:
PDDocument document = PDDocument.load(new File("tagged.pdf"));
FDFDocument fdfDoc = FDFDocument.loadXFDF(new File("annotation.xfdf"));
List fdfAnnots = fdfDoc.getCatalog().getFDF().getAnnotations();
List pageAnnotations = new ArrayList();
for (int i=0; i < fdfAnnots.size(); i++) {
FDFAnnotation fdfannot = fdfAnnots.get(i);
PDAnnotation pdfannot = PDAnnotation.createAnnotation(fdfannot.getCOSObject());
pdfannot.constructAppearances();
pageAnnotations.add(pdfannot);
}
document.getPage(0).setAnnotations(pageAnnotations);
document.save(new File("tagged_with_annotation.pdf"));
но проверка veraPDF выводит:
Аннотация, за исключением аннотаций подтипа Widget, PrinterMark или Link, должна быть вложенные в тег Annot
и выходные данные средства проверки читаемости PDF (инструмент PAC):
Аннотация не вложена в элемент структуры «Annot»
как ожидалось, потому что я не установил тег «annot» (и конкретное место ) для импортированной аннотации.
Кроме того, я могу получить объект тега P:
PDDocumentCatalog pdDocumentCatalog = document.getDocumentCatalog();
PDStructureTreeRoot pdStructureTreeRoot = pdDocumentCatalog.getStructureTreeRoot();
COSArray aDocument = (COSArray)(pdStructureTreeRoot.getK().getCOSObject());
COSObject oDocument = (COSObject) aDocument.get(0);
COSArray aPart = (COSArray)oDocument.getItem(COSName.K).getCOSObject();
COSObject oPart = (COSObject) aPart.get(0);
COSArray aSect = (COSArray)oPart.getItem(COSName.K).getCOSObject();
COSObject oSect = (COSObject) aSect.get(0);
COSArray aP = (COSArray)oSect.getItem(COSName.K).getCOSObject();
COSObject oP= (COSObject) aP.get(0);
Но я не понимаю, как редактировать существующее дерево тегов в PDF.
Вопрос: как добавить тег и аннотацию в файл PDF. существующее дерево тегов в PDF с помощью PDFBox?
ОБНОВЛЕНИЕ: пример PDF и XFDF здесь.
ОБНОВЛЕНИЕ 2: Я обновил файл tagged_with_annotation_acrobat.pdf на Google Диске. Предыдущая версия была неверной: пропущен тег аннотации.
ОБНОВЛЕНИЕ 3. Чтобы выбрать последнюю букву P, измените:
COSArray aP = oSect.getCOSArray(COSName.K);
для
COSArray aH1P = oSect.getCOSArray(COSName.K);
COSDictionary oP = (COSDictionary) aH1P.getObject(1);
COSArray aP = oP.getCOSArray(COSName.K);
и для добавления аннотации без внешнего P внутри последнего P
// add the annotation element
COSDictionary anDict = new COSDictionary();
anDict.setItem(COSName.S, COSName.ANNOT);
anDict.setItem(COSName.P, oP);
anDict.setItem(COSName.PG, page);
PDObjectReference objRef = new PDObjectReference();
anDict.setItem(COSName.K, objRef);
objRef.setReferencedObject(page.getAnnotations().get(0));
aP.add(anDict);
Подробнее здесь: https://stackoverflow.com/questions/790 ... ing-pdfbox
Мобильная версия