准备工作

引用pom

<!--生成pdf-->
<dependency>  <groupId>com.itextpdf</groupId>  <artifactId>itextpdf</artifactId>  <version>5.5.11</version>
</dependency>
<!--中文字体-->
<dependency>  <groupId>com.itextpdf</groupId>  <artifactId>itext-asian</artifactId>  <version>5.2.0</version>
</dependency>
<!--html xml 转为pdf-->
<dependency>  <groupId>com.itextpdf.tool</groupId>  <artifactId>xmlworker</artifactId>  <version>5.5.11</version>
</dependency>  

1. 添加表格

创建两列的表格PdfPTable table = new PdfPTable(2);

如果要划定两列的比例,在后面添加一行

table.setWidths(new float[]{1, 3});

程序会自动添加格子,由于定义了每行两列,则两组为一行

PdfPCell 为每个格子,可以定义格子的样式,前后间距,边框样式等

一定要在cell的维度设置格式,table维度是不起效果的

如果只要最外面的边框,则需要多定义一个外圈的table, 原来的table作为外圈的cell填充进去

    private void createTable(Document document, Font fontBig, Font fontNormal, Font fontYellow) {try {PdfPTable tableFather = new PdfPTable(1);//为了做外圈的边框tableFather.setWidthPercentage(100);PdfPTable table = new PdfPTable(2);table.addCell(getCell("日期", 1, 1, fontYellow));table.addCell(getCell("天气", 1, 1, fontYellow));table.addCell(getCell("07.12", 1, 1, fontNormal));table.addCell(getCell("下雨", 1, 1, fontNormal));table.addCell(getCell("07.13", 1, 1, fontNormal));table.addCell(getCell("多云", 1, 1, fontNormal));Paragraph weatherParagraph = new Paragraph("天气信息", fontBig);weatherParagraph.setSpacingAfter(10);document.add(weatherParagraph);PdfPCell tableItem = new PdfPCell(table);tableItem.setBorderWidth(2f);tableItem.setBorderColor(new BaseColor(227, 230, 232));tableItem.setPadding(8f);tableFather.addCell(tableItem);document.add(tableFather);} catch (Exception ex) {}}
    private PdfPCell getCell(String cellValue, int colspan, int rowSpan, Font font) {PdfPCell cell = new PdfPCell();try {cell = new PdfPCell(new Phrase(cellValue, font));cell.setBorder(Rectangle.NO_BORDER);cell.setPaddingTop(2f);cell.setRowspan(rowSpan);cell.setColspan(colspan);cell.setHorizontalAlignment(Element.ALIGN_LEFT);} catch (Exception ex) {logger.warn("Pdf getCell Exception", 0, ex);}return cell;}

类似效果图

itext生成的pdf会默认表格都在一行展示,如果展示不下,则在下一页分页展示,所以第一页展示不下会导致第一页末尾留下大段空白,很不美观。

尤其是在表格嵌套表格的情况下,之所以嵌套表格,是因为要保留最外侧的边框,去除内部的边框。

如何控制分页展示table,显得紧凑些?在add到document之前添加跨页设置

tableFather.setSplitLate(false);//跨页处理
            tableFather.setSplitRows(true);
            document.add(tableFather);

2. html添加

    private void createHtml(Document document){try {String pocketDescription = "<html><body><p class=\"\" style=\"\">如果说荷兰是橙色的,那阿姆斯特丹就是缤纷的彩色。</p>  <p class=\"\" style=\"\"><strong>游玩建议</strong><br>游玩整个阿姆斯特丹大约需2-3天</p></body></html>";Paragraph context = new Paragraph();ElementList elementList = MyXMLWorkerHelper.parseToElementList(pocketDescription, null);for (Element element : elementList) {context.add(element);}context.setSpacingBefore(10f);document.add(context);}catch (Exception ex){}}

这里由于中文的关系,需用重载parseToElementList函数

public class MyXMLWorkerHelper {public static class MyFontsProvider extends XMLWorkerFontProvider {public MyFontsProvider() {super(null, null);}@Overridepublic Font getFont(final String fontname, String encoding, float size, final int style) {try {BaseFont bfChinese = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);//中文字体return new Font(bfChinese, size, style);} catch (Exception ex) {return new Font(Font.FontFamily.UNDEFINED, size, style);}}}public static ElementList parseToElementList(String html, String css) throws IOException {// CSSCSSResolver cssResolver = new StyleAttrCSSResolver();if (css != null) {CssFile cssFile = XMLWorkerHelper.getCSS(new ByteArrayInputStream(css.getBytes()));cssResolver.addCss(cssFile);}// HTMLMyFontsProvider fontProvider = new MyFontsProvider();CssAppliers cssAppliers = new CssAppliersImpl(fontProvider);HtmlPipelineContext htmlContext = new HtmlPipelineContext(cssAppliers);htmlContext.setTagFactory(Tags.getHtmlTagProcessorFactory());htmlContext.autoBookmark(false);// PipelinesElementList elements = new ElementList();ElementHandlerPipeline end = new ElementHandlerPipeline(elements, null);HtmlPipeline htmlPipeline = new HtmlPipeline(htmlContext, end);CssResolverPipeline cssPipeline = new CssResolverPipeline(cssResolver, htmlPipeline);// XML WorkerXMLWorker worker = new XMLWorker(cssPipeline, true);XMLParser p = new XMLParser(worker);html = html.replace("<br>", "<br/>").replace("<hr>", "<hr/>").replace("<img>", "").replace("<param>", "").replace("<link>", "");//不支持单独标签p.parse(new ByteArrayInputStream(html.getBytes()));return elements;}
}

类似效果

java 通过itext 创建pdf 添加,插入 表格,html格式相关推荐

  1. java 通过 itext生成pdf添加,插入文字,图片

    准备工作 引用pom <!--生成pdf--><dependency><groupId>com.itextpdf</groupId><artifa ...

  2. java使用iText导出pdf添加页眉,并设置图片

    PdfWriter pdfWriter;Document document; public ExportPDF(File file) {document = new Document();// 建立一 ...

  3. java使用itext填充pdf模板,超简单教学,有手就行

    java使用itext填充pdf模板 1.先去建一个Word文件,设置好想要填充的地方,留好位置,设置好下划线 2.将Word另存为pdf 3.打开电脑中的Adobe Acrobat pro DC(这 ...

  4. java 使用itext 导出pdf 控制图片的大小

    在使用itext 导出pdf 的过程中,可能会遇到这样的需求,就是导出文字加图片.使用我们前面写的程序,确实是可以导出图片,如果针对于类似简历的需求,图片填充单元格,会满足效果,如下图所示: 但在实际 ...

  5. 使用itext创建PDF模板

    1.在pom.xml文件中添加itextpdf依赖 <dependency> <groupId>com.itextpdf</groupId> <artifac ...

  6. java 使用itext导出PDF文件,中文不显示问题解决

    之前写的java 使用itext 导出pdf 发现有个问题,在今天使用的时候,发现一个问题,就是当单元格中写中文的时候,导出来的pdf中文不显示. java 使用itext导出PDF文件,图片文字左右 ...

  7. 通过Java组件iText生成PDF报表或合同,完成pdf上传,预览,存入数据库

    因业务需要,做了一个通过Java组件iText生成PDF合同,运行成功了,做个记录,也分享给大家. 首先,我们需要准备好一个有文本域的pdf文件. 1.先用word做出你需要的模板,并保存. 2.通过 ...

  8. Java使用itext生成Pdf

    Java使用itext生成Pdf 背景 所需依赖 解决jpedal-lgpl jar包问题 示例代码 生成带图片的PDF(使用本地文件系统图片) 生成带图片的PDF(使用网络图片) 背景 在某些业务场 ...

  9. java 生成字体文件,java使用itext生成pdf文件-设置字体,itextpdf,import com.l

    java使用itext生成pdf文件-设置字体,itextpdf,import com.limport com.lowagie.text.Document;import com.lowagie.tex ...

最新文章

  1. 探讨ASP.NET AJAX客户端开发技术
  2. R语言ggplot2可视化:箱图(box plot)可视化并且在为箱图的异常值(outlier)添加数据标签
  3. 聊一聊Web端的即时通讯
  4. python散点图拟合曲线-python曲线拟合
  5. java double储存原理_Java内存分配原理
  6. 程序员面试题精选100题(30)-赋值运算符重载函数[C/C++/C#]
  7. 大头贴计算机教程,推荐!自家电脑也能拍大头贴的秘密
  8. keep怎么生成运动轨迹_【念叨叨】keep手环拔草记
  9. LoadRunner 12 发布,主推云
  10. java pos58打印_POS58票据热敏打印机,怎么用ESC/POS命令控制打印
  11. wget无法批量下载气象数据的解决方案(Python、迅雷批量下载气象数据方法)
  12. 索尼笔记本笔记本计算机在哪里设置,索尼vaio笔记本怎么进bios设置|索尼笔记本进bios按什么键...
  13. Python爬虫51job职位
  14. 微信小程序学习笔记(4)
  15. 2022.11.5 英语背诵
  16. 关于TQ2440通过Jlink下载Uboot到开发板的方法(不能识别自己板子的norflash型号,且不能安装USB)
  17. 静态网页制作教程 (转载)
  18. SCOI2019酱油记
  19. Linux嵌入式驱动开发07——GPIO驱动过程记录(飞凌开发板)
  20. [附源码]Java计算机毕业设计SSM坝上长尾鸡养殖管理系统

热门文章

  1. eBay新手该如何选品?eBay防关联同样很重要
  2. 仿360小说网站的源码设计实现
  3. html5雪花飘落,使用js实现雪花飘落效果
  4. 如何和用PS做消失点
  5. 高德拉特三问:改变什么、改变成什么、怎样改变?
  6. 基于HAL库的rs232modbus主机
  7. 2022年最新IP归属地运营商地区经纬度查询API接口分享
  8. 阿里巴巴前端工程师一面二面三面终面面经总结
  9. jquery jsonp_结合JSONP和jQuery快速构建功能强大的混搭
  10. Android Logd框架梳理