在 iText 7 中为 PDF 创建图像表单域。NET/C#
Creating Image Form Fields for PDFs in iText 7 .NET/C#
我正在尝试在 PDF 中创建一个表单域,用户可以在其中插入图像文件并保存文档,以便图像持久存在(在新的 PDF 文档中,而不是更改现有文档)。我知道这是可能的,因为我已经在其他 PDF 中看到过它,但我无法弄清楚它应该如何在 iText 7 中完成 .NET/C#.
我从 iText 网站上找到了 this on Google, which seems to at least provide the JavaScript and outline of a solution, but I don't know how to edit the "Layout" of an iText PdfButtonFormField
object. I have also tried this answer,但它是为添加到现有文档而设计的,无论如何我都无法让它工作(一些更难以捉摸的 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 中的按钮时出现 "Select Image" 对话框,但该按钮仍然只是一个灰色方块,上面写着 "caption",而不是被所选图像替换。但我怀疑需要一个通用按钮,以便您可以(以某种方式)覆盖布局。
如果有人知道应该如何完成此操作,无论是使用此按钮方法还是其他方式,我将不胜感激一些指示。正如我所说,我特别感兴趣的是在 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 几乎可以满足您的需求。
唯一需要调整的是布局。默认情况下,创建的按钮具有 "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
}
我正在尝试在 PDF 中创建一个表单域,用户可以在其中插入图像文件并保存文档,以便图像持久存在(在新的 PDF 文档中,而不是更改现有文档)。我知道这是可能的,因为我已经在其他 PDF 中看到过它,但我无法弄清楚它应该如何在 iText 7 中完成 .NET/C#.
我从 iText 网站上找到了 this on Google, which seems to at least provide the JavaScript and outline of a solution, but I don't know how to edit the "Layout" of an iText PdfButtonFormField
object. I have also tried this answer,但它是为添加到现有文档而设计的,无论如何我都无法让它工作(一些更难以捉摸的 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 中的按钮时出现 "Select Image" 对话框,但该按钮仍然只是一个灰色方块,上面写着 "caption",而不是被所选图像替换。但我怀疑需要一个通用按钮,以便您可以(以某种方式)覆盖布局。
如果有人知道应该如何完成此操作,无论是使用此按钮方法还是其他方式,我将不胜感激一些指示。正如我所说,我特别感兴趣的是在 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 几乎可以满足您的需求。 唯一需要调整的是布局。默认情况下,创建的按钮具有 "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
}