itext - 添加无边框的 png 图像

itext - add png image with no border

我想将以下 png 图像添加到我的 pdf 中:

我使用以下代码来完成:

Image img = PngImage.getImage(filename);
img.setBorder(Image.NO_BORDER);
img.setAlignment(Element.ALIGN_CENTER);
img.scaleAbsolute(width,height);
document.add(img);

图像包含一个没有外边框的条形图。当我将图像添加到我的 pdf 时,它显示了一个外边框,但只显示了底部、左侧和顶部:

我想删除 pdf 中的边框,但上面的代码并没有实现。

我正在使用 iText-2.1.5。

在评论中,我声称您的原始图像确实有边框。你声称它没有边框。既然你已经分享了图片,我们可以核实事实,看看谁是对的。

事实证明,我是对的。当我在 GIMP 中打开图像时,我清楚地看到透明边框:

也许您没有看到它,因为您正在 Paint 中查看图像,或者您可能认为 "transparent" 和 "white" 是相同的颜色。显然这个假设是错误的。

我创建了一个包含您分享的图片的 PDF,当我使用 iText RUPS 打开这个 PDF 时,我看到了这样的东西:

ISO-32000-1(又称 PDF 规范)不支持 PNG,因此想要将 PNG 引入 PDF 文件的软件需要将该 PNG 转换为另一种格式。在 iText 的情况下,"normal" PNG 被转换为带有过滤器 /FlateDecode.

的位图

在你的例子中,你有一个透明的 PNG。在 ISO-32000-1 中,透明图像始终存储为两个图像:不透明图像(在我的屏幕截图中,/Img1 对象编号为 2)和图像遮罩(在我的屏幕截图中,/Img0 对象编号 1).

如果您仔细观察图像蒙版(使不透明图像变得透明的图像),您会发现它是一个黑白图像,显示了一个非常小的边框。此图像显示在 lower-right 面板中,其中显示 "Stream"(这是呈现图像流的位置)。这个非常小的边框就是我们在GIMP(或者其他支持透明图片的图片查看器)中也能看到的透明边框。

如果这个边框是透明的,那你为什么在 PDF 查看器中看到它?好吧,这个边框被视为一条宽度为零的线。在 PDF 查看器中,宽度为零的线使用可在用于查看 PDF 的设备上显示的最小宽度显示。如果放大 PDF,您会注意到线条的宽度保持不变。

总结:您声称您的图像没有任何边框,并且边框是由 iText 添加的。我已经证明你错了:图像 does 有一个 transparent 边框并且 iText 正确地引入了这个透明边框作为遮罩。 PDF 查看器根据 ISO-32000-1 将此边框显示为 zero-width 线。

您可以通过去除原始图像中的透明边框来解决您的问题。例如:我使用 GIMP flattened 图像。结果是这张图片:

此图片不再有透明边框,当您将其引入 PDF 时,不显示边框,也不向 PDF 添加遮罩: