pdfbox的一些使用记录
链接: [接口文档](链接: link.
业务需求:在pdf上添加一些文本和图片生成一个新的pdf
这种需求你们可以花点钱嘛,花点,哪怕用itext呢,花不了多少钱,哪怕偷偷摸摸的呢?
使用pdfBox就是有些难受,但是itext商用要钱,就使用了pdfbox 这个开源框架
下面开始
加载pdf模板
//加载pdf模板
ClassPathResource classPathResource = new ClassPathResource("/template/selfHelpApplication_dadi.pdf");
InputStream in = classPathResource.getInputStream();
PDDocument document = PDDocument.load(in);
// 获取第0页
PDPage page = document.getPage(0);
PDPageContentStream contentStream = new PDPageContentStream(document, page,
PDPageContentStream.AppendMode.PREPEND, false);
//设置字体
InputStream inFont = DaDiApi.class.getClassLoader().getResourceAsStream("template/simfang.ttf");
PDType0Font font = PDType0Font.load(document, inFont);
contentStream.setFont(font, 10.56f);
添加文本方法
/**
* 设置x轴和Y轴的时候按照66.66的大小显示pdf模板的像素位置进行设置,然后再微调
* @param overContent
* @param txt 文本
* @param def 默认文本
* @param x X轴坐标
* @param y Y轴坐标
* @throws Exception
*/
public static void showTextByLeft(PDPageContentStream overContent, String txt, String def, float x, float y) throws Exception{
overContent.beginText();
if (null == txt) {
txt = def;
}
overContent.newLineAtOffset(x, y);
overContent.showText(txt);
overContent.endText();
}
设置文字
PDFBoxUtil.showTextByLeft(contentStream, "√", "", 148,630);
用这种方法设置的窜在的问题是文本会从像素所在位置直接向后写,会和模板原有文字重叠
可以通过计算文字的宽度,设置多行解决这个问题
//插入网络图片
BufferedImage bufferImage = ImageIO.read("URL");
PDImageXObject pdImage = LosslessFactory.createFromImage(document, bufferImage);
contentStream.drawImage(pdImage, 255, 80, 60, 60);
//插入本地图片
// Loading img from file
PDImageXObject pdImage = PDImageXObject.createFromFile("src/main/resources/song.png", document);
contentStream.drawImage(pdImage, 255, 80, 50, 50);
以from表单方式插入文本
待续,
我遇上一个问题,form表单方式插入,pdfbox会根据from表单的大小和文本长度自动设定字号,造成文字大小不一致,小生才疏学浅,没找到解决办法