- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我目前有一个 PdfReader 和一个 PdfStamper,我正在用它们填写 acrofields。我现在必须将另一个 pdf 复制到我一直在填写的表格的末尾,当我这样做时,我在复制的新表格上丢失了 acrofield。这是代码。
public static void addSectionThirteenPdf(PdfStamper stamper, Rectangle pageSize, int pageIndex){
PdfReader reader = new PdfReader(FacesContext.getCurrentInstance().getExternalContext().getResourceAsStream("/resources/documents/Section13.pdf"));
AcroFields fields = reader.getAcroFields();
fields.renameField("SecurityGuidancePage3", "SecurityGuidancePage" + pageIndex);
stamper.insertPage(pageIndex, pageSize);
stamper.replacePage(reader, 1, pageIndex);
}
我创建原始文档的方式是这样的。
OutputStream output = FacesContext.getCurrentInstance().getExternalContext().getResponseOutputStream();
PdfReader pdfTemplate = new PdfReader(FacesContext.getCurrentInstance().getExternalContext().getResourceAsStream("/resources/documents/dd254.pdf"));
PdfStamper stamper = new PdfStamper(pdfTemplate, output);
stamper.setFormFlattening(true);
AcroFields fields = stamper.getAcroFields();
有没有办法使用第一段代码合并并将两个 acrofields 合并在一起?
最佳答案
根据您的具体需求,可能会出现不同的情况,但无论如何:您做错了。您应该使用 PdfCopy
或 PdfSmartCopy
来合并文档。
下面将解释不同的场景 video tutorial .
您可以在 iText sandbox 中找到大部分示例.
合并不同的表单(具有不同的字段)
如果您想合并不同的 表单而不展平它们,您应该像在MergeForms 中所做的那样使用PdfCopy
示例:
public void createPdf(String filename, PdfReader[] readers) throws IOException, DocumentException {
Document document = new Document();
PdfCopy copy = new PdfCopy(document, new FileOutputStream(filename));
copy.setMergeFields();
document.open();
for (PdfReader reader : readers) {
copy.addDocument(reader);
}
document.close();
for (PdfReader reader : readers) {
reader.close();
}
}
在这种情况下,readers
是一个 PdfReader
实例数组,其中包含不同 表单(具有不同的字段名称),因此我们使用 PdfCopy
并确保我们不会忘记使用 setMergeFields()
方法,否则不会复制字段。
合并相同的表单(具有相同的字段)
在这种情况下,我们需要重命名字段,因为我们可能希望在不同的页面上使用不同的值。在 PDF 中,一个字段只能有一个值。如果您合并相同的表单,您将拥有同一字段的多个可视化效果,但每个可视化效果将显示相同的值(因为在现实中,只有一个字段)。
让我们来看看MergeForms2示例:
public void manipulatePdf(String src, String dest) throws IOException, DocumentException {
Document document = new Document();
PdfCopy copy = new PdfSmartCopy(document, new FileOutputStream(dest));
copy.setMergeFields();
document.open();
List<PdfReader> readers = new ArrayList<PdfReader>();
for (int i = 0; i < 3; ) {
PdfReader reader = new PdfReader(renameFields(src, ++i));
readers.add(reader);
copy.addDocument(reader);
}
document.close();
for (PdfReader reader : readers) {
reader.close();
}
}
public byte[] renameFields(String src, int i) throws IOException, DocumentException {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
PdfReader reader = new PdfReader(src);
PdfStamper stamper = new PdfStamper(reader, baos);
AcroFields form = stamper.getAcroFields();
Set<String> keys = new HashSet<String>(form.getFields().keySet());
for (String key : keys) {
form.renameField(key, String.format("%s_%d", key, i));
}
stamper.close();
reader.close();
return baos.toByteArray();
}
如您所见,renameFields()
方法在内存中创建了一个新文档。该文档使用 PdfSmartCopy
与其他文档合并。如果您在此处使用 PdfCopy
,您的文档将变得臃肿(我们很快就会发现这一点)。
合并扁平化表单
在FillFlattenMerge1 ,我们使用 PdfStamper
填写表格。结果是保存在内存中并使用 PdfCopy
合并的 PDF 文件。虽然如果您要合并不同的表单,这个示例很好,但这实际上是一个关于如何不这样做的示例(如 video tutorial 中所述)。
FillFlattenMerge2显示如何合并正确填写和展平的相同表格:
public void manipulatePdf(String src, String dest) throws DocumentException, IOException {
Document document = new Document();
PdfCopy copy = new PdfSmartCopy(document, new FileOutputStream(dest));
document.open();
ByteArrayOutputStream baos;
PdfReader reader;
PdfStamper stamper;
AcroFields fields;
StringTokenizer tokenizer;
BufferedReader br = new BufferedReader(new FileReader(DATA));
String line = br.readLine();
while ((line = br.readLine()) != null) {
// create a PDF in memory
baos = new ByteArrayOutputStream();
reader = new PdfReader(SRC);
stamper = new PdfStamper(reader, baos);
fields = stamper.getAcroFields();
tokenizer = new StringTokenizer(line, ";");
fields.setField("name", tokenizer.nextToken());
fields.setField("abbr", tokenizer.nextToken());
fields.setField("capital", tokenizer.nextToken());
fields.setField("city", tokenizer.nextToken());
fields.setField("population", tokenizer.nextToken());
fields.setField("surface", tokenizer.nextToken());
fields.setField("timezone1", tokenizer.nextToken());
fields.setField("timezone2", tokenizer.nextToken());
fields.setField("dst", tokenizer.nextToken());
stamper.setFormFlattening(true);
stamper.close();
reader.close();
// add the PDF to PdfCopy
reader = new PdfReader(baos.toByteArray());
copy.addDocument(reader);
reader.close();
}
br.close();
document.close();
}
这是三种情况。您的问题对任何人来说都不清楚,但您可以决定哪种情况最适合您的需求。我建议您在编码之前花时间学习。观看视频,尝试示例,如果您仍有疑问,您可以提出更聪明的问题。
关于java - IText 将文档与 acrofields 合并,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28566190/
我有一个已填写字段的 PDF 表单。如果我尝试阅读 acrofields,它们是空的。但在 PDF 中,我可以更改值并保存它们。 private static string GetFormFieldN
使用 itextsharp ,我正在尝试将表单文本字段的字体大小设置为 auto . 我目前正在做这样的事情: Object d = 0.0; PdfReader reader = new PdfRe
我正在使用 java 中的压模创建 acrofields(如下所示),我想找到一种方法来知道 acrofields 的长度。我希望能够确定要在 acrofield 中输入的字符串的长度,如果它太长,那
我有一个将目录插入现有 Acroform 的过程,并且我能够跟踪我需要从哪里开始该内容。但是,我现有的 Acrofields 低于该点,需要根据我插入的表格的高度向上或向下移动。有了那个,我怎样才能改
我需要使用 iTextSharp 将一些格式化文本添加到 PDF 表单域,但我似乎无法弄清楚。这就是我目前设置字段的方式,但插入文本的某些部分需要加粗或采用其他格式。 stamper.AcroFiel
我正在使用 iTextSharp 从 PDF 中提取签名名称。我在访问大尺寸和多页 PDF(~40MB 和~5000 页)的 AcroFiels 时遇到问题(速度过慢)。 这是我的代码片段: usin
AcroField 中有没有计算文本高度的技巧? 换句话说,我有一个带有正文部分的模板 PDF,我想将长文本粘贴到其中,并且我想获取文本的高度。如果溢出,则为其余文本插入一个新页面。 最佳答案 这将给
我正在使用 iTextSharp 将数据填充到在 OpenOffice 中创建的 PDF 模板。它填充良好,我得到了正确的 PDF,但有些地方我想增加 AcroField 的宽度。 我做了下面的代码。
我正在使用 iTextSharp 将数据填充到在 OpenOffice 中创建的 PDF 模板。它填充良好,我得到了正确的 PDF,但那是即将到来的可编辑模式。我想要不可编辑的 PDF。并且还使一些行
我正在使用 iTextSharp 将数据填充到在 OpenOffice 中创建的 PDF 模板。它填充得很好,我得到了正确的 PDF。在那个 PDF 中,有些地方会出现摘要,我希望那个地方的文本与模板
我正在用 Java 编写一个程序,用于打印宾果卡的 PDF 文件。每页是一张卡片。为了方便我,我创建了一个带有 acrofields 的模板 PDF 文件,这样程序只需要创建该模板的副本,用数字填充
我正在尝试使用 acrofields 填充 PDF,我能够完美地添加字符串数据,但在将图像添加到 acrofields 时遇到问题。这是我添加字符串数据的代码.. File f = new F
我目前有一个 PdfReader 和一个 PdfStamper,我正在用它们填写 acrofields。我现在必须将另一个 pdf 复制到我一直在填写的表格的末尾,当我这样做时,我在复制的新表格上丢失
“iText In Action”中有一些技巧,涵盖了设置字体以及“FontFactory.RegisterDirectories”方法(正如书中所说...这是一个昂贵的调用)。但是,就我而言,我想用
我目前正在开发一种用于在 pdf 文档上应用和验证数字签名的工具。我了解 pdf 文档中的每个签名都适用于 AcroFields 的某个版本。每次用户更改某些输入(即通过填写 pdf 表单)时,都会创
将内容填充到模板中,很好,但我想要 AcroField 的下划线。 我正在使用下面的代码。 ClassCastException 即将到来。 Font font = FontFactory.getFo
我正在处理的项目有一个 PDF 文件,用作生成另一个最终 PDF 的模板。 该模板有几个表单字段。为了呈现最终文档,我使用 iText 打开模板,找到所有表单字段并填写所需的数据。 现在有一个要求,要
我正在使用 itext sharp 用值填充模板上的表单字段。 我使用 pdfescape.com 创建了模板 这是我用来将值放入 pdf 模板的代码。 private static byte[]
我有一个带有 acroform 字段的 pdf,现在我需要找到相应的 PDField 对象。为此,我正在使用这段代码 public PDField getPDFieldWithName(final S
我正在编写一个需要读取 XFA 和 AcroField 模板的 C# 应用程序。由于公司的规模和可能与应用程序相关的现有 PDF 文档的数量,选择一个并使用它是不可能的。 我目前正在使用 iTextS
我是一名优秀的程序员,十分优秀!