`
huangronaldo
  • 浏览: 220549 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

Java HTML直接导出PDF

阅读更多

Java  HTML直接导出PDF

对于java中如何从html中直接导出pdf,有很多的开源代码,这里个人用itext转。

首先需要的包有:core-renderer-1.0.jar

core-renderer-R8pre1.jar

core-renderer.jar

iText-2.0.8.jar

jtidy-4aug2000r7-dev.jar

Tidy.jar

iTextAsian.jar

java代码的话就比较简单了。具体是先用Tidy将html转换为xhtml,将xhtml转换为其它各种格式的。虽然在转化到pdf时也是用的iText。代码如下:

	//struts1.x中
else if("Html2Pdf".equalsIgnoreCase(action)){
	exportPdfFile("http://localhost:8080/jsp/test.jsp");
	return null;
}

// 导出pdf add by huangt 2012.6.1
	public File exportPdfFile(String urlStr) throws BaseException {
		// String outputFile = this.fileRoot + "/" +
		// ServiceConstants.DIR_PUBINFO_EXPORT + "/" + getFileName() + ".pdf";
		String outputFile = "d:/test3.pdf";
		OutputStream os;
		try {
			os = new FileOutputStream(outputFile);

			ITextRenderer renderer = new ITextRenderer();

			String str = getHtmlFile(urlStr);
			renderer.setDocumentFromString(str);
			ITextFontResolver fontResolver = renderer.getFontResolver();
			
			fontResolver.addFont("C:/WINDOWS/Fonts/SimSun.ttc",BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);// 宋体字
			fontResolver.addFont("C:/WINDOWS/Fonts/Arial.ttf",BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);// 宋体字
			renderer.layout();

			renderer.createPDF(os);

			System.out.println("转换成功!");
			os.flush();
			os.close();
			return new File(outputFile);
		} catch (FileNotFoundException e) {
			// logger.error("不存在文件!" + e.getMessage());
			throw new BaseException(e);
		} catch (DocumentException e) {
			// logger.error("生成pdf时出错了!" + e.getMessage());
			throw new BaseException(e);
		} catch (IOException e) {
			// logger.error("pdf出错了!" + e.getMessage());
			throw new BaseException(e);
		}

	}

	// 读取页面内容 add by huangt 2012.6.1
	public String getHtmlFile(String urlStr) throws BaseException {
		URL url;
		try {
			if (urlStr.indexOf("?") != -1) {
				urlStr = urlStr + "&locale="
						+ LocaleContextHolder.getLocale().toString();
			} else {
				urlStr = urlStr + "?locale="
						+ LocaleContextHolder.getLocale().toString();
			}
			url = new URL(urlStr);

			URLConnection uc = url.openConnection();
			InputStream is = uc.getInputStream();
			
			Tidy tidy = new Tidy();

			OutputStream os2 = new ByteArrayOutputStream();
			tidy.setXHTML(true); // 设定输出为xhtml(还可以输出为xml)
			tidy.setCharEncoding(Configuration.UTF8); // 设定编码以正常转换中文
			tidy.setTidyMark(false); // 不设置它会在输出的文件中给加条meta信息
			tidy.setXmlPi(true); // 让它加上<?xml version="1.0"?>
			tidy.setIndentContent(true); // 缩进,可以省略,只是让格式看起来漂亮一些
			tidy.parse(is, os2);

			is.close();

			// 解决乱码 --将转换后的输出流重新读取改变编码
			String temp;
			StringBuffer sb = new StringBuffer();
			BufferedReader in = new BufferedReader(new InputStreamReader(
					new ByteArrayInputStream(
							((ByteArrayOutputStream) os2).toByteArray()),
					"utf-8"));
			while ((temp = in.readLine()) != null) {
				sb.append(temp);
			}

			return sb.toString();
		} catch (IOException e) {
			// logger.error("读取客户端网页文本信息时出错了" + e.getMessage());
			throw new BaseException(e);
		}

	}

 

为了解决包的问题,加上Maven <!-- pdf导出 -->

			<dependency>
				<groupId>com.lowagie</groupId>
				<artifactId>itext</artifactId>
				<version>2.1.7</version>
			</dependency>
			<dependency>
				<groupId>org.xhtmlrenderer.flyingsaucer</groupId>
				<artifactId>pdf-renderer</artifactId>
				<version>1.0</version>
			</dependency>
			<dependency>
				<groupId>jtidy</groupId>
				<artifactId>jtidy</artifactId>
				<version>4aug2000r7-dev</version>
				<type>jar</type>
				<scope>compile</scope>
			</dependency>
			<dependency>
				<groupId>net.sf.barcode4j</groupId>
				<artifactId>barcode4j-light</artifactId>
				<version>2.0</version>
			</dependency>
			<dependency>
				<groupId>avalon-framework</groupId>
				<artifactId>avalon-framework-impl</artifactId>
				<version>4.2.0</version>
			</dependency>
			<!-- pdf -->
 

另外附上 稍微复杂的PDFUtils.java文件,由于没时间就不做整理解释了!见下载附件!

 

  • Tidy.jar (133.7 KB)
  • 下载次数: 1505
分享到:
评论
28 楼 哇哈哈1 2017-04-11  
楼主 你好  看了你的文章顿时收益颇深   可以提问吗?

html转pdf的时候如果html过大  怎么让pdf分页?
27 楼 大海你好 2016-07-15  
错误:“Stream closed”楼主,没找到哪里有哦错
26 楼 微站题 2016-01-20  
能给我发下jar包吗,有3个没有下载到 297196894@qq.com   先谢谢了
25 楼 yuwei35kd 2014-11-06  
PDFUtil.java中有的类引用不到
24 楼 liuning_89 2014-04-10  
515244259@qq.com 求例子
23 楼 衞酆夼 2014-04-07  
楼主,能发个例子看看嘛,谢谢啦,2833297668@qq.com
22 楼 lezi2012 2014-02-17  
建议使用 wkhtmltopdf  这个工具,google 代码上有下载,效果要好的多
21 楼 lkx9020 2013-12-30  
楼主能将这个程序的源码发给我吗?745135430@qq.com,谢谢
20 楼 kingboyguo 2013-09-01  
能把这个项目发给我吗,非常感谢。276399697@qq.com
19 楼 zy3zzz3yyy 2013-08-30  
您好!感觉非常给力,能把一个比较完整的例子发给我吗?非常感谢!1627628543@qq.com
18 楼 lijunxijava 2013-08-05  
您好,能把完整例子发给我一下参考吗,谢谢!871483756@qq.com
17 楼 89402437 2013-05-23  
能把完整例子发给我下吗,谢谢!352deqyiyt@163.com
使用这个例子不能改善text-align: right;的问题
16 楼 lku1314 2013-04-24  
lz  请问documentException 是在那个包啊 ? 我换了几个 core-renderer.jar 都是缺失这个

这个异常
15 楼 daichangfu 2013-04-07  
不能用啊。不显示中文。
14 楼 huangronaldo 2013-02-25  
hyk821 写道
楼主 能发下该项目给我吗?723427671@qq.com


项目 很大,耦合了很多很多 业务逻辑, 很难分离出来 。不好意思了
13 楼 hyk821 2013-01-23  
楼主 能发下该项目给我吗?723427671@qq.com
12 楼 huangronaldo 2012-10-30  
dxl525183697 写道
问一下,为什么我的 程序里renderer没有setDocumentFromString(str);方法,是不是依赖包的问题,问题是我的依赖包都是从这边下的

如果没有有这个方法的话,是renderer这个包有问题
可另外下载
11 楼 dxl525183697 2012-10-25  
问一下,为什么我的 程序里renderer没有setDocumentFromString(str);方法,是不是依赖包的问题,问题是我的依赖包都是从这边下的
10 楼 cctvcctv127 2012-10-17  
我也要  发我cctv----127@163.com上 非常感谢
9 楼 mazheng34340237 2012-09-23  
我也要 工程,34340237@QQ.com  非常感谢

相关推荐

Global site tag (gtag.js) - Google Analytics