pdf - 使用 PDFBox 将图像作为图标添加到 PDF 文档
问题描述
我试图模仿 Acrobat JS 调用的行为,doc.importIcon()
使用 PDF Box 将大量图像作为图标导入 PDF 文档。
我已经在 AP Dictionary 中创建并添加了一个 PDAppearanceStream。doc.getIcon()
不幸的是,稍后在 PDF JS 中无法通过 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());
解决方案
事实证明,Acrobat 中的 JS 运行时似乎需要编码为 UTF-16 的 COSString 元素。字节顺序标记
在对图标名称进行正确编码并使用COSString(byte[])
一切按预期工作后。
推荐阅读
- python - Selenium TimeOut --> 找不到定位器
- flutter - “字符串?”类型的值 不能分配给“字符串”类型的变量颤动
- docker - Docker Compose 不会构建镜像,但会尝试从 Dockerhub 中提取
- vaadin - 如何更新 CrudPanel 中的项目
- netty - WebClientRequestException 与 Netty WebClient OIDC
- linux - Ubuntu Desktop 20.04 - 没有 VirtualHost 配置的 Apache2 呈现网站
- python - Keras 调谐器,results_summary 未显示相应的试用目录
- ios - XCTest 不测量 CPU 和内存
- python - 从python beautifulsoup中的div中获取所有数据字段
- vue.js - 防止在行上的文本选择上发生 click:row 事件