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: