Добавить изображения в виде значков в PDF-документ с помощью PDFBox - PullRequest
0 голосов
/ 08 февраля 2019

Я пытаюсь имитировать поведение вызова Acrobat JS doc.importIcon(), используя PDF Box, чтобы импортировать большее количество изображений в виде значков в документ PDF.

Я уже создал и добавилPDAppearanceStream в словарь AP.К сожалению, значок не доступен через doc.getIcon() вызов JS позже в PDF JS.

Возможно, у кого-то из вас была такая же проблема.Полагаю, мне здесь не хватает только небольшого фрагмента.

Мой текущий код выглядит так:

PDDocumentCatalog docCatalog = document.getDocumentCatalog();
PDDocumentNameDictionary nameDict = docCatalog.getNames();


COSDictionary dic = nameDict.getCOSObject().getCOSDictionary(COSName.AP);
COSArray names = (COSArray) dic.getDictionaryObject(COSName.NAMES);

PDImageXObject imgNeu = PDImageXObject.createFromFileByContent(new File("C:\\FancyPicture.jpg"), document);
float width = imgNeu.getWidth();
float height = imgNeu.getHeight();

PDAppearanceStream pdAppearanceStream = new PDAppearanceStream(document);
pdAppearanceStream.setResources(new PDResources());
try (PDPageContentStream pdPageContentStream = new PDPageContentStream(document, pdAppearanceStream))
{
    pdPageContentStream.drawImage(imgNeu, 0, 0, width, height);
}
pdAppearanceStream.setBBox(new PDRectangle(width, height));
pdAppearanceStream.setFormType(1);

COSArray defaultRes = new COSArray();
defaultRes.add(COSName.getPDFName("PDF"));
defaultRes.add(COSName.getPDFName("ImageC"));
pdAppearanceStream.getResources().getCOSObject().setItem(COSName.PROC_SET, defaultRes);

Matrix mat = new Matrix(1.0f, 0.0f, 0.0f, 1.0f, 0.0f, 0.0f);
pdAppearanceStream.setMatrix(mat.createAffineTransform());

COSDictionary strDic = pdAppearanceStream.getCOSObject();
strDic.setString(COSName.NAME, "FRM");

COSString key = new COSString("img_01");
names.add(key.getCOSObject());
names.add(pdAppearanceStream.getCOSObject());

1 Ответ

0 голосов
/ 08 февраля 2019

Получается, что для выполнения JS в Acrobat требуются элементы COSString, закодированные как UTF-16, вкл.Порядок следования байтов

После правильного кодирования имен значков и использования COSString(byte[]) все работает как положено.

...