文章18 | 阅读 10901 | 点赞0
这个系列主要记录一些itext7里面出现的一些问题,以及网友问的一些问题,主要是自己的真知灼见,如果有错误希望大家能指出,感谢大家一如既往的支持。
之前在itext7学习笔记——第3章提到过:Document
是PdfDocument
的高级别表示,在官方api文档中,描述了以下主要区别(我整理的):
PdfDocument
:直接跟pdf文档有关系,有页面大小等属性,是比较底层的类Document
:是高级的类,可以有一些高级api,例如设置页面大小、旋转、增加元素等操作,它本身是不含pdf里面的具体语法的,它的add一些操作都是通过渲染器(Rendering)来进行操作的,所以我们可以改变渲染器操作来改变一些操作的动作。在pdf里面添加的内容的时候,如果您添加的内容超出了一页的内容的话,itext7会自动另起一页来开始绘制,那么是否有方法来在本页的内容还没满的情况下另起一页来绘制呢?
答案肯定是可以,有以下两种方法:
PdfDocument
对象拥有以下方法:
PdfDocument
的默认页面大小。PdfDocument
的默认页面大小。doc.add相关操作
PdfDcoument相关操作
——————
PdfDocument.addPage()
——————
doc.add相关操作
PdfDcoument相关操作
假设一开始只有一页,那么执行的情况就是,doc添加的内容都会在第一页上面,但是PdfDocument添加的内容会在两页上。
结论:addNewPage后通过doc添加的内容并不会显示在最新的一页上
2. addNewPage(int index)和addNewPage(int index,PageSize pageSize):执行完addNewPage(int index)以后如果添加,添加的内容会在哪边呢?分为8种情况:
index超过当前pdf的页数,也就是index=pdf页数+1
通过Document添加的内容
在执行addNewPage(int index)之前
在执行addNewPage(int index)之后
通过PdfDocument添加的内容
在执行addNewPage(int index)之前
在执行addNewPage(int index)之后
index小于当前pdf的页数
通过Document添加的内容:
在执行addNewPage(int index)之前
在执行addNewPage(int index)之后
通过PdfDocument添加的内容:
在执行addNewPage(int index)之前
在执行addNewPage(int index)之后
具体情况大家可以试试,很复杂,综合起来跟第1点一样,addNewPage后通过doc添加的内容和PdfDocument添加的内容所在页面并不是一样的,那问题来了,是否有一种情况是添加一页后,doc和PdfDocument添加的内容都是在新的一页上呢?我们来看一下第二种方法。
在PdfDocument
中有一个方法:add(AreaBreak areaBreak)
,它的作用是停止绘制当前的元素,通常是page。然后看一下AreaBreak
类的描述:它是停止当前的元素并创建一个新的元素,如果没有申明PageSize
的大小,那么它创建的元素大小和当前的元素大小一样。所以我们可以这么使用来创建新的一页:
xxxxxx //当前页面的操作
doc.add(new AreaBreak(AreaBreakType.NEXT_PAGE));
xxxxxx //在新的页面上操作
是不是很方便!推荐大家使用这种方式来创建新的页面!
我们在第4章的时候添加了一个AcroForm表单,那我们是否新创一页然后再添加表单呢?
问题1解决了创建新的一页的问题,那么开始解决添加新的表单的问题:在一个pdf中,AcroForm只能有一个,它是一个字典,记录的是每个小部件的名称,对应每个小部件注释的对象,所以表单我们是可以再创建的,只需要把表单里面小部件的名称和对象注册到AcroForm中即可(注意每个小部件的名称唯一就行),如下代码:
/**
* Created by ASUS on 2017/9/20.
*/
import com.itextpdf.forms.PdfAcroForm;
import com.itextpdf.forms.fields.PdfButtonFormField;
import com.itextpdf.forms.fields.PdfChoiceFormField;
import com.itextpdf.forms.fields.PdfFormField;
import com.itextpdf.forms.fields.PdfTextFormField;
import com.itextpdf.kernel.geom.PageSize;
import com.itextpdf.kernel.geom.Rectangle;
import com.itextpdf.kernel.pdf.PdfDocument;
import com.itextpdf.kernel.pdf.PdfWriter;
import com.itextpdf.kernel.pdf.action.PdfAction;
import com.itextpdf.layout.Document;
import com.itextpdf.layout.element.AreaBreak;
import com.itextpdf.layout.element.Paragraph;
import com.itextpdf.layout.property.AreaBreakType;
import com.itextpdf.layout.property.TextAlignment;
import java.io.File;
import java.io.IOException;
public class C04E02_JobApplication2 {
public static final String DEST = "results/chapter04/job_application2.pdf";
public static void main(String args[]) throws IOException {
File file = new File(DEST);
file.getParentFile().mkdirs();
new C04E02_JobApplication2().createPdf(DEST);
}
public void createPdf(String dest) throws IOException {
//Initialize PDF document
PdfDocument pdf = new PdfDocument(new PdfWriter(dest));
PageSize ps = PageSize.A4;
pdf.setDefaultPageSize(ps);
// Initialize document
Document document = new Document(pdf);
C04E02_JobApplication2.addAcroForm(document);
//Close document
document.close();
}
public static void addAcroForm(Document doc) {
Paragraph title = new Paragraph("Application for employment")
.setTextAlignment(TextAlignment.CENTER)
.setFontSize(16);
doc.add(title);
doc.add(new Paragraph("Full name:").setFontSize(12));
doc.add(new Paragraph("Native language: English French German Russian Spanish").setFontSize(12));
doc.add(new Paragraph("Experience in: cooking driving software development").setFontSize(12));
doc.add(new Paragraph("Preferred working shift:").setFontSize(12));
doc.add(new Paragraph("Additional information:").setFontSize(12));
//Add acroform
PdfAcroForm form = PdfAcroForm.getAcroForm(doc.getPdfDocument(), true);
//Create text field
PdfTextFormField nameField = PdfTextFormField.createText(doc.getPdfDocument(),
new Rectangle(99, 753, 425, 15), "name", "");
form.addField(nameField);
//Create radio buttons
PdfButtonFormField group = PdfFormField.createRadioGroup(doc.getPdfDocument(), "language", "");
PdfFormField.createRadioButton(doc.getPdfDocument(), new Rectangle(130, 728, 15, 15), group, "English");
PdfFormField.createRadioButton(doc.getPdfDocument(), new Rectangle(200, 728, 15, 15), group, "French");
PdfFormField.createRadioButton(doc.getPdfDocument(), new Rectangle(260, 728, 15, 15), group, "German");
PdfFormField.createRadioButton(doc.getPdfDocument(), new Rectangle(330, 728, 15, 15), group, "Russian");
PdfFormField.createRadioButton(doc.getPdfDocument(), new Rectangle(400, 728, 15, 15), group, "Spanish");
form.addField(group);
//Create checkboxes
for (int i = 0; i < 3; i++) {
PdfButtonFormField checkField = PdfFormField.createCheckBox(doc.getPdfDocument(), new Rectangle(119 + i * 69, 701, 15, 15),
"experience".concat(String.valueOf(i+1)), "Off", PdfFormField.TYPE_CHECK);
form.addField(checkField);
}
//Create combobox
String[] options = {"Any", "6.30 am - 2.30 pm", "1.30 pm - 9.30 pm"};
PdfChoiceFormField choiceField = PdfFormField.createComboBox(doc.getPdfDocument(), new Rectangle(163, 676, 115, 15),
"shift", "Any", options);
form.addField(choiceField);
//Create multiline text field
PdfTextFormField infoField = PdfTextFormField.createMultilineText(doc.getPdfDocument(),
new Rectangle(158, 625, 366, 40), "info", "");
form.addField(infoField);
//Create push button field
PdfButtonFormField button = PdfFormField.createPushButton(doc.getPdfDocument(),
new Rectangle(479, 594, 45, 15), "reset", "RESET");
button.setAction(PdfAction.createResetForm(new String[] {"name", "language", "experience1", "experience2", "experience3", "shift", "info"}, 0));
form.addField(button);
doc.add(new AreaBreak(AreaBreakType.NEXT_PAGE)); //关键的一句话
Paragraph title2 = new Paragraph("Application for employment")
.setTextAlignment(TextAlignment.CENTER)
.setFontSize(16);
doc.add(title2);
doc.add(new Paragraph("Full name:").setFontSize(12));
doc.add(new Paragraph("Native language: English French German Russian Spanish").setFontSize(12));
doc.add(new Paragraph("Experience in: cooking driving software development").setFontSize(12));
doc.add(new Paragraph("Preferred working shift:").setFontSize(12));
doc.add(new Paragraph("Additional information:").setFontSize(12));
//以下小部件的名称只是变换一下,在后面加2
//Create text field
PdfTextFormField nameField2 = PdfTextFormField.createText(doc.getPdfDocument(),
new Rectangle(99, 753, 425, 15), "name2", "");
form.addField(nameField2); //用到之前的form
//Create radio buttons
PdfButtonFormField group2 = PdfFormField.createRadioGroup(doc.getPdfDocument(), "language2", "");
PdfFormField.createRadioButton(doc.getPdfDocument(), new Rectangle(130, 728, 15, 15), group2, "English");
PdfFormField.createRadioButton(doc.getPdfDocument(), new Rectangle(200, 728, 15, 15), group2, "French");
PdfFormField.createRadioButton(doc.getPdfDocument(), new Rectangle(260, 728, 15, 15), group2, "German");
PdfFormField.createRadioButton(doc.getPdfDocument(), new Rectangle(330, 728, 15, 15), group2, "Russian");
PdfFormField.createRadioButton(doc.getPdfDocument(), new Rectangle(400, 728, 15, 15), group2, "Spanish");
form.addField(group2);
//Create checkboxes
for (int i = 0; i < 3; i++) {
PdfButtonFormField checkField = PdfFormField.createCheckBox(doc.getPdfDocument(), new Rectangle(119 + i * 69, 701, 15, 15),
"experience2_".concat(String.valueOf(i+1)), "Off", PdfFormField.TYPE_CHECK);
form.addField(checkField);
}
//Create combobox
String[] options2 = {"Any", "6.30 am - 2.30 pm", "1.30 pm - 9.30 pm"};
PdfChoiceFormField choiceField2 = PdfFormField.createComboBox(doc.getPdfDocument(), new Rectangle(163, 676, 115, 15),
"shift2", "Any", options2);
form.addField(choiceField2);
//Create multiline text field
PdfTextFormField infoField2 = PdfTextFormField.createMultilineText(doc.getPdfDocument(),
new Rectangle(158, 625, 366, 40), "info2", "");
form.addField(infoField2);
//Create push button field
PdfButtonFormField button2 = PdfFormField.createPushButton(doc.getPdfDocument(),
new Rectangle(479, 594, 45, 15), "reset2", "RESET");
button2.setAction(PdfAction.createResetForm(new String[] {"name2", "language2", "experience2_1", "experience2_2", "experience2_3", "shift2", "info2"}, 0));
form.addField(button2);
}
}
版权说明 : 本文为转载文章, 版权归原作者所有 版权申明
原文链接 : https://blog.csdn.net/u012397189/article/details/78054147
内容来源于网络,如有侵权,请联系作者删除!