html pdf 模板,记一次 HTML 模板 转 PDF
HTM模板的样式和实际转pdf样式会有非常大的差距 获取模板的方式也是十分曲折...
这里记录一下便捷的方式
第一步:
在前端调用windows的打印页面 这里的样式完全和html一一致;左侧 目标打印机 选择:另存为PDF
这里保存的pdf样式和html的样式完全一致。
第二步:
把上一步保存好的pdf转换为word 在线转换地址 pdf2word
第三步:
把上一步保存好的word转换为html 在线转换地址 word2html
获得的模板在稍作调整即可
我是这么转换了几次才得到了样式最贴近的模板
如果样式差距大 可以自己调整转换的步骤 省略 or 多转几次
jar包中有default.css文件可能会影响样式
图片支持http链接 直接像普通的字符串一样扔进去就可以
如果样式难搞 字段不多建议使用 pdf模板转换 样式不会改变 缺点:字符长度完全受域限制 图片插入太费劲
首先引入依赖
com.itextpdf.tool
xmlworker
5.5.13
com.itextpdf
itextpdf
5.5.9
com.itextpdf
itext-asian
5.2.0
以下为批量导出的代码 忽略业务代码
@RequestMapping(value="/exportPrintList")
public void exportPdf(String keyword, String status, String createStartTime, String createEndTime, HttpServletResponse response) {
FileUtil.createDir(pdfFilePath,false);
//业务代码 查询需要导出的数据
AppHealthtestEx ahe = new AppHealthtestEx();
ahe.setType(HealthTestType.HealthTest.getType());
ahe.setKeywords(keyword);
ahe.setCreateStartTime(createStartTime);
ahe.setCreateEndTime(createEndTime);
if (StringUtils.isNotBlank(status)) {
ahe.setStatus(Integer.parseInt(status));
}
ahe.setOrgOid(getSearchOrgOid());
List testNumbers = service.findPrintHealthtestEx(ahe);
int corePoolSize = 5;
if(testNumbers.size()
corePoolSize = testNumbers.size();
}
if(corePoolSize>10){
corePoolSize = 10;
}
// 批量导出 多个任务
ExecutorService executorService = new ThreadPoolExecutor(corePoolSize, testNumbers.size(), 0L,
TimeUnit.SECONDS, new ArrayBlockingQueue<>(3));
List result = Lists.newArrayList();
AppPrintMode findPrintMode = new AppPrintMode();
List appPrintModes = appPrintModeService.find(findPrintMode);
if(CollectionUtils.isNotEmpty(appPrintModes)){
findPrintMode = appPrintModes.get(0);
}
int printMode = 1;
if(findPrintMode.getPrintPlateType()!=null){
printMode = findPrintMode.getPrintPlateType();
}
String template = "";
if(printMode == 1){
template = templatePath+"PrintAll.html";
}else{
template = templatePath +"PrintConcis.html";
}
for (AppHealthtestEx ex : testNumbers) {
result.add(executorService.submit(new
PrintThread(pdfFilePath,ex.getTestNumber(),service,template,ex.getName())));
}
executorService.shutdown();
try {
executorService.awaitTermination(600,TimeUnit.SECONDS);
FileUtil.compressToZip(pdfFilePath,filePath,"体检报告导出.zip");
service.downloadPdf(response, "体检报告导出.zip");
}catch (Exception e){
log.error("export pdf error :",e);
}
}
线程类:
import com.itextpdf.text.Document;
import com.itextpdf.text.PageSize;
import com.itextpdf.text.pdf.PdfWriter;
import com.itextpdf.tool.xml.XMLWorkerHelper;
import com.itextpdf.tool.xml.html.CssAppliers;
import com.itextpdf.tool.xml.html.CssAppliersImpl;
import com.itextpdf.tool.xml.html.Tags;
import com.itextpdf.tool.xml.pipeline.html.HtmlPipelineContext;
import org.apache.commons.collections.MapUtils;
import org.apache.commons.lang3.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.nio.charset.Charset;
import java.util.Map;
import java.util.concurrent.Callable;
public class PrintThread implements Callable{
public Logger log = LoggerFactory.getLogger(this.getClass());
private String fileFilePath;
private String testNumber;
private String templatePath;
private AppHealthtestService appHealthtestService;
private String fileName;
public PrintThread(String fileFilePath, String testNumber, AppHealthtestService appHealthtestService,String templatePath,String fileName) {
this.fileFilePath = fileFilePath;
this.testNumber = testNumber;
this.appHealthtestService = appHealthtestService;
this.templatePath = templatePath;
this.fileName = fileName;
}
@Override
public Object call(){
FileOutputStream fos = null;
Document document = null;
try {
// 获取所有占位符对应的值
Map stringObjectMap = appHealthtestService.exportPreview(testNumber);
String htmlContent = htmlSetValue(readString(templatePath),stringObjectMap);
ByteArrayInputStream in = new ByteArrayInputStream(htmlContent.getBytes("UTF-8"));
document = new Document(PageSize.A4);
PdfWriter pdfWriter = PdfWriter.getInstance(document, new FileOutputStream(fileFilePath+ fileName+testNumber + ".pdf"));
document.open();
document.addTitle("xxx报告");
// 使用我们的字体提供器,并将其设置为unicode字体样式
AsianFontProvider fontProvider = new AsianFontProvider();
fontProvider.addFontSubstitute("lowagie", "garamond");
// 生产环境是windows 我本地也是windows 如果不加这句 在我本地是没问题 在服务器上就是乱码 ... 坑
fontProvider.setUseUnicode(true);
CssAppliers cssAppliers = new CssAppliersImpl(fontProvider);
HtmlPipelineContext htmlContext = new HtmlPipelineContext(cssAppliers);
htmlContext.setTagFactory(Tags.getHtmlTagProcessorFactory());
XMLWorkerHelper.getInstance().getDefaultCssResolver(true);
XMLWorkerHelper.getInstance().parseXHtml(pdfWriter, document, in, null, Charset.forName("UTF-8"),
fontProvider);
// XMLWorkerHelper.getInstance().parseXHtml(pdfWriter, document, in, Charset.forName("UTF-8"),new AsianFontProvider());
document.close();
} catch (Exception e) {
e.printStackTrace();
} finally {
if (fos != null) {
try {
fos.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (document != null) {
document.close();
}
}
return "success";
}
// 读html模板代码
private static String readString(String filePath) {
File file = new File(filePath);
String result = "";
try {
FileInputStream in = new FileInputStream(file);
// size 为字串的长度 ,这里一次性读完
int size = in.available();
byte[] buffer = new byte[size];
in.read(buffer);
in.close();
result = new String(buffer,"UTF-8");
} catch (IOException e) {
e.printStackTrace();
}
return result;
}
/**
* 替换掉模板中的占位符
* @param html 模板代码
* @param map 替换模板的值
* @return
*/
private String htmlSetValue(String html,Map map){
if(StringUtils.isBlank(html) || MapUtils.isEmpty(map)){
return html;
}
for (String key : map.keySet()) {
html = html.replaceAll("#"+key,MapUtils.getString(map,key,""));
}
return html;
}
字体类:
public class AsianFontProvider extends XMLWorkerFontProvider {
public AsianFontProvider() {
super(null,null);
}
@Override
public Font getFont(final String fontname, String encoding, float size, final int style) {
String fntname = fontname;
if (fntname == null) {
fntname = "宋体";
}
if (size == 0) {
size = 4;
}
return super.getFont(fntname, encoding, size, style);
}
}
HTML模板太大 贴一小段 使用 #key 在替换的时候把所有的占位符替换为自己想要的值
比如 map中的键值对为: #addres,北京市朝阳区 这样在html中要显示地址的地方写 #address即可:
地
址:#address
身
高:
style="font-family:'Microsoft YaHei'; font-size:8pt">#heightcm
体
重:
style="font-family:'Microsoft YaHei'; font-size:8pt">#weightkg
html pdf 模板,记一次 HTML 模板 转 PDF相关推荐
- Java 生成各种 PDF 实战方案(图片、模板、表格)
刚接到了一个需求,生成一个pdf,一开始以为挺简单的,通过模板生成嘛,我也发过相应的文章,根据模板直接生成pdf,响应到前端或者根据模板生成pdf,直接指定下载位置,这两种方案都可以,不过这篇文章主要 ...
- 昆虫记思维导图模板分享
记得在小时候对很多小动物都充满好奇,想去摸索一番.就像是让-亨利·卡西米尔·法布尔一样,对昆虫的痴迷研究,将昆虫的特征习性和婚习都完整的记录下来,但是要对昆虫记的内容,创作背景等制作思维导图是要怎样操 ...
- java导出pdf文件并下载_java根据模板生成pdf文件并导出
1.首先需要依赖包:itext的jar包,我是maven项目,所以附上maven依赖 [html] view plain copy com.itextpdf itextpdf 5.5.10 [html ...
- pdfbox替换模板标签,并将多个pdf合并为一个pdf(有图片插入图片)
替换100个模板中部分标签后,并合并100个pdf模板文档.10个400kb的图片为一个pdf文档 耗时20s左右 1.导入pdfbox <dependencies><depend ...
- java 文字生成pdf,并创建自定义表单域pdf模板
目录 本文总共知识点: pom 所有的import 生成带表格的pdf 另一种方式是指定坐标生成文本域 main方法: 创建表单域做为pdf模板: 创建签名域: 根据文字获取坐标位置 完整代码: 本文 ...
- 利用Adobe Acrobat DC制作pdf模板后,使用java直接生成pdf至本地指定路径或导出pdf文件
参考文章来源: springboot+itextpdf按模板生成PDF文件及在线下载PDF文件 JAVA根据模板生成PDF文件并导出 java将字符串按照指定长度分割成字符串数组 感谢上述博主大大,救 ...
- powermill程序单html模板,3-PowerMill程序单的模板定制.pdf
第第 1页页 共 共 6 页页 PowerMill程序单的模板定制程序单的模板定制 PowerMill 提供两种方法输出 NC 加工程序单加工程序单 右键菜单 PowerMILLUtilities 和 ...
- Django模板之django自带模板
模板 知识点 自带模板 基本使用 流程控制 过滤器 继承 Jinja2模板 配置 CSRF 原理 如何防范 一.Django使用自带模板 1.1 配置 在工程中创建模板目录templates.[然后新 ...
- php模板引擎如何实现,php模板引擎技术简单实现
用了smarty,tp过后,也想了解了解其模板技术是怎么实现,于是写一个简单的模板类,大致就是读取模板文件->替换模板文件的内容->保存或者静态化 tpl.class.php主要解析 as ...
最新文章
- Error in install.packages : cannot remove prior installation of package
- java打开网页横屏_巅峰之战!三款最热java手机浏览器横屏
- Android中广播接收者BroadcastReceiver详解
- 正则表达式 特殊符号系列 通配符系列
- Docker修改空间大小
- SQL Lite on NHibernate
- 第五章 随机事件及其概率
- php 执行文件tar打包,利用tar for windows对大量文件进行快速打包
- [js] axios拦截器原理是什么?
- python执行shellcode_python exec shellcode
- 1.3 jieba分词运用:词云、关键词抽取、TextRank、TF-IDF
- [Erlang 0017]Erlang/OTP基础模块 proc_lib
- word文档如何设置/取消首行输入空格当作缩进
- 手把手教你在群晖中设置阿里云DDNS
- 学习 Json解析数据
- 计算机色彩学,浅析色彩原理
- 圣地亚哥大学计算机科学专业,加州大学圣地亚哥分校计算机科学本科
- 因子分析模型(主成分解)、及与主成分分析模型的联系与区别(附详细案例)
- 「五度易链」我国华为、阳光电源逆变器出货量连续多年位居全球榜首
- 使用ownCloud搭建私人存储云(以Ubuntu12.04为例)