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