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相关推荐

  1. Java 生成各种 PDF 实战方案(图片、模板、表格)

    刚接到了一个需求,生成一个pdf,一开始以为挺简单的,通过模板生成嘛,我也发过相应的文章,根据模板直接生成pdf,响应到前端或者根据模板生成pdf,直接指定下载位置,这两种方案都可以,不过这篇文章主要 ...

  2. 昆虫记思维导图模板分享

    记得在小时候对很多小动物都充满好奇,想去摸索一番.就像是让-亨利·卡西米尔·法布尔一样,对昆虫的痴迷研究,将昆虫的特征习性和婚习都完整的记录下来,但是要对昆虫记的内容,创作背景等制作思维导图是要怎样操 ...

  3. java导出pdf文件并下载_java根据模板生成pdf文件并导出

    1.首先需要依赖包:itext的jar包,我是maven项目,所以附上maven依赖 [html] view plain copy com.itextpdf itextpdf 5.5.10 [html ...

  4. pdfbox替换模板标签,并将多个pdf合并为一个pdf(有图片插入图片)

    替换100个模板中部分标签后,并合并100个pdf模板文档.10个400kb的图片为一个pdf文档 耗时20s左右  1.导入pdfbox <dependencies><depend ...

  5. java 文字生成pdf,并创建自定义表单域pdf模板

    目录 本文总共知识点: pom 所有的import 生成带表格的pdf 另一种方式是指定坐标生成文本域 main方法: 创建表单域做为pdf模板: 创建签名域: 根据文字获取坐标位置 完整代码: 本文 ...

  6. 利用Adobe Acrobat DC制作pdf模板后,使用java直接生成pdf至本地指定路径或导出pdf文件

    参考文章来源: springboot+itextpdf按模板生成PDF文件及在线下载PDF文件 JAVA根据模板生成PDF文件并导出 java将字符串按照指定长度分割成字符串数组 感谢上述博主大大,救 ...

  7. powermill程序单html模板,3-PowerMill程序单的模板定制.pdf

    第第 1页页 共 共 6 页页 PowerMill程序单的模板定制程序单的模板定制 PowerMill 提供两种方法输出 NC 加工程序单加工程序单 右键菜单 PowerMILLUtilities 和 ...

  8. Django模板之django自带模板

    模板 知识点 自带模板 基本使用 流程控制 过滤器 继承 Jinja2模板 配置 CSRF 原理 如何防范 一.Django使用自带模板 1.1 配置 在工程中创建模板目录templates.[然后新 ...

  9. php模板引擎如何实现,php模板引擎技术简单实现

    用了smarty,tp过后,也想了解了解其模板技术是怎么实现,于是写一个简单的模板类,大致就是读取模板文件->替换模板文件的内容->保存或者静态化 tpl.class.php主要解析 as ...

最新文章

  1. Error in install.packages : cannot remove prior installation of package
  2. java打开网页横屏_巅峰之战!三款最热java手机浏览器横屏
  3. Android中广播接收者BroadcastReceiver详解
  4. 正则表达式 特殊符号系列 通配符系列
  5. Docker修改空间大小
  6. SQL Lite on NHibernate
  7. 第五章 随机事件及其概率
  8. php 执行文件tar打包,利用tar for windows对大量文件进行快速打包
  9. [js] axios拦截器原理是什么?
  10. python执行shellcode_python exec shellcode
  11. 1.3 jieba分词运用:词云、关键词抽取、TextRank、TF-IDF
  12. [Erlang 0017]Erlang/OTP基础模块 proc_lib
  13. word文档如何设置/取消首行输入空格当作缩进
  14. 手把手教你在群晖中设置阿里云DDNS
  15. 学习 Json解析数据
  16. 计算机色彩学,浅析色彩原理
  17. 圣地亚哥大学计算机科学专业,加州大学圣地亚哥分校计算机科学本科
  18. 因子分析模型(主成分解)、及与主成分分析模型的联系与区别(附详细案例)
  19. 「五度易链」我国华为、阳光电源逆变器出货量连续多年位居全球榜首
  20. 使用ownCloud搭建私人存储云(以Ubuntu12.04为例)

热门文章

  1. php vendor bin phinx,数据库Seeding
  2. 千兆PHY与RJ45接口线序
  3. 极速办公(excel)如何快速计算排名
  4. 开发后台界面用 div好,还是frame 框架 好?
  5. java8写一个word count
  6. hive时金额为科学记数法转为普通的数字
  7. 【矩阵乘】【DP】【codevs 1305】Freda的道路
  8. 【新知实验室】TRTC腾讯实时音视频动手实验
  9. 制作服装推广软文html,服装行业软文怎么写,公众号服装分销软文推广!
  10. Android7.1.1 remap鼠标右键为返回键