如何即时将值插入现有 PDF?
How to insert values into an existing PDF on the fly?
有一个 PDF,其中包含一些字段以接受来自用户的值(例如:"bio data" 表单)。我的问题是如何将用户输入插入现有 PDF 的正确字段并生成填充的 PDF?
如果我使用 iTextSharp,那么如何选择坐标来打印值?
是否有任何设计工具可以设计矩形字段来接受值?
因为我的 PDF 模板有很多字段可以从用户端获取值。
副词中的 tnx。
有两种可能:
您的原始 PDF 是一个表格:
您可以通过检查 PDF 是否包含此处说明的任何字段来检查这一点:convert pdf editable fields into text using java programming
您需要将 Java 代码调整为 C# 代码,或者您可以使用 RUPS,如我对问题 How to get specific types from AcroFields? Like PushButtonField, RadioCheckField, etc
的回答所示
在这种情况下,填写表格很容易:
PdfStamper pdfStamper = new PdfStamper(new PdfReader(templateFile), new FileStream(fileName, FileMode.Create));
AcroFields acroFields = pdfStamper.AcroFields;
acroFields.SetField(key, value);
pdfStamper.FormFlattening = true;
pdfStamper.Close();
您可以根据需要添加任意多行 SetField()
。在这些行中 key
是原始表单中定义的字段名称; value
是您要在该字段的位置添加的值。
带有 pdfStamper.FormFlattening
的行是可选的。如果将该值设置为 true
,所有交互性都将被删除:表单将不再是表单。如果您删除该行或将该值设置为 false
,则该表单仍将是一个表单。您将能够更改字段的内容并提取字段的值。
您的原始 PDF 不是表格:
PDF 在人眼中可能看起来像一个表单,但如果它没有 AcroForm 字段(也没有 XFA),那么机器就不会将其视为表单。在这种情况下,您必须了解所有内容都固定在页面上的固定坐标处。可以在绝对位置添加内容,但原内容不会移动
向现有 PDF 添加内容的方法有多种,它们都涉及 PdfStamper
。从 PdfStamper
获得 PdfContentByte
对象后,您可以按照文档中的说明添加文本。阅读章节 Manipulating existing PDFs and Absolute positioning of text or take a look at the content tagged with the keyword PdfStamper. The watermark examples 应该也很有趣。
我建议不要使用第二种方法,因为很难找到要使用的确切坐标。如果您的 PDF 不是表单,请使用 Adobe Acrobat 将其转换为表单并使用第一种方法。第一种方法更适合未来:如果您必须更改表单中的某些内容,则无需更改代码即可更改该表单(前提是您保留原始字段名称)。
ItextSharp 提供你做同样的事情,使用 ItextSharp 的 pdfStamper class。
仅供参考。
//create pdfreader instance and read content of existing PDF file into it, by providing it's path
PdfReader pdfReader = new PdfReader(FILE_PATH);
// create stamper instance to edit the exiting file
PdfStamper pdfStamper = new PdfStamper(pdfReader, Response.OutputStream);
// perform your edit operation here.....
.
.
.
// close pdfStamper instance
stamper.Close();
有一个 PDF,其中包含一些字段以接受来自用户的值(例如:"bio data" 表单)。我的问题是如何将用户输入插入现有 PDF 的正确字段并生成填充的 PDF? 如果我使用 iTextSharp,那么如何选择坐标来打印值?
是否有任何设计工具可以设计矩形字段来接受值? 因为我的 PDF 模板有很多字段可以从用户端获取值。 副词中的 tnx。
有两种可能:
您的原始 PDF 是一个表格:
您可以通过检查 PDF 是否包含此处说明的任何字段来检查这一点:convert pdf editable fields into text using java programming
您需要将 Java 代码调整为 C# 代码,或者您可以使用 RUPS,如我对问题 How to get specific types from AcroFields? Like PushButtonField, RadioCheckField, etc
的回答所示在这种情况下,填写表格很容易:
PdfStamper pdfStamper = new PdfStamper(new PdfReader(templateFile), new FileStream(fileName, FileMode.Create));
AcroFields acroFields = pdfStamper.AcroFields;
acroFields.SetField(key, value);
pdfStamper.FormFlattening = true;
pdfStamper.Close();
您可以根据需要添加任意多行 SetField()
。在这些行中 key
是原始表单中定义的字段名称; value
是您要在该字段的位置添加的值。
带有 pdfStamper.FormFlattening
的行是可选的。如果将该值设置为 true
,所有交互性都将被删除:表单将不再是表单。如果您删除该行或将该值设置为 false
,则该表单仍将是一个表单。您将能够更改字段的内容并提取字段的值。
您的原始 PDF 不是表格:
PDF 在人眼中可能看起来像一个表单,但如果它没有 AcroForm 字段(也没有 XFA),那么机器就不会将其视为表单。在这种情况下,您必须了解所有内容都固定在页面上的固定坐标处。可以在绝对位置添加内容,但原内容不会移动
向现有 PDF 添加内容的方法有多种,它们都涉及 PdfStamper
。从 PdfStamper
获得 PdfContentByte
对象后,您可以按照文档中的说明添加文本。阅读章节 Manipulating existing PDFs and Absolute positioning of text or take a look at the content tagged with the keyword PdfStamper. The watermark examples 应该也很有趣。
我建议不要使用第二种方法,因为很难找到要使用的确切坐标。如果您的 PDF 不是表单,请使用 Adobe Acrobat 将其转换为表单并使用第一种方法。第一种方法更适合未来:如果您必须更改表单中的某些内容,则无需更改代码即可更改该表单(前提是您保留原始字段名称)。
ItextSharp 提供你做同样的事情,使用 ItextSharp 的 pdfStamper class。 仅供参考。
//create pdfreader instance and read content of existing PDF file into it, by providing it's path
PdfReader pdfReader = new PdfReader(FILE_PATH);
// create stamper instance to edit the exiting file
PdfStamper pdfStamper = new PdfStamper(pdfReader, Response.OutputStream);
// perform your edit operation here.....
.
.
.
// close pdfStamper instance
stamper.Close();