Как добавить тег аннотации в PDF с тегами с помощью PDFBoxJAVA

Программисты JAVA общаются здесь
Ответить
Anonymous
 Как добавить тег аннотации в PDF с тегами с помощью PDFBox

Сообщение Anonymous »

У меня есть PDF-файл с тегами (соответствует PDF-UA) с простой структурой:
Изображение
< /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
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «JAVA»