iText7根据html表格(table)代码生成表格、解决跨行跨列问题
2017-06-18 16:37
3515 查看
由于要解析html代码,所以我还用了一个第三方的插件jsoup,可以自己百度一下,或者点击这里下载API,免费的。。
html表格的代码是没有格式的,我就不贴了,下面直接给代码
1.效果图
![](https://oscdn.geek-share.com/Uploads/Images/Content/202004/26/e1cf96da0553d73983e39afd4520beaf)
2.源码
1.TestTable .java (执行方法)
PDFUtil.java (iText我自己写的工具类)
html表格的代码是没有格式的,我就不贴了,下面直接给代码
1.效果图
2.源码
1.TestTable .java (执行方法)
package test; import org.jsoup.Jsoup; import org.jsoup.nodes.Element; import org.jsoup.select.Elements; import com.gsafety.plan.module.util.PDFUtil; import com.itextpdf.kernel.pdf.PdfDocument; import com.itextpdf.layout.Document; public class TestTable { public static String url="G:\\test4.pdf"; public static void main(String[] args) throws Exception { long old = System.currentTimeMillis(); PDFUtil pdfUtil=new PDFUtil(url);//传入url创建pdf Document doc=pdfUtil.createPdfDoc(); PdfDocument pdfDoc=doc.getPdfDocument(); pdfUtil.addTitle(doc,"表格"); //html代码 String pg="<table><thead><tr><td style='width:78.2000pt;'><p style='text-align:center;'><st 4000 rong><span style='font-family:'Times New Roman';font-size:10.5pt;'>预警分级</span></strong></p></td><td colspan='4' style='width:336.8500pt;'><p style='text-align:center;'><strong><span style='font-family:'Times New Roman';font-size:10.5pt;'>4<span style='font-family:宋体;'>个等级标准划分</span></span></strong></p></td></tr></thead><tbody><tr><td style='width:78.2000pt;'><p style='text-align:center;'><span style='font-family:'Times New Roman';font-size:10.5000pt;'>预警级别</span></p></td><td style='width:81.1500pt;'><p style='text-align:center;'><span style='font-family:'Times New Roman';font-size:10.5000pt;'>一级</span></p></td><td style='width:78.1500pt;'><p style='text-align:center;'><span style='font-family:'Times New Roman';font-size:10.5000pt;'>二级</span></p></td><td style='width:88.7500pt;'><p style='text-align:center;'><span style='font-family:'Times New Roman';font-size:10.5000pt;'>三级</span></p></td><td style='width:88.8000pt;'><p style='text-align:center;'><span style='font-family:'Times New Roman';font-size:10.5000pt;'>四级</span></p></td></tr><tr><td style='width:78.2000pt;'><p style='text-align:center;'><span style='font-family:'Times New Roman';font-size:10.5000pt;'>级别描述</span></p></td><td style='width:81.1500pt;'><p style='text-align:center;'><span style='font-family:'Times New Roman';font-size:10.5000pt;'>特别严重</span></p></td><td style='width:78.1500pt;'><p style='text-align:center;'><span style='font-family:'Times New Roman';font-size:10.5000pt;'>严重</span></p></td><td style='width:88.7500pt;'><p style='text-align:center;'><span style='font-family:'Times New Roman';font-size:10.5000pt;'>较重</span></p></td><td style='width:88.8000pt;'><p style='text-align:center;'><span style='font-family:'Times New Roman';font-size:10.5000pt;'>一般</span></p></td></tr><tr><td style='width:78.2000pt;'><p style='text-align:center;'><span style='font-family:'Times New Roman';font-size:10.5000pt;'>颜色标示</span></p></td><td style='width:81.1500pt;'><p style='text-align:center;'><span style='font-family:'Times New Roman';font-size:10.5000pt;'>红</span></p></td><td style='width:78.1500pt;'><p style='text-align:center;'><span style='font-family:'Times New Roman';font-size:10.5000pt;'>橙</span></p></td><td style='width:88.7500pt;'><p style='text-align:center;'><span style='font-family:'Times New Roman';font-size:10.5000pt;'>黄</span></p></td><td style='width:88.8000pt;'><p style='text-align:center;'><span style='font-family:'Times New Roman';font-size:10.5000pt;'>蓝</span></p></td></tr></tbody></table>"; //----------这段 ebfd 是使用jsoup-----begin------ org.jsoup.nodes.Document docParse= Jsoup.parseBodyFragment(pg);//格式化html Element body = docParse.body();//放入body片段 //System.out.println(body.ownText()); Elements allTag=body.children();//获得儿子标签列表 for(Element e: allTag){ if("table".equals(e.nodeName())){ System.out.println("找到table了"); pdfUtil.addTable(doc, e);//使用工具类的方法 } } //----------这段是使用jsoup-----end------ pdfDoc.close(); doc.close(); long now = System.currentTimeMillis(); System.out.println("共耗时:" + ((now - old) / 1000.0) + "秒\n\n" + "文件保存在:"+url); } }
PDFUtil.java (iText我自己写的工具类)
package com.gsafety.plan.module.util; import java.io.IOException; import java.util.HashMap; import java.util.LinkedHashMap; import java.util.Map; import org.apache.struts2.ServletActionContext; import org.jsoup.nodes.Element; import org.jsoup.select.Elements; import com.itextpdf.io.font.PdfEncodings; import com.itextpdf.io.image.ImageData; import com.itextpdf.io.image.ImageDataFactory; import com.itextpdf.kernel.events.IEventHandler; import com.itextpdf.kernel.events.PdfDocumentEvent; import com.itextpdf.kernel.font.PdfFont; import com.itextpdf.kernel.font.PdfFontFactory; import com.itextpdf.kernel.pdf.PdfDocument; import com.itextpdf.kernel.pdf.PdfWriter; import com.itextpdf.kernel.pdf.xobject.PdfImageXObject; import com.itextpdf.layout.Document; import com.itextpdf.layout.element.AreaBreak; import com.itextpdf.layout.element.Cell; import com.itextpdf.layout.element.Image; import com.itextpdf.layout.element.Paragraph; import com.itextpdf.layout.element.Table; import com.itextpdf.layout.property.TextAlignment; /** * * * * * @author Hui * */ public class PDFUtil { public static String DEST2 = "";//文件路径 public static PdfFont sysFont =null; private Map<String, Integer> catalogMap = new LinkedHashMap<String, Integer>();//<标题,页数> public PDFUtil(String url){ try { //sysFont = PdfFontFactory.createFont("STSongStd-Light", "UniGB-UCS2-H", false);//中文设置 sysFont = PdfFontFactory.createFont("c://windows//fonts//simsun.ttc,1",PdfEncodings.IDENTITY_H, false);//中文设置,解决特殊字符错误 DEST2=url; } catch (IOException e) { e.printStackTrace(); } } /** * 创建pdf doc * @return doc * */ public Document createPdfDoc() throws Exception{ PdfDocument pdfDoc = new PdfDocument(new PdfWriter(DEST2)); Document doc = new Document(pdfDoc);//构建文档对象 //设置页码 //TextFooterEventHandler eh= new TextFooterEventHandler(doc); //pdfDoc.addEventHandler(PdfDocumentEvent.END_PAGE,eh); return doc; } /** * 添加大标题 * @param * * */ public void addTitle(Document doc,String title) throws Exception{ Paragraph paragraph = new Paragraph(); paragraph.add(title).setFont(sysFont).setBold().setFontSize(20).setTextAlignment(TextAlignment.CENTER); doc.add(paragraph); } /** * 添加一级标题 * @param * * */ public void addHeading1(Document doc,String pg) throws Exception{ Paragraph paragraph = new Paragraph(); paragraph.add(pg).setFont(sysFont).setBold().setFontSize(16); doc.add(paragraph); catalogMap.put(pg, doc.getPdfDocument().getNumberOfPages()); } /** * 添加二级标题 * @param * * */ public void addHeading2(Document doc,String pg) throws Exception{ Paragraph paragraph = new Paragraph(); paragraph.add(pg).setFont(sysFont).setBold().setFontSize(14).setFirstLineIndent(14); doc.add(paragraph); catalogMap.put(pg, doc.getPdfDocument().getNumberOfPages()); } /** * 添加三级标题 * @param * * */ public void addHeading3(Document doc,String pg) throws Exception{ Paragraph paragraph = new Paragraph(); paragraph.add(pg).setFont(sysFont).setBold().setFontSize(12); doc.add(paragraph); catalogMap.put(pg, doc.getPdfDocument().getNumberOfPages()); } /** * 添加段落 * @param * */ public void addParagraph(Document doc,String pg) throws Exception{ Paragraph paragraph = new Paragraph(); paragraph.add(pg).setFont(sysFont).setFirstLineIndent(20);//中文字体,首行缩进 doc.add(paragraph); } /** * 添加图片 * @param * */ public void addImg(Document doc,String url) throws Exception{ String realUrl=ServletActionContext.getServletContext().getRealPath("/img")+"/"+url; ImageData imgData=ImageDataFactory.create(realUrl); Image pic=new Image(imgData); doc.add(pic); } /** * 添加表格 * @param * @param Element e * */ public void addTable(Document doc,Element e) throws Exception{ Elements eTag=e.children();//获得thead和tobody Table table=new Table(e.children().last().children().last().childNodeSize());//tobody最后一列的tr获得行数,这里可能会有些出入 for(Element tBady: eTag){ Elements tCellList=tBady.children();//获得tr行 for(Element tCell: tCellList){ Elements tDList=tCell.children();//获得td格子 for(Element td:tDList){ String oldRowspan=td.attr("rowspan");//获得跨行 String oldColspan=td.attr("colspan");//获得跨列 int rowspan=0; int colspan=0; if(oldRowspan!="" && oldRowspan.length()>0){ rowspan=Integer.valueOf(td.attr("rowspan")); } if(oldColspan!="" && oldColspan.length()>0){ colspan=Integer.valueOf(td.attr("colspan")); } Cell cell=new Cell(rowspan,colspan).add(td.text()); table.addCell(cell); } } } doc.add(table.setFont(sysFont).setAutoLayout()); } public Map<String, Integer> getCatalogMap() { return catalogMap; } public void setCatalogMap(Map<String, Integer> catalogMap) { this.catalogMap = catalogMap; } }
相关文章推荐
- 使用itext根据freemarks模版生成pdf,表格产生跨页问题解决方法
- 解决itext-rtf.jar 对html转换后生成rtf文档 其中表格行列合并的问题
- 通过swagger2markup+asciidoctorj生成html和pdf文档并解决asciidoctorj生成的pdf文件中文显示不全问题(maven方式及java代码方式)
- 解决 HTML 转到 XHTML 中,表格(Table)不能居中的问题。align="center" 过时问题
- 网页表格表头固定并可以自由拉伸列头的问题解决 (完美方案_html_table_seo)
- Proc_BuildTableHtml(根据SQL生成表格形式的html)
- html中表格table的行列合并问题解决
- 使用itext将html生成pdf中文换行问题解决方案2
- 意外解决js动态生成的html代码中一些事件失效问题
- Html 中表格导出生成excel文件,解决中文导出失败问题。
- 使用itext将html生成pdf中文换行问题解决方案
- 意外解决js动态生成的html代码中一些事件失效问题
- struts2中,解决property标签原样输出HTML代码的问题
- Asp.Net Table控件动态生成表格操作实例(代码调试通过)
- 谈谈.NET中如何根据代码自动生成代码对象模型的解决思路
- cppwebbrower中获取html中table表格的代码
- 一句代码解决 tr td table 重边的问题
- 生成唯一32位ID编码代码,以满足对ID编号的唯一性加资源性解决问题
- 解决MOSS、SharePoint 根据.stp模版生成站点的问题
- HTML里隐藏表格TABLE或者DIV内容的样式代码