产品需求: 在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();
        }
    }
}

最终效果:

通过itextpdf向PDF文件最后一页添加图片-LMLPHP

 

之前尝试的两种方案都不尽人意,

方案一: 把签名图片固定在某一页(第一页的某个位置,功能能实现,不满足产品需求,就像是水印嵌在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();

效果图:

通过itextpdf向PDF文件最后一页添加图片-LMLPHP

 

方案二: 思路: 将图片转成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);*/

通过itextpdf向PDF文件最后一页添加图片-LMLPHP

 

09-22 14:30