当前位置: 首页 > 知识库问答 >
问题:

设置图像窗体字段

呼延升
2023-03-14

我创建了一个带有一个图像字段的示例PDF表单。我正在尝试使用PDFBOX将图像设置到字段。

我看到PDFBox将这样的字段作为pdpushbutton的实例处理,但我没有看到这个类的接口公开处理图像的方法...

可以使用注释中的URL下载示例PDF。

java prettyprint-override">PDDocument pdfDocument = null;
PDAcroForm acroForm = pdfDocument.getDocumentCatalog().getAcroForm();
if (acroForm != null) {
    PDPushButton field = (PDPushButton) acroForm.getField("test");

    PDImageXObject pdImageXObject = PDImageXObject.createFromFile("my_img.png", pdfDocument);

    List<PDAnnotationWidget> widgets = field.getWidgets();

    /*
     * The field may appear multiple times in the document, I would like to repeat that for every widget (occurence).
     */
    for(PDAnnotationWidget widget : widgets) {
        PDRectangle rectangle = widget.getRectangle();

        //PDAppearanceDictionary appearanceDict = widget.getAppearance();
        /*
         * In my case, when the image is not set with Acrobat DC, appearanceDict is null.
         */

        /*
         * Create the appearance stream and fill it with the image.
         */
        PDAppearanceStream pdAppearanceStream = new PDAppearanceStream(pdfDocument);
        pdAppearanceStream.setResources(new PDResources());
        try (PDPageContentStream pdPageContentStream = new PDPageContentStream(pdfDocument, pdAppearanceStream)) {
            pdPageContentStream.drawImage(pdImageXObject, rectangle.getLowerLeftX(), rectangle.getLowerLeftY(), pdImageXObject.getWidth(), pdImageXObject.getHeight());
        }
        pdAppearanceStream.setBBox(new PDRectangle(rectangle.getWidth(), rectangle.getHeight()));

        /*
         * Create the appearance dict with only one appearance (default) and set the appearance to the widget.
         */
        PDAppearanceDictionary appearanceDict = new PDAppearanceDictionary();
        appearanceDict.setNormalAppearance(pdAppearanceStream);
        widget.setAppearance(appearanceDict);
    }
}

ByteArrayOutputStream outStr = new ByteArrayOutputStream();
pdfDocument.save(outStr);
pdfDocument.close();

我的目标是从这个PDF开始,用PDFBox得到这个PDF。

共有1个答案

蒋永宁
2023-03-14

首先,pdf标准ISO 32000-2根本没有指定“图像字段”。某些专有的pdf生成器/编辑器(特别是Adobe产品)使用JavaScript使按钮字段操作类似于GUI中图像的表单字段,特别是在他们自己的pdf查看器中。尽管如此,这些按钮是按钮,而不是图像表单字段。因此,

PDFBox将这样的字段视为PDPushButtonhtml" target="_blank">实例,但我没有看到该类的接口公开处理图像的方法...

但是,如果您真的需要像图像字段这样的东西,则不需要找到不同的解决方案来模拟图像字段,您可以简单地跟随Adobe的领导。我们只需要知道,我们只模拟图像字段。

当从页面内容引用扁平化后的所述XObject时,该转换AA不再由查看器自动确定和应用,因此必须由表单扁平化器显式添加。

显然PDFBox表单展平至少不会创建AA矩阵,特别是它假定左下边界框始终位于坐标系原点。

对于您的PDF示例,情况并非如此,因此在此处进行展平可以有效地将“展平图像”字段按钮移出屏幕。

 类似资料:
  • 在我的应用程序中,我有一个文本视图,用户可以在其中设置字体和字体样式。我正在用这行排字。 现在,我使用以下行设置字体样式: 这很好用。我可以看到字体已改为衬线斜体。问题是,当我将字体样式改为普通字体时,字体就变松了。 上面的一行不仅将斜体重置为普通,还将衬线重置为默认字体。 如何保留以前的字体,并将字体样式更改为普通字体? 我正在使用API:min sdk版本=17,目标版本=21

  • 问题内容: 目前,我正在Android应用程序中绘制PNG图像,如下所示: 如果我在数据库中有图像名称的列表,是否可以使用图像名称在上方设置可绘制对象?我已经有了遍历数据库的代码,我只是想根据从此处获取的值来绘制图像。 例如,数据库的一条记录: 因此,当我阅读该记录时,我有一个值为“ testimage”的字符串,然后我想将可绘制的图像设置为。 我想到的一种方式是这样的: 但是,这不是很有效! 谢

  • 目前正在练习使用android studio制作应用程序。我有这个自定义字体,并保存到res/font目录中供以后使用。在活动中,我试图使用typeface对象调用getfont(R.font.my\u customized\u font)。例如)Typeface font=getResources()。getfont(R.font.mycustomizedfont) 但是,当我尝试使用API级别

  • 我想在Java中创建一个文本编辑器。这是我到目前为止写的: 我的问题是为设置字体。当我在实际程序上单击按钮时,什么也没发生。我该怎么办?

  • (set-default-font "Verdana-10") (if window-system (set-fontset-font (frame-parameter nil 'font) 'unicode '("simsun" . "unicode-bmp")) ) 英文字体 中文字体

  • 本文向大家介绍设置字体时为什么建议设置替换字体?相关面试题,主要包含被问及设置字体时为什么建议设置替换字体?时的应答技巧和注意事项,需要的朋友参考一下 这是由于网站用户的浏览设备不同,可能并不支持或没有安装你所设置的字体。 这时候就会自动使用替换字体来对网页进行一个展示。 设置替换字体可以尽可能保证所有用户的浏览体验。