itext7 生成pdf操作过于复杂,特别是封面、目录页码以及页眉页脚的处理需要基于事件处理,因此写了个简单的类库用于简化操作,只用关注文档内容的构建而无需关注其他;

代码地址: https://gitee.com/zherc/itext7-simple

maven依赖

<dependency><groupId>io.gitee.zherc</groupId><artifactId>itext7-simple</artifactId><version>0.0.1</version>
</dependency>

实现PDF渲染器

渲染顺序为 内容>目录>封面

public class TestPdfRender implements PdfRender {/*** 渲染封面* @param document 文档对象*/@Overridepublic void cover(ItextDocument document) {try {Div div = new Div();div.setDestination("cover");div.add(new Paragraph("封面").setFontColor(Color.parse("#FFFFFF")));div.setWidth(document.getPageWidth());div.setHeight(document.getPageHeight());PdfImageXObject imageXObject = new PdfImageXObject(ImageDataFactory.create(new URL("https://zhiper-cdn.oss-cn-shanghai.aliyuncs.com/2051961.jpg")));BackgroundImage image = new BackgroundImage(imageXObject);div.setProperty(Property.BACKGROUND_IMAGE, image);Table table = new Table(4);table.setBorder(Border.NO_BORDER);table.addHeaderCell("标题一");table.addHeaderCell("标题二");table.addHeaderCell("标题三");table.addHeaderCell("标题四");div.add(table);document.add(div);} catch (Exception e) {}PdfOutline outlines = document.getPdfDocument().getOutlines(true);outlines.addOutline("封面", 0).addDestination(PdfDestination.makeDestination(new PdfString("cover")));}/*** 渲染目录* @param document 文档对象*/@Overridepublic void directory(ItextDocument document) {Div div = new Div();div.add(new Paragraph("目录").setDestination("directory").setHorizontalAlignment(HorizontalAlignment.CENTER));ItextPdfDocument itextPdfDocument = document.getItextPdfDocument();itextPdfDocument.eachCatalog(catalog -> {Link link = new Link(catalog.getTitle(), PdfAction.createGoTo(catalog.getCode()));Paragraph paragraph = new Paragraph(link);paragraph.add("......................").add(catalog.getPageNumber() + "").setFirstLineIndent(10 * (1 - catalog.getLevel()));div.add(paragraph);});PdfOutline outlines = document.getPdfDocument().getOutlines(true);outlines.addOutline("目录", 0).addDestination(PdfDestination.makeDestination(new PdfString("directory")));document.add(div);}/*** 渲染页眉* @param header 页眉对象*/@Overridepublic void header(Header header) {try {Table table = new Table(1);table.setBorder(Border.NO_BORDER);Cell cell = new Cell();cell.setTextAlignment(TextAlignment.CENTER);Paragraph paragraph = new Paragraph("页眉" + header.getPageNumber());cell.setVerticalAlignment(VerticalAlignment.MIDDLE);paragraph.setBackgroundColor(Color.parse("#d0d0d0"));cell.add(paragraph);table.addCell(cell);header.layout(table);} catch (Exception e) {e.printStackTrace();}
//      header.addText(new Text(Point.build(0, 0), "页眉" + header.getPageNumber()).centered());}/*** 渲染页脚* @param footer 页脚对象*/@Overridepublic void footer(Footer footer) {//        footer.addText(new Text(Point.build(0, 0), "第" + footer.getPageNumber() + "页")
//                .style(new FontStyle(10)).align(HorizontalAlign.CENTER, VerticalAlign.MIDDLE));Table table = new Table(3);table.setBorderTop(new SolidBorder(Color.parse("#EEEEEE"), 2f));table.addCell(new Cell().setBorder(Border.NO_BORDER).add(new Paragraph("左边")).setTextAlignment(TextAlignment.LEFT));table.addCell(new Cell().setBorder(Border.NO_BORDER).add(new Paragraph("第" + footer.getPageNumber() + "页")).setTextAlignment(TextAlignment.CENTER));table.addCell(new Cell().setBorder(Border.NO_BORDER).add(new Paragraph("右边")).setTextAlignment(TextAlignment.RIGHT));footer.layout(table);}/*** 渲染文档内容* @param document 文档对象*/@SneakyThrows@Overridepublic void body(ItextDocument document) {ItextPdfDocument pdfDocument = document.getItextPdfDocument();for (int i = 0; i < 10; i++) {String title = "第" + i + "部分内容";// 添加目录H1 h1 = new H1(title);Catalog catalog = pdfDocument.addCatalog(h1, title);// 添加书签pdfDocument.addBookmark(h1, catalog.getCode());document.add(new Div().add(h1));Div div = new Div();Table table = new Table(6);table.setBorder(Border.NO_BORDER);table.addHeaderCell("标题一");table.addHeaderCell("标题二");table.addHeaderCell("标题三");table.addHeaderCell("标题四");table.addHeaderCell("标题五");table.addHeaderCell("标题六");for (int j = 0; j < 360; j++) {Cell cell = new Cell();cell.setBorder(Border.NO_BORDER);cell.add(new Paragraph("表格"));table.addCell(cell);}table.setWidth(document.getWidth());table.setHorizontalAlignment(HorizontalAlignment.CENTER);div.add(table);String secondTitle = title + "二级书签";H2 h2 = new H2(secondTitle);Catalog secCatalog = pdfDocument.addCatalog(h2);div.add(h2);pdfDocument.addBookmark(h2, secCatalog.getCode());Rect bodyRect = document.getBodyRect();// canvas绘图Rectangle boundingBox = new Rectangle(0,0, bodyRect.getWidth(),200);PdfFormXObject xObject = new PdfFormXObject(boundingBox);xObject.makeIndirect(pdfDocument);//Make sure the XObject gets added to the documentPDFCanvas pCanvas = new PDFCanvas(xObject, pdfDocument);//Create a canvas from the XObjectpCanvas.text(Point.build(60, 60), "吃个桃桃", "#d3d3d3", 12);pCanvas.rectangle(Point.build(20, 20), 30, 30).setFillColor(Color.BLUE).fill();//            Canvas canvas = new Canvas(xObject, pdfDocument);//Create a canvas from the XObject
//            canvas.setRenderer(new CanvasRenderer(canvas){//                @Override
//                public void addChild(IRenderer renderer) {//                    super.addChild(renderer);
//                }
//            });pCanvas.draw(canvas -> {canvas.setFontColor(Color.RED);canvas.showTextAligned("吃个桃桃好凉凉", 200, 100, TextAlignment.LEFT, 90);});pCanvas.text(Point.build(60, 80), "一个小桃子", "#d3d3d3", 12);Image rect = new Image(xObject);
//            rect.setAutoScale(true);
//            rect.setBackgroundColor(Color.parse("#000000"));div.add(rect);//            div.add(rect);document.add(div);/*** 将文本放置在指定位置并旋转角度*/document.showTextAligned("吃个桃桃好凉凉0", 90, 90, TextAlignment.LEFT);document.showTextAligned("吃个桃桃好凉凉30", 90, 90, TextAlignment.LEFT, 30);document.showTextAligned("吃个桃桃好凉凉60", 90, 90, TextAlignment.LEFT, 60);document.showTextAligned("吃个桃桃好凉凉90", 90, 90, TextAlignment.LEFT, 90);document.showTextAlignedKerned("吃个桃桃好凉凉120", 90, 90, TextAlignment.LEFT, VerticalAlignment.MIDDLE, 120);
//            document.add(SvgUtil.convert(svg, pdfDocument).setHorizontalAlignment(HorizontalAlignment.CENTER));//            PdfPage page = pdfDocument.getPage(pdfDocument.getNumberOfPages());
//            Canvas canvas = new Canvas(page);
//            canvas.circle(Point.build(200, 400), 100).setFillColor(Color.parse("#EEEEEE")).fill();
//            canvas.beginText().setFontAndSize(pdfDocument.getDefaultFont(), 12).setTextRise(120).showText("中文").endText();if (i < 9) document.nextPage();}}
}

配置PDF结构 调用渲染器生成PDF

class Generate{public static final String output = System.getProperty("user.dir") + "\\test.pdf";public static final String font = System.getProperty("user.dir") + "\\msyh.ttf";public void setup(){// 设置输出文件以及字体PdfSetup setup = new PdfSetup(output, font);// 是否需要目录setup.setDirectory(true);// 是否需要封面setup.setCover(true);// 是否需要页脚setup.setFooter(true);// 是否需要页眉setup.setHeader(true);// 根据渲染器以及PDF设置生成PDFItext7Pdf.getPdf(new TestPdfRender(), setup).write();}
}

使用IText7 生成PDF文档相关推荐

  1. 手把手教你使用 Java 在线生成 pdf 文档

    一.介绍 在实际的业务开发的时候,研发人员往往会碰到很多这样的一些场景,需要提供相关的电子凭证信息给用户,例如网银/支付宝/微信购物支付的电子发票.订单的库存打印单.各种电子签署合同等等,以方便用户查 ...

  2. Java生成PDF文档 iText使用PDF模板一

    最近在弄这个java生成pdf,哎,在网上查找了各种各样的学习资料,弄了几天,今天终于把这个效果简单的弄出来,所以,也把这个,我所走过的坑,作一个记录,提供接下来需要学习的人. 参考文献文档:http ...

  3. .net中使用iText7合并pdf文档

    iText7 是 iText 强大的 PDF 工具包的最新版本,用于 PDF 生成.PDF 编程.处理和操作,以下是在.net中使用iText7实现pdf文档合并的简单过程: 添加NuGet包引用:添 ...

  4. PHP生成PDF文档的FPDF类

    以前在PHP4的早期版本中用PDFlib生成PDF文档比较容易,现在升级到PHP5了,发现更麻烦了,装的PHP 5.2.4默认没有PHPlib,从php.net上找了一个,装上竟一直报错,开始以为是版 ...

  5. java pdf 中文_java-pdf-itext 生成pdf 文档(支持中文字体)

    java-pdf-itext 生成pdf 文档(支持中文字体) itext 版本:2.1.7 package com.demo.preview; import java.io.ByteArrayOut ...

  6. qt 利用 HTML 生成PDF文档,不能显示jpg图片

    利用 QPrinter 和html 生成 pdf文档 其中用html语句有显示图片的语句 但只能显示png格式的图片,不能显示jpg格式图片. 经过排查:语法,文件路径等都正确,最终在stack ov ...

  7. 【报表技术】IReport图形化报表开发工具生成PDF文档

    [报表技术]IReport图形化报表开发工具生成PDF文档 新建一个文件. 由于IReport的默认设置是不支持中文的,IReport没有内置中文的包. 了解报表模板结构. ①title:报表标题. ...

  8. app canvas渲染后图片黑色_H5 基于 canvas 实现电子签名并生成PDF文档

    (给前端大全加星标,提升前端技能) 转自:coyota666 https://juejin.cn/post/6901273585428463624 前言 电子签名通俗来说就是通过技术手段实现在电子文档 ...

  9. php源生生成pdf_TCPDF - 可生成PDF文档和条形码PHP库

    TCPDF 用于生成PDF文档的开源PHP类 主要特点 基本功能不需要外部库: 所有标准页面格式,自定义页面格式,自定义边距和度量单位: UTF-8 Unicode和从右至左的语言: TrueType ...

最新文章

  1. R语言使用ggplot2包geom_jitter()函数绘制分组(strip plot,一维散点图)带状图(添加均值、标准偏差)实战
  2. java监听所有端口_(变强、变秃)Java从零开始之zookeeper安装
  3. 剖析ifstream打开含中文路径名文件失败的原因(转)
  4. nginx 支持h265 的 rtmp和hls,http-flv
  5. html, xhtml和xml
  6. linux gcc常用编译选项总结
  7. ecshop api.php,ecshop2.72 api.php 文件鸡肋注入
  8. sql 从ip列表中查询ip段_IP地址段查询深度优化案例
  9. 汽车配件+供应链一体化:降低库存成本,提高运营效率
  10. 在Web中使用jsmpeg.js低时延播放RTSP视频流(海康、大华)方案 - vue-jsmpeg-player
  11. 同比增长率,环比增长速度、环比发展速度
  12. 如何打开caj文件,以及caj文件如何转换为PDF格式
  13. 怎样保护计算机桌面不被更改,电脑保护屏幕怎么设置
  14. 四毛子算法与+-1RMQ
  15. ModSecurity规则
  16. 知识管理系统,帮你挖掘出企业90%的隐性知识
  17. 调度站入口有n节软席和硬席车厢,将所有软席调到硬席之前
  18. Excel表格文本/数字/科学计数法的格式转换问题
  19. 小程序服务器如何防攻击,中小网站防止DDOS攻击的方法
  20. 放弃数学专业跳槽高薪行业,如今他却后悔了

热门文章

  1. Pandas-DataFrame使用
  2. SLE46C-40.K44P-M12单光速安全传感器
  3. vue2实现可拖拽甘特图(结合element-ui的gantt图)
  4. 使用Junit测试 RESTful
  5. r与python语法_Python和R:我推荐Python的几大理由
  6. android手机浏览器测评,QQ浏览器和800浏览器哪个好?安卓手机浏览器对比评测
  7. Nginx根据域名分发不同端口
  8. 非遗“洋蛇灯”国家级传承人身患尿毒症 期待年轻人加入
  9. 十大管理之项目人力资源管理知识点
  10. 学习笔记——day47(jsp)