生成 PDF 全攻略【2】在已有PDF上添加内容

简介:

 项目在变,需求在变,不变的永远是敲击键盘的程序员.....

     PDF 生成后,有时候需要在PDF上面添加一些其他的内容,比如文字,图片....

     经历几次失败的尝试,终于获取到了正确的代码书写方式。

     在此记录总结,方便下次以不变应万变,需要的 jar 请移步:生成PDF全攻略

        PdfReader reader = new PdfReader("E:\\A.pdf");
        PdfStamper stamper = new PdfStamper(reader, new FileOutputStream("E:\\B.pdf"));
        PdfContentByte overContent = stamper.getOverContent(1);

    上述的这段代码算是在原有 PDF 上面添加内容的核心代码,具体流程如下

  • 如果看官老爷够仔细的话,该代码是将原 A.pdf 读取,然后将它写入 B.pdf,然后操作 B.pdf。
  • 可能有的看官老爷会说,将 A 读取,然后在写入 A 中,这样肯定是不行的,在读取的时候 A 已经被加载了,不能进行修改。
  • 我不喜欢这种方式,因为原 PDF 的信息已经存储在数据库中,其中包括 PDF 的服务器路径、旧名称、新名称、类型......
  • 这样就会多出一次数据库变更操作,因为这里PDF名称需要变更,而且鬼知道后续需求还会怎么变。
  • 这里急需 只在 PDF 中添加内容,其他的什么都不变,将代码稍微调整了一下。
        FileUtil.fileChannelCopy(A.pdf,A + "tmp".pdf));
        PdfReader reader = new PdfReader(A + "tmp".pdf);
        PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(A.pdf));
        PdfContentByte overContent = stamper.getOverContent(1);

    代码流程就变做下面这个样子

  • 这里引入了管道复制文件,将A 复制一份,读取副本,然后写回到原 PDF A 中,最后当然需要删除副本文件。
  • 到这里,无论后续需求怎么变,保证了pdf 的其他属性不变,就能从容面对。

     管道复制代码如下:

复制代码
    public static void fileChannelCopy(File sources, File dest) {
        try {
            FileInputStream inputStream = new FileInputStream(sources);
            FileOutputStream outputStream = new FileOutputStream(dest);
            FileChannel fileChannelin = inputStream.getChannel();//得到对应的文件通道
            FileChannel fileChannelout = outputStream.getChannel();//得到对应的文件通道
            fileChannelin.transferTo(0, fileChannelin.size(), fileChannelout);//连接两个通道,并且从in通道读取,然后写入out通道

            inputStream.close();
            fileChannelin.close();
            outputStream.close();
            fileChannelout.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
复制代码

      完整的在已有PDF添加其他内容代码如下:

复制代码
        FileUtil.fileChannelCopy(new File("E:\\A.pdf"),new File("E:\\A+"tmp".pdf"));
        PdfReader reader = new PdfReader("E:\\A+"tmp".pdf");
        PdfStamper stamper = new PdfStamper(reader, new FileOutputStream("E:\\A.pdf"));
        PdfContentByte overContent = stamper.getOverContent(1);

        //添加文字
        BaseFont font = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
        overContent.beginText();
        overContent.setFontAndSize(font, 10);
        overContent.setTextMatrix(200, 200);
        overContent.showTextAligned(Element.ALIGN_CENTER,"需要添加的文字",580,530,0);
        overContent.endText();

        //添加图片
        PdfDictionary pdfDictionary = reader.getPageN(1);
        PdfObject pdfObject =  pdfDictionary.get(new PdfName("MediaBox"));
        PdfArray pdfArray = (PdfArray) pdfObject;
        Image image = Image.getInstance("D:\\1.jpg");
        image.setAbsolutePosition(100,100);
        overContent.addImage(image);

        //添加一个红圈
        overContent.setRGBColorStroke(0xFF, 0x00, 0x00);
        overContent.setLineWidth(5f);
        overContent.ellipse(250, 450, 350, 550);
        overContent.stroke();
        stamper.close();
复制代码

 本文转自Orson博客园博客,原文链接:http://www.cnblogs.com/java-class/p/5555494.html,如需转载请自行联系原作者

相关文章
|
Java Unix Linux
知识分享之Golang——读取pdf中纯文本内容
知识分享之Golang篇是我在日常使用Golang时学习到的各种各样的知识的记录,将其整理出来以文章的形式分享给大家,来进行共同学习。欢迎大家进行持续关注。 知识分享系列目前包含Java、Golang、Linux、Docker等等。
1697 1
知识分享之Golang——读取pdf中纯文本内容
|
Python
|
JSON Java BI
Java 解析pdf文档内容实战案例
Java 解析pdf文档内容实战案例
Java 解析pdf文档内容实战案例
|
JSON 自然语言处理 数据可视化
如何用Elasticsearch实现Word、PDF,TXT文件的全文内容检索?
如何用Elasticsearch实现Word、PDF,TXT文件的全文内容检索?
如何用Elasticsearch实现Word、PDF,TXT文件的全文内容检索?
|
IDE 开发工具 Python
python 读出pdf文件中的内容
python 读出pdf文件中的内容
110 0
|
Java
Java之生成Pdf并对Pdf内容操作
虽说网上有很多可以在线导出Pdf或者word或者转成png等格式的工具,但是我觉得还是得了解知道是怎么实现的。一来,在线免费转换工具,是有容量限制的,达到一定的容量时,是不能成功导出的;二来,业务需求,特别是OA方面的项目,报表不单单只是在线通过浏览器登录对应的站点浏览还需有时导出Pdf格式(pdf格式为通用格式,无论是浏览器还是其他工具都能打开,因此特别是做项目实施的,除了用word编写文档之外,通常还导出一下pdf,这样一来保证给老板看时,不会因为某种原因打不开文件看不到对应的实质内容。
1651 0
|
存储 自然语言处理 数据挖掘
如何用Python批量提取PDF文本内容?
本文为你展示,如何用Python把许多PDF文件的文本内容批量提取出来,并且整理存储到数据框中,以便于后续的数据分析。 问题 最近,读者们在后台的留言,愈发五花八门了。
2208 0
|
Java Apache
Java使用PDFBox开发包实现对PDF文档内容编辑与保存
pdfbox开发包下载地址:http://pdfbox.apache.org/ 程序实现了PDF文档的创建,读入,与修改PDF内容并保存。 可能有个前提,PDF文档不是加密的,如果加密怎么办,我没研究过! 源代码如下: package com.
1925 0