使用flying saucer将html文件转成PDF
使用flying saucer生成PDF文件之前,先要使用freemarker生成html文件,然后将html文件转成pdf。生成html文件的东东网上一搜一大堆,大家找找就成。
当然“使用flying saucer将html文件转成PDF“的东东网上也是一搜一大堆,所以我这篇主要不是讲怎么生成,而是记载一路走来碰到的各种奇葩问题。
还是上一下转成pdf文件的方法吧,可能以后有用:
Java代码
/** * 该方法用来将指定的word文件转换成pdf文件(使用flying saucer技术) * @param pdfPath:生成后的pdf所在目录,包括目录+pdf名称+.+pdf * @param htmlFilePath:需要进行转换的html文件所在目录,包括目录+html名称+.+html * */
public boolean createPDFByHtml(String pdfPath,String htmlFilePath){ boolean result = false; //1、判断给定的文件是否是html文件:是htm格式结尾,或者以html格式结尾 if(htmlFilePath.toUpperCase().endsWith(".HTM") || htmlFilePath.toUpperCase().endsWith(".HTML")){//两种格式都是扫描文件格式 try { OutputStream os = new FileOutputStream(pdfPath); ITextRenderer renderer = new ITextRenderer(); renderer.setDocument(new File(htmlFilePath)); // 解决中文支持问题 ITextFontResolver fontResolver = renderer.getFontResolver(); fontResolver.addFont("C:/Windows/Fonts/simsun.ttc", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED); fontResolver.addFont("C:/Windows/Fonts/simhei.ttf", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED); fontResolver.addFont("C:/Windows/Fonts/simkai.ttf", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED); renderer.layout(); renderer.createPDF(os); os.close(); result = true; } catch (Exception e) { result = false; e.printStackTrace(); } }else{ result = false; } return result ;
}
再说一下碰到的问题:
1、现象:不出现任何问题,pdf文件也不生成。使用debug跟踪,跟踪到ITextRenderer renderer = new ITextRenderer();时就进入到乱起八糟的东西里边去了,F8直接结束debug依旧不报错也不生成文件。
解决办法:将catch中的Exception改成Throwable,再一执行,开始报错了。
报错:org.xhtmlrenderer.util.XRRuntimeException: Can't load the XML resource (using TRaX transformer). java.io.IOException: Stream closed。
解决:通过将Exception改成Throwable才出现错误应该就能猜到,是jar包出问题了。将系统中的iText的jar包改成iText-2.0.8.jar,据网上说flying saucer已经停止更新,可能在开发这个功能时用的是2.0.8的版本,而iText一直在更新且后面的版本不支持2.0.8中的这个功能。
2、报错:java.lang.NoSuchMethodError: com.lowagie.text.pdf.BaseFont.getCharBBox(C)[I
解决:解决方法同1,替换jar包,只能换成2.0.8的,因为其他版本的都没有这个方法。
3、报错:org.xhtmlrenderer.util.XRRuntimeException: Can't load the XML resource (using TRaX transformer). org.xml.sax.SAXParseException: The entity "nbsp" was referenced, but not declared.
解决:这个是我做测试的时候报的错,当时测试时html文件很简单,只有基本标签,如<html><head><body>等。解决办法办是为html添加声明,即:
将<html>替换成
<!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">
替换成别的版本的声明也行,我这个是因为css要求这样的声明,否则样式会出现问题。
4、报错:org.xhtmlrenderer.util.XRRuntimeException: Can't load the XML resource (using TRaX transformer). org.xml.sax.SAXParseException: The element type "meta" must be terminated by the matching end-tag "</meta>".
解决:说实话,这个问题我并没有碰到,因为我所有的标签都是结束了的,只是有些是使用简写,如<input />而不是<input></input>。之所以粘出来这个错误,因为我无法重现那个错误而他们两个报错的原因是一致的,都是因为标签没有结束。这个错误报的比较具体,有具体说到哪个标签,我测试时报的错比较迷糊,差不多就是说xml格式有问题,我查了下没发现问题,后来把所有的简写改成一对一对的标签才没有报错。由此可见,flying saucer对xml格式要求很严格。
5、现象:生成的pdf只显示数字和字母,不显示中文。
解决:网上大部分的解决办法都是说添加ITextFontResolver fontResolver = renderer.getFontResolver();fontResolver.addFont("C:/Windows/Fonts/SIMSUN.TTC", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);只有真正试过的人才知道,只加了这一句根本就没用,即便是本地确实有这个文件或者换成别的所谓”宋体“的文件还是没有用,还有一个关键点:body{font-family: SimSun;}
所以总结起来三个点:
a、在生成pdf的方法中添加代码:ITextFontResolver fontResolver = renderer.getFontResolver();fontResolver.addFont("C:/Windows/Fonts/SIMSUN.TTC", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
b、确保C:/Windows/Fonts/SIMSUN.TTC这个文件确实存在(服务器上存在就成),若不存在从别的地方拷一个过来。
c、在模板文件页面添加样式:body{font-family: SimSun;}(SimSun只能是这样子,不能改,改成别的就不认了)
存在的问题:中文的问题是解决了,但是html中字体样式会丢失,如html文件中原本有加粗的字,转成pdf之后不再有加粗的字。
6、现象:生成的pdf左侧有边框,右侧没有边框
解决:我这里用的是table布局,table有定义宽度,每个td都有定义宽度,先将td的宽度调小,然后将table的宽度调小,可能要调小好几次然后才能出右侧边框。
最后祝大家好运
PS:在这个过程中有碰到其他问题的可以给我留言,我弄个总得,以后别人碰到相同问题就不用再走冤枉路了,多谢多谢!
使用flying saucer将html文件转成PDF相关推荐
- gbq6的文件能转换成gbq5_PPT文件转换成PDF怎么转?这些方法能实现快速转换
PPT文件转换成PDF怎么转?我们在工作中经常会用到PPT幻灯片,很多PPT在使用过后也会转换成PDF格式文件再进行存档备份.PPT文件要怎么操作才能转换成PDF文件呢?如果文件数量很多,一份一份的转 ...
- java pdf 首页 缩略图_Java中将上传的文件首页生成缩略图(先将上传的文件转成pdf,然后将pdf转成jpg)...
1.首先将上传的非jpg,pdf格式的文件转成pdf,这个是采用OpenOffice进行转的,具体代码如下: private void officeToPdf(){ OpenOfficeConnect ...
- 和doc的区别怎么转换手机_如何把doc文件转换成PDF格式?高手告诉你应该这么做...
视频步骤: 知乎视频www.zhihu.com 有时候老师让交的实验报告文件格式必须为PDF格式,因为PDF与不同的操作系统和软件版本具有很好的兼容性,所以大多数人都喜欢将Word转换成PDF.但有 ...
- vs 如何将源文件转换成可执行文件_如何将图片文件转换成PDF文件?
小编的一个朋友是做室内设计的,大家都知道做室内设计或者其它一些关于设计方面的工作都少不了画图.他每天会画很多张图并且还会反复修改,非常麻烦.有的图会因为不小心鼠标或者键盘误点了,导致一些图的数据错误, ...
- sql文件转成json格式_10秒就能将任意格式的文件转成PDF,简单易操作,不学可别后悔...
为什么今天我们会谈到将其他常用格式的文件转成PDF呢?其中一个最重要的原因就是防止他人随意更改我们所做的文件,下面我们就针对常用格式文件转成PDF,这一问题来具体说说怎么操作. 一.PC端操作 1.o ...
- react在线浏览doc_如何把doc文件转换成PDF格式?教你一招秒实现
有时候老师让交的实验报告文件格式必须为PDF格式,因为PDF与不同的操作系统和软件版本具有很好的兼容性,所以大多数人都喜欢将Word转换成PDF.但有的同学的Word版本不能直接将doc文件转换成PD ...
- PHP 把ofd格式文件转PDF,打开OFD格式文件及将OFD格式文件转换成PDF文件
今天收到一张浙江开具的ofd格式发票,便在网上找相关的软件来打开方便打印出来给财务做账,但是找了一大圈没有解决方案,有些收费的解决方法,大部分所谓的OFD软件是骗人的,下载安装后根本打不开OFD格式的 ...
- Acrobat如何将word文件转换成pdf格式
很多朋友电脑装了Adobe Acrobat,却不知道Acrobat如何将word文件转换成pdf格式,现在就给大家讲解一下.比如,我们电脑安装Adobe Acrobat Professional 7 ...
- 用手机把纸质文件扫描成pdf的方法分享,不能错过哦。
用手机把纸质文件扫描成pdf的方法分享!相信很多小伙伴日常在处理文件的时候,碰到的纸质文件还是非常多的,而且经常会需要我们将纸质的文件转换成电子文件,这时候重新开始写或者重新制作显然是不太现实的,当然 ...
最新文章
- Python知识点1——基础
- C语言实现encode和decode
- 【前端开发系列】—— CSS3属性选择器总结
- 魔兽争霸3地图(WarIII Maps):三国猛兽传
- ​第二十四章:皮衣大卖
- 利用SmsManager发送短信
- VC++如何根据进程名获取进程ID
- 双进程的扩展双屏软件的快捷键的设计和使用说明
- Altium designer 原理图转换为pcb时出现的 unknown pin 和 failed to add class member
- 【IIOT】欧姆龙PLC数采之CP2E
- 【java】this()与super()使用详解
- YouTube直播SDK集成(一)
- w ndows系统启动日志ID,WIN7日志总能看到 特殊登陆 事件ID 4672,是怎么回事?
- Redmi AirDots只有一边有声音?? 如何进行双耳连接?
- 西门子200系列PLC通信编程指令讲解
- 下一代图像压缩格式科普---HEIF 与AVIF格式
- centos6 安装 nscd 清除DNS缓存
- 天翼云对象存储android实现,对象存储基础介绍(华为云、腾讯云、天翼云都提供对象存储服务)...
- A1010——Radix(好多测试点…)
- python语言中有哪些函数_Python语言中的函数
热门文章
- Python爬虫-国家企业信用信息公示系统App
- edge搁置标签页_如何自定义Microsoft Edge的新标签页
- java统计每个单词单词出现的次数_Java统计英文句子中出现次数最多的单词并计算出现次数的方法...
- 万豪 数据泄露 sql注入_如何防止数据库泄漏和注入
- Qt GUI图形图像开发之QT表格控件QTableView详细使用方法与实例
- w7提示无法关闭计算机,番茄花园windows7关闭电脑关机时提示强制关闭程序怎么办...
- 』 [大话IT]我编的计算机基础教材,大家批判批判
- 算法整理(二)---快速排序的两种实现方式:双边扫描和单边扫描
- 从个人软件到企业软件
- 自学前端第一天:认识前端工程与网页