根据html模板以另存为方式导出pdf

对于html模板的要求
<!--?xml version="1.0" encoding="UTF-8"?--><!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd ">
<html xmlns="http://www.w3.org/1999/xhtml ">
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
上两个必须要有。
<p name="_sampleCode"></p>, map.put("p[name=_sampleCode]", sample.getSamplecode());
这样就可以了。 切记,参数不能用id来找,id找不到。

 

用到的jsoup,itextpdf 。对html的样式保存完好,如果要添加富文本内容的话,可以尝试<pre></pre>包裹下数据再传进来。

package com. *;
 
import java.io.File;
import java.io.IOException;
import java.io.OutputStream;
import java.io.UnsupportedEncodingException;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import javax.servlet.http.HttpServletResponse;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.xhtmlrenderer.pdf.ITextRenderer;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.pdf.BaseFont;
 
public class ExportHtmlToSaveAs {
 
/ **
*导出文件名
*/
private String fileName;
 
/ **
* 模板文件路径
*/
private String path;
 
/ **
* 输出流
*/
private OutputStream os;
 
/ **
* jsoup工具的html对象
*/
private Document parse;
 
/ **
* flying-saucer工具导出对象
*/
private ITextRenderer renderer;
 
 
public ExportHtmlToSaveAs() {
super();
fileName = null;
path = null;
parse = null;
os = null;
}
 
/ **
* 解决生成文件名中的中文不显示
* @param fileName
* @return
*/
private String modificationFileName(String fileName){
try {
fileName = new String(fileName.getBytes(), "ISO-8859-1");
} catch (UnsupportedEncodingException e1) {
e1.printStackTrace();
}
return fileName;
}
 
/ **
* 读取html模板文件为Document对象
* @param path
* @return
*/
private Document getParse(String path){
try {
parse = Jsoup.parse(new File(path), "UTF-8","");
} catch (IOException e) {
e.printStackTrace();
}
return parse;
}
 
/ **
* 对html模板装填,数据Map参数限定为key为String,value为String
* @param parse
* @param map
* @return
*/
private void modificationParse(Map <String,String> map){
Iterator <Entry<String, String>> iter = map.entrySet().iterator();
while (iter.hasNext()) {
Entry <String, String> entry = (Entry<String, String>) iter.next();
String value = (String) entry.getValue();
parse.select(entry.getKey()).html(null==value? "":value);
}
}
 
/ **
* 修饰输出流,添加输出文件名,自定义下载
* @param resp
* @return
*/
private HttpServletResponse modificationResp(HttpServletResponse resp){
resp.setContentType( "application/x-download;charset=utf-8");
resp.addHeader( "Content-Disposition", "attachment;filename="+ fileName);
return resp;
}
 
/ **
* 获取输出流
* @param resp
* @return
* @throws IOException
*/
private OutputStream getOs(HttpServletResponse resp) throws IOException {
resp = modificationResp(resp);
return resp.getOutputStream();
}
 
/ **
* 修饰renderer,添加中文字体(宋体)
* @param renderer
* @throws DocumentException
* @throws IOException
*/
private void modificationRenderer() throws DocumentException, IOException{
renderer.getFontResolver().addFont( "C:/WINDOWS/Fonts/SIMSUN.TTC",BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
}
 
/ **
* flying-saucer方法根据html字符串导出pdf
* @param html
* @param os
* @throws DocumentException
* @throws IOException
*/
private void exportforRenderer() throws DocumentException, IOException{
this.renderer = new ITextRenderer();
modificationRenderer();
renderer.setDocumentFromString(parse.html(),null);
renderer.layout();
renderer.createPDF(os);
}
 
/ **
* 导出 初始化
* @param fileName
* @param path
* @param map
* @param response
* @throws IOException
*/
private void initialize(String fileName,String path,Map <String,String> map,HttpServletResponse response) throws IOException{
this.fileName = modificationFileName(fileName);
this.path = path;
this.parse = getParse(this.path);
if (null!=map) {
modificationParse(map);
}
this.os = getOs(response);
}
 
/ **
* 导出pdf,map为null时输出模板
* @param fileName
* @param path
* @param map
* @param response
* @throws IOException
* @throws DocumentException
*/
public void HtmlExportPdf(String fileName,String path,Map <String,String> map,HttpServletResponse response) throws IOException, DocumentException{
fileName = fileName + ".pdf";
initialize(fileName,path,map,response);
exportforRenderer();
close();
}
 
/ **
* 导出html,map为null时输出模板
* @param fileName
* @param path
* @param map
* @param response
* @throws IOException
* @throws DocumentException
*/
public void HtmlExportHtml(String fileName,String path,Map <String,String> map,HttpServletResponse response) throws IOException, DocumentException{
fileName = fileName + ".html";
initialize(fileName,path,map,response);
exportforHtml();
close();
}
 
/ **
* 直接将html导出
* @throws IOException
*/
private void exportforHtml() throws IOException {
os.write(parse.html().getBytes());
}
 
/ **
* 关闭输出流
* @throws IOException
*/
private void close() throws IOException {
os.flush();
os.close();
}
 
 
 
}

转载于:https://www.cnblogs.com/du93/p/7284890.html

要使用iTextPDF导出PDF模板,可以按照以下步骤进行操作: 1. 首先,制作一个PDF模板。你可以使用Adobe Acrobat X Pro来打开原型PDF文件,并将其另存为PDF模板。确保模板中包含需要填充的字段或占位符。 2. 确保你的iTextPDF库已正确引入。在你的项目中添加以下依赖项: ``` <dependency> <groupId>com.itextpdf</groupId> <artifactId>itextpdf</artifactId> <version>5.5.6</version> </dependency> <dependency> <groupId>com.itextpdf</groupId> <artifactId>itext-asian</artifactId> <version>5.2.0</version> </dependency> ``` 3. 在你的代码中,使用iTextPDF库创建一个PdfReader对象来读取你的PDF模板。 4. 通过PdfReader对象获取PdfStamper对象,这将允许你修改PDF文件。 5. 使用PdfStamper对象的getAcroFields()方法来获取表单域的集合。表单域是你在PDF模板中定义的字段或占位符。 6. 使用AcroFields对象的setField()方法来为每个表单域设置值。你可以根据需要设置不同的值。 7. 最后,使用PdfStamper对象的close()方法来关闭并保存修改后的PDF文件。 这样,你就成功地使用iTextPDF导出PDF模板了。记得在代码中按照上述步骤进行相应的操作和设置。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [java 使用 itextpdf5 利用 pdf 模板生成PDF文件](https://blog.csdn.net/qq_39750658/article/details/110561286)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [使用itextpdf完成PDF模板类制作、使用](https://blog.csdn.net/m0_60524086/article/details/124195792)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值