Python 为什么使用PIL保存为pdf会在字体周围创建灰色区域

Python 为什么使用PIL保存为pdf会在字体周围创建灰色区域,python,pdf,png,python-imaging-library,Python,Pdf,Png,Python Imaging Library,我想将pdf文件转换为png,以便在Python中进行操作,并将其保存为pdf,但在此过程中,字体周围会创建一个灰色区域(我的图像是一个简单的黑白类型的文档)。它非常微弱,在屏幕上有点难以看到,但当打印出来时,它变得相当清晰 以下是我使用的特定命令: PDF到PNG(灰度、超级采样以保持图像质量): Python内部 import Image img = Image.open('file_out.png') img.save('file_out2.pdf') 我还尝试使用Ghostscrip

我想将pdf文件转换为png,以便在Python中进行操作,并将其保存为pdf,但在此过程中,字体周围会创建一个灰色区域(我的图像是一个简单的黑白类型的文档)。它非常微弱,在屏幕上有点难以看到,但当打印出来时,它变得相当清晰

以下是我使用的特定命令:
PDF到PNG(灰度、超级采样以保持图像质量):

Python内部

import Image 
img = Image.open('file_out.png')
img.save('file_out2.pdf')
我还尝试使用Ghostscript将pdf转换为png:

gs -sDEVICE=png16m -sOutputFile=file.png -dNOPAUSE -dBATCH -r300 file_out.pdf 
保存结果

这里有一部分是什么

identify -verbose file.png
为ImageMagick png提供:

 Format: PNG (Portable Network Graphics)
  Class: PseudoClass
  Geometry: 1700x2200+0+0
  Resolution: 500x500
  Print size: 3.4x4.4
  Units: Undefined
  Type: Grayscale
  Base type: Grayscale
  Endianess: Undefined
  Colorspace: Gray
  Depth: 8/4-bit
  Channel depth:
    gray: 4-bit
有人有办法吗?或者至少是一个解释

编辑:
我发现使用“-sample 1700x2200”而不是“-scale 1700x2200”修复了字体周围的灰色,但随后细线几乎消失,字体出现锯齿……

pdf格式基本上是一种矢量格式,也可以包括位图(“光栅”)图像

如果原始
pdf
包含扫描的文档,它通常只包含位图图像(通常为
tiff
jpeg
格式),然后将其转换为
png
是可以的(如果您坚持图像的原始分辨率)

但是,如果原始文件包含矢量图形(包括文本字符串),则将这些图形转换为位图通常会导致采样错误。为了避免这种情况,可以使用1位颜色深度(“黑白”格式)和至少与打印机匹配的分辨率。不过,这将生成一个相当大的文件
png
文件。使用
tiff
格式可能会生成较小的文件。“tiff inside pdf”格式是扫描大型图形时经常看到的格式。根据ImageMagick的
identify
程序,这样的
tiff
文件如下所示:

  Format: TIFF (Tagged Image File Format)
  Class: DirectClass
  Geometry: 13231x9355+0+0
  Resolution: 400x400
  Print size: 33.0775x23.3875
  Units: PixelsPerInch
  Type: Bilevel
  Base type: Bilevel
  Endianess: MSB
  Colorspace: Gray
  Depth: 1-bit
  Channel depth:
    gray: 1-bit
尽管文件很大,但是
tiff
文件只有144 kb。
tiff2pdf
程序(软件包的一部分)可以将这些文件转换为小巧的
pdf
文件

但是保存文档格式的最佳方法是编辑
pdf
文件本身,而不是将其转换为其他格式

有一个Python模块用于处理
pdf
documents。但是,由于您没有指定要对文档执行什么操作,因此无法确定这是否可以执行您想要的操作。也有,但更多的是用于生成pdf文件。如果您的系统上安装了
cairo
库,则生成
pdf
文档的权重较小

(用java编写)是一个处理
pdf
文件的优秀工具

编辑:灰度采样将始终引入采样伪影。这些本身不是错误,只是采样过程的结果

如本·杰克逊所说,将
pdf
文件反编译成PostScript是可以做到的。有几个实用程序可以帮助您实现这一点
pdftops
来自-utils包,以及随附的
pdf2ps
。根据我的经验,
pdftops
倾向于产生更好的可用输出

但我还没有找到一个好方法来自动化这个过程。下面是使用
pdftops
反编译的Numpy用户指南的一个片段:

(At)
[7.192997
0
2.769603
0] Tj
-314 TJm
(the)
[2.769603
0
4.9813
0
4.423394
0] Tj
-313 TJm
(core)
[4.423394
0
4.9813
0
3.317546
0
4.423394
0] Tj
-314 TJm
(of)
[4.9813
0
3.317546
0] Tj
-313 TJm
(the)
[2.769603
0
4.9813
0
4.423394
0] Tj
-314 TJm
(NumPy)
[7.192997
0
4.9813
0
7.750903
0
5.539206
0
4.9813
0] Tj
-314 TJm
(package,)
[4.9813
0
4.423394
0
4.423394
0
4.9813
0
4.423394
0
4.9813
0
4.423394
0
2.49065
0] Tj
-329 TJm
这会产生一句话“在Numpy包的核心”,因此如果您在PostScript文件中查找()之间的任何内容,就会得到字符串

因此,改变单个单词或删除短片段并不难

  • 在反编译的PostScript中找到正确的单词
  • 编辑它们(以及周围的参数!)
  • 重新编译为pdf(使用ghostscript)
但是您必须查看文档的开头,看看函数
Tj
TJm
的作用。如果要替换文本,则必须删除它们并使用
Tj
TJm
的正确参数输入新的文本和代码。这需要理解PostScript。如果你要替换一个句子,你通常不能用更长的句子替换它;没有足够的空间

因此,通常建议尝试使用原始应用程序更改输出

难道没有办法得到一个好的灰度采样吗?我想做的是用PIL打开文件,添加一些文本并覆盖一个图像

PDF是一个压缩的PostScript文档(加上元数据)。PostScript是一种编程语言。如果使用
pdf2ps
,则可以将代码添加到PostScript中,以覆盖PDF的任何现有部分。然后用
pdf2ps
转换回来


这里还有另一个问题可以直接解决这个问题:

“保持图像质量的超级采样”基本上意味着“为锐利的黑色对象添加灰色边框”,以反映亚像素定位。这就是你看到的吗?可能是字体大小的1/4,看起来太大了。而且在PNG图像中不可见。谢谢,当我对图像进行超级采样时,我确实遇到了字体采样错误。难道没有办法得到一个好的灰度采样吗?我想做的是用PIL打开文件,添加一些文本并覆盖一个图像。
(At)
[7.192997
0
2.769603
0] Tj
-314 TJm
(the)
[2.769603
0
4.9813
0
4.423394
0] Tj
-313 TJm
(core)
[4.423394
0
4.9813
0
3.317546
0
4.423394
0] Tj
-314 TJm
(of)
[4.9813
0
3.317546
0] Tj
-313 TJm
(the)
[2.769603
0
4.9813
0
4.423394
0] Tj
-314 TJm
(NumPy)
[7.192997
0
4.9813
0
7.750903
0
5.539206
0
4.9813
0] Tj
-314 TJm
(package,)
[4.9813
0
4.423394
0
4.423394
0
4.9813
0
4.423394
0
4.9813
0
4.423394
0
2.49065
0] Tj
-329 TJm