【问题标题】:flying saucer (xhtmlrenderer) requests image 4 times飞碟(xhtmlrenderer)请求图像 4 次
【发布时间】:2010-07-30 07:20:23
【问题描述】:

在我的 xhtml 中,我有以下内容:

...
<img src="myImage.jpg" />
...

我是这样渲染的:

ITextRenderer renderer = new ITextRenderer();
renderer.setDocument(XMLResource.load(in).getDocument(), url);
renderer.layout();
renderer.createPDF(out);

生成的 PDF 符合预期,但我注意到图像(在 xhtml 中仅包含一次且仅呈现一次)被请求 4 次。

现在,除了额外数据下载的明显问题外,这对大多数人来说都不是问题。

但是,我需要为动态图像实现一个“使用时过期”的图像缓存,这变得非常头疼......

为什么飞碟只渲染一次就需要4次请求呢?

【问题讨论】:

    标签: java itext flying-saucer xhtmlrenderer


    【解决方案1】:

    此问题已在最新版本的 FlyingSaucer 中得到修复。我已经用 9.0.3 确认了自己,尽管我相信在此之前的几个小版本也包含修复。

    【讨论】:

      【解决方案2】:

      我刚刚浏览了代码,这里没有解决方案(无需重新编写 itext 和飞碟)。

      第一次打开流只是为了测试能不能打开,不读取数据。

      第二次是itext读取header判断文件类型,只读取前4个字节。

      第三次是 itext 确定图像的尺寸 - 我不确定,但我认为除了标题之外没有太多其他内容。

      最后一次读取是渲染图像。

      所以下载影响不大,4个url连接——是的,但是整个流只传输一次

      而我的“使用过期”缓存必须改为“第 4 次使用过期”。

      【讨论】:

      • 也许 http 标头包含一些如何过滤的信息?我猜第一个请求是 HEAD 请求,你数不过来。否则我会说“在第一次请求之后,资源可以再使用 10 秒”左右。
      • zeiss,他们没有设置任何不同的标题或参数来识别他们将从流中提取的信息类型。他们每次都只是给new URL(uri).openStream()。这会很方便,因为我可以只返回一个虚拟流,告诉 api 仅针对每个请求的相关信息,并将真实数据留给最后一个请求。我可以通过请求索引来做到这一点,即请求 1 返回“JPEG”,请求 2 返回......等等。重新考虑 10 秒的想法,我的第四个请求方法更好,原因有很多。
      • 但它的实现非常依赖。将此作为增强请求发布在“itext-questions”邮件列表中。至少我们可以修饰 .openStream() 调用。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-03-20
      • 2012-01-05
      • 2016-12-22
      • 1970-01-01
      • 2013-07-30
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多