产品需求: 在pdf 最后一页嵌上签名,因为每个pdf 内容不一样,故不能用pdf 模板的方式,所以采用将签名嵌在最后一页.
最终方案,首先上最终代码:
public static void main(String[] args) throws Exception {
PdfReader reader = null;
PdfStamper stamper = null;
FileInputStream fis = null;
try {
fis = new FileInputStream(new File("C:\\Users\\EDZ\\Desktop\\peletter.pdf"));
} catch (FileNotFoundException e) {
log.error("pdf文件路径不正确",e);
}
String path = "C:\\Users\\EDZ\\Desktop\\peletter888.pdf";
try {
reader = new PdfReader(fis);
stamper = new PdfStamper(reader, new FileOutputStream(path));
//新增空白页
stamper.insertPage(reader.getNumberOfPages() + 1, reader.getPageSizeWithRotation(1));
//捕获新增的空白页
PdfContentByte under = stamper.getOverContent(reader.getNumberOfPages());
Image image = Image.getInstance("C:\\Users\\EDZ\\Desktop\\sign.jpg");
// 图片大小 宽,高
image.scaleAbsolute(250, 200);
image.setAbsolutePosition(25, 530);
under.addImage(image);
stamper.close();
reader.close();
} catch (DocumentException | IOException e) {
log.error("向pdf追加图片失败",e);
} finally {
if (ObjectUtils.isEmpty(stamper)) {
stamper.close();
}
if (ObjectUtils.isEmpty(reader)) {
reader.close();
}
}
}
最终效果:
之前尝试的两种方案都不尽人意,
方案一: 把签名图片固定在某一页(第一页的某个位置,功能能实现,不满足产品需求,就像是水印嵌在pdf 的某个位置(同样可以设置图片大小和横纵坐标))
File file = new File("C:\\Users\\EDZ\\Desktop\\peletter.pdf");
//合成后的文件
FileOutputStream outputStream = new FileOutputStream("C:\\Users\\EDZ\\Desktop\\peletter_sign1.pdf");
PdfReader pdfReader = new PdfReader(new FileInputStream(file));
PdfStamper pdfStamper = new PdfStamper(pdfReader, outputStream);
//将签名图片放在pdf文件的第4页
PdfContentByte pdfContentByte = pdfStamper.getOverContent(1);
//签名图片
Image contractSealImg = Image.getInstance("C:\\Users\\EDZ\\Desktop\\sign.jpg");
pdfContentByte.saveState();
PdfGState pdfGState = new PdfGState();
//给图片设置透明度
pdfGState.setFillOpacity(0.8F);
pdfContentByte.setGState(pdfGState);
//设置图片位置
// contractSealImg.setAbsolutePosition(75, 320);
//设置图片大小
// contractSealImg.scaleAbsolute(80, 60);
contractSealImg.setAbsolutePosition(80, 80);
contractSealImg.scaleAbsolute(200, 200);
//将图片添加到pdf文件
pdfContentByte.addImage(contractSealImg);
pdfContentByte.restoreState();
pdfStamper.setFormFlattening(true);
pdfStamper.close();
pdfReader.close();
outputStream.close();
效果图:
方案二: 思路: 将图片转成PDF ,再 合并pdf,用的spire插件,能实现功能,但是最后两张上面均有水印,除去 比较麻烦:
<dependency>
<groupId>e-iceblue</groupId>
<artifactId>spire.office</artifactId>
<version>2.10.0</version>
</dependency>
pdf 去水印: Evaluation Warning : The document was created with Spire.PDF for Java.
//获取要合并的PDF文档的路径
String[] files = new String[]{"C:\\\\Users\\\\EDZ\\\\Desktop\\\\peletter.pdf", "output/ToPDF1.pdf"};
//合并这些文档并返回一个 PdfDocumentBase 类对象
PdfDocumentBase doc = PdfDocument.mergeFiles(files);
//保存合并后的文档
doc.save("4.pdf", FileFormat.PDF);*/
/*//加载PDF文档
PdfDocument pdf = new PdfDocument();
pdf.loadFromFile("C:\\Users\\EDZ\\Desktop\\4.pdf");
//添加一个空白页,目的为了删除jar包添加的水印,后面再移除这一页
pdf.getPages().add();
//移除第一个页
pdf.getPages().remove(pdf.getPages().get(0));
//pdf.getPages().remove(pdf.getPages().get(pdf.getPages().getCount()-1));
//保存为另外一个文档
pdf.saveToFile("C:\\Users\\EDZ\\Desktop\\7.pdf");*/
// PdfDocument pdf = new PdfDocument();
// pdf.loadFromFile("C:\\Users\\EDZ\\Desktop\\4.pdf");
// //保存为Word格式
// pdf.saveToFile("a.docx", FileFormat.DOCX);
// DocToPDF.docTopdf("C:\\Users\\EDZ\\Desktop\\a.docx", "C:\\Users\\EDZ\\Desktop\\8.pdf", "C:\\Users\\EDZ\\Desktop\\");
/*PdfDocument pdf = new PdfDocument();
pdf.loadFromFile("C:\\Users\\EDZ\\Desktop\\ToPDF.pdf");
int pageCount = pdf.getPages().getCount();
log.info("pageCount: {}", pageCount);
pdf.getPages().add();
//获取PDF文件的页数
int pageCount1 = pdf.getPages().getCount();
log.info("pageCount1: {}", pageCount1);
// pdf.getPages().remove(pdf.getPages().get(0));
pdf.getPages().remove(pdf.getPages().get(pdf.getPages().getCount()-1));
pdf.saveToFile("C:\\Users\\EDZ\\Desktop\\9.pdf");*/
/*//加载Word文档
Document document = new Document("C:\\Users\\EDZ\\Desktop\\a.docx");
//使用新文本替换文档中的指定文本
document.replace("Evaluation Warning : The document was created with Spire.PDF for Java.", "", false, true);
//保存文档
document.saveToFile("C:\\Users\\EDZ\\Desktop\\c.docx");
PdfDocument pdf = new PdfDocument();
pdf.loadFromFile("C:\\Users\\EDZ\\Desktop\\ToPDF.pdf");
//保存为Word格式
pdf.saveToFile("d.docx", FileFormat.DOCX);
//获取要合并的PDF文档的路径
String[] files = new String[]{"C:\\Users\\EDZ\\Desktop\\peletter.pdf", "output/ToPDF1.pdf"};
//合并这些文档并返回一个 PdfDocumentBase 类对象
PdfDocumentBase doc = PdfDocument.mergeFiles(files);
//保存合并后的文档
doc.save("8.pdf", FileFormat.PDF);*/