Java实现HTML转PDF的几种方法—主要解决中文乱码问题
第一:同事在做HTML转PDF中遇到乱码问题
*****************************************************************
她采用的itext方法实现HTML转存为PDF,代码如下:
1 import java.io.FileInputStream; 2 import java.io.FileOutputStream; 3 4 import com.itextpdf.text.Document; 5 import com.itextpdf.text.PageSize; 6 import com.itextpdf.text.pdf.PdfWriter; 7 import com.itextpdf.tool.xml.XMLWorkerHelper; 8 9 public class HtmlToPDF { 10 public static final String HTML = "D:/printEnforcement.htm"; 11 public static void main(String[] args) { 12 try { 13 14 Document document = new Document(PageSize.LETTER); 15 PdfWriter pdfWriter = PdfWriter.getInstance(document, 16 new FileOutputStream("d://testpdf.pdf")); 17 document.open(); 18 document.addAuthor("test"); 19 document.addCreator("test"); 20 document.addSubject("test"); 21 document.addCreationDate(); 22 document.addTitle("XHTML to PDF"); 23 24 XMLWorkerHelper worker = XMLWorkerHelper.getInstance(); 25 26 worker.parseXHtml(pdfWriter, document, new FileInputStream(HTML), null, new AsianFontProvider()); 27 document.close(); 28 System.out.println("Done."); 29 } catch (Exception e) { 30 e.printStackTrace(); 31 } 32 } 33 34 }
1 import com.itextpdf.text.BaseColor; 2 import com.itextpdf.text.Font; 3 import com.itextpdf.text.pdf.BaseFont; 4 import com.itextpdf.tool.xml.XMLWorkerFontProvider; 5 6 public class AsianFontProvider extends XMLWorkerFontProvider { 7 8 public Font getFont(final String fontname, final String encoding, 9 final boolean embedded, final float size, final int style, 10 final BaseColor color) { 11 BaseFont bf = null; 12 try { 13 bf = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", 14 BaseFont.NOT_EMBEDDED); 15 } catch (Exception e) { 16 e.printStackTrace(); 17 } 18 Font font = new Font(bf, size, style, color); 19 font.setColor(color); 20 return font; 21 } 22 }
代码的思路很简单的,一个pdfwriter类负责输出pdf参数,一个document作为方法中的参数,一个xmlworkhelper负责将html转化为pdf文档;
在另一个类中XMLWorkerFontProvider目前主要写的是关于字体参数的设置。
两个java文件能够显示正常的PDF文件。
附测试代码Demo: