最近在工作中遇到了一个很囧的事情。要把HTML页面转换成PDF或者tiff图片等其他形式,目前tiff还是一头雾水,如果各位大师有真的可行的想法(不要是别人那边抄的,百度最近搜索的质量严重的打击了我对国货的信心。)希望能够告诉我,先谢了。
言归正传。所以,我就做了把HTML转换成PDF的形式。目前可以完美支持一比一转换,下面就把我的解决方案贴出来。
首先,当然是找到能够解析PDF的完美组件,百度和谷歌不约而同的告诉我们。IText是王道。而目前开源的组件中,Itext的确是一个First Choice,如果各位单纯是做把图片转成PDF或者自己写了Velocity或者FreeMarker模板生成了HTML是非常推荐直接用Itext来进行的。而如果,大家像我这样已经有前人写好了HTML页面或者懒得写FreeMarker模板的话。可以直接看下一段。
由于他们已经写好了HTML页面,而且显示已经很完美了。那我要做的就是能完美解析HTML+CSS的PDF生成工具。这时候flying-saucer进入了我的选择范围中。
http://code.google.com/p/flying-saucer/
上面是网址,这个工具托管在GoogleCode上面,作者做他们能够做下面的工作:
Flying Saucer takes XML or XHTML and applies CSS 2.1-compliant stylesheets to it, in order to render to PDF (via iText), images, and on-screen using Swing or SWT。
不难看出工作原理,就是解析XML或者XHTML并且包括css样式表,并且用Swing或者SWT的组件生成PDF的功能。这解决了页面的显示问题。IText自身的一个很严重的问题就是解析CSS有很大的问题。而这个解决了。下面就是用Flying Saucer来实现的代码:
?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public boolean convertHtmlToPdf(String inputFile, String outputFile)
throws Exception {
OutputStream os = new FileOutputStream(outputFile);
ITextRenderer renderer = new ITextRenderer();
String url = new File(inputFile).toURI().toURL().toString();
renderer.setDocument(url);
// 解决中文支持问题
ITextFontResolver fontResolver = renderer.getFontResolver();
fontResolver.addFont("C:/Windows/Fonts/SIMSUN.TTC", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
//解决图片的相对路径问题
renderer.getSharedContext().setBaseURL("file:/D:/");
renderer.layout();
renderer.createPDF(os);
os.flush();
os.close();
return true;
}
上面这段代码是这样的,输入一个HTML地址URL = inputFile,输入一个要输出的地址,就可以在输出的PDF地址中生成这个PDF。
注意事项:
1.输入的HTML页面必须是标准的XHTML页面。页面的顶上必须是这样的格式:
?
1
2
<!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">
并且HTML页面的语法必须是非常严谨的,所有标签都必须闭合等等(由于flying-Saucer做了XML解析的工作,不严谨会报错的。),这是对页面的第一个要求。
2.要用到图片的地方写相对路径的形式,比如:
?
1
<img src="a.jpg" alt="323" width="252" height="80" />
而它的图片位置则必须在Java代码中指定。
renderer.getSharedContext().setBaseURL("file:/D:/");
也有另一种方法就是直接在<img>标签中写绝对路径。
3.Flying-Saucer在解析tiff格式的图片的时候会报错。具体原因我还没找到。希望大家能够指点我。
4.如果在页面中有中文字体的话。必须在HTML代码中的样式中写上某种字体的css,并且必须是用英文的,然后在Java代码中写上对应的文件位置。
ITextFontResolver fontResolver = renderer.getFontResolver();
fontResolver.addFont("C:/Windows/Fonts/SIMSUN.TTC", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
上面的方法是添加了宋体。也可以添加其他字体。
以上就是解决方案。
分享到:
相关推荐
pdf24 tools是由德国Geek Software公司开发的一款优秀实用且完全免费的PDF工具箱软件,PDF24工具箱包含PDF分割/合并、PDF压缩、PDF编辑器、PDF加密/解密、PDF页面/图像提取、PDF比较、PDF转换、添加PDF水印等多种...
PDFRenderer是一种Java库,用于将PDF文档渲染成位图图像,以便在应用程序中显示或处理。这个技术在Java Swing环境中特别有用,因为它允许开发者在GUI组件,如JFrame,中展示PDF内容。以下是对“PDFRenderer显示PDF...
众所周知PDF文档是大家工作学习中非常常用的一种文档格式,pdf文件是通过虚拟打印各种文件生成的二进制编码格式,由于大部分PDF数据是经过压缩的,使用文本编辑器编辑PDF文件会导致文件损坏或数据偏移,或者在网络...
PDFLib 是一个强大的库,专为开发者设计,用于在各种应用程序中生成、修改和操作PDF文档。这个压缩包包含了一些关键组件,使C++程序员能够轻松地集成PDF处理功能到他们的项目中。以下是对这些组件的详细解释: 1. `...
PDFLIB库是一个强大的C++库,专为生成高质量的PDF文档而设计。它提供了一组丰富的API函数,允许程序员在C++应用程序中直接创建、修改和处理PDF文档。本篇文章将深入探讨如何利用PDFLIB库在C++环境中构建PDF文件。 ...
在Vue.js应用中,预览PDF文件流是一个常见的需求,特别是在处理在线文档或者需要展示PDF内容的场景下。`vue-pdf`是一个强大的插件,它允许我们在Vue组件中轻松地集成PDF预览功能。这个插件是基于PDF.js库构建的,PDF...
标题 "PB数据窗口导出PDF并且合并到一个PDF文件中" 涉及的主要知识点是使用PowerBuilder(PB)这个编程工具,对数据窗口对象进行操作,并将结果以PDF格式导出,最后实现多个PDF文件的合并。在这个过程中,我们不仅...
自己写的 spire.pdf 简单的demo ,有一些基础的使用方法,对刚接触的小伙伴会非常友善; 里面主要包含: 1.去除水印; 2.获取每页pdf的图片; 3.获取书签; 4.读取pdf将pdf转化为文字,最后由txt文件保存; 5....
在Android开发中,有时我们需要在应用中展示PDF文件,但默认的WebView组件并不支持直接打开PDF,这使得开发者需要寻找其他解决方案。"pdfview打开pdf文件,避免android无法通过webview打开pdf文件"这个主题正是关注...
PDF文件格式在IT行业中广泛应用,尤其在文档分享和电子出版领域。`pdfview.ocx`控件是专门用于处理PDF文件的一种组件,它允许开发者在应用程序中集成PDF阅读和操作功能,比如在C#和Wpf这样的环境中。在这个场景中,`...
从文档属性的基本操作到创建您自己的 PDF 查看器和 PDF 编辑器,这款软件满足您的所有需求。 Quick PDF Library 是一款供 PDF 开发人员使用的 SDK,功能强大、无需版税,其中包括超过500个函数,可用于 Delphi、C、...
Java PDF文件处理是一个重要的领域,尤其在开发企业级应用时,常常需要对PDF文档进行创建、编辑、转换或渲染等操作。Aspose.PDF是一款强大的Java库,它为开发者提供了全面的API,使得处理PDF文档变得简单高效。在这...
在Android平台上,生成和读取PDF文件是一项常见的需求,特别是在数据导出、报告生成或文档共享等场景。iText是一个强大的开源库,它允许开发者在Java和.NET环境中创建、编辑和处理PDF文档。在这个场景中,我们将探讨...
在这些应用中,有时我们需要集成PDF阅读功能,以便用户能够查看或交互与PDF文档。这就是“Unity读取PDF插件PDFRenderer”发挥作用的地方。 PDFRenderer插件是一个专门针对Unity开发的工具,它允许开发者在Unity环境...
用途:根据PDF模板生成PDF文件,将数据库查询的数据插入到模板指定未知,然后生成新的PDF文件 原理: 代码说明:exprotPDF_Main 为主文件。调用了outpdf1的两个文件的方法。outpdf1里的方法,是通过outpdf2345678这...
PDF.js和PDF.Worker.js是Mozilla开发的开源库,用于在Web浏览器中渲染PDF文档,无需依赖任何插件。这两个JavaScript文件是实现HTML页面加载和显示PDF的关键组件,提供了纯JavaScript解决方案来处理PDF文档。 PDF.js...
PDF.js是一个开源JavaScript库,由Mozilla开发,用于在Web浏览器中渲染PDF文档,无需依赖任何插件。这个库的目标是提供一个与平台和浏览器无关的解决方案,使得用户可以在任何支持HTML5的浏览器上查看PDF文件。本文...
在.NET环境中,C#开发人员经常需要处理PDF文档,包括生成PDF、读取PDF文本以及提取PDF中的图像。为了实现这些功能,通常会借助于第三方库或DLL,因为.NET框架本身并不内置完整的PDF处理能力。本教程将详细介绍如何...
在IT行业中,PDF(Portable Document Format)是一种广泛使用的文件格式,用于存储和交换文档。有时候我们需要将PDF文档打印出来,特别是在商业环境中。然而,有些打印工具可能会遇到页数限制的问题,这在处理大量...
PDF.js是Mozilla开发的一个开源项目,它允许开发者使用纯JavaScript在Web浏览器中渲染PDF文档,无需依赖任何插件。这个Demo展示了如何利用PDF.js库实现PDF在线预览和打印功能,同时还提供了页面缩放和打开本地PDF...