gpt4 book ai didi

c# - 在 iText 7 .NET/C# 中为 PDF 创建图像表单域

转载 作者:行者123 更新时间:2023-12-04 01:26:28 25 4
gpt4 key购买 nike

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

我找到了 this在谷歌上,它似乎至少提供了 JavaScript 和解决方案的大纲,但我不知道如何编辑 iText PdfButtonFormField 对象的“布局”。我也试过this answer来自 iText 网站,但它旨在添加到现有文档中,而且我无法让它正常工作(一些更难以捉摸的 System.NullReferenceException 错误)。

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

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 instance of an object.' 错误(不幸的是它没有比这更具体),堆栈跟踪有点无用:

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 中的按钮时,我得到一个“选择图像”对话框,但该按钮仍然只是一个上面写有“标题”的灰色方 block ,而不是被替换所选图像。但我怀疑需要一个通用按钮,以便您可以(以某种方式)覆盖布局。

如果有人知道这应该如何完成,无论是使用此按钮方法还是其他方式,我将不胜感激一些指示。正如我所说,我特别感兴趣的是在 C# 程序中使用 iText 7 在新生成的 PDF 文档中创建这些字段。

最佳答案

But I get a System.NullReferenceException: 'Object reference not set to an instance of an object.'

这是 Acroform#addField 方法中的错误。每次获取无名字段作为参数时都会抛出 NPE。为避免这种情况,只需在添加到表单之前设置字段名称 (field#setName)。

Using which the code compiles, and I get a "Select Image" dialogue box when I click on the button in the PDF, but the button remains just a grey square with "caption" written on it, rather than being replaced by the selected image. But I suspect that a generic button is required so you can overwrite the layout (somehow).

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

另一方面,CreatePushButton 几乎可以满足您的需求。唯一需要调整的是布局。默认情况下,创建的按钮具有“仅标签”布局。

  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
}

关于c# - 在 iText 7 .NET/C# 中为 PDF 创建图像表单域,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61848306/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com