论坛首页 Java企业应用论坛

介绍一个PDF的生成方案

浏览 150937 次
该帖已经被评为良好帖
作者 正文
   发表时间:2009-11-26   最后修改:2009-11-26
为什么我在测试的时候始终会报一个找不到匹配的方法的异常
代码如下
package test;

import java.io.FileOutputStream;
import java.io.OutputStream;

import org.xhtmlrenderer.pdf.ITextRenderer;

public class PdfGenerate {
	public static void main(String[] args) throws Exception {
		String outputFile = "c:/firstdoc.pdf";
		OutputStream os = new FileOutputStream(outputFile);
		ITextRenderer renderer = new ITextRenderer();

		String html = "<html><head><meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" /></head><body><p>你好啊!</p><p>这里加入图片</p><p><img src=\"ww.jpg\" width=\"139\" height=\"102\" /></p><p><img src=\"ww.jpg\" width=\"140\" height=\"95\" /></p><p>测试而已!</p><p>hello the world~</p></body></html>";

		renderer.setDocumentFromString(html);

		// 解决图片的相对路径问题
		renderer.getSharedContext().setBaseURL("file:/c:/");

		renderer.layout();
		renderer.createPDF(os);

		os.close();
		System.out.println("生成成功!");
	}
}




在使用Itext.jar时,jar包网上下的,版本应该是2.0.x,报的异常如下
Exception in thread "main" java.lang.NoSuchMethodError: com.lowagie.text.pdf.BaseFont.getHeight()F



把Itext的jar包换成了2.1.7的之后,异常如下
Exception in thread "main" java.lang.NoSuchMethodError: com.lowagie.text.pdf.BaseFont.getCharBBox(C)[I
	at org.xhtmlrenderer.pdf.ITextFontResolver$FontDescription.setMetricDefaults(ITextFontResolver.java:679)
	at org.xhtmlrenderer.pdf.ITextFontResolver$FontDescription.<init>(ITextFontResolver.java:610)
	at org.xhtmlrenderer.pdf.ITextFontResolver.addCourier(ITextFontResolver.java:410)
	at org.xhtmlrenderer.pdf.ITextFontResolver.createInitialFontMap(ITextFontResolver.java:390)
	at org.xhtmlrenderer.pdf.ITextFontResolver.<init>(ITextFontResolver.java:52)
	at org.xhtmlrenderer.pdf.ITextRenderer.<init>(ITextRenderer.java:115)
	at org.xhtmlrenderer.pdf.ITextRenderer.<init>(ITextRenderer.java:102)
	at test.PdfGenerate.main(PdfGenerate.java:12)


0 请登录后投票
   发表时间:2009-11-27   最后修改:2009-11-27
itext2.1.7的这个方法是public int[] getCharBBox(int c) ;而2.0.8的是public int[] getCharBBox(char c) ,我用2.0.8的是没有问题的
另外,downpour,中文那个问题怎么解决啊?我被它源码里那个递归搞得头晕死掉了,搞不明白了
0 请登录后投票
   发表时间:2009-12-04   最后修改:2009-12-05
中文换行问题解决了,这东西源码里面是将英文按空格分组,每组判断其位置+长度是否超出边界,超出的话将该组丢到下一行,但是中文里面基本没有空格,所以就无奈了。
将其源码改了改,如果是中文,每字一组,如果是英文,还是按照空格分组,这样大概效率会受一些影响,不过好歹是可以用了,而且一般pdf生成我想应该也不会放在需要大访问量的地方吧。附件是打好包的jar,覆盖就可以了
1 请登录后投票
   发表时间:2009-12-12  
yye_javaeye 写道
中文换行问题解决了,这东西源码里面是将英文按空格分组,每组判断其位置+长度是否超出边界,超出的话将该组丢到下一行,但是中文里面基本没有空格,所以就无奈了。
将其源码改了改,如果是中文,每字一组,如果是英文,还是按照空格分组,这样大概效率会受一些影响,不过好歹是可以用了,而且一般pdf生成我想应该也不会放在需要大访问量的地方吧。附件是打好包的jar,覆盖就可以了


我用的你的包,可是不管用啊。全是中文,仍然没有换行。。
0 请登录后投票
   发表时间:2009-12-13  
?怎么会?我用的是挺好的啊,效果看附件
  • 大小: 41.4 KB
0 请登录后投票
   发表时间:2009-12-13  
yye_javaeye 写道
?怎么会?我用的是挺好的啊,效果看附件


帅哥,你不要光给我们一个jar包行吗?告诉我们一下,你改的哪个类,哪个方法,顺便把代码贴一下。谢谢啦。
0 请登录后投票
   发表时间:2009-12-13  
楼上的包我试过,加了一个 isChinese 的方法, 对于符合 xhtml语言的 DIV+CSS 样式的还是挺支持的,但对于不被推荐的<table><tr><td> 中的 中文字符貌似支持不了分行。详情见附件。
  • 大小: 20.3 KB
0 请登录后投票
   发表时间:2009-12-13   最后修改:2009-12-13
最近要做一个 html的PDF打印的工作,看到了这篇文章,一直也在试图用flying saucer 的方案来实现。在整个过程中,遇到了很多困难,感觉flying saucer 本身在服务器端的解析能力,与浏览器通过http协议的解析能力还有很多的不足。 例如, 缩印,再例如,显示背景图片,再例如,对<table><tr><td>的支持,再例如对 <jsp:include/>,frame的支持(试过@include 语法,原来以为支持,结果也不支持。 难道只能渲染现有代码? )。 不知道大家在使用时感觉什么样。 之前我们曾使用过 客户端的小开源软件,pdf creator。 这个对客户端html的PDF解析相当有效。 美中不足的就是依赖于客户端的安装。 好好的瘦客户端变成胖客户端也有点不好。。。 唉~~~~~
0 请登录后投票
   发表时间:2009-12-13  
l116116116 写道
最近要做一个 html的PDF打印的工作,看到了这篇文章,一直也在试图用flying saucer 的方案来实现。在整个过程中,遇到了很多困难,感觉flying saucer 本身在服务器端的解析能力,与浏览器通过http协议的解析能力还有很多的不足。 例如, 缩印,再例如,显示背景图片,再例如,对<table><tr><td>的支持,再例如对 <jsp:include/>,frame的支持(试过@include 语法,原来以为支持,结果也不支持。 难道只能渲染现有代码? )。 不知道大家在使用时感觉什么样。 之前我们曾使用过 客户端的小开源软件,pdf creator。 这个对客户端html的PDF解析相当有效。 美中不足的就是依赖于客户端的安装。 好好的瘦客户端变成胖客户端也有点不好。。。 唉~~~~~


我认为你这种试图使用JSP来渲染PDF的方式本身就和flying saucer的初衷不同。

Flying sauser的目标是能够解析基于HTML+CSS的plain text,并将之结构化成iText可识别的API调用。所以,你要做的,是把最终需要展现在PDF中的东西,用HTML+CSS表达出来,而不是传入给Flying sauser一个JSP文件。

所以我的看法是,Freemarker或者Velocity的模板才是使用Flying sauser的最佳实践。
0 请登录后投票
   发表时间:2009-12-14  
l116116116 写道
楼上的包我试过,加了一个 isChinese 的方法, 对于符合 xhtml语言的 DIV+CSS 样式的还是挺支持的,但对于不被推荐的<table><tr><td> 中的 中文字符貌似支持不了分行。详情见附件。



我是下面这种方法使用的:
<table width="100%" border="1" cellspacing="0" cellpadding="0" style="table-layout:fixed; word-break:break-strict;">
    <tr>
        <td>
            Jasper Report的设计思路,本身是不违反我上面所说的初衷的。因为我们的努力方向是先生成模板,然后得到数据,最后将两者整合得到结果。但是Jasper Report的问题在于,其生成模板的方式过于复杂,即使有IDE的帮助,我们还是需要对其中的众多规则有所了解才行,否则就会给调试带来极大的麻烦。
        </td>
    </tr>
    <tr>
        <td>
            Happy Thanksgiving!

            Given the holiday, we are releasing the President's weekly address today. 
            In this video, President Obama calls to our attention the men and women in uniform 
            who are away from home sacrificing time with family to protect our safety and freedom.
             He also talks about the progress of health care reform, the Recovery Act, and job creation to 
            ensure that next Thanksgiving will be a brighter day.


        </td>
    </tr>
</table>

没有发现问题啊
0 请登录后投票
论坛首页 Java企业应用版

跳转论坛:
Global site tag (gtag.js) - Google Analytics