因为业务需要,导出PDF时需要嵌入一张背景图,使用的技术是com.itextpdf,然后在往上苦苦搜索不可得,最后经过自己研究终于解决了该问题,所以分享给大家。

导出一张简单PDF代码

public static void main(String[] args)  throws Exception {Document doc = new Document();doc.setPageSize(PageSize.A4);//设置为A4大小PdfWriter pdfWriter = PdfWriter.getInstance(doc, new FileOutputStream("E:/dmeo.pdf"));// 设置自定义翻页PdfPageEvent pageEvent = new PdfPageEvent();pdfWriter.setPageEvent(pageEvent);doc.open();// 新页doc.newPage();// 嵌入背景图doc.newPage();// 设置背景图Image image = Image.getInstance("E:/bg_test.png");image.setAbsolutePosition(0, 0);image.scaleAbsolute(PageSize.A4); // A4的配置doc.add(image);// 设置上间距Paragraph paragraph = new Paragraph(" ");paragraph.setLeading(40);paragraph.setAlignment(Element.ALIGN_LEFT);doc.add(paragraph);// 内容for (int i = 0; i < 100; i++) {paragraph = new Paragraph("Hello World!!!");paragraph.setAlignment(Element.ALIGN_LEFT);doc.add(paragraph);}// 将缓存刷入到文件pdfWriter.flush();doc.close();pdfWriter.close();System.out.println("导出完毕");}

然后我们看看效果:


可以到,第一页背景是嵌入成功,但是第二页背景并没有嵌入,原因也很简单,因为我们只给第一页嵌入了背景图,但新的问题来了,第二页是自动生成的,这时候有可爱的小伙伴会想到在输出打印哪里每打印一次都进行一次设置背景图,首先不说效率问题,当真的去这样做的话,你会发现是行不通的,原因我就不在这里说,大家有兴趣可以跟下源码,此处不做多的赘述,直接上解决方案:
首先需要跟进

PdfWriter pdfWriter = PdfWriter.getInstance(doc, new FileOutputStream(“E:/dmeo.pdf”));

public static PdfWriter getInstance(final Document document, final OutputStream os)throws DocumentException {PdfDocument pdf = new PdfDocument();document.addDocListener(pdf);PdfWriter writer = new PdfWriter(pdf, os);pdf.addWriter(writer);return writer;}

PdfDocument 这个对象就是我们此次的重点,pdf的写入分页都是由这个PdfDocument 对象进行的,所以我们需要继承该对象,在其写入之后做一些事情。

public class MyPdfDocument extends PdfDocument {private Document document;private boolean isNewPage = true;public MyPdfDocument(Document document) {this.document = document;}@Overridepublic boolean add(Element element) throws DocumentException {// 判断是否快写满了,如果是,进行换页,并设置背景图和上间距float currentHeight = this.currentHeight;if(currentHeight > (PageSize.A4.getHeight() - 200)) {try {document.newPage();// 设置背景图Image image = Image.getInstance("E:/bg_test.png");image.setAbsolutePosition(0, 0);image.scaleAbsolute(PageSize.A4); // A4的配置document.add(image);// 设置上间距Paragraph paragraph = new Paragraph(" ");paragraph.setLeading(40);paragraph.setAlignment(Element.ALIGN_LEFT);document.add(paragraph);} catch (Exception e) {e.printStackTrace();}}boolean flag = super.add(element);return flag;}}

当然仅仅定义了我们的PdfDocument 还不够,因为这时候你会发现,PdfWriter尽让不支持我们传入自己定义的PdfDocument ,所以我们还需要继承PdfWriter配置一个我们想要的对象

public class MyPdfWriter extends PdfWriter {public MyPdfWriter(final PdfDocument document, final OutputStream os) {super(document, os);pdf = document;directContentUnder = new PdfContentByte(this);directContent = directContentUnder.getDuplicate();}public static PdfWriter getInstance(final Document document, final OutputStream os)throws DocumentException {// 使用我们自己的PdfDocument MyPdfDocument pdf = new MyPdfDocument(document);document.addDocListener(pdf);PdfWriter writer = new MyPdfWriter(pdf, os);pdf.addWriter(writer);return writer;}}

然后还需要获取我们自己的PdfWriter

public static void main(String[] args)  throws Exception {Document doc = new Document();doc.setPageSize(PageSize.A4);// 获取我们自己定义的PdfWriter PdfWriter pdfWriter = MyPdfWriter.getInstance(doc, new FileOutputStream("E:/dmeo.pdf"));// 设置自定义翻页PdfPageEvent pageEvent = new PdfPageEvent();pdfWriter.setPageEvent(pageEvent);doc.open();// 新页doc.newPage();// 嵌入背景图doc.newPage();...
}

我们来看效果:

以上便是该文章所有的内容

关于PDF嵌入背景图的实现相关推荐

  1. Itext 7 生成pdf带有背景图

    Itext 7 生成pdf带有背景图并下载PDF到本地 引入jar包 <dependency><groupId>com.itextpdf</groupId>< ...

  2. 【教程】Spire.PDF教程:如何给PDF添加背景颜色和平铺背景图

    Spire.PDF是一个专业的PDF组件,能够独立地创建.编写.编辑.操作和阅读PDF文件,支持 .NET.Java.WPF和Silverlight.Spire.PDF的PDF API拥有丰富的功能, ...

  3. itextsharp php,C#_C#使用iTextSharp设置PDF所有页面背景图功能实例,本文实例讲述了C#使用iTextSharp - phpStudy...

    C#使用iTextSharp设置PDF所有页面背景图功能实例 本文实例讲述了C#使用iTextSharp设置PDF所有页面背景图功能的方法.分享给大家供大家参考.具体如下: 在生成PDF 的时候,虽然 ...

  4. iTextSharp 设置PDF所有页面背景图功能

    原文地址http://www.soaspx.com/dotnet/asp.net/tech/tech_20120828_9539.html,感谢,如果此内容是摘自其他博客地址,请告诉我,多谢.红色的注 ...

  5. php 生成背景图+嵌入图

    <?phpuse think\Db; use think\Config;/*** 画布生图* @param type $partjob_id 兼职id* @param type $data 内容 ...

  6. 背景图怎么置于底层_Ps素材教程含有刻度的背景图

    更多表盘和教程,就点上方蓝字关注我们 Ps这个软件大家都很熟悉我就不介绍啦,本文章交大家如何P出表盘背景图 首先准备的软件Photoshop,下载地址见百度,我的软件版本是CC 2019(如下图) 新 ...

  7. power bi 背景图_Power BI桌面脉冲图

    power bi 背景图 In my last article, Power BI Desktop Interactive chord diagrams, we underscored that Mi ...

  8. power bi 背景图_Power BI桌面饼图树

    power bi 背景图 Power BI Desktop amplifies the value of data. We can connect to multiple data sources a ...

  9. 背景图延迟加载(lazyload)技术

    图片延迟加载技术目前已经被各种网站广泛的使用,但最近的一篇<PS美女试验的惊人结果 >文章中使用的却是背景图延迟加载技术.为什么要使用背景图延迟加载技术?下面我们就来说一说这个问题. 之所 ...

最新文章

  1. vivo 互联网业务就近路由技术实战
  2. 【swjtu】数字电路实验7_8_电子琴设计
  3. python写用用户名密码程序_Python创建用户名和密码程序
  4. Java IO在Android中应用(二):APK加固
  5. python函数参数*args和**args
  6. 求 A^B mod C. (1=A,C=1000000000,1=B=10^1000000).(fzu1759,hdu3221,hdu4335)
  7. 平均负载及CPU上下文切换
  8. 少了unicon-tools是不行滴
  9. 程序员常用的画图软件推荐
  10. ad 14 自己画元件库教程
  11. hdwiki的php架构,hdwiki框架结构简要说明
  12. Java:Java实现简单闹钟设计
  13. Docker---(7)Docker安装启动RabbitMQ
  14. 腾讯副总裁邱岳鹏:云的发展要迈过三道关
  15. FFmpeg动效实践与探索(文字方框的同步展开及收缩)
  16. FPGA 学习笔记:Vivado 2020.2 MicroBlaze MIG 测试 DDR3 篇尾
  17. java--阿拉伯数字转中文数字
  18. jQuery显示隐藏
  19. “10•24”专供:Spark全套知识体系,免费领!
  20. 模态对话框和非模态对话框和dlg.DoModal();

热门文章

  1. During sturtup program exited with code 0xc0000139的解决办法!
  2. TensorFlow北大公开课学习笔记-4.1损失函数
  3. Spring cloud实现FeignClient指定Zone调用
  4. NDK Resolution Outcome: Project settings: Gradle model version=XXX, NDK version is UNKNOWN
  5. 语句的认识,选择语句和循环语句(2022.11.13)
  6. Serverless Computing Fass $ openwhisk快速部署、应用、实例
  7. 使用pycharm去掉表格中的重复数据
  8. 华为发布:30岁以下员工仅占28% 你信吗?
  9. 亚马逊测评:最前沿养号系统,如何降低成本提高效率搭建稳定的ip环境
  10. 开发一个Canvas小游戏 实现一个游戏“引擎”