1、IText实现html2pdf,速度快,纠错能力差,支持中文(要求HTML使用unicode编码),但中支持一种中文字体,开源。
2、Flying Sauser实现html2pdf,纠错能力差,支持多种中文字体(部分样式不能识别),开源。
3、PD4ML实现html2pdf,速度快,纠错能力强,支持多种中文字体,商业。
(一)IText
测试案例:TestIText.Java
依赖jar包:iText-2.0.8.jar、iTextAsian.jar(支持中文)
下面只是一个小的测试案例,如果项目中使用到了该组件可以参考API完成项目组中相应的功能!
importjava.io.FileOutputStream;
importjava.io.FileReader;
importjava.util.ArrayList;
importcom.lowagie.text.Document;
importcom.lowagie.text.Element;
importcom.lowagie.text.Font;
importcom.lowagie.text.PageSize;
importcom.lowagie.text.Paragraph;
importcom.lowagie.text.html.simpleparser.HTMLWorker;
importcom.lowagie.text.html.simpleparser.StyleSheet;
importcom.lowagie.text.pdf.BaseFont;
importcom.lowagie.text.pdf.PdfWriter;
publicclassTestIText{
publicstaticvoidmain(String[]args){
TestITextih=newTestIText();
ih.htmlCodeComeFromFile("D://Test//iText.html","D://Test//iText_1.pdf");
ih.htmlCodeComeString("Hello中文","D://Test//iText_2.pdf");
}
publicvoidhtmlCodeComeFromFile(StringfilePath,StringpdfPath){
Documentdocument=newDocument();
try{
StyleSheetst=newStyleSheet();
st.loadTagStyle("body","leading","16,0");
PdfWriter.getInstance(document,newFileOutputStream(pdfPath));
document.open();
ArrayListp=HTMLWorker.parseToList(newFileReader(filePath),st);
for(intk=0;k
document.add((Element)p.get(k));
}
document.close();
System.out.println("文档创建成功");
}catch(Exceptione){
e.printStackTrace();
}
}
publicvoidhtmlCodeComeString(StringhtmlCode,StringpdfPath){
Documentdoc=newDocument(PageSize.A4);
try{
PdfWriter.getInstance(doc,newFileOutputStream(pdfPath));
doc.open();
//解决中文问题
BaseFontbfChinese=BaseFont.createFont("STSong-Light","UniGB-UCS2-H",BaseFont.NOT_EMBEDDED);
FontFontChinese=newFont(bfChinese,12,Font.NORMAL);
Paragrapht=newParagraph(htmlCode,FontChinese);
doc.add(t);
doc.close();
System.out.println("文档创建成功");
}catch(Exceptione){
e.printStackTrace();
}
}
}
(二)Flying Sauser
依赖jar包:iText-2.0.8.jar、iTextAsian.jar、core-renderer.jar
默认情况下,core-renderer.jar对中文是不能进行换行的,如果想解决换行问题可以去/blog/611561下载一个jar包,该包对源代码做了稍加修改.
下面只是一个小的测试案例,如果项目中使用到了该组件可以参考API完成项目组中相应的功能!
importjava.io.File;
importjava.io.FileOutputStream;
importjava.io.OutputStream;
importorg.xhtmlrenderer.pdf.ITextFontResolver;
importorg.xhtmlrenderer.pdf.ITextRenderer;
importcom.lowagie.text.pdf.BaseFont;
publicclassTestFlyingSauser{
publicstaticvoidmain(String[]args)throwsException{
demo_1();
demo_2();
}
//不支持中文
publicstaticvoiddemo_1()throwsException{
StringinputFile="D:/Test/flying.html";
Stringurl=newFile(inputFile).toURI().toURL().toString();
StringoutputFile="D:/Test/flying.pdf";
OutputStreamos=newFileOutputStream(outputFile);
ITextRendererrenderer=newITextRenderer();
renderer.setDocument(url);
renderer.layout();
renderer.createPDF(os);
os.close();
}
//支持中文
publicstaticvoiddemo_2()throwsException{
StringoutputFile="D:/Test/demo_3.pdf";
OutputStreamos=newFileOutputStream(outputFile);
ITextRendererrenderer=newITextRenderer();
ITextFontResolverfontResolver=renderer.getFontResolver();
fontResolver.addFont("C:/Windows/fonts/simsun.ttc",BaseFont.IDENTITY_H,BaseFont.NOT_EMBEDDED);
StringBufferhtml=newStringBuffer();
//DOCTYPE必需写否则类似于这样的字符解析会出现错误
html.append("htmlPUBLIC/"-//W3C//DTDXHTML1.0Transitional//EN/"/"/TR/xhtml1/DTD/xhtml1-transitional.dtd/">");
html.append("").append("
")
.append("")
.append("
body{font-family:SimSun;}
-->")
.append("")
.append("
");
html.append("
支持中文!");
html.append("");
renderer.setDocumentFromString(html.toString());
//解决图片的相对路径问题
//renderer.getSharedContext().setBaseURL("file:/F:/teste/html/");
renderer.layout();
renderer.createPDF(os);
os.close();
}
}
(三)PD4ML
依赖jar包:pd4ml_demo.jar、pd4ml__css2.jar、fonts.jar
下面只是一个小的测试案例,如果项目中使用到了该组件可以参考API完成项目组中相应的功能!
importjava.awt.Insets;
importjava.io.File;
importjava.io.FileOutputStream;
importjava.io.StringReader;
importorg.zefer.pd4ml.PD4Constants;
importorg.zefer.pd4ml.PD4ML;
publicclassConverter{
publicstaticvoidmain(String[]args)throwsException{
Converterconverter=newConverter();
converter.generatePDF_2(newFile("D:/Test/demo_ch_pd4ml_a.pdf"),"D:/Test/a.htm");
FilepdfFile=newFile("D:/Test/demo_ch_pd4ml.pdf");
StringBufferhtml=newStringBuffer();
html.append("")
.append("
")
.append("")
.append("")
.append("
")
.append("")
.append("显示中文")
.append("")
.append("");
StringReaderstrReader=newStringReader(html.toString());
converter.generatePDF_1(pdfFile,strReader);
}
//手动构造HTML代码
publicvoidgeneratePDF_1(FileoutputPDFFile,StringReaderstrReader)throwsException{
FileOutputStreamfos=newFileOutputStream(outputPDFFile);
PD4MLpd4ml=newPD4ML();
pd4ml.setPageInsets(newInsets(20,10,10,10));
pd4ml.setHtmlWidth(950);
pd4ml.setPageSize(pd4ml.changePageOrientation(PD4Constants.A4));
pd4ml.useTTF("java:fonts",true);
pd4ml.setDefaultTTFs("KaiTi_GB2312","KaiTi_GB2312","KaiTi_GB2312");
pd4ml.enableDebugInfo();
pd4ml.render(strReader,fos);
}
//HTML代码来自于HTML文件
publicvoidgeneratePDF_2(FileoutputPDFFile,StringinputHTMLFileName)throwsException{
FileOutputStreamfos=newFileOutputStream(outputPDFFile);
PD4MLpd4ml=newPD4ML();
pd4ml.setPageInsets(newInsets(20,10,10,10));
pd4ml.setHtmlWidth(950);
pd4ml.setPageSize(pd4ml.changePageOrientation(PD4Constants.A4));
pd4ml.useTTF("java:fonts",true);
pd4ml.setDefaultTTFs("KaiTi_GB2312","KaiTi_GB2312","KaiTi_GB2312");
pd4ml.enableDebugInfo();
pd4ml.render("file:"+inputHTMLFileName,fos);
}
}
参考资料:
生成PDF文档的方案大致就这些了,希望能够给大家带来帮助!如果上面的三种方案都还不能满足项目组的需求哪就只有去买商业软件了。
转载自--/zdtwyjp/article/details/5769353#