java实现PDF指定坐标位置文字写入
使用java实现PDF指定坐标位置文字写入
step1 引入依赖
<dependency>
<groupId>org.apache.pdfbox</groupId>
<artifactId>pdfbox</artifactId>
<version>2.0.29</version>
</dependency>
step2 下载中文字体ttf文件(pdfbox原生的不支持中文)
可以自己下载,下载地址
https://www.fonts.net.cn/font-31538305958.html
step3 上代码
import java.awt.*;
import java.io.File;
import java.io.IOException;
public class ChineseFont {
//将字体加载到jvm中
public static void imp() throws IOException, FontFormatException {
File file = new File("D:\\FangZhengXinShuSongJianTi-1.ttf");
Font font = Font.createFont(Font.TRUETYPE_FONT, file);
GraphicsEnvironment.getLocalGraphicsEnvironment().registerFont(font);
}
}
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPageContentStream;
import org.apache.pdfbox.pdmodel.PDPageTree;
import org.apache.pdfbox.pdmodel.font.PDType0Font;
import java.io.File;
public class PdfTest {
// 获取Y坐标 (Y坐标是反的)
// value Y标尺 毫米数
public static float getY(int value){
// 获取坐标
return getDpi(295-value);
}
// 获取X坐标 (X轴坐标不用变)
// value X标尺 毫米数
public static float getDpi(int value){
double v = value / 25.4;
float v1 = (float)(72 * v);
return (float) (Math.round(v1 * 10)) /10;
}
public static void main(String[] args) {
try {
File file = new File("D:\\source.pdf");
PDDocument document = PDDocument.load(file);
PDPageTree pages = document.getPages();
ChineseFont.imp();
// 中文字体库,如果不用中文的,更加简单,可自行百度
PDType0Font chineseFont = PDType0Font.load(document,new File("D:\\FangZhengXinShuSongJianTi-1.ttf"));
for (int i = 0; i < pages.getCount(); i++) {
// i是页码,表明是第几页插入数据 从0开始
// 创建内容流
PDPageContentStream contentStream = new PDPageContentStream(document, pages.get(i), PDPageContentStream.AppendMode.APPEND, true, true);
// 设置字体和字体大小
contentStream.setFont(chineseFont, 12);
switch (i){
case 0:
// 在指定位置插入数据
contentStream.beginText();
// X Y坐标获取与计算逻辑参考
// https://max.book118.com/html/2020/0919/6014113040003000.shtm
contentStream.newLineAtOffset(getDpi(46), getY(52));
contentStream.showText("姓名");
contentStream.endText();
contentStream.beginText();
contentStream.newLineAtOffset(getDpi(135), getY(66));
contentStream.showText("岗位名称");
contentStream.endText();
break;
case 1:
// 在指定位置插入数据
contentStream.beginText();
contentStream.newLineAtOffset(getDpi(44), getY(31));
contentStream.showText("上班地址");
contentStream.endText();
}
// 关闭内容流
contentStream.close();
}
File file1 = new File("D:\\target.pdf");
document.save(file1);
document.close();
// 生成后删除
// file1.delete();
System.out.println("Successfully added page numbers to the PDF document!");
} catch (Exception e) {
}
}
}