需求:给原有pdf左上角加 logo,右下角加签名,每页都显示,且不得覆盖原pdf内容,并增加页码
代码:
@Test
public void updatePdfAccount() {
String sourceDir = "D:\\account\\go\\pdfAccount\\newPdf"; // 修改前的 pdf账单文件夹
String targetDir = "D:\\account\\go\\pdfAccount\\test\\";// 修改后的 pdf账单
File dir = new File(sourceDir);
File[] files = dir.listFiles(new FilenameFilter() {
@Override
public boolean accept(File dir, String name) {
return name.toLowerCase().endsWith(".pdf") || name.toLowerCase().endsWith(".pdf");
}
});
String headImage = "D:\\account\\international_head.jpg";//头部图片
String footImage = "D:\\account\\1.jpg"; //尾部图片
for (File f : files) {
try {
FileInputStream pdfInputStream = new FileInputStream(f.getPath());
PDDocument pdDocument = PDDocument.load(pdfInputStream);
int count= pdDocument.getNumberOfPages();
PDFont font = PDType1Font.HELVETICA_BOLD;
for (int i = 0; i < count; i++) {
PDPage page = pdDocument.getPage(i);
PDImageXObject image = PDImageXObject.createFromFile(headImage, pdDocument);
//放头部图片
PDPageContentStream pageStream = new PDPageContentStream(pdDocument, page, PDPageContentStream.AppendMode.APPEND, false, false);
// pageStream对象绘制图片位置及大小,已PDF文件右下角为原点(x,y)是图片左下角左边,width、height是图片的长和宽
pageStream.drawImage(image, 20, 15, 120, 50);
pageStream.close();
//放尾部图片
PDImageXObject image2 = PDImageXObject.createFromFile(footImage, pdDocument);
PDPageContentStream pageStream2 = new PDPageContentStream(pdDocument, page, PDPageContentStream.AppendMode.PREPEND, false, false);
//pageStream对象绘制图片位置及大小,已PDF文件右下角为原点(x,y)是图片左下角左边,width、height是图片的长和宽
pageStream2.drawImage(image2, 520, 50, 200, 60);
pageStream2.close();
//增加页码
PDPageContentStream pageStream3 = new PDPageContentStream(pdDocument, page, PDPageContentStream.AppendMode.PREPEND, false, false);
pageStream3.setFont(font, 9); //调整字体
PDRectangle mediaBox = page.getMediaBox();
float x = mediaBox.getLowerLeftX() + 740; //调整坐标
float y = mediaBox.getLowerLeftY() + 30; //调整坐标
String text = "Page " + (i+1) + " of " + count;// 页码文本
pageStream3.beginText();
pageStream3.newLineAtOffset(x, y);
pageStream3.showText(text);
pageStream3.endText();
pageStream3.close();
}
// 7、保存PDF到指定路径
pdDocument.save(targetDir + f.getName());
pdDocument.close();
pdfInputStream.close();
} catch (Exception e) {
e.printStackTrace();
}
}
总结:挺好用,只是需要调整坐标,我这儿调整了头部图片和尾部图片。主打一个随机应变