论坛首页 Java企业应用论坛

介绍一个PDF的生成方案

浏览 151694 次
该帖已经被评为良好帖
作者 正文
   发表时间:2009-11-06  
youthon 写道
yye_javaeye 写道
页面中图片为jfreechart生成的,生成pdf后图片不显示,已设置了图片相对路径为:
renderer.getSharedContext().setBaseURL("http://localhost:8081/test/");还是不行,请问有什么方法解决 ?

你应该设置成获取的绝对路径才行吧

但是我的图片并没有生成啊,只是在http上提供一个地址而已
0 请登录后投票
   发表时间:2009-11-06  
按照lz的说法,这个pdf生成方案确实很好
0 请登录后投票
   发表时间: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只能输出一种固定的字体了
0 请登录后投票
   发表时间:2009-11-07  
youthon 写道

费了半天劲终于把你的代码跟原代码比较了一下,这种改法确实很粗糙
参考了这个链接吧:
http://blog.sina.com.cn/s/blog_488aef530100afav.html
这样的话,pdf只能输出一种固定的字体了


实在不明白,为什么针对多个字体的解决方案,会显得如此死板。这不是一个很容易解决的问题么?

1. 你在Java代码中加入你需要使用的所有字体

2. 在CSS中引用你所需要使用的字体

你还想怎样?
0 请登录后投票
   发表时间:2009-11-07  
楼主的人品不错,想到了搞一个网上生成pdf电子书的应用业务。
0 请登录后投票
   发表时间:2009-11-07  
不错,研究下,i
0 请登录后投票
   发表时间: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;
    }
}

0 请登录后投票
   发表时间:2009-11-09  
另,官方主页r8更新说明里面给的分页方法是错误的,官方给的是-fs-table-pagination:paginate,实际应该是-fs-table-paginate:paginate,目前继续钻研页眉页脚
0 请登录后投票
   发表时间:2009-11-09  
yye_javaeye 写道
关于远程图片,Override了它的ITextUserAgent中的方法,暂时解决了,不过大小无法读取,必须在html中显示指定


所以我倒是建议你先把远程图片读到本地来,在本地建立好缓存,这样既可以读文件,又可以读大小,这样不好么?

ITextUserAgent这个类的实现有些地方的确让人有点不爽。override它也没啥问题。
0 请登录后投票
   发表时间:2009-11-09   最后修改:2009-11-09
就现在这样吧,我觉得挺好,呵呵
因为图片是动态画的,每个人访问都会不一样,本地缓存会很多的
0 请登录后投票
论坛首页 Java企业应用版

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