第5章:操纵一个现有的PDF文档 您所在的位置:网站首页 新建pdf怎么增加页数显示 第5章:操纵一个现有的PDF文档

第5章:操纵一个现有的PDF文档

2024-07-16 01:49| 来源: 网络整理| 查看: 265

来源 iTextCN 浏览 2785 扫码 分享 2022-04-27 18:07:16 第5章:操纵一个现有的PDF文档添加注解及内容修改表单字段属性添加页眉、页脚及水印修改页面大小和方向总结

ready to translate : https://developers.itextpdf.com/content/itext-7-jump-start-tutorial/chapter-5-manipulating-existing-pdf-document

第5章:操纵一个现有的PDF文档

第1章到第3章的例子中,我们总是从头开始用iText创建一个新的PDF文档。第四章的最后几个例子中用的是一个现有的PDF文档,通过对这个PDF表格进行数据的填写,让它不再具有交互性或者带了一些预设值。接下来的第五章里,我们将继续使用现有的PDF。首先通过PdfReader加载一个现有的文件,然后用reader对象来创建一个新的PdfDocument。

添加注解及内容

在前面的章节中,我们使用了一个现有的PDF表单job_application.pdf,并填写了其中的相关字段。在这一章中,我们会更进一步。我们将开始添加一个文本注解,一些文本和一个新的复选框。如图5.1所示。

图5.1:可修改的表单

我们将重复之前AddAnnotationsAndContent例子中的代码。

PdfDocument pdfDoc = new PdfDocument(new PdfReader(src), new PdfWriter(dest));// add contentpdfDoc.close();

在上面的代码中,有一段”add content”的注释,我们将从这里开始添加注解,包括额外的文本和复选框。

就像第4章中的例子一样,我们将注解添加到从PdfDocument实例中获取的页面:

PdfAnnotation ann = new PdfTextAnnotation(new Rectangle(400, 795, 0, 0)) .setTitle(new PdfString("iText")) .setContents("Please, fill out the form.") .setOpen(true);pdfDoc.getFirstPage().addAnnotation(ann);

如果我们想要把内容添加到内容流中,则需要创建一个PdfCanvas对象,之后可以使用PdfPage对象作为PdfCanvas构造函数的参数:

PdfCanvas canvas = new PdfCanvas(pdfDoc.getFirstPage());canvas.beginText().setFontAndSize( PdfFontFactory.createFont(FontConstants.HELVETICA), 12) .moveText(265, 597) .showText("I agree to the terms and conditions.") .endText();

添加文本的代码与我们在第2章中所做的相似。无论您是从头开始创建文档,还是将内容添加到现有文档,都不会影响我们使用的说明。将字段添加到PdfAcroForm实例也是如此:

PdfAcroForm form = PdfAcroForm.getAcroForm(pdfDoc, true);PdfButtonFormField checkField = PdfFormField.createCheckBox( pdfDoc, new Rectangle(245, 594, 15, 15), "agreement", "Off", PdfFormField.TYPE_CHECK);checkField.setRequired(true);form.addField(checkField);

现在我们已经添加了一个额外的字段,接下来我们要更改reset字段的操作:

form.getField("reset").setAction(PdfAction.createResetForm( new String[]{"name", "language", "experience1", "experience2", "experience3", "shift", "info", "agreement"}, 0));

让我们看看我们是否也可以改变表单字段的一些视觉效果。

修改表单字段属性

在FillAndModifyForm例子中,我们返回到第4章中的FillForm示例,不是仅仅填写表单,还要更改字段的属性:

PdfAcroForm form = PdfAcroForm.getAcroForm(pdfDoc, true);Map fields = form.getFormFields();fields.get("name").setValue("James Bond").setBackgroundColor(Color.ORANGE);fields.get("language").setValue("English");fields.get("experience1").setValue("Yes");fields.get("experience2").setValue("Yes");fields.get("experience3").setValue("Yes");List options = new ArrayList();options.add(new PdfString("Any"));options.add(new PdfString("8.30 am - 12.30 pm"));options.add(new PdfString("12.30 pm - 4.30 pm"));options.add(new PdfString("4.30 pm - 8.30 pm"));options.add(new PdfString("8.30 pm - 12.30 am"));options.add(new PdfString("12.30 am - 4.30 am"));options.add(new PdfString("4.30 am - 8.30 am"));PdfArray arr = new PdfArray(options);fields.get("shift").setOptions(arr);fields.get("shift").setValue("Any");PdfFont courier = PdfFontFactory.createFont(FontConstants.COURIER);fields.get("info") .setValue("I was 38 years old when I became a 007 agent.", courier, 7);

请仔细看下面几行:

第3行:将“name”字段的值设置为“James Bond”,同时将背景颜色更改为Color.ORANGE。

第8-17行:创建一个Java List,其中包含比最初表单更多的选项(第8-15行)。我们将这个List转换为一个PdfArray(第16行),使用这个数组来更新“shift”字段的选项(第17行)。

第19-21行:创建一个新的PdfFont,当设置“info”字段的值时,我们使用这个字体和一个新的字体大小作为额外的参数。

来看看图5.2,看看我们的变化是否被应用。

图5.2:用高亮字段修改表单

我们看到“shift”字段现在有更多的选项,但是没有看到“name”字段的背景颜色。目前还不清楚“info”字段的字体是否已经改变。但这又怎么了?没有什么是错的,这些字段当前是高亮显示的,蓝色高亮显示的是背景颜色。让我们点击“突出显示的字段”,看看会发生什么。

![Figure 5.3: updated form, no highlighting](https://developers.itextpdf.com/sites/default/files/C05F03.png

图5.3:不用高亮字段修改表单

现在图5.3看起来和我们预期的一样。如果我们添加了form.flattenFields(),我们就不会有这个问题了。因为在这种情况下,我们在关闭PdfDocument之前将不再有一个表单。下一章中我们会来做一些更多的表单示例,但现在让我们看看可以对现有不包含表单的文档做些什么。

添加页眉、页脚及水印

你还记得我们在第三章中创造的20世纪UFO目击报告吗?我们将在下面的几个例子中使用类似的报告:ufo.pdf,见图5.4。

图5.4:UFO目击报告

正如你所看到的那样,它不像我们在第三章中所做的报告那么华丽。但如果我们想在这个现有的报告中添加一个标题、一个水印和一个页脚,说明“Y的第X页”怎么办?图5.5就显示了这样一个报告的样子。

图5.5:有页眉、页脚及水印的UFO目击报告

在图5.5中,我们放大了第3章中添加页码时没有的优势。第3章中,在添加页脚时我们不知道总页数,因此我们只添加了当前的页码。现在我们用的是现有的文档,我们可以添加“4页中的第1页”,“4页中的第2页”,等等。

从头创建文档时,可以为总页数创建一个占位符。一旦创建了所有的页面,我们就可以将该页面的总数添加到该占位符,但这不在本介绍性教程的范围之内。

AddContent示例显示了如何将内容添加到现有文档中的每个页面。

PdfDocument pdfDoc = new PdfDocument(new PdfReader(src), new PdfWriter(dest));Document document = new Document(pdfDoc);Rectangle pageSize;PdfCanvas canvas;int n = pdfDoc.getNumberOfPages();for (int i = 1; i


【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有