网上有好多的代码实例,好多都说可以解决中文以及样式问题,然而并不能,好不容易找到一篇,可以解决的,真心不容易,赶紧贴出来,备份一下。
import com.itextpdf.text.pdf.BaseFont;
import org.xhtmlrenderer.pdf.ITextFontResolver;
import org.xhtmlrenderer.pdf.ITextRenderer;
import java.io.*;
* 文件格式转换工具类
* @author lbj
* 2015-10-8 上午10:52:22
public class FileTypeConvertUtil {
* 将HTML转成PD格式的文件。html文件的格式比较严格
* @param htmlFile
* @param pdfFile
* @throws Exception
// <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd ">
public static void html2pdf(String htmlFile, String pdfFile) throws Exception {
// step 1
String url = new File(htmlFile).toURI().toURL().toString();
System.out.println(url);
// step 2
OutputStream os = new FileOutputStream(pdfFile);
ITextRenderer renderer = new ITextRenderer();
renderer.setDocumentFromString(getXmlString());
// renderer.setDocument(url);
// step 3 解决中文支持
ITextFontResolver fontResolver = renderer.getFontResolver();
if("linux".equals(getCurrentOperatingSystem())){
fontResolver.addFont("/usr/share/fonts/chiness/simsun.ttc", BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
}else{
fontResolver.addFont("C:\\Users\\Spring\\Desktop\\simsun.ttc", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
fontResolver.addFont("C:\\Users\\Spring\\Desktop\\arial.ttf", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
renderer.layout();
renderer.createPDF(os);
os.close();
System.out.println("create pdf done!!");
public static String getCurrentOperatingSystem(){
String os = System.getProperty("os.name").toLowerCase();
System.out.println("---------当前操作系统是-----------" + os);
return os;
public static String getXmlString() {
String xmlString="<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n" +
"<html lang=\"en\" xmlns=\"http://www.w3.org/1999/xhtml\">\n" +
"<head>\n" +
" <meta charset=\"UTF-8\"/>\n" +
" <title>Hello World</title>\n" +
"\t<style>\n" +
"\t table.table-separate th{\n" +
" font-weight:bold;\n" +
" font-size:14px;\n" +
" border-top:1px solid #F3EDE9 !important;\n" +
" }\n" +
" table.table-separate td{\n" +
" padding: 13px 0;\n" +
" font-weight:100;\n" +
" }\n" +
" .table-separate td.tit{\n" +
" background-color: #f4f9fe;\n" +
" font-weight:normal;\n" +
" padding:22px 0;\n" +
" width:15%;\n" +
" }\n" +
" .table-separate td.cont{\n" +
" text-align: left;\n" +
" padding:16px 22px;\n" +
" width:85%;\n" +
" line-height:175%;\n" +
" }\n" +
" .table-separate.no-border th{\n" +
" border:none;\n" +
" text-align: left;\n" +
" }\n" +
" .table-separate.no-border td{\n" +
" text-align: left;\n" +
" border:none;\n" +
" }\n" +
"\t@page {\n" +
"\tsize:210mm 297mm;//纸张大小A4\n" +
"\tmargin: 0.25in;\n" +
"\t-fs-flow-bottom: \"footer\";\n" +
"\t-fs-flow-left: \"left\";\n" +
"\t-fs-flow-right: \"right\";\n" +
"\tborder: thin solid black;\n" +
"\tpadding: 1em;\n" +
"\t}\n" +
"\t#footer {\n" +
"\tfont-size: 90%; font-style: italic;\n" +
"\tposition: absolute; top: 0; left: 0;\n" +
"\t-fs-move-to-flow: \"footer\";\n" +
"\t}\n" +
"\t#pagenumber:before {\n" +
"\tcontent: counter(page);\n" +
"\t}\n" +
"\t#pagecount:before {content: counter(pages);\n" +
"\t}\n" +
"\ttable {\n" +
"\t\t\tborder-collapse: collapse;\n" +
"\t\t\ttable-layout: fixed;\n" +
"\t\t\tword-break:break-all;\n" +
"\t\t\tfont-size: 10px;\n" +
"\t\t\twidth: 100%;\n" +
"\t\t\ttext-align: center;\n" +
"\t}\n" +
"\ttd {\n" +
"\t\tword-break:break-all;\n" +
"\t\tword-wrap : break-word;\n" +
"\t}\n" +
"\t</style>\n" +
"\t</head>\n" +
"<body style = \"font-family: SimSun;\">\n" +
"<div id=\"footer\" style=\"\"> Page <span id=\"pagenumber\"/> of <span id=\"pagecount\"/> </div>\n" +
"<div id=\"main\">\n" +
" <div style=\"max-width:600px;margin:0 auto;padding:10px;\">\n" +
" <div style=\"text-align: center; padding: 5mm 0;\">\n" +
" <div style=\"font-weight: bold; font-size: 30px;\"> HI Fudi&More</div>\n" +
" <div> THANK YOU FOR SHOPPING WITH Fudi&More!</div>\n" +
" </div>\n" +
" <div style=\"border: 1px solid black; background-color: #f8f8f8; padding: 4mm;\">\n" +
" <div style=\"font-size: 17px; font-weight: bold; border-bottom: 1px solid black; padding-bottom: 5mm;\"> ORDER DETAILS</div>\n" +
" <div style=\"padding-top: 10px;\">\n" +
" <div><strong>Order: </strong>D-8C2Y Placed on 29/09/2019 10:04</div>\n" +
" <div><strong>Carrier: </strong>Delivery</div>\n" +
" <div><strong>Payment: </strong>Cash Payment</div>\n" +
" </div>\n" +
" </div>\n" +
" <div style=\"margin-top: 4mm;\">\n" +
" <table class=\"table-separate\" cellpadding=\"0\" cellspacing=\"0\" style=\"max-width:600px;margin:0 auto;padding:10px;\">\n" +
" <thead>\n" +
" <tr style=\"text-align: center; height: 40px;\">\n" +
" <th style=\"width: 90px; background-color: #f8f8f8; border-top: 1px solid black; border-left: 1px solid black; border-right: 1px solid black;\">\n" +
" Reference\n" +
" </th>\n" +
" <th colspan=\"2\" style=\"background-color: #f8f8f8; border-top: 1px solid black; border-right: 1px solid black;\">Product</th>\n" +
" <th style=\"width: 110px; background-color: #f8f8f8; border-top: 1px solid black; border-right: 1px solid black;\">Unit price</th>\n" +
" <th style=\"width: 80px; background-color: #f8f8f8; border-top: 1px solid black; border-right: 1px solid black;\">Quantity</th>\n" +
" <th style=\"width: 90px; background-color: #f8f8f8; border-top: 1px solid black; border-right: 1px solid black;\">Total price</th>\n" +
" </tr>\n" +
" </thead>\n" +
" <tbody>\n" +
" <tr style=\"text-align: center; \">\n" +
" <td style=\"border-top: 1px solid black; border-bottom: 1px solid black; border-left: 1px solid black; border-right: 1px solid black;\">\n" +
" Main\n" +
" </td>\n" +
" <td colspan=\"2\"\n" +
" style=\"border-top: 1px solid black; border-bottom:1px solid black; border-right: 1px solid black; text-align: left; padding: 010px;\">\n" +
" SweetSour Chicken\n" +
" </td>\n" +
" <td style=\"border-top: 1px solid black; border-bottom: 1px solid black; border-right: 1px solid black;\">€ 7.00</td>\n" +
" <td style=\"border-top: 1px solid black; border-bottom: 1px solid black; border-right: 1px solid black;\">1</td>\n" +
" <td style=\"border-top: 1px solid black; border-bottom: 1px solid black; border-right: 1px solid black;\">€ 7.00</td>\n" +
" </tr>\n" +
" <tr style=\"text-align: center; \">\n" +
" <td style=\"border-top: 1px solid black; border-bottom: 1px solid black; border-left: 1px solid black; border-right: 1px solid black;\">\n" +
" Main\n" +
" </td>\n" +
" <td colspan=\"2\"\n" +
" style=\"border-top: 1px solid black; border-bottom:1px solid black; border-right: 1px solid black; text-align: left; padding: 010px;\">\n" +
" Black Bean Stir Fry\n" +
" </td>\n" +
" <td style=\"border-top: 1px solid black; border-bottom: 1px solid black; border-right: 1px solid black;\">€ 9.00</td>\n" +
" <td style=\"border-top: 1px solid black; border-bottom: 1px solid black; border-right: 1px solid black;\">1</td>\n" +
" <td style=\"border-top: 1px solid black; border-bottom: 1px solid black; border-right: 1px solid black;\">€ 9.00</td>\n" +
" </tr>\n" +
" <tr style=\"text-align: center; \">\n" +
" <td style=\"border-top: 1px solid black; border-bottom: 1px solid black; border-left: 1px solid black; border-right: 1px solid black;\">\n" +
" Pizzas\n" +
" </td>\n" +
" <td colspan=\"2\"\n" +
" style=\"border-top: 1px solid black; border-bottom:1px solid black; border-right: 1px solid black; text-align: left; padding: 010px;\">\n" +
" Test Design Your Own 8\" Pizza\n" +
" </td>\n" +
" <td style=\"border-top: 1px solid black; border-bottom: 1px solid black; border-right: 1px solid black;\">€ 6.00</td>\n" +
" <td style=\"border-top: 1px solid black; border-bottom: 1px solid black; border-right: 1px solid black;\">1</td>\n" +
" <td style=\"border-top: 1px solid black; border-bottom: 1px solid black; border-right: 1px solid black;\">€ 6.00</td>\n" +
" </tr>\n" +
" </tbody>\n" +
" <tfoot>\n" +
" <tr style=\"text-align: center; height: 8mm;\">\n" +
" <td colspan=\"5\"\n" +
" style=\"text-align: right; width: 90px; background-color: #f8f8f8; border-bottom: 1px solid black; border-left: 1px solid black; border-right: 1px solid black; padding: 0 10px;\">\n" +
" Item:\n" +
" </td>\n" +
" <td style=\"background-color: #f8f8f8; border-bottom: 1px solid black; border-right: 1px solid black;\">3</td>\n" +
" </tr>\n" +
" <tr style=\"text-align: center; height: 8mm;\">\n" +
" <td colspan=\"5\"\n" +
" style=\"text-align: right; width: 90px; background-color: #f8f8f8; border-bottom: 1px solid black; border-left: 1px solid black; border-right: 1px solid black; padding: 0 10px;\">\n" +
" Subtotal:\n" +
" </td>\n" +
" <td style=\"background-color: #f8f8f8; border-bottom: 1px solid black; border-right: 1px solid black;\">€24.00</td>\n" +
" </tr>\n" +
" <tr style=\"text-align: center; height: 8mm;\">\n" +
" <td colspan=\"5\"\n" +
" style=\"text-align: right; width: 90px; background-color: #f8f8f8; border-bottom: 1px solid black; border-left: 1px solid black; border-right: 1px solid black; padding: 0 10px;\">\n" +
" Deliver Fee:\n" +
" </td>\n" +
" <td style=\"background-color: #f8f8f8; border-bottom: 1px solid black; border-right: 1px solid black;\">+€2.00</td>\n" +
" </tr>\n" +
" <tr style=\"text-align: center; height: 8mm;\">\n" +
" <td colspan=\"5\"\n" +
" style=\"text-align: right; width: 90px; background-color: #f8f8f8; border-bottom: 1px solid black; border-left: 1px solid black; border-right: 1px solid black; padding: 0 10px;\">\n" +
" Discount:\n" +
" </td>\n" +
" <td style=\"background-color: #f8f8f8; border-bottom: 1px solid black; border-right: 1px solid black;\">-€0.00</td>\n" +
" </tr>\n" +
" <tr style=\"text-align: center; height: 8mm;\">\n" +
" <td colspan=\"5\"\n" +
" style=\"text-align: right; width: 90px; background-color: #f8f8f8; border-bottom: 1px solid black; border-left: 1px solid black; border-right: 1px solid black; padding: 0 10px;\">\n" +
" Total:\n" +
" </td>\n" +
" <td style=\"background-color: #f8f8f8; border-bottom: 1px solid black; border-right: 1px solid black;\">€24.00</td>\n" +
" </tr>\n" +
" </tfoot>\n" +
" </table>\n" +
" </div>\n" +
" <div>\n" +
" <div style=\"border: 1px solid black; background-color: #f8f8f8; padding:5mm; margin-top: 5mm;\">\n" +
" <div style=\"font-size: 17px; font-weight: bold; border-bottom: 1px solid black; padding-bottom: 15px;\"> DELIVERY ADDRESS</div>\n" +
" <div style=\"padding-top: 10px;\">\n" +
" <div><strong>guan</strong> ☎ <strong>13656690321</strong></div>\n" +
" <div> 1024/ Edenhall,ModelFarmRd,Cork,爱尔兰,A 2048</div>\n" +
" </div>\n" +
" </div>\n" +
" </div>\n" +
" <div style=\"font-size: 13px;\"><p>You can review your order and download your invoice from the \"<a target=\"_blank\"\n" +
" href=\"http://www.fudiandmore.ie/#/FudiIndex/Order1\">Order\n" +
" history</a>\"section of your customer account by clicking \"<a target=\"_blank\" href=\"http://www.fudiandmore.ie/#/FudiIndex/Personalcenter1\">My\n" +
" account</a>\" on ourshop.</p></div>\n" +
" <hr style=\"border-width: 5px;\"/>\n" +
" <div> Fudi,More powered by <a target=\"_blank\" href=\"http://www.fudiandmore.ie\">A2BLiving</a></div>\n" +
" </div>\n" +
"</div>\n" +
"</body>\n" +
"</html>";
StringBuffer stringBuffer=new StringBuffer();
return xmlString;
public static void main(String[] args) {
// String htmlFile = "/home/lbj/sign.jsp";
// String pdfFile = "/home/lbj/sign.pdf";
String htmlFile = "C:\\Users\\Spring\\Desktop\\qqq.html";
String pdfFile = "C:\\Users\\Spring\\Desktop\\testoone2.pdf";
try {
FileTypeConvertUtil.html2pdf(htmlFile, pdfFile);
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itextpdf</artifactId>
<version>5.5.9</version>
</dependency>
<dependency>
<groupId>com.itextpdf.tool</groupId>
<artifactId>xmlworker</artifactId>
<version>5.5.9</version>
</dependency>
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itext-asian</artifactId>
<version>5.2.0</version>
</dependency>
<dependency>
<groupId>org.xhtmlrenderer</groupId>
<artifactId>flying-saucer-pdf-itext5</artifactId>
<version>9.0.3</version>
</dependency>
这就完了.直接运行没问题。还有比如 & 在正文中的要转义 & 要不然报错,格式一定要正确,</>结束符一定要有,标准也要有
<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">
<html lang=\"en\" xmlns=\"http://www.w3.org/1999/xhtml\">
这个缺了你可以试试,出了问题你自己该,还有一点很重要,body 中指定字体,不指定的,中文你就不要想它出现了。还有一些 分页啥的,样式里写好就行,要是超宽了,那就自己看着实例的样式改改,大概就好了
转载于 https://www.cnblogs.com/hxz-nl/p/11611909.html