使用 PDF 库在现有 PDF 文件上绘制小图像

Posted

技术标签:

【中文标题】使用 PDF 库在现有 PDF 文件上绘制小图像【英文标题】:Drawing small images on an existing PDF file by using PDF Libraries 【发布时间】:2019-03-08 16:32:56 【问题描述】:

我正在开发一个创建 PDF 文件的应用程序,我需要在其上绘制一些小图像。

问题在于 PDF 上绘制的图像模糊且质量非常低。 我也尝试在不缩放的情况下绘制图像,但同样的情况是,它们很模糊。

这是我绘制一张图像的 sn-p(我没有使用 iText)

Bitmap calendarBitmap = BitmapFactory.decodeResource(getApplicationContext().getResources(), R.drawable.icon_200ppp_calendar);
pdfCanvas.drawBitmap(scaleToFitHeight(calendarBitmap, 16), xCoord, yCoord, null);

public Bitmap scaleToFitHeight(Bitmap b, int height) 
   float factor = height / (float) b.getHeight();
   return Bitmap.createScaledBitmap(b, (int) (b.getWidth() * factor), height, true);

我有 PNG 和 SVG 格式的图像(转换为 VectorDrawable),结果是一样的。

这是PNG:

这是通过 android Studio 从 SVG 文件生成的 XML:SVG converted to VectorDrawable

这些是结果:

【问题讨论】:

对模糊图像使用专业级 PDF 检查器。分辨率和原版一样吗?相同的大小,以像素为单位?如果不是,则必须进行一些重新采样。 PDF 能够包含清晰的位图。 (我认为这不是您的观众!为了保持一致性,请尝试另一个。) 原始 PNG 图像为 48x48px,我使用我发布的方法调整大小以将其缩小为 16x16。 PDF 检查器显示它的大小和位分辨率相同。 等等——你自己把它缩小到原来的1/3?那你为什么会惊讶缩小后的图像不如原始图像清晰?它与 PDF 无关,是缩小尺寸使您的图像模糊。 (解决方案:不要。) 是的,我正在缩小它,因为图像的尺寸太大。我会问设计师一张精确尺寸的图片:)谢谢!我仍然有一个疑问:你知道缩小一个 72dpi 的图像和另一个 300dpi 的图像是否相同? 【参考方案1】:

您必须将图像的密度设置为 X 因子。 例如:

Bitmap bm = new Bitmap(..);
bm.setDensity(bm.getDensity()*4);
// try with different X's: 2, 3, 4, 5, 6.

这种质量损失的发生是因为当您写入 PDF 时,它会自动调整您的位图大小以适应该画布分辨率。此外,如果您调整图像大小,位图,如果您有一个 50X50 的图像并且您想调整为 50X10 的大小,那么您必须小心它会弄乱图像。而是尝试按一个因子调整位图的大小:

bm.getWidth()/4, 
bm.getHeight()/4

等等。

【讨论】:

以上是关于使用 PDF 库在现有 PDF 文件上绘制小图像的主要内容,如果未能解决你的问题,请参考以下文章

使用 PHP 在现有 PDF 文件中插入图像文件

如何将外部 OCR 嵌入现有 PDF?

使用 Wea​​syprint 的 PDF 输出不显示图像(Django)

MuPdf 库在从 pdf 页面渲染图像时是不是比 xpdf/poppler 更快?

怎么给PDF文件添加数字签名

将图像放在 PDF 上