itext7学习笔记杂谈系列1——添加新的页面和新的AcroForm

itext7学习笔记杂谈系列1——添加新的页面和新的AcroForm这个系列主要记录一些itext7里面出现的一些问题,以及网友问的一些问题,主要是自己的真知灼见,如果有错误希望大家能指出,感谢大家一如既往的支持。Doucment与PdfDocument之前在itext7学习笔记——第3章提到过:Document是PdfDocument的高级别表示,在官方api文档中,描述了以下主要区别(我整理的):-PdfDocument:直接跟pdf文档有关系,有

大家好,欢迎来到IT知识分享网。itext7学习笔记杂谈系列1——添加新的页面和新的AcroForm"

作者:CuteXiaoKe
微信公众号:CuteXiaoKe

    这个系列主要记录一些itext7里面出现的一些问题,以及网友问的一些问题,主要是自己的真知灼见,如果有错误希望大家能指出,感谢大家一如既往的支持。

Doucment与PdfDocument

    之前在itext7学习笔记——第3章提到过:DocumentPdfDocument的高级别表示,在官方api文档中,描述了以下主要区别(我整理的):

  • PdfDocument:直接跟pdf文档有关系,有页面大小等属性,是比较底层的类
  • Document:是高级的类,可以有一些高级api,例如设置页面大小、旋转、增加元素等操作,它本身是不含pdf里面的具体语法的,它的add一些操作都是通过渲染器(Rendering)来进行操作的,所以我们可以改变渲染器操作来改变一些操作的动作。

添加新的页面

问题1

在pdf里面添加的内容的时候,如果您添加的内容超出了一页的内容的话,itext7会自动另起一页来开始绘制,那么是否有方法来在本页的内容还没满的情况下另起一页来绘制呢?

回答1

    答案肯定是可以,有以下两种方法:

通过addNewPage()方式

    PdfDocument对象拥有以下方法:

  • addNewPage():在最后添加一页,页面大小为PdfDocument的默认页面大小。
  • addNewPage(int index):在指定位置创建并插入一页,页面大小为PdfDocument的默认页面大小。
  • addNewPage(PageSize pageSize):在最后添加一页,页面大小为指定的页面大小
  • addNewPage(int index,PageSize pageSize):在指定位置创建并插入一页,页面大小为指定的页面大小。

addNewPage的注意事项

  1. addNewPage()和addNewPage(PageSize pageSize):执行完addNewPage()以后如果添加内容,添加的内容会在哪边呢?比如以下情况:
doc.add相关操作
PdfDcoument相关操作
——————
PdfDocument.addPage()
——————
doc.add相关操作
PdfDcoument相关操作

    假设一开始只有一页,那么执行的情况就是,doc添加的内容都会在第一页上面,但是PdfDocument添加的内容会在两页上。
结论:addNewPage后通过doc添加的内容并不会显示在最新的一页上

  1. 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添加的内容都是在新的一页上呢?我们来看一下第二种方法。

通过AreaBreakType.NEXT_PAGE方式

    在PdfDocument中有一个方法:add(AreaBreak areaBreak),它的作用是停止绘制当前的元素,通常是page。然后看一下AreaBreak类的描述:它是停止当前的元素并创建一个新的元素,如果没有申明PageSize的大小,那么它创建的元素大小和当前的元素大小一样。所以我们可以这么使用来创建新的一页:

xxxxxx //当前页面的操作
doc.add(new AreaBreak(AreaBreakType.NEXT_PAGE));
xxxxxx //在新的页面上操作

    是不是很方便!推荐大家使用这种方式来创建新的页面!

问题2

我们在第4章的时候添加了一个AcroForm表单,那我们是否新创一页然后再添加表单呢?

回答2

    问题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://yundeesoft.com/11215.html

(0)

相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注微信