生成PDF全攻略之在已有PDF上添加内容的实现方法_java

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

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 的其他属性不变,就能从容面对。

管道复制代码如下:

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

 inputStream.close();
 fileChannepn.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-pght", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
  overContent.beginText();
  overContent.setFontAndSize(font, 10);
  overContent.setTextMatrix(200, 200);
  overContent.showTextApgned(Element.ApGN_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.setpneWidth(5f);
  overContent.elppse(250, 450, 350, 550);
  overContent.stroke();
  stamper.close();

以上这篇生成PDF全攻略之在已有PDF上添加内容的实现方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持。

以上是小编为您精心准备的的内容,在的博客、问答、公众号、人物、课程等栏目也有的相关内容,欢迎继续使用右上角搜索按钮进行搜索生成pdf
itext 生成pdf全攻略、婴儿辅食添加全攻略、辅食添加全攻略、根据已有公钥生成私钥、已有条码的怎么生成,以便于您获取更多的相关知识。

时间: 2024-08-29 01:19:15

生成PDF全攻略之在已有PDF上添加内容的实现方法_java的相关文章

Xcode 4.1~4.6 + iOS 5、iOS 6免证书(iDP)开发+真机调试+生成IPA全攻略

原创文章,欢迎分享:未经许可,不得转载:版权所有,侵权必究 开发环境使用的是目前为止最新的稳定版软件:Mac OS X Lion 10.7 + Xcode 4.1 目前Xcode 4.2 Preview版也已经发布,据说其修改方法跟4.1非常类似,只改动了一行代码,请参看参考文章的第二篇.本文仍以4.1版本为例. 更新:现在Xcode 4.2正式版和iOS 5均已发布,下面补充上4.2的修改方法.(2011-10-24) 各步骤会标明版本,比如(Xcode4.1请执行)和(Xcode4.2请执行

生成PDF全攻略

阅读目录 1.IText 生成复杂PDF 2.IText添加对中文的支持 3.iTextRenderer(Flying Saucer) HTML转PDF      经历过多少踩坑,翻看过多少类似博客,下载过多少版本的Jar,才能摸索出正确的代码书写方式,才能实现项目经理需求分析书中的功能点.      本文借一次 JavaEE 生成PDF的颠簸的实现过程,描述中小公司程序员的坎坷成长之路.      俺上面只所以将成熟大公司排除在外的原因是,大公司一般都有成熟的产品线和技术积淀.      至少

javascript操作excel生成报表全攻略

 这篇文章主要介绍了如何使用javascript操作excel生成报表,需要的朋友可以参考下 最近做一个项目,用到了javascript操纵excel以生成报表,下面是标有详细注解的实例  代码如下: <html> <head> <script language="javascript" type="text/javascript"> </script><script language="javascr

javascript操作excel生成报表全攻略_javascript技巧

最近做一个项目,用到了javascript操纵excel以生成报表,下面是标有详细注解的实例 复制代码 代码如下: <html> <head> <script language="javascript" type="text/javascript"> </script><script language="javascript" type="text/javascript"&

ALEXA站长全攻略-Alexa世界排名

写此文之前本拟在"ALEXA"前加一个"网站流量世界排名",可转而一想ALEXA主营业务及目前的功能也不一个专做网站流量排名的网站,更确切的说它是一个提供搜索的网站,提供分类导航的网站.不过在中国,大多数人与我的第一反应就是它是一个做网站流量排名的网站,是一个"排名网站".就是<福布斯>是靠给富人排名而使自己出名,ALEXA是给网站排名而出名.初识ALEXA是2003年初,不过因其全英文而使我对其只知皮毛,随着国内媒体一次次地提起它,

ALEXA站长全攻略

中介交易 SEO诊断 淘宝客 云主机 技术大厅 写此文之前本拟在"ALEXA"前加一个"网站流量世界排名",可转而一想ALEXA主营业务及目前的功能也不一个专做网站流量排名的网站,更确切的说它是一个提供搜索的网站,提供分类导航的网站.不过在中国,大多数人与我的第一反应就是它是一个做网站流量排名的网站,是一个"排名网站".就是<福布斯>是靠给富人排名而使自己出名,ALEXA是给网站排名而出名. 初识ALEXA是2003年初,不过因其全英

《过年回家挑战亲戚提问全攻略》有女朋友了吗?

离春节还有几天, QQ 空间上的年味就已十分浓烈.为了应对春节回家时七大姑八大姨连环炮弹式的盘问,有细心的网友吐血整理了一份<挑战亲戚提问全攻略>,在 QQ 空间上被广泛传阅.而有吃货网友则已开启春节模式,在 QQ 空间相册上晒<那些"年儿"的味道>,将以往过年时街边的各色小吃一一罗列,同时筹划着年货置办的清单. <过年回家挑战亲戚提问全攻略>有女朋友了吗? "有女朋友了没?""年终奖多少啊?""什么

用C#制作PDF文件全攻略

攻略 前 言丽水市汽车运输集团有限公司信息中心 苟安廷PDF文件是目前比较流行的电子文档格式,在办公自动化(OA)等软件的开发中,经常要用到该格式,但介绍如何制作PDF格式文件的资料非常少,在网上搜来搜去,都转贴的是同一段"暴力"破解的方法,代码片断如下: StreamWriter pPDF=new StreamWriter(filePath); ArrayList xRefs=new ArrayList(); float yPos =0f; long streamStart=0; l

Nginx服务器基本的模块配置和使用全攻略_nginx

1. 安装nginx 1.1 选择稳定版本我们编译安装nginx来定制自己的模块,机器CentOS 6.2 x86_64.首先安装缺少的依赖包: # yum -y install gcc gcc-c++ make libtool zlib zlib-devel openssl openssl-devel pcre pcre-devel 这些软件包如果yum上没有的话可以下载源码来编译安装,只是要注意编译时默认安装的目录,确保下面在安装nginx时能够找到这些动态库文件(ldconfig). 从