Создать новый пользовательский объект COSBase с pdfbox? - PullRequest
0 голосов
/ 21 мая 2019

Можем ли мы создать новый пользовательский PDFOperator (например, PDFOperator {BDC}) и объекты COSBase (например, COSName {P} COSName {Prop1} (опять же Prop1 будет ссылаться на еще один объект))? И добавить их в корневую структуру PDF?

Я прочитал некоторый список токенов парсера из существующего pdf-документа. Я хотел пометить PDF. В этом процессе я сначала манипулирую списком токенов с вновь созданными объектами COSBase. Наконец я добавлю их в корневую структуру дерева. Так вот, как я могу создать объекты COSBase. Я использую код для извлечения токенов из PDF

old_document = PDDocument.load(new File(inputPdfFile));
List<Object> newTokens = new ArrayList<>();
for (PDPage page : old_document.getPages()) 
{
    PDFStreamParser parser = new PDFStreamParser(page);
    parser.parse();
    List<Object> tokens = parser.getTokens();
    for (Object token : tokens) {
        System.out.println(token);
        if (token instanceof Operator) {
            Operator op = (Operator) token;     
        }
}
newTokens.add(token);
}

PDStream newContents = new PDStream(document);
document.addPage(page);
OutputStream out = newContents.createOutputStream(COSName.FLATE_DECODE);
ContentStreamWriter writer = new ContentStreamWriter(out);
writer.writeTokens(newTokens);
out.close();
page.setContents(newContents);
document.save(outputPdfFile);
document.close();

Выше кода создаст новый PDF со всеми форматами и изображениями. Итак, в списке newTokens содержатся все существующие объекты COSBase, поэтому я хотел манипулировать некоторыми тегами объектов COSBase, и если я сохраню новый документ, он должен быть помечен без какой-либо обработки декодирования, кодирования, шрифтов и обработки изображений.

Первый. Будет ли эта идея работать? Если да, то помогите мне с кодом для создания пользовательских объектов COSBase. Я очень новичок в Java.

1 Ответ

0 голосов
/ 06 июня 2019

В зависимости от формата вашего документа вы можете вставить отмеченный контент.

//Below code is to add   "/p <<MCID 0>> /BDC"

newTokens.add(COSName.getPDFName("P"));
currentMarkedContentDictionary = new COSDictionary();
currentMarkedContentDictionary.setInt(COSName.MCID, mcid);
mcid++;
newTokens.add(currentMarkedContentDictionary);
newTokens.add(Operator.getOperator("BDC"));

// After adding mcid you have to append your existing tokens TJ , TD, Td, T* ....
newTokens.add(existing_token);
// Closed EMC
newTokens.add(Operator.getOperator("EMC"));
//Adding marked content to the root tree structure.
structureElement = new PDStructureElement(StandardStructureTypes.P, currentSection);
structureElement.setPage(page);
PDMarkedContent markedContent = new PDMarkedContent(COSName.P, currentMarkedContentDictionary);
structureElement.appendKid(markedContent);
currentSection.appendKid(structureElement);

Спасибо @Tilman Hausherr

...