生成PDF全攻略之在已有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 的其他属性不变,就能从容面对。

管道复制代码如下:

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上添加内容的实现方法就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持我们。

(0)

相关推荐

  • 使用jspdf生成pdf报表

    由于前台html已经动态生成报表,而且,前台有一个功能,一个date range组件,当你拖动的时候,报表会在不提交到后台的情况下动态变化. 因此需要用到js生成生报表: 用到的组件: jquery.js jspdf.js canvg.js html2canvas.js jspdf.plugin.autotable.js 前台动态生成的chart现在一般是用的html5的canvas或者是svg,很不幸运,我遇到的是svg, 如果是flash没研究过. 由于报表还需要保持原html页面的外观,但

  • java在pdf中生成表格的方法

    1.目标 在pdf中生成一个可变表头的表格,并向其中填充数据.通过泛型动态的生成表头,通过反射动态获取实体类(我这里是User)的get方法动态获得数据,从而达到动态生成表格. 每天生成一个文件夹存储生成的pdf文件(文件夹的命名是年月日时间戳),如:20151110 生成的文件可能在毫秒级别,故文件的命名规则是"到毫秒的时间戳-uuid",如:20151110100245690-ece540e5-7737-4ab7-b2d6-87bc23917c8c.pdf 通过读取properti

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

    项目在变,需求在变,不变的永远是敲击键盘的程序员..... PDF 生成后,有时候需要在PDF上面添加一些其他的内容,比如文字,图片.... 经历几次失败的尝试,终于获取到了正确的代码书写方式. 在此记录总结,方便下次以不变应万变,需要的 jar 请移步:生成PDF全攻略 PdfReader reader = new PdfReader("E:\\A.pdf"); PdfStamper stamper = new PdfStamper(reader, new FileOutputStr

  • javascript操作excel生成报表全攻略

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

  • 剖析各类恶意网页对策分析—注册表使用全攻略之七

    剖析各类恶意网页对策分析-注册表使用全攻略之七 互联网利用IE等的漏洞完全可以让你通过浏览网页让你的电脑面目全非,或者格盘,甚至中下木马,传播病毒,而且这种形式的传播愈演愈烈,闲话少说了,现在来分析一下各类恶意网页. 分析前先介绍一下注册表的修改方法,因为注册表在网页病毒中是中枢,就是通过它让你的电脑面目全非. 第一种方法:直接修改法 就是在运行里敲入regedit,然后进行编辑,这是大家通常修改注册表的方法. 第二种方法:reg包导入法 现在以解锁注册表为例(其实解锁用兔子等工具更好更方便,这

  • Linux中搭建完整的samba服务器全攻略(centos版)

    前言 smb是一个协议名,它能被用于Web连接和客户端与服务器之间的信息沟通.SMB最初是IBM的贝瑞·费根鲍姆(Barry Feigenbaum)研制的,其目的是将DOS操作系统中的本地文件接口"中断13"改造为网络文件系统. smb服务简介 后来微软对这个发展进行了重大更改,这个更改后的版本也是最常见的版本.微软将SMB协议与它和3Com一起发展的网络管理程序结合在一起,并在Windows for Workgroups和后来的Windows版本中不断加入新的功能. SMB一开始的设

  • Chrome插件(扩展)开发全攻略(完整demo)

    写在前面 我花了将近一个多月的时间断断续续写下这篇博文,并精心写下完整demo,写博客的辛苦大家懂的,所以转载务必保留出处.本文所有涉及到的大部分代码均在这个demo里面:https://github.com/sxei/chrome-plugin-demo ,大家可以直接下载下来运行. 另外,本文图片较多,且图片服务器带宽有限,右下角的目录滚动监听必须等到图片全部加载完毕之后才会触发,所以请耐心等待加载完毕. 本文目录: demo部分截图: 前言 什么是Chrome插件 严格来讲,我们正在说的东

  • 微信公众帐号开发教程之图文消息全攻略

    引言及内容概要 已经有几位读者抱怨"柳峰只用到文本消息作为示例,从来不提图文消息,都不知道图文消息该如何使用",好吧,我错了,原本以为把基础API封装完.框架搭建好,再给出一个文本消息的使用示例,大家就能够照猫画虎的,或许是因为我的绘画功底太差,画出的那只猫本来就不像猫吧-- 本篇主要介绍微信公众帐号开发中图文消息的使用,以及图文消息的几种表现形式.标题取名为"图文消息全攻略",这绝对不是标题党,是想借此机会把大家对图文消息相关的问题.疑虑.障碍全部清除掉. 图文消

  • 文件关联及应用—注册表使用全攻略之二

    注册表的文件关联及应用-注册表使用全攻略之二  喜欢使用Windows右键快捷菜单的朋友可能知道,当你选择了一个文件(或者是文件夹或是系统图标)再单击鼠标右键,系统就会弹出一个菜单,菜单上面的各种"功能"(或称"操作")任你选择,但是你是否注意到,当你安装一些应用软件之后,你的右键菜单是不是膨胀,以winzip为例,安装winzip之后,文件或文件夹的右键菜单当中就增加了功能选择项"Add to Zip"和"Add to xxx.zip

  • 注册表REG文件全攻略—注册表使用全攻略之十五

    注册表REG文件全攻略-注册表使用全攻略之十五 1.何谓REG文件 REG文件实际上是一种注册表脚本文件,双击REG文件即可将其中的数据导入到注册表中.利用REG文件我们可以直接对注册表进行任何修改操作,它对注册表的操作可以不受注册表编辑器被禁用的限制,因此功能更为强大.灵活,另外,由于REG文件可以用任何文本文件编辑工具(例如记事本)进行修改,因此通过它对注册表数据进行修改后,如果发生错误,还可以通过改回REG文件中的数据后再导入,从而实现恢复操作,因此它又较之直接用注册表编辑器修改更安全,所

  • 注册表应用100例—注册表使用全攻略之十一

    注册表应用100例-注册表使用全攻略之十一 1 修改窗口滚动条的大小(Windows 9x/2000/XP)(1)打开注册表编辑器.(2)打开HKEY_CURRENT_USER\Control Panel\Desktop\Windows Metrics子键.(3)右边窗口中的ScrollHeight和ScrollWidth是窗口滚动条的高和宽,默认值为-270(均以Windows 9x为例,Windows 2000/XP的默认值与其相差不大),分别双击ScrollHeight和ScrollWid

  • 解开注册表被锁的方法—注册表使用全攻略之四

    解开注册表被锁的方法-注册表使用全攻略之四 一.解锁方法: 1. 你可以在恢复注册表时,用F8进入选DOS模式或用 运行,C:>SCANREG/RESTORE  2. 你也可以用NotePad编辑一个文本文件,保存文件的时候用格式 xxxxxx.reg 在文件中打入以下: (空一行)REGEDIT 或 REGEDIT4 [HKEY_USERS\.DEFAULT\Software\Microsoft\Windows\CurrentVersion\ Policies\system"Disabl

随机推荐