`

使用flying saucer将html文件转成PDF

    博客分类:
  • Java
阅读更多

使用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:在这个过程中有碰到其他问题的可以给我留言,我弄个总得,以后别人碰到相同问题就不用再走冤枉路了,多谢多谢!

分享到:
评论

相关推荐

    SpringBoot集成Freemarker+FlyingSaucer实现pdf在线预览.pdf

    4. 使用FlyingSaucer将HTML文档转换为PDF文档。 六、技术点总结 本方案中涉及到的技术点包括: * Freemarker模板引擎:用于生成HTML模板。 * FlyingSaucer PDF生成:用于将HTML文档转换为PDF文档。 * SpringBoot...

    flyingsaucer转html为PDF(中文可用)

    以下是如何使用`Flyingsaucer`将包含中文的HTML转换为PDF的步骤: 1. **添加依赖**:首先,你需要在项目中引入`Flyingsaucer`和`iText`的依赖。对于Java项目,这通常是在`pom.xml`(Maven)或`build.gradle`...

    用flying saucer将html生成pdf的例子

    4. **PDF生成**:flying saucer生成的页面流通过iText处理,将其转换成符合PDF规范的文档。iText可以控制PDF的元数据、页面大小、安全设置等。 5. **输出与保存**:最后,生成的PDF文件可以被保存在本地、发送到...

    Flying Saucer实现html转pdf(一些问题,持续更新)

    本文将深入探讨如何使用Flying Saucer实现HTML到PDF的转换,并解决可能遇到的一些问题。 首先,让我们了解Flying Saucer的基本原理。它基于开源的Web浏览器引擎Itext,可以解析HTML、CSS,并将其渲染为PDF。 Flying...

    flying-saucer生成pdf

    这个示例可能演示了如何配置和调用flying-saucer服务,以及如何将Freemarker模板渲染成HTML,最终生成PDF。通过分析源代码,我们可以学习如何在实际项目中整合这些技术。 总的来说,flying-saucer是一个强大而灵活...

    flyingsaucer html转pdf demo

    Flyingsaucer的核心在于它使用了开源的Web渲染引擎IText,它能够解析HTML并将其转化为高质量的PDF文档。通过这个工具,我们可以将网页设计精确地复刻到PDF中,包括字体、颜色、图像、表格等元素。这为开发者提供了一...

    flying-saucer-pdf 生成pdf解决图片问题 解决中文问题

    `flying-saucer-pdf`支持嵌入字体,可以在转换时指定包含中文字符的字体文件,如Arial Unicode MS或SimSun。 2. 在HTML或CSS中设置字体-family属性,确保优先使用支持中文的字体。 3. 如果是服务器端转换,确保...

    flyingsaucer指导文档

    - **PDF文件生成**: FlyingSaucer支持将文档输出为PDF格式。 - **字体控制**: 用户可以根据需要添加自定义字体或指定特定编码下的字体。 - **页面尺寸设置**: 可以自由控制生成PDF文档的页面大小。 - **页边距调整**...

    flying saucer的中文不显示问题(修改源码后重新打的jar包)

    将这个新jar包集成到你的项目中,可以确保在使用Flying Saucer将网页转换为PDF时,中文内容能够正确显示。 总的来说,解决"Flying Saucer的中文不显示问题"是一个涉及字符编码配置和字体资源管理的过程。通过修改...

    Flying Saucer ,简单实用的pdf转换api

    Flying Saucer是一个开源Java库,专门用于将HTML文档转换为PDF格式。这个API因其易于使用和功能强大而受到开发者的欢迎。在本文中,我们将深入探讨Flying Saucer的核心概念、工作原理以及如何在实际项目中应用它。 ...

    flyingSaucer.jar

    接着,`flyingSaucer` 使用`IText`将这个DOM转换为PDF格式,确保所有的样式、图像和文本都被正确地保留下来。 ### 功能特性 1. **HTML支持**:`flyingSaucer` 支持HTML5,CSS2.1和部分CSS3,这意味着它可以处理...

    Flying Saucer 支持中文宋体win,Linux,直接使用

    Flying Saucer 支持中文宋体win,Linux; Css 页面字体修改为 font-family:STSong; 就可以了,具体

    flying-saucer jar包下载

    "Flying-Saucer"是一个开源Java库,主要用于将HTML内容转换为PDF格式,方便进行电子文档的生成和分发。这个库包含了多个组件,每个组件都有特定的功能,以协同完成HTML到PDF的转换过程。在提供的信息中,我们提到了...

    利用flying saucer 生成Pdf的例子

    本实例将深入探讨如何利用Flying Saucer生成PDF,并解决其中遇到的中文显示问题。 首先,Flying Saucer基于IText库,IText是一款强大的PDF处理工具,它提供了丰富的API用于创建、修改和处理PDF文档。Flying Saucer...

    flyingsaucer-R8.zip

    《使用Flyingsaucer与iText生成PDF:技术解析与实践指南》 在现代的IT行业中,HTML到PDF的转换已经成为一种常见的需求,无论是为了打印、归档还是提供离线阅读,这种转换都能极大地提高效率。Flyingsaucer和iText...

    java实现将html转pdf,并在指定位置添加印章

    在IT行业中,将HTML文件转换为PDF是一种常见的需求,特别是在文档生成、报表导出或电子签名应用中。Java提供了一些库来实现这个功能,同时还能支持在生成的PDF上添加图像,例如电子印章。以下是对这个主题的详细阐述...

    iText+Flying Saucer生成pdf文档所需要的jar包

    Flying Saucer与iText结合使用时,可以将HTML内容通过Flying Saucer渲染成PDF,特别适合于从Web应用中生成PDF报告。 在“iText+Flying Saucer生成pdf文档jar包(修改后的)”这个描述中,"修改后的"可能指的是...

    Flying-Saucer jar包

    Flying-Saucer是一款开源的Java库,主要用于将HTML、CSS以及Office文档转换成高质量的PDF格式。这个jar包集合包含了几个关键的组件,使得开发者能够更便捷地进行文档转换操作。下面将详细介绍这些组件和它们的功能,...

Global site tag (gtag.js) - Google Analytics