itext7学习笔记杂谈系列3——在绝对位置添加文本

x33g5p2x  于2021-12-28 转载在 其他  
字(1.7k)|赞(0)|评价(0)|浏览(567)

之前也是有人问过我如何使用itext7在pdf的绝对位置中插入文本呢?这几天我也是查阅了相关资料,把相关应用场景和解决方法给大家说一说。

应用场景

其实在pdf中的绝对位置中插入文本的应用场景还是很多的,最典型的应用场景如下:

  • 合同模板采用PDF
  • 合同里面大部分文字已经写好,少部分内容由用户填写,例如姓名,身份证号等
  • 要填入的内容的绝对位置已经确定,这时候我们网页端或者其他终端接收用户填入的内容,根据内容填到PDF中相应位置

这就是典型的应用场景,其实还有很多地方要用到这操作,让我们来怎么实现这操作。
大家是否还记得我们在itext7第二章里面提及过,最原始的坐标的原点在PDF的左下位置。

方法一:setFixedPosition-高级API

最简单的方法,就是使用Paragraph对象的setFixedPosition方法啦,该方法是继承自com.itextpdf.layout.ElementPropertyContainer的方法,方法原型如下:

函数原型:

public T setFixedPosition(int pageNumber, float left,
float bottom,
UnitValue width)

参数:

  • pageNumber:要设置绝对位置所在的页码
  • left:添加文本的左下角相对原点的x坐标
  • bottom:添加文本的左下角相对原点的y坐标
  • width:添加文本的横向宽度

代码实例:

Text text = new Text(String.format("Page %d", pdf.getNumberOfPages() - 1));
text.setBackgroundColor(Color.WHITE); 
//前面这个text主要是设置背景色为白色,如果text的位置上面有内容就会覆盖掉内容
document.add(new Paragraph(text).setFixedPosition(
pdf.getNumberOfPages(), 549, 742, 100)); //这里面width取决于留空的宽度,这里我们尽量取大一点

运行结果:

width参数的选取

在这里我们要注意到width这个参数的选取,如果你的width选取的过小,那你的文字会以多行的形式展示,如下图是width=10的时候,效果下图:

当width=20的时候,效果如下图:

方法二:使用Canvas-低级API

这种方法主要是利用了RectangleCanvas相结合来在特定位置添加文本,我们直接来看如下代码:

PdfPage page = pdf.addNewPage();
PdfCanvas pdfCanvas = new PdfCanvas(page);
Rectangle[] columns = {new Rectangle(6, 650, 100, 30),
        new Rectangle(50, 500, 100, 100),};  //几个Rectangle对应几个位置
pdfCanvas.rectangle(columns[0]);
pdfCanvas.stroke();  
Canvas canvas = new Canvas(pdfCanvas, pdf, columns[0]);
Paragraph p=new Paragraph("hssssas").setFont(f3).setBold().setFontSize(10);   //Bold为设置粗体
canvas.add(p);

步骤如下:

  1. 根据合同中留空的位置设计相应个数的Rectangle
  2. 用第一个矩形设置当前pdfCanvas画布的位置,表明要在这个矩形里面添加内容
  3. 调用stroke()函数,显示这个矩形,当然,你可以不掉用这个函数,那就不会显示这个矩形。
  4. 根据pdfCanvas来创建Canvas实例
  5. 创建一个Paragraph对象,加粗,设置字体样式,设置字体大小。
  6. Canvas中添加这个Paragraph

结果如下图所示:

PS:往矩形里面添加内容还会遇到其他情况,例如添加的内容超出了矩形的大小,那么添加的内容会怎么样呢,是否有解决方法呢?大家可以先行自己试一试,我会在其他章节里面提到这个问题

相关文章