Where is TextFormFieldBuilder?



下面的代码可以在这里的最后一个示例(https://kb.itextpdf.com/home/it7kb/examples/creating-form-fields)中找到,它使用了一个名为TextFormFieldBuilder的类。这个类似乎不存在于API中(至少c#中不存在)。我刚下载了最新的nuget包,链接有"it7kb"所以我假设这个文档是针对文本7的。

我错过了什么?我需要做些什么才能使这个例子有效?

namespace iText.Samples.Sandbox.Events
{
public class GenericFields
{
public static readonly String DEST = "results/sandbox/events/generic_fields.pdf";
public static void Main(String[] args)
{
FileInfo file = new FileInfo(DEST);
file.Directory.Create();
new GenericFields().ManipulatePdf(DEST);
}
protected void ManipulatePdf(String dest)
{
PdfDocument pdfDoc = new PdfDocument(new PdfWriter(dest));
Document doc = new Document(pdfDoc);
Paragraph p = new Paragraph();
p.Add("The Effective Date is ");
Text day = new Text("     ");
day.SetNextRenderer(new FieldTextRenderer(day, "day"));
p.Add(day);
p.Add(" day of ");
Text month = new Text("     ");
month.SetNextRenderer(new FieldTextRenderer(month, "month"));
p.Add(month);
p.Add(", ");
Text year = new Text("            ");
year.SetNextRenderer(new FieldTextRenderer(year, "year"));
p.Add(year);
p.Add(" that this will begin.");
doc.Add(p);
doc.Close();
}
private class FieldTextRenderer : TextRenderer
{
protected String fieldName;
public FieldTextRenderer(Text textElement, String fieldName) : base(textElement)
{
this.fieldName = fieldName;
}
// If renderer overflows on the next area, iText uses getNextRender() method to create a renderer for the overflow part.
// If getNextRenderer isn't overriden, the default method will be used and thus a default rather than custom
// renderer will be created
public override IRenderer GetNextRenderer()
{
return new FieldTextRenderer((Text) modelElement, fieldName);
}
public override void Draw(DrawContext drawContext)
{
PdfTextFormField field = new TextFormFieldBuilder(drawContext.GetDocument(), fieldName)
.SetWidgetRectangle(GetOccupiedAreaBBox()).CreateText();
PdfAcroForm.GetAcroForm(drawContext.GetDocument(), true)
.AddField(field);
}
}
}
}

编辑:我尝试了以下,因为它似乎是等效的逻辑,但当我运行它时,我得到一个空引用对象在下一行。具体来说,null引用错误发生在Draw方法的最后一行的.AddField(field)方法调用上,但是在检查时,该行上没有任何内容为null,因此错误必须在该方法中出现,因此我无法判断问题是什么。

PdfTextFormField field = PdfTextFormField.CreateText(drawContext.GetDocument(), GetOccupiedAreaBBox());

我在使用Maven2的7.2.5的Java版本的iText7时遇到了同样的问题。使用任何类型的FieldBuilder的iText7 Jumpstart示例import对我不起作用。我认为这可能是一个许可问题,因为这在iText7中发生了变化,并且有许可和iText7版本的兼容性矩阵,所以我检查了iText7社区版本源代码的GitHub repo。你的地址是itext7-dotnet,你需要的类确实存在于GitHub上。使用GitHub可以从源代码构建,并将标签更改为您正在使用的任何特定版本。默认情况下,源构建为Java生成*-8.0.0-SNAPSHOT,我不确定为dotnet生成什么。这解决了Java中的问题。

我知道我有点晚了,但是我有同样的问题,并且能够找到一个不需要从源代码重新构建ittext的解决方案。我在google上搜索了一下,找到了一个itext7示例的库,其中包括一个如何创建表单字段的工作示例。它根本不使用缺失的TextFormFieldBuilder类,而是调用PdfFormField.CreateText()。您可以在这里找到示例代码:https://github.com/itext/i7ns-samples/blob/7.2.5/itext/itext.samples/itext/samples/sandbox/acroforms/CreateFormInTable.cs

下面是示例代码的全文,以防上面的链接失效:

using System;
using System.IO;
using iText.Forms;
using iText.Forms.Fields;
using iText.Kernel.Pdf;
using iText.Layout;
using iText.Layout.Element;
using iText.Layout.Properties;
using iText.Layout.Renderer;
namespace iText.Samples.Sandbox.Acroforms
{
public class CreateFormInTable
{
public static readonly String DEST = "results/sandbox/acroforms/create_form_in_table.pdf";
public static void Main(String[] args)
{
FileInfo file = new FileInfo(DEST);
file.Directory.Create();
new CreateFormInTable().ManipulatePdf(DEST);
}
protected void ManipulatePdf(String dest)
{
PdfDocument pdfDoc = new PdfDocument(new PdfWriter(dest));
Document doc = new Document(pdfDoc);
Table table = new Table(UnitValue.CreatePercentArray(2)).UseAllAvailableWidth();
Cell cell = new Cell().Add(new Paragraph("Name:"));
table.AddCell(cell);
cell = new Cell();
cell.SetNextRenderer(new CreateFormFieldRenderer(cell, "name"));
table.AddCell(cell);
cell = new Cell().Add(new Paragraph("Address"));
table.AddCell(cell);
cell = new Cell();
cell.SetNextRenderer(new CreateFormFieldRenderer(cell, "address"));
table.AddCell(cell);
doc.Add(table);
doc.Close();
}
private class CreateFormFieldRenderer : CellRenderer
{
protected String fieldName;
public CreateFormFieldRenderer(Cell modelElement, String fieldName)
: base(modelElement)
{
this.fieldName = fieldName;
}            

// If renderer overflows on the next area, iText uses getNextRender() method to create a renderer for the overflow part.
// If getNextRenderer isn't overriden, the default method will be used and thus a default rather than custom
// renderer will be created
public override IRenderer GetNextRenderer()
{
return new CreateFormFieldRenderer((Cell) modelElement, fieldName);
}
public override void Draw(DrawContext drawContext)
{
base.Draw(drawContext);
PdfTextFormField field = PdfFormField.CreateText(drawContext.GetDocument(),
GetOccupiedAreaBBox(), fieldName, "");
PdfAcroForm form = PdfAcroForm.GetAcroForm(drawContext.GetDocument(), true);
form.AddField(field);
}
}
}
}

相关内容

  • 没有找到相关文章

最新更新