使用iText 將html頁面轉PDF檔案(itext+freemarker)
阿新 • • 發佈:2019-01-02
1.匯入jar包(使用maven管理)
2.編寫處理類HtmlToPDF.java<!--itext start--> <dependency> <groupId>com.lowagie</groupId> <artifactId>itext</artifactId> <version>2.0.8</version> </dependency> <dependency> <groupId>com.itextpdf</groupId> <artifactId>itext-asian</artifactId> <version>5.2.0</version> </dependency> <dependency> <groupId>com.lowagie</groupId> <artifactId>itext-rtf</artifactId> <version>2.1.7</version> </dependency> <dependency> <groupId>com.itextpdf</groupId> <artifactId>itextpdf</artifactId> <version>5.4.2</version> </dependency> <dependency> <groupId>com.itextpdf.tool</groupId> <artifactId>xmlworker</artifactId> <version>5.4.1</version> </dependency> <dependency> <groupId>org.jsoup</groupId> <artifactId>jsoup</artifactId> <version>1.8.3</version> </dependency> <dependency> <groupId>org.xhtmlrenderer</groupId> <artifactId>core-renderer</artifactId> <version>R8</version> </dependency> <!--itext end-->
<pre name="code" class="java"> import java.awt.Color; import java.io.BufferedInputStream; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.OutputStream; import java.io.OutputStreamWriter; import java.io.Writer; import java.net.MalformedURLException; import java.net.URLEncoder; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; import java.util.UUID; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.swing.JOptionPane; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Controller; import org.xhtmlrenderer.pdf.ITextFontResolver; import org.xhtmlrenderer.pdf.ITextRenderer; import com.itextpdf.text.pdf.BaseFont; import freemarker.template.Configuration; import freemarker.template.DefaultObjectWrapper; import freemarker.template.Template; public class HtmlToPDF { private static HtmlToPDF instance=new HtmlToPDF(); private HtmlToPDF() { } public static HtmlToPDF getInstance() { return instance; } private String basePath=this.getClass().getResource("").getPath()+"template"; private String tmppdfPath = "D:/常用/深圳專案/新建資料夾/template/pdf";//pdf路徑
//<span style="font-family: Arial, Helvetica, sans-serif;">archiveInfoMap放置要傳遞給模版的引數</span> private String preExportPdf(Map<String,Object> archiveInfoMap) throws Exception { UUID uuid = UUID.randomUUID(); String outputFile = tmppdfPath + "/" + uuid + ".pdf"; //生成的PDF名
//STEP1:使用freemarker 將模版頁面生成要轉的html頁面
//a.建立一個合適的Configration物件
Configuration configuration = new Configuration();
// configuration.setDirectoryForTemplateLoading(new File(basePath));//方式一:使用絕對路徑設定模版路徑
configuration.setClassForTemplateLoading(this.getClass(), "template");//方式二:使用所在類的相對路徑設定模版路徑
configuration.setObjectWrapper(new DefaultObjectWrapper());
configuration.setDefaultEncoding("UTF-8"); //這個一定要設定,不然在生成的頁面中 會亂碼
//b.獲取或建立一個模版
Template template = configuration.getTemplate("test3.html");
String outPutFileName = basePath+"/"+unitId+".html"; //生成的html名
Writer writer = new OutputStreamWriter(new FileOutputStream(outPutFileName),"UTF-8");
//c.使用template將資料注入模版頁面生成要轉pdf的html頁面
template.process(archiveInfoMap, writer);
writer.flush();
//STEP2:使用itext將html頁面轉成PDF檔案
OutputStream os = new FileOutputStream(outputFile);
// String url=new File(outPutFileName).toURI().toURL().toString();
String url=new File(outPutFileName).toURI().toURL().toString();
//生成ITextRenderer例項
ITextRenderer renderer = new ITextRenderer();
//關聯html頁面
renderer.setDocument(url);
//設定獲取圖片的基本路徑
renderer.getSharedContext().setBaseURL(new File(basePath).toURI().toURL().toString());
//解決中文問題(模版頁面test3.html配套加上<style mce_bogus="1" type="text/css">
// body {font-family: SimSun; background:none;margin-left: auto;margin-right: auto;}
// </style>)
ITextFontResolver fontResolver = renderer.getFontResolver();
fontResolver.addFont("C:/WINDOWS/Fonts/SimSun.ttc",BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
renderer.layout();
renderer.createPDF(os);
writer.close();
os.close();
File file =new File(outPutFileName);
return outputFile;
}
public String exportPdf(Map baseInfoMap,String imgURL) throws Exception
{
String pdfFilename = preExportPdf(baseInfoMap);
System.out.println("個人檔案pdf匯出成功:["+pdfFilename+"]");
return pdfFilename;
}
}