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

在iText 7.NET/C#中为PDF创建图像表单字段#

皇甫宇定
2023-03-14

我试图在PDF中创建一个表单字段,用户可以在其中插入图像文件并保存文档,以便图像是持久的(在新的PDF文档中,而不是更改现有文档)。我知道这是可能的,因为我在其他PDF中看到过这样做,但我不知道在iText7 for.NET/C#中应该如何这样做。

使用创建按钮并替换图像的想法,到目前为止我已经尝试了:

PdfWriter writer = new PdfWriter("myfile.pdf");
PdfDocument document = new PdfDocument(writer);
PdfPage pdfPage = document.AddNewPage(PageSize.A4);
PdfCanvas canvas = new PdfCanvas(pdfPage);

PdfAcroForm form = canvas.GetForm();

PdfButtonFormField button = PdfFormField.CreateButton(document, new Rectangle(50, 50), 0);

button.SetAction(PdfAction.CreateJavaScript("event.target.buttonImportIcon();"));

form.AddField(button); // <-- Error on this line

document.Close();
writer.Close();

希望buttonimporticon()足以覆盖按钮的外观。但我得到一个System.NullReferenceException:“Object reference not set to an Object的实例。”错误出现在指示行(不幸的是,它并不比这更具体),并且StackTrace稍有帮助:

Unhandled Exception: System.NullReferenceException: Object reference not set to an instance of an object.
    at iText.Forms.PdfAcroForm.AddField(PdfFormField field, PdfPage page)
    at iText.Forms.PdfAcroForm.AddField(PdfFormField field)
    at ReplaceIcon.Main(String[] args) in ReplaceIcon.cs:line 65

我还尝试用createPushButton替换createButton,如:

PdfButtonFormField button = PdfFormField.CreatePushButton(document, new Rectangle(50, 50), "name", "caption");

当我点击PDF中的按钮时,我会得到一个“选择图像”对话框,但是按钮仍然是一个灰色的方块,上面写着“标题”,而不是被选中的图像替换。但我怀疑需要一个通用按钮,这样你就可以覆盖布局(不知怎么的)。

如果有人知道这是如何做的,无论是使用这个按钮的方法或另一种方式,我将非常感谢一些指针。正如我所说的,我特别感兴趣的是在一个新生成的PDF文档中创建这些字段,在一个C#程序中使用iText 7。

共有1个答案

松波
2023-03-14

但我得到一个System.NullReferenceException:“对象引用未设置为对象的实例。”

这是Acroform#addfield方法中的bug。NPE每次获得一个无名字段作为参数时都会被抛出。要避免这种情况,只需在添加到表单之前设置字段名(字段#setname)。

当我点击PDF中的按钮时,我会得到一个“选择图像”对话框,但是按钮仍然是一个灰色的方块,上面写着“标题”,而不是被选中的图像替换。但我怀疑需要一个通用按钮,这样你就可以覆盖布局(不知怎么的)。

PdfFormField.CreateButton方法在这里没有给您带来任何优势。iText中的那个方法创建了一个空的PdfButtonFormField(外观和行为应该由开发人员在创建字段之后定义)。

另一方面,CreatePushButton几乎可以完成您需要的操作。唯一必须调整的是一个布局。默认情况下,创建的按钮具有“Label Only”布局。

  public void Generate()
    {
        PdfWriter writer = new PdfWriter("myfile.pdf");
        PdfDocument document = new PdfDocument(writer);

        PdfAcroForm form = PdfAcroForm.GetAcroForm(document, true);
        PdfButtonFormField button = PdfFormField.CreatePushButton(document, new Rectangle(20, 500, 50, 50), "btn",
            "load");
        button.SetAction(PdfAction.CreateJavaScript("event.target.buttonImportIcon();"));
//change the layout type.   
PdfDictionary widget = (PdfDictionary) button.GetKids().Get(0).GetIndirectReference().GetRefersTo();
    widget.GetAsDictionary(PdfName.MK).Put(PdfName.TP, new PdfNumber((int) PushButtonLayouts.ICON_ONLY));

        form.AddField(button); // <-- Error on this line

        document.Close();
    }

    enum PushButtonLayouts
    {
        LABEL_ONLY = 0, //No icon; caption only
        ICON_ONLY = 1, //No caption; icon only
        ICON_TOP_LABEL_BOTTOM = 2, // Caption below the icon
        LABEL_TOP_ICON_BOTTOM = 3, // Caption above the icon
        ICON_LEFT_LABEL_RIGHT = 4, //Caption to the right of the icon
        LABEL_LEFT_ICON_RIGHT = 5, //Caption to the left of the icon
        LABEL_OVER = 6 // Caption overlaid directly on the icon
    }
 类似资料:
  • 我有这种超文本标记语言: HTML只包含生成的PDF文件中的文本,而忽略了图像。 这是我用来转换该段落的代码: 我使用的是iText7 7.1.11和iText7.pdfhtml3.0.0。 我还应该告诉你,使用iText7 7.1.2和iText7,同样的代码在同样的图像下工作得非常完美。PDFHTML2.0.2。 这些版本之间有什么变化吗? 当然,图像可以使用https://server/Us

  • 我试图使用itext7将图像添加到我的pdf文档中,但我得到了DirectoryNotFoundExctive。我使用的是itextSharp,但itext7的情况并非如此,StackOverflow的一些类似问题向我展示了它是如何完成的,但它不会读取资产文件夹中的文件。这是我的代码: 当我使用按钮点击事件运行此代码时,它会抛出以下错误:

  • 我有一个私人钥匙在档案里。“privatekey.pem”并且不知道如何创建谁能帮助我吗?我正在尝试使用IText7签名pdf。

  • 问题内容: 我正在寻找一个Java库,该库可以获取PDF并从第一页创建缩略​​图(PNG)。 我已经看过JPedal了,但是它疯狂的许可费完全让人望而却步。目前,我正在使用iText处理PDF文件,但我相信它不会生成缩略图。我可以在命令行上使用类似Ghostscript之类的东西,但我希望尽可能将我的项目保留为全Java。 问题答案: PDF Renderer 是LGPL许可的纯Java库,它使此

  • 我在运行时用一个模板文件在itext7.pdfhtml中构建一个PDF。我想在生成的PDF中的每一页都添加一个页脚,该PDF有两页,但出于某种原因,页脚只出现在第二页。

  • 如何使用itext7在内存流中创建PDF而不是物理文件?我不知道如何在最新版本中做到这一点,有帮助吗? 我尝试了以下代码,但pdfSM没有正确填充: 完整的测试代码如下所示供您参考,它在通过filePath进入PdfWriter时有效,但不适用于内存流: