锁定老帖子 主题:介绍一个PDF的生成方案
该帖已经被评为良好帖
|
|
---|---|
作者 | 正文 |
发表时间:2009-11-06
youthon 写道 yye_javaeye 写道 页面中图片为jfreechart生成的,生成pdf后图片不显示,已设置了图片相对路径为:
renderer.getSharedContext().setBaseURL("http://localhost:8081/test/");还是不行,请问有什么方法解决 ? 你应该设置成获取的绝对路径才行吧 但是我的图片并没有生成啊,只是在http上提供一个地址而已 |
|
返回顶楼 | |
发表时间:2009-11-06
按照lz的说法,这个pdf生成方案确实很好
|
|
返回顶楼 | |
发表时间:2009-11-06
最后修改:2009-11-06
yongboy 写道 修改后的xhtmlrenderer核心包已经在
http://yongboy.iteye.com/blog/510976 上面地址中提供下载,无须显示在CSS中定义字体了,无须如下直接显示定义引入字体: ITextFontResolver fontResolver = renderer.getFontResolver(); fontResolver.addFont("C:/Windows/fonts/simsun.ttc", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED); 估计会方便一些如我之类的新手吧。 费了半天劲终于把你的代码跟原代码比较了一下,这种改法确实很粗糙 参考了这个链接吧: http://blog.sina.com.cn/s/blog_488aef530100afav.html 这样的话,pdf只能输出一种固定的字体了 |
|
返回顶楼 | |
发表时间:2009-11-07
youthon 写道 费了半天劲终于把你的代码跟原代码比较了一下,这种改法确实很粗糙 参考了这个链接吧: http://blog.sina.com.cn/s/blog_488aef530100afav.html 这样的话,pdf只能输出一种固定的字体了 实在不明白,为什么针对多个字体的解决方案,会显得如此死板。这不是一个很容易解决的问题么? 1. 你在Java代码中加入你需要使用的所有字体 2. 在CSS中引用你所需要使用的字体 你还想怎样? |
|
返回顶楼 | |
发表时间:2009-11-07
楼主的人品不错,想到了搞一个网上生成pdf电子书的应用业务。
|
|
返回顶楼 | |
发表时间:2009-11-07
不错,研究下,i
|
|
返回顶楼 | |
发表时间:2009-11-09
最后修改:2009-11-09
关于远程图片,Override了它的ITextUserAgent中的方法,暂时解决了,不过大小无法读取,必须在html中显示指定,代码如下:不知道还有没有更好的解决方法:
import org.xhtmlrenderer.pdf.ITextUserAgent; import org.xhtmlrenderer.pdf.ITextOutputDevice; import org.xhtmlrenderer.pdf.ITextFSImage; import org.xhtmlrenderer.resource.ImageResource; import org.xhtmlrenderer.resource.CSSResource; import org.xhtmlrenderer.util.XRLog; import java.io.IOException; import java.io.InputStream; import java.net.MalformedURLException; import java.net.URL; import java.net.URLConnection; import java.util.LinkedHashMap; import com.lowagie.text.Image; /** * 修改xhtmlrenderer获取css和image资源的方式为网络 */ @SuppressWarnings("unchecked") public class HttpURLUserAgent extends ITextUserAgent { /** * an LRU cache */ private int imageCacheCapacity = 16; private LinkedHashMap imageCache = new LinkedHashMap(imageCacheCapacity, 0.75f, true) { protected boolean removeEldestEntry(java.util.Map.Entry eldest) { return size() > imageCacheCapacity; } }; public HttpURLUserAgent(ITextOutputDevice outputDevice) { super(outputDevice); } @Override public CSSResource getCSSResource(String uri) { InputStream is = null; uri = resolveURI(uri); try { URLConnection uc = new URL(uri).openConnection(); uc.connect(); is = uc.getInputStream(); } catch (MalformedURLException e) { XRLog.exception("bad URL given: " + uri, e); } catch (IOException e) { XRLog.exception("IO problem for " + uri, e); } return new CSSResource(is); } @Override public ImageResource getImageResource(String uri) { ImageResource ir; uri = resolveURI(uri); ir = (ImageResource) imageCache.get(uri); if (ir == null) { try { ir = new ImageResource(new ITextFSImage(Image.getInstance(new URL(uri)))); } catch (Exception e) { e.printStackTrace(); } imageCache.put(uri, ir); } if (ir == null) ir = new ImageResource(null); return ir; } } |
|
返回顶楼 | |
发表时间:2009-11-09
另,官方主页r8更新说明里面给的分页方法是错误的,官方给的是-fs-table-pagination:paginate,实际应该是-fs-table-paginate:paginate,目前继续钻研页眉页脚
|
|
返回顶楼 | |
发表时间:2009-11-09
yye_javaeye 写道 关于远程图片,Override了它的ITextUserAgent中的方法,暂时解决了,不过大小无法读取,必须在html中显示指定
所以我倒是建议你先把远程图片读到本地来,在本地建立好缓存,这样既可以读文件,又可以读大小,这样不好么? ITextUserAgent这个类的实现有些地方的确让人有点不爽。override它也没啥问题。 |
|
返回顶楼 | |
发表时间:2009-11-09
最后修改:2009-11-09
就现在这样吧,我觉得挺好,呵呵
因为图片是动态画的,每个人访问都会不一样,本地缓存会很多的 |
|
返回顶楼 | |