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);
}
}
本文介绍如何使用PDFBox和Barcode4j库在PDF文件中添加一维码和文字内容,包括在pom.xml中引入所需jar包,以及具体的Java代码实现。
249

被折叠的 条评论
为什么被折叠?



