使用flying saucer生成PDF文件之前,先要使用freemarker生成html文件,然后将html文件转成pdf。生成html文件的东东网上一搜一大堆,大家找找就成。
当然“使用flying saucer将html文件转成PDF“的东东网上也是一搜一大堆,所以我这篇主要不是讲怎么生成,而是记载一路走来碰到的各种奇葩问题。
还是上一下转成pdf文件的方法吧,可能以后有用:
/** * 该方法用来将指定的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:在这个过程中有碰到其他问题的可以给我留言,我弄个总得,以后别人碰到相同问题就不用再走冤枉路了,多谢多谢!
相关推荐
4. 使用FlyingSaucer将HTML文档转换为PDF文档。 六、技术点总结 本方案中涉及到的技术点包括: * Freemarker模板引擎:用于生成HTML模板。 * FlyingSaucer PDF生成:用于将HTML文档转换为PDF文档。 * SpringBoot...
以下是如何使用`Flyingsaucer`将包含中文的HTML转换为PDF的步骤: 1. **添加依赖**:首先,你需要在项目中引入`Flyingsaucer`和`iText`的依赖。对于Java项目,这通常是在`pom.xml`(Maven)或`build.gradle`...
4. **PDF生成**:flying saucer生成的页面流通过iText处理,将其转换成符合PDF规范的文档。iText可以控制PDF的元数据、页面大小、安全设置等。 5. **输出与保存**:最后,生成的PDF文件可以被保存在本地、发送到...
Flyingsaucer的核心在于它使用了开源的Web渲染引擎IText,它能够解析HTML并将其转化为高质量的PDF文档。通过这个工具,我们可以将网页设计精确地复刻到PDF中,包括字体、颜色、图像、表格等元素。这为开发者提供了一...
这个示例可能演示了如何配置和调用flying-saucer服务,以及如何将Freemarker模板渲染成HTML,最终生成PDF。通过分析源代码,我们可以学习如何在实际项目中整合这些技术。 总的来说,flying-saucer是一个强大而灵活...
`flying-saucer-pdf`支持嵌入字体,可以在转换时指定包含中文字符的字体文件,如Arial Unicode MS或SimSun。 2. 在HTML或CSS中设置字体-family属性,确保优先使用支持中文的字体。 3. 如果是服务器端转换,确保...
在这个主题中,我们将深入探讨如何使用Flying Saucer进行HTML到PDF的转换,并解决可能出现的问题。 首先,Flying Saucer基于XHTML,因此在转化前,确保你的HTML代码是符合XHTML标准的。如果HTML代码包含不合法的...
- **PDF文件生成**: FlyingSaucer支持将文档输出为PDF格式。 - **字体控制**: 用户可以根据需要添加自定义字体或指定特定编码下的字体。 - **页面尺寸设置**: 可以自由控制生成PDF文档的页面大小。 - **页边距调整**...
将这个新jar包集成到你的项目中,可以确保在使用Flying Saucer将网页转换为PDF时,中文内容能够正确显示。 总的来说,解决"Flying Saucer的中文不显示问题"是一个涉及字符编码配置和字体资源管理的过程。通过修改...
Flying Saucer是一个开源Java库,专门用于将HTML文档转换为PDF格式。这个API因其易于使用和功能强大而受到开发者的欢迎。在本文中,我们将深入探讨Flying Saucer的核心概念、工作原理以及如何在实际项目中应用它。 ...
接着,`flyingSaucer` 使用`IText`将这个DOM转换为PDF格式,确保所有的样式、图像和文本都被正确地保留下来。 ### 功能特性 1. **HTML支持**:`flyingSaucer` 支持HTML5,CSS2.1和部分CSS3,这意味着它可以处理...
"Flying-Saucer"是一个开源Java库,主要用于将HTML内容转换为PDF格式,方便进行电子文档的生成和分发。这个库包含了多个组件,每个组件都有特定的功能,以协同完成HTML到PDF的转换过程。在提供的信息中,我们提到了...
Flying Saucer 支持中文宋体win,Linux; Css 页面字体修改为 font-family:STSong; 就可以了,具体
本实例将深入探讨如何利用Flying Saucer生成PDF,并解决其中遇到的中文显示问题。 首先,Flying Saucer基于IText库,IText是一款强大的PDF处理工具,它提供了丰富的API用于创建、修改和处理PDF文档。Flying Saucer...
《使用Flyingsaucer与iText生成PDF:技术解析与实践指南》 在现代的IT行业中,HTML到PDF的转换已经成为一种常见的需求,无论是为了打印、归档还是提供离线阅读,这种转换都能极大地提高效率。Flyingsaucer和iText...
在IT行业中,将HTML文件转换为PDF是一种常见的需求,特别是在文档生成、报表导出或电子签名应用中。Java提供了一些库来实现这个功能,同时还能支持在生成的PDF上添加图像,例如电子印章。以下是对这个主题的详细阐述...
Flying Saucer与iText结合使用时,可以将HTML内容通过Flying Saucer渲染成PDF,特别适合于从Web应用中生成PDF报告。 在“iText+Flying Saucer生成pdf文档jar包(修改后的)”这个描述中,"修改后的"可能指的是...
Flying-Saucer是一款开源的Java库,主要用于将HTML、CSS以及Office文档转换成高质量的PDF格式。这个jar包集合包含了几个关键的组件,使得开发者能够更便捷地进行文档转换操作。下面将详细介绍这些组件和它们的功能,...