问题总结
- 中文不显示
解决:主要是ttf文件的问题,如果ttf支持中文就可以。 - 纸张大小,宽度不够 参考
样式问题:
<table border="0" width="100%" columns="3" widths="50;10;40">
代码
HtmlToPDF.java
package com.example.demo.utils;
import com.itextpdf.text.BaseColor;
import com.itextpdf.text.Document;
import com.itextpdf.text.Font;
import com.itextpdf.text.PageSize;
import com.itextpdf.text.pdf.BaseFont;
import com.itextpdf.text.pdf.PdfWriter;
import com.itextpdf.tool.xml.XMLWorkerFontProvider;
import com.itextpdf.tool.xml.XMLWorkerHelper;
import java.io.*;
import java.nio.charset.StandardCharsets;
/**
* @author baitao
* @date 2018/11/13 10:21
*/
public class HtmlToPDF {
/**
* html 转换 pdf
* @param txt html文件路径
* @param path pdf文件路径
* @param name pdf文件名字
* @param ttf 字体文件
*/
public static boolean htmlFileToPdf(String txt, String path, String name, String ttf){
try {
Document document = new Document(PageSize.A5);
PdfWriter pdfWriter = PdfWriter.getInstance(document, new FileOutputStream(path+"/"+name));
document.open();
FileReader reader = new FileReader(txt);
BufferedReader br = new BufferedReader(reader);
String temStr = null;
StringBuilder inputStr = new StringBuilder();
while ((temStr = br.readLine()) != null) {
inputStr.append(temStr);
}
XMLWorkerHelper worker = XMLWorkerHelper.getInstance();
worker.parseXHtml(pdfWriter, document, new ByteArrayInputStream(inputStr.toString().getBytes()), (InputStream) null, new MyFontProviders(ttf));
br.close();
reader.close();
document.close();
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}finally {
System.out.println("转换结束");
}
}
/**
* html 转换 pdf
* @param txt html字符串
* @param path pdf文件路径
* @param name pdf文件名字
* @param ttf 字体文件
*/
public static boolean htmlStrToPdf(String txt, String path, String name, String ttf){
try {
Document document = new Document(PageSize.A5);
PdfWriter pdfWriter = PdfWriter.getInstance(document, new FileOutputStream(path+"/"+name));
document.open();
XMLWorkerHelper worker = XMLWorkerHelper.getInstance();
worker.parseXHtml(pdfWriter, document, new ByteArrayInputStream(txt.getBytes(StandardCharsets.UTF_8)), (InputStream) null, new MyFontProviders(ttf));
document.close();
return true;
} catch (Exception e) {
e.printStackTrace();
return false;
}finally {
System.out.println("转换结束");
}
}
}
class MyFontProviders extends XMLWorkerFontProvider {
private String ttf; //字体文件完整路径
public MyFontProviders(String ttf) {
super();
this.ttf = ttf;
}
public Font getFont(final String fontname, final String encoding,
final boolean embedded, final float size, final int style,
final BaseColor color) {
BaseFont bf = null;
try {
bf = BaseFont.createFont(ttf, BaseFont.IDENTITY_H,
BaseFont.NOT_EMBEDDED);
} catch (Exception e) {
e.printStackTrace();
}
Font font = new Font(bf, size, style, color);
font.setColor(color);
return font;
}
}
MainTest.java
package com.example.demo;
import com.example.demo.utils.HtmlToPDF;
public class MainTest {
public static void main(String[] arts) {
HtmlToPDF.htmlFileToPdf("D:\\test\\test.html", "D:\\test", "wode.pdf", "D:\\test\\WeiRuanYaHei-1.ttf");
System.out.printf("test");
}
}
pom.xml
<dependency>
<groupId>com.itextpdf.tool</groupId>
<artifactId>xmlworker</artifactId>
<version>5.5.13</version>
</dependency>
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itextpdf</artifactId>
<version>5.5.13</version>
</dependency>
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itext-asian</artifactId>
<version>5.2.0</version>
</dependency>