给PDF文件添加一维码和文字内容

1.在pom.xml引入pdfbox的jar包和一维码生成的jar包

<!-- PDF解析包 -->
<dependency>
    <groupId>org.apache.pdfbox</groupId>
    <artifactId>pdfbox</artifactId>
    <version>2.0.12</version>
</dependency>
<dependency>
    <groupId>org.apache.pdfbox</groupId>
    <artifactId>fontbox</artifactId>
    <version>2.0.12</version>
</dependency>

<!-- 条形码生成 -->
<dependency>
    <groupId>net.sf.barcode4j</groupId>
    <artifactId>barcode4j-light</artifactId>
    <version>2.0</version>
</dependency>

2.以下是PDF添加一维码和文字的工具类

import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.PDPageContentStream;
import org.apache.pdfbox.pdmodel.common.PDRectangle;
import org.apache.pdfbox.pdmodel.font.PDFont;
import org.apache.pdfbox.pdmodel.font.PDType0Font;
import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject;
import org.apache.pdfbox.util.Matrix;
import org.krysalis.barcode4j.impl.code128.Code128Bean;
import org.krysalis.barcode4j.output.bitmap.BitmapCanvasProvider;
import org.krysalis.barcode4j.tools.UnitConv;

import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;

public class pdfAdd {
    /**
     * 给PDF文件添加一维码
     * @param document pdfbox的文件对象PDDocument
     * @param barcodeContent 一维码内容
     * @param saveFile pdf文件的保存地址
     */
    public void addBarcode(PDDocument document,String barcodeContent,String saveFile) throws IOException {
        //新建字节数组输出流
        ByteArrayOutputStream baos = new ByteArrayOutputStream();
        //code128对象  来自jar:org.krysalis.barcode4j.impl.code128.Code128Bean
        Code128Bean bean = new Code128Bean();
        //分辨率
        int dpi = 80;
        // 设置宽
        bean.setModuleWidth(UnitConv.in2mm(1.0f / dpi));
        //条码两边不留空白
        bean.doQuietZone(false);
        //设置图片类型
        String format = "image/png";
        //把参数传入,把图片写入到流中
        BitmapCanvasProvider canvas = new BitmapCanvasProvider(baos, format, dpi, BufferedImage.TYPE_BYTE_BINARY, false, 0);
        // 生成图片
        bean.generateBarcode(canvas, barcodeContent);
        //绘制结束
        try {
            // 关闭流
            canvas.finish();
        } catch (IOException e) {
            throw new RuntimeException(e);
        } finally {
            try {
                if (baos != null)
                    // 关闭字节数组输出流
                    baos.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        //字节数组流变为字节数组 byte[]
        byte[] barCode=baos.toByteArray();

        //获取PDF文件第一页,下标为0
        PDPage firsPpage = document.getPage(0);
        //获取PDFBOX中的image对象。第一个参数是PDFBOX对象,第二个是Image图片字符数组,第三个是一维码内容
        PDImageXObject pdImage = PDImageXObject.createFromByteArray(document, barCode, barcodeContent);
        //第一页的页面内容流
        PDPageContentStream firstContentStream = new PDPageContentStream(document, firsPpage, PDPageContentStream.AppendMode.APPEND, true, true);
        //定义
        float scale = 1f;
        //把图片写入PDF第一页面.第一个参数:image图片对象;第二个:X轴位置;第三个:Y轴位置;第四个:图片宽;第五个:图片高
        firstContentStream.drawImage(pdImage, 495, 520, pdImage.getWidth() * scale, pdImage.getHeight() * scale);
        //关闭第一页页面内容
        firstContentStream.close();
        //保存添加一维码后的PDF文件
        document.save(saveFile);
    }

    /**
     * 给PDF文件每页添加文字内容
     * @param document pdfbox对象
     * @param textContent 添加的文字内容
     * @param saveFile 文件的保存路径
     */
    public void addText(PDDocument document,String textContent,String saveFile) throws IOException {
        //获取当前class文件的路径
        String currentPath = this.getClass().getClassLoader().getResource("").getPath();
        //获取webapp/static/font文件夹内的字体文件路径,只有引入这个字体文件才能使用汉字
        String fontStyleFile = currentPath.substring(0, currentPath.length() - 16) + "static/font/ARIALUNI.TTF";
        //获取PDFont文字对象
        PDFont font= PDType0Font.load(document, new File(fontStyleFile));
        //文字大小
        float fontSize=20.0f;
        //循环PDF每页
        for(PDPage page:document.getPages()) {
            //得到页面的矩形对象
            PDRectangle pageSize = page.getMediaBox();
            //设置插入文字的宽度
            float stringWidth = font.getStringWidth(textContent)*fontSize/1000f;
            //设置文字位置
            float upperRightX=pageSize.getUpperRightX();
            float upperRightY=pageSize.getUpperRightY();
            //获取页面内容流对象
            PDPageContentStream contentStream = new PDPageContentStream(document, page, PDPageContentStream.AppendMode.APPEND, true, true);
            //开始插入文字
            contentStream.beginText();
            //设置字体和文字大小
            contentStream.setFont( font, fontSize );
            //设置文字颜色
            contentStream.setNonStrokingColor(255, 0, 0);
            //设置文本矩阵的位置
            Matrix matrix=Matrix.getTranslateInstance(upperRightX-stringWidth-10, upperRightY-fontSize-10);
            //将文本矩阵放入页面中
            contentStream.setTextMatrix(matrix);
            //显示插入的文字内容
            contentStream.showText(textContent);
            //插入文字完毕
            contentStream.endText();
            //关闭页面内容流
            contentStream.close();
        }
        //保存添加文字后的PDF文件
        document.save(saveFile);
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值