2

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

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

convert -density 500 -alpha off file_in.pdf -scale 1700x2200 -bordercolor black -border 1x1 -fuzz 20% -trim +repage -colorspace Gray -depth 4 file_out.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'修复了字体周围的灰色,但是细线几乎消失了,字体出现锯齿......

4

2 回答 2

2

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

如果原件pdf包含扫描的文档,它通常只包含位图图像(通常为tiffjpeg格式),然后将其转换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程序(tiff包的一部分)可以将这些转换为漂亮的小pdf文件。

但保留文档格式的最佳方法是编辑pdf文件本身,而不是将其转换为另一种格式。

有一个用于操作pdf文档的 Python 模块;PyPDF2。但是由于您没有指定对文档执行的操作,因此无法说这是否可以执行您想要的操作。还有ReportLab,但更多的是用于生成pdf 文件。如果您的cairo系统上安装了该库,那么 pycairo是一个不太重要的生成pdf文档的选项。

pdftk(用 java 编写)通常是用于处理pdf文件的出色实用程序。

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

pdf正如 Ben Jackson 所提到的,可以将文件反编译为 PostScript。有几个实用程序可以帮助您;pdftops来自poppler -utils 包,pdf2ps它带有ghostscript。以我的经验,pdftops往往会产生更好的可用输出。

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

(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。如果你要替换一个句子,你通常不能用更长的句子替换它;不会有足够的空间...

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

于 2013-03-30T08:19:35.427 回答
0

有没有办法在灰度中获得良好的采样?我想要做的是用 PIL 打开文件,添加一些文本并覆盖图像

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

这是另一个直接处理该想法的问题: 在 Ghostscript 中是否可以在 PDF 的每一页中添加水印

于 2013-03-30T17:53:13.357 回答