我的代码使用“飞碟用户代理”库从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多久刷新一次缓存,其大小首先是多少,如何为其指定路径,如何存储它?
谢谢您的帮助。
答案 0 :(得分:1)
摘要:OP的解决方案可能使用了底部编号中的一个。 (3):通过命令行参数/配置文件禁用缓存。
这段代码不是来自iText,而是来自flyingsaucer本身,但是由于您仅复制并粘贴了一种方法,因此人们很难回答。
如您在顶部看到的那样,缓存大小为 32 private static final int IMAGE_CACHE_CAPACITY = 32;
。
您还可以在代码中看到键是 URI
resource = (ImageResource) _imageCache.get(uriStr);
或_imageCache.put(uriStr, resource);
因此,如果您在远程位置上的图像发生了变化,但是URI保持不变,您将获得旧图像。因此,您有几种选择:
更新:我仍然不清楚您想要什么?是否要在不更改代码的情况下禁用缓存功能?
clearImageCache()
来清除缓存或[shrinkImage][2]
并丢弃较旧的图像(如果超过32个)xr.image.cache-capacity
。您可以使用配置文件(local.xhtmlrenderer.conf)或将其指定为参数java -Dxr.image.cache-capacity=0
。