首先我们先来看代码:

Document  document = new  Document();
PdfWriter  pdfWriter = PdfWriter.getInstance(document , new  FileOutputStream(tmp_pdf));
document.open();
document.add(new  Paragraph("hello world"));
PdfFormField  pdfFormField1 = PdfFormField.createSignature(pdfWriter);
PdfFormField  pdfFormField2 = PdfFormField.createSignature(pdfWriter);
PdfFormField  pdfFormField3 = PdfFormField.createSignature(pdfWriter);
PdfFormField  pdfFormField4 = PdfFormField.createSignature(pdfWriter);
PdfAppearance  pdfAppearance = PdfAppearance.createAppearance(pdfWriter , 72 , 48);
pdfFormField1.setWidget(new  Rectangle(72 , 732 , 144 , 780) , PdfAnnotation.HIGHLIGHT_INVERT);
pdfFormField1.setFlags(PdfAnnotation.FLAGS_PRINT);
pdfFormField1.setPage();
pdfFormField1.setMKBorderColor(BaseColor.BLACK);
pdfFormField1.setMKBackgroundColor(BaseColor.WHITE);
pdfAppearance.rectangle(0.5f , 0.5f , 71.5f , 47.5f);
pdfAppearance.stroke();
pdfFormField1.setAppearance(PdfAnnotation.APPEARANCE_NORMAL , pdfAppearance);
pdfWriter.addAnnotation(pdfFormField1);
pdfFormField2.setWidget(new  Rectangle(72 , 532 , 144 , 580) , PdfAnnotation.HIGHLIGHT_INVERT);
pdfFormField2.setFlags(PdfAnnotation.FLAGS_PRINT);
pdfFormField2.setPage();
pdfFormField2.setMKBorderColor(BaseColor.BLACK);
pdfFormField2.setMKBackgroundColor(BaseColor.WHITE);
pdfAppearance.rectangle(0.5f , 0.5f , 71.5f , 47.5f);
pdfAppearance.stroke();
pdfFormField2.setAppearance(PdfAnnotation.APPEARANCE_NORMAL , pdfAppearance);
pdfWriter.addAnnotation(pdfFormField2);
pdfFormField3.setWidget(new  Rectangle(72 , 332 , 144 , 380) , PdfAnnotation.HIGHLIGHT_INVERT);
pdfFormField3.setFlags(PdfAnnotation.FLAGS_PRINT);
pdfFormField3.setPage();
pdfFormField3.setMKBorderColor(BaseColor.BLACK);
pdfFormField3.setMKBackgroundColor(BaseColor.WHITE);
pdfAppearance.rectangle(0.5f , 0.5f , 71.5f , 47.5f);
pdfAppearance.stroke();
pdfFormField3.setAppearance(PdfAnnotation.APPEARANCE_NORMAL , pdfAppearance);
pdfWriter.addAnnotation(pdfFormField3);
pdfFormField4.setWidget(new  Rectangle(72 , 132 , 144 , 180) , PdfAnnotation.HIGHLIGHT_INVERT);
pdfFormField4.setFlags(PdfAnnotation.FLAGS_PRINT);
pdfFormField4.setPage();
pdfFormField4.setMKBorderColor(BaseColor.BLACK);
pdfFormField4.setMKBackgroundColor(BaseColor.WHITE);
pdfAppearance.rectangle(0.5f , 0.5f , 71.5f , 47.5f);
pdfAppearance.stroke();
pdfFormField4.setAppearance(PdfAnnotation.APPEARANCE_NORMAL , pdfAppearance);
pdfWriter.addAnnotation(pdfFormField4);
document.close();

然后来一张效果图:

这张效果图由上往下,依次是 pdfFormField1、pdfFormField2、pdfFormField3、pdfFormField4 绘制的矩形框。

在讲 Rectangle 的四个坐标参数之前,先理解一下 IText 中对于 PDF 设置的 xy 坐标的概念。

首先,Itext 按照 page 页数来对一个 PDF 文本做一个拆分,指定了第几页,那就在那一页上做操作。当我们 setPage()方法传递的是一个空值时,就表示操作第一页。

然后坐标轴的原点(0,0)位于该页面的左下角。X 轴就是左下角到右下角的那条直线,Y 轴就是左下角到左上角的那条直线。

Rectangle

在用 Rectangle 绘制一个矩形的时候,我们需要往它的构造函数里传递四个参数,前面两个参数代表第一个点的 xy 坐标,后面两个参数代表第二个点的 xy 坐标值,Itext 将以这两个点作为对角点来创建一个矩形。

咋一看,绘制这么一个矩形似乎并没有什么卵用,但实际上,我们用的比较多的一个地方:PDF 数字签名就跟它密切相关。PDF 数字签名的具体实现我将在之后的博文里面进行更新。

Java 是一种可以撰写跨平台应用软件的面向对象的程序设计语言,是由 Sun Microsystems 公司于 1995 年 5 月推出的。Java 技术具有卓越的通用性、高效性、平台移植性和安全性。