it-swarm.cn

pdf到jpg且无质量损失; gscan2pdf

当我使用以下方式将pdf文件转换为一堆jpg文件时

convert -quality 100 file.pdf page_%04d.jpg

我有明显的质量损失。

但是,如果执行以下操作,则不会(明显)损失质量:

启动gscan2pdf,选择file-> import(然后选择file.pdf)。然后转到gscan2pdf的临时目录。有许多pnm文件(pdf文件的每一页一个)。现在我做

  for file in *.pnm; do            
  convert $file $file.jpg done

生成的jpg文件(大致)与原始pdf的质量相同(这就是我想要的)。

现在我的问题是,是否有一种简单的命令行方法可以将pdf文件转换为一堆jpg文件而不会引起明显的质量损失? (以上解决方案过于复杂且耗时)。

56
student

您不清楚“质量损失”是什么意思。那可能意味着很多不同的事情。您可以张贴一些示例来说明吗?也许从质量较差和质量好的版本中删除同一部分(作为PNG,以避免进一步的质量损失)。

也许您需要使用-density以更高的dpi进行转换:

convert -density 300 file.pdf page_%04d.jpg

(如有必要,您可以在前面加上-units PixelsPerInch-units PixelsPerCentimeter。我的副本默认为ppi。)

更新:正如您所指出的,gscan2pdf(使用方式)只是pdfimages的包装(从 poppler )。给定PDF作为输入时,pdfimages的作用与convert的不同。

convert获取PDF,以一定的分辨率对其进行渲染,然后将生成的位图用作源图像。

pdfimages通过PDF查找嵌入式位图图像,并将每个图像导出到一个文件中。它只是忽略了PDF中的任何文本或矢量绘图命令。

因此,如果您拥有的PDF只是一系列位图的包装,则pdfimages可以更好地提取它们,因为它可以将原始数据还原为原始大小。您可能还想对pdfimages使用-j选项,因为PDF可以包含原始JPEG数据。默认情况下,pdfimages会将所有内容转换为PNM格式,并且将JPEG> PPM> JPEG转换是有损过程。

所以,尝试

pdfimages -j file.pdf page

您可能需要也可能不需要在其后加上convert.jpg步骤(取决于PDF使用的位图格式)。

我在从一系列JPEG图像制作的PDF上尝试了此命令。提取的JPEG与源图像逐字节相同。您无法获得比这更高的质量。

101
cjm

正如学生的回答所说,pdfimages是一个不错的选择。根据我的经验,无论您指定了正确的dpi,gsconvert都输出质量差。

但是,如果pdf每页有多个图层,则pdfimages不起作用并将这些图层提取为单独的图像,在这种情况下,最好使用inskcape导出页面,如图所示。

这是我使用的命令:

pdftk combined_to_do.pdf burst output pg_%04d.pdf
ls ./pg*.pdf | xargs -L1 -I {}  inkscape {} -z --export-dpi=300 --export-area-drawing --export-png={}.png

第一条命令拆分所有页面,第二条命令将一页一页地转换为png。您可以将其保留为png或仅将其转换为jpeg

ls ./p*.png | xargs -L1 -I {} convert {}  -quality 100 -density 300 {}.jpg

pdfimagesgs和ImageMagick的convert相比,我发现inkscape的输出质量最好。

4
Eduard Florinescu

@cjm的响应是正确的,但是如果您喜欢GUI并且不想渲染所有pdf页面,只是为了获得一些图像,请使用gimp。

用gimp打开pdf文件,您将获得一个包含所有页面的导入窗口。选择所需的任何页面,并将分辨率设置为600 pix/inch(在许多情况下,我发现300的锐度太大)。使用“文件/导出”保存为所需的格式

无论如何,必须有一个标志才能从命令行中选择所需的页面。

3
albfan

查看gscan2pdf源代码,我注意到它使用pdfimages。所以pdfimages file.pdf page将导致page-001.ppm, page-002.ppm等.

2
student

您的问题尚不清楚的是,您是在谈论pdf中的文本和矢量图形,还是在pdf中包含嵌入式图像。

阅读了gscan2pdf的内容后,我猜您的pdf文件包含(仅)嵌入式图形。

convert本质上“打印”您的pdf,而不考虑内容是什么。就像@cjm所建议的那样,您可能要更改打印浓度。这是提高矢量图形质量的唯一方法。

如果相反,您要提取的是嵌入式图像(就像gscan2pdf似乎所做的那样),则猜测密度通常会导致质量下降或质量超出要求(以及浪费磁盘空间)。答案是提取图像而不是打印pdf。 请参阅本文 基本上提倡使用pdfimages以便提取图像而不会降低质量。

2
asoundmove