我正在尝试使用PDF Box模仿Acrobat JS调用doc.importIcon()
的行为,以将大量图像作为图标导入PDF文档。
我已经创建了PDAppearanceStream并将其添加到AP词典中。
不幸的是,稍后在PDF JS中无法通过doc.getIcon()
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());
答案 0 :(得分:1)
事实证明,好像Acrobat中的JS运行时需要将COSString elems编码为UTF-16 incl。字节顺序标记
正确编码图标名称并使用COSString(byte[])
后,一切正常。