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) {
            
        }
    }
}

step4 搞定 自己试试吧

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值