【问题标题】:PDF 'Itext User Agent' cache size and how to clear itPDF“Itext 用户代理”缓存大小以及如何清除它
【发布时间】:2018-12-10 14:30:49
【问题描述】:

我的代码使用“飞碟用户代理”库从 html 模板生成 PDF/PPT 文件。

现在的问题是 Itext 使用缓存系统通过缓存而不是调用外部 URL 来访问图像和其他资源。我想知道如何清除这个缓存,或者刷新需要多少时间。我不知道我在这里感到绝望和无能为力,因为由于缺乏良好的文档,我什至无法理解这个工具。

1- 请您解释一下ReplacedElementFactory 的作用。

2- 在研究图书馆时,我找到了方法:

    public ImageResource getImageResource(String uri) {
    ImageResource resource = null;
    uri = this.resolveURI(uri);
    resource = (ImageResource)this._imageCache.get(uri);
    if (resource == null) {
        InputStream is = this.resolveAndOpenStream(uri);
        if (is != null) {
            try {
                URL url = new URL(uri);
                if (url.getPath() != null && url.getPath().toLowerCase().endsWith(".pdf")) {
                    PdfReader reader = this._outputDevice.getReader(url);
                    PDFAsImage image = new PDFAsImage(url);
                    Rectangle rect = reader.getPageSizeWithRotation(1);
                    image.setInitialWidth(rect.getWidth() * this._outputDevice.getDotsPerPoint());
                    image.setInitialHeight(rect.getHeight() * this._outputDevice.getDotsPerPoint());
                    resource = new ImageResource(uri, image);
                } else {
                    Image image = Image.getInstance(this.readStream(is));
                    this.scaleToOutputResolution(image);
                    resource = new ImageResource(uri, new ITextFSImage(image));
                }

                this._imageCache.put(uri, resource);
            } catch (Exception var16) {
                XRLog.exception("Can't read image file; unexpected problem for URI '" + uri + "'", var16);
            } finally {
                try {
                    is.close();
                } catch (IOException var15) {
                    ;
                }

            }
        }
    }

包含这行代码resource = (ImageResource)this._imageCache.get(uri);

我认为这是它从缓存中获取图像的地方,而不是寻找更新版本的图片。

3- Itext 多久刷新一次它的缓存,首先它的大小是多少,我如何为其指定路径,它如何存储它?

感谢您的帮助。

【问题讨论】:

    标签: java itext flying-saucer


    【解决方案1】:

    总结:OP可能使用的解决方案在底部没有。 (3): 通过命令行参数/配置文件禁用缓存。

    此代码不是来自 iText,而是来自flyingsaucer 本身,但是由于您只复制粘贴了一种方法,因此人们真的很难回答。

    正如您在顶部看到的那样,缓存大小为 32 private static final int IMAGE_CACHE_CAPACITY = 32;

    您还可以在代码中看到 keyURI resource = (ImageResource) _imageCache.get(uriStr);_imageCache.put(uriStr, resource);

    因此,如果您在远程位置上的图像发生更改但 URI 保持不变,您将获得旧图像。所以你有几个选择:

    1. 禁用缓存
    2. 添加失效机制。这可以基于时间。例如。您知道您服务器上的图像每 6 小时更改一次,然后相应地设置失效时间
    3. 添加哈希来验证图像是否已更改...

    更新:我仍然不完全清楚你想要什么?您想在不更改代码的情况下禁用缓存功能吗?

    1. 您可以在每次图像更改时更改图像 URI(例如添加一些随机数...)(从而使其唯一)。这样做的好处是,如果图像可以重复使用,速度会更快。
    2. 您可以尝试调用clearImageCache(),这将清除缓存或[shrinkImage][2],旧图像将被丢弃(如果超过 32 个)
    3. 或者您使用 FlyinSaucer Configuration 禁用缓存(例如,将其设置为 0)。您要查找的密钥是xr.image.cache-capacity。您可以使用配置文件 (local.xhtmlrenderer.conf) 或将其指定为参数java -Dxr.image.cache-capacity=0

    【讨论】:

    • 正是问题所在,图像在外部发生了变化但保持相同的URI,这导致在另一台服务器上更新图像的延迟,我发现资源存储在RAM中,现在我们可以只等待垃圾收集器删除此资源,否则我们需要覆盖此方法并按照您的建议强制清理
    猜你喜欢
    • 2017-02-26
    • 1970-01-01
    • 2013-05-07
    • 2015-11-12
    • 1970-01-01
    • 1970-01-01
    • 2014-11-25
    • 2018-01-17
    • 1970-01-01
    相关资源
    最近更新 更多