最近有用到使用 itext 将 html 页面转 pdf 的操作,做个笔记
技术预研
受限于某些外部原因(该环境无法使用 java 执行 sh 脚本),wkhtmltopdf 被排除在外,最终选择了 itext 全家桶,itextpdf
作为 pdf 生成核心,xmlworker
用于 html 转 pdf,itext-asian
用于支持中文显示,视情况而定还可以引入 nekohtml
对非标准 html 页面进行标签补全.
引入 maven 依赖
<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>
核心功能代码
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.ByteArrayInputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.nio.charset.Charset;
public class PDFUtil {
public static void writeStringToOutputStreamAsPDF(String html, OutputStream os) {
writeToOutputStreamAsPDF(new ByteArrayInputStream(html.getBytes()), os);
}
public static void writeToOutputStreamAsPDF(InputStream html, OutputStream os) {
try {
Document document = new Document(PageSize.A4);
PdfWriter pdfWriter = PdfWriter.getInstance(document, os);
document.open();
XMLWorkerHelper worker = XMLWorkerHelper.getInstance();
worker.parseXHtml(pdfWriter, document, html, Charset.forName("UTF-8"), new AsianFontProvider());
document.close();
} catch (Exception e) {
}
}
}
/**
* 用于中文显示的Provider
*/
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);
}
}
其中 writeToOutputStreamAsPDF
方法接受输入流形式的 html 文件,然后将 pdf 写入到输出流中,而 writeStringToOutputStreamAsPDF
方法则接受文本形式的 html 文件,方便做一些模板替换的预处理工作,当然也可以结合 vm,fm 等模板引擎进行模板文件数据渲染,请自行了解,OutputStream
输出流可作为文件输出流写入到生成 PDF 文件,也可以作为 web 环境下的 response
提供 PDF 文档显示/下载功能
欢迎来到这里!
我们正在构建一个小众社区,大家在这里相互信任,以平等 • 自由 • 奔放的价值观进行分享交流。最终,希望大家能够找到与自己志同道合的伙伴,共同成长。
注册 关于