使用 itextpdf html 转pdf
- 添加依赖
<dependency> <groupId>com.itextpdf</groupId> <artifactId>itextpdf</artifactId> <version>5.5.11</version> </dependency> <dependency> <groupId>com.itextpdf.tool</groupId> <artifactId>xmlworker</artifactId> <version>5.5.11</version> </dependency> <dependency> <groupId>com.itextpdf</groupId> <artifactId>itext-asian</artifactId> <version>5.2.0</version> </dependency>
2.主要类
import com.itextpdf.text.Document; import com.itextpdf.text.PageSize; import com.itextpdf.text.pdf.PdfWriter; import com.itextpdf.tool.xml.XMLWorkerHelper; import java.io.ByteArrayInputStream; import java.io.FileOutputStream; import java.io.InputStream; import java.nio.charset.Charset; public class XmlWorkerHelperUtil{ public static void htmlToPDF(String htmlString,String pdfPath) { try { Document document = new Document(PageSize.A4); PdfWriter pdfWriter = PdfWriter.getInstance(document,new FileOutputStream(pdfPath)); document.open(); document.addAuthor("作者"); document.addCreator("创建者"); document.addSubject("主题"); document.addCreationDate(); document.addTitle("标题"); XMLWorkerHelper worker = XMLWorkerHelper.getInstance(); InputStream inputStream=null; worker.parseXHtml(pdfWriter, document, new ByteArrayInputStream(htmlString.getBytes("UTF-8")),inputStream,Charset.forName("UTF-8"),new AsianFontProvider()); document.close(); } catch (Exception e) { e.printStackTrace(); } } public static void main(String[] args) { String html="<html>\n" + "\t<head>\n" + "\t\t<meta charset=\"utf-8\" />\n" + "\t\t<title></title>\n" + "\t</head>\n" + "\t<body>\n" + "\t\t<div>\n" + "\t\t\t<div>\n" + "\t\t\t\t<h4>基本信息:</h4>\n" + "\t\t\t\t<ul>\n" + "\t\t\t\t<li>采购方式:公开询价</li>\n" + "\t\t\t\t<li>报价方式:整单报价</li>\n" + "\t\t\t\t<li>报价截止时间:2019-08-2611:05</li>\n" + "\t\t\t\t<li>交货时间:2019-08-30</li>\n" + "\t\t\t\t<li>采购单号:GJ201908011157</li>\n" + "\t\t\t\t<li>备注:含门撑及木质包装。</li>\n" + "\t\t\t\t</ul>\n" + "\t\t\t</div>\n" + "\t\t\t<div>\n" + "\t\t\t\t<h4>>>采购物资:</h4>\n" + "<table border=\"1px\" cellspacing=\"0\" cellpadding=\"2px\">" + "\t\t\t\t\t<tr>\n" + "\t\t\t\t\t\t<td>序号</td>\n" + "\t\t\t\t\t\t<td>需求单位</td>\n" + "\t\t\t\t\t\t<td>计划名称</td>\n" + "\t\t\t\t\t\t<td>规格型号</td>\n" + "\t\t\t\t\t\t<td>单位</td>\n" + "\t\t\t\t\t\t<td>采购数量</td>\n" + "\t\t\t\t\t\t<td>用途</td>\n" + "\t\t\t\t\t</tr>\n" + "\t\t\t\t\t<tr>\n" + "\t\t\t\t\t\t<td>001</td>\n" + "\t\t\t\t\t\t<td>江苏国电南自海...</td>\n" + "\t\t\t\t\t\t<td>海吉电气柜</td>\n" + "\t\t\t\t\t\t<td>海吉电气柜/TGHB前门后...</td>\n" + "\t\t\t\t\t\t<td>EA</td>\n" + "\t\t\t\t\t\t<td>1.0</td>\n" + "\t\t\t\t\t</tr>\n" + "\t\t\t\t</table>\n" + "\t\t\t</div>\n" + "\t\t</div>\n" + "\t</body>\n" + "</html>"; XmlWorkerHelperUtil.htmlToPDF(html.replaceAll("\n","").replaceAll("\t",""),"D:/a.pdf"); }
import com.itextpdf.text.Font; import com.itextpdf.text.pdf.BaseFont; import com.itextpdf.tool.xml.XMLWorkerFontProvider; public class AsianFontProvider extends XMLWorkerFontProvider { @Override public Font getFont(final String fontname, String encoding, float size, final int style) { try { BaseFont bfChinese = BaseFont.createFont("STSongStd-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED); return new Font(bfChinese, size, style); } catch (Exception e) { } return super.getFont(fontname, encoding, size, style); } }
说明下:页面标签是严格验证的所以你获取页面元素的时候要慎重 ,还有就是他需要完整的html 页面 就是<html>标签,最終效果如下: