我有一个自定义报告,它通过Graphics2D
绘制,并使用了很多小BufferedImage
个精灵。 PrinterJob.print()
似乎每个精灵大致调用Printable.print()
一次(实际计数可以双向变化),因此有些页面会重新渲染150次......这会导致打印速度慢得令人无法接受两页10秒。
我发现了这个:Why does the java Printable's print method get called multiple times with the same page number?
但它似乎没有解释我的特定问题(或只是部分解释了它)。我创建了一个只有几个精灵的测试报告,当我在垂直轴或水平轴上添加和删除图像时,有少量调整大小上下移动。
使用Bullzip打印到PDF时,我注意到在放大图像后,它们会使用双线性或双三次算法进行放大。这些图像中的一个在具有索引调色板方面是独特的,看起来不是缩放的。我确认缩放是一种Java行为,而不是Bullzip通过打印到真正的打印机并观察相同的图像进行缩放而不是执行缩放。
因为打印API试图将图像重新缩放到它想到的任何DPI,所以它让我感到震惊,但出于某种原因,它每次遇到它认为需要这种处理的图像时都会调用Printable.print()
。
如何解决此问题?我尝试在调用Graphics2D
时获得的Printable.print()
上设置渲染提示,但无济于事。我不知道还有什么办法可以找到并检查print API的源代码。
答案 0 :(得分:0)
我想我只是偶然发现了它。我刚刚修改过的一个报告现在在一些几何图形上绘制了一个图像,我注意到图像框后面的几何图形部分正在被栅格化,并且与框外相比看起来很模糊。有问题的图像(以及除了一个索引的彩色图像以外的所有图像)都有一个8位的alpha通道。
之前我注意到Java的打印光栅化器不喜欢具有半透明度的东西(一个使用它的报告在我认为300dpi完全被光栅化了......),但我忘了这些图像也有alpha通道。
当我有机会时,我可能会通过进一步提高图像的分辨率和使用1位alpha来解决这个问题。按比例缩小以查看屏幕时,它将再次显示几位alpha并且看起来没问题。