我正在尝试使用命令行程序convert将PDF转换为图像(JPEG或PNG)。这是我要转换的PDF之一。

我希望程序修剪掉多余的空白并返回足够高质量的图像,以便可以轻松读取上标。

这是我目前的最佳尝试。如您所见,修整效果很好,我只需要稍微提高一下分辨率即可。这是我正在使用的命令:

convert -trim 24.pdf -resize 500% -quality 100 -sharpen 0x1.0 24-11.jpg


我试图做出以下有意识的决定:


调整大小它更大(对分辨率没有影响)
使质量尽可能高
使用-sharpen(我尝试了一系列值)

关于任何建议在最终的PNG / JPEG中获得更高的图像分辨率将不胜感激!

评论

我不知道,您也可以尝试链接...

另请参阅:askubuntu.com/a/50180/64957

如果您使用的是Mac,请查看sip的手册页,即“可编写脚本的图像处理系统”。这是macOS内置的命令行图像编辑器,适用于PDF和许多其他图像类型。

@ghoti sips只会将PDF文件的第一页转换为图像。

#1 楼

似乎可以使用以下方法:

convert           \
   -verbose       \
   -density 150   \
   -trim          \
    test.pdf      \
   -quality 100   \
   -flatten       \
   -sharpen 0x1.0 \
    24-18.jpg


它产生左图。将其与我原始命令的结果(右图)进行比较:


并选择“在新标签页中打开图像...”。)

还要牢记以下事实:


图像上较差,模糊的图像右侧的文件大小为1.941.702字节(1.85 MB)。
其分辨率为3060x3960像素,使用16位RGB颜色空间。
左侧的更好,更清晰的图像具有文件大小337.879字节(330 kByte)。
其分辨率为758x996像素,使用8位灰度颜色空间。

因此,无需调整大小;添加-density标志。密度值150很奇怪-尝试一系列的值会导致两个方向上的图像看起来都更差!

评论


density参数有点特殊,因为in必须位于输入文件之前。由于PDF是一种基于矢量的文件格式,没有像素的概念,因此它表示“页面为8英寸乘12英寸”。如果需要像素,则可以使用浓度设置来告诉它,要在输出中获得每英寸多少个像素。例如使用150,您将在结果图像中得到8x150 = 1200 x 12x150 = 1800像素。这也是进行锐化,对比度,压缩等设置的像素数量。

–丹尼尔·施奈勒(Daniel Schneller)
13年8月2日在7:30

在Mac OS上可能会导致黑色背景(请参阅stackoverflow.com/questions/10934456/…)。要解决此问题,请添加-flatten。

– fbiville
16-4-16在21:59



当我尝试将pdf转换为png时,在Mac OS上出现了黑色背景,添加了-flatten解决了它。

– olala
16年9月1日在22:34

哇!刚使用-density和-flatten选项来减小pdf的大小(到另一个pdf)。 -flatten选项确实有助于减小总大小。就我而言,没有视觉障碍。

– parvus
16-10-6在8:45

如果起始图像的质量低于该值,则-density标志在较高的值上可能会给出较差的结果。

– parvus
16-10-6在8:48

#2 楼

我个人喜欢这样。

convert -density 300 -trim test.pdf -quality 100 test.jpg


文件大小是原来的两倍多,但对我来说看起来更好。

-density 300设置dpi

-trim删除与角像素颜色相同的任何边缘像素。

-quality 100将JPEG压缩质量设置为最高质量。 br />
-sharpen之类的文字不能很好地与文本配合使用,因为它们会撤消字体渲染系统使它更清晰的功能。

如果您确实想要将其炸毁,请在此处调整大小可能是更大的dpi值,例如targetDPI * scalingFactor,它将以您想要的分辨率/尺寸呈现PDF。

imagemagick.org上的参数说明在此处

评论


它的大小是原来的两倍,主要是因为输出密度增加了一倍,并且jpg压缩质量设置为max(因此压缩率不高)。

–rivimey
15年4月15日在14:14

使用convert,我们将如何知道转换了多少页面?

– Kiran Reddy
17-10-12在7:27

嗯,这绝对是要走的路。增强该源密度并删除-sharpen。质量比使用默认设置好得多,并且比使用-sharpen更自然。

–约书亚·品特(Joshua Pinter)
19年1月5日,0:20

这应该是最好的答案,而不是当前的答案。另外,在Ubuntu上也需要这样做:转换失败时,mv /etc/ImageMagick-6/policy.xml /etc/ImageMagick-6/policy.xmlout(来源:askubuntu.com/a/1081907)

– Costin Gușă
20年8月26日在7:13



#3 楼

我在命令行上使用pdftoppm来获取初始图像,通常具有300dpi的分辨率,因此pdftoppm -r 300,然后使用convert进行修整和PNG转换。

评论


在不使用Imagemagick的情况下,此解决方案似乎是出于透明转换的精神。 pdftoppm也可以输出JPEG和PNG。

–亚伦·布里克(Aaron Brick)
16 Sep 4'在5:16

pdftoppm为我带来了非常不错的JPEG(并且仍然小于IM)!谢谢!

– jkd
20年8月16日在10:03

似乎没有'-r'标志,pdftoppm使用pdf的原始分辨率,这是您可以从pdf中获得的最大分辨率。转换工具保持该分辨率。

–乔沙
20-11-02在20:05

#4 楼

通常,我使用原始分辨率的'pdfimages'提取嵌入的图像,然后使用ImageMagick的转换为所需的格式:

$ pdfimages -list fileName.pdf
$ pdfimages fileName.pdf fileName   # save in .ppm format
$ convert fileName-000.ppm fileName-000.png


这将生成最佳和最小的结果文件。

注意:对于有损JPG嵌入式图像,必须使用-j:

$ pdfimages -j fileName.pdf fileName   # save in .jpg format


对于最近使用的poppler,您可以使用-all保存有损为jpg,无损为png

在提供很少的Win平台上,您必须从以下位置下载最新的(0.37 2015)'poppler-util'二进制文件:
http://blog.alivate。 com.au/poppler-windows/

评论


只是一个小小的修正:第一个代码块中的第二个命令应该以pdftoppm开头而不是pdfimages

–satyanarayan rao
19年6月25日在17:36

不,较旧的pdfimages会将提取的图像保存到pdftoppm之类的ppm中,而pdftoppm从来没有-list选项。如注释中所述,当前的pdf图像可以使用-all直接保存为PNG和JPG。

–Valerio
19年6月26日在20:52

#5 楼

当将大型PDF批量处理为PNG和JPG以使用gs使用的基础convert(又名Ghostscript)命令时,我发现它既更快又更稳定。

您可以在的输出中看到该命令。 convert -verbose,还有一些可能的调整(YMMV),很难/无法直接通过convert访问。

但是,使用gs进行修剪和锐化将变得更加困难,因此我说YMMV!

#6 楼

我确实没有在convert上取得过成功([2020年5月更新:实际上:它几乎对我不起作用]),但是我在pdftoppm上取得了出色的成功。以下是从PDF生成高质量图像的几个示例:



[每pg产生约25 MB大小的文件]以300 DPI输出未压缩的.tif文件格式放入名为“ images”的文件夹中,文件名为pg-1.tif,pg-2.tif,pg-3.tif等:

mkdir -p images && pdftoppm -tiff -r 300 mypdf.pdf images/pg



[每pg产生约1MB大小的文件]以300 DPI的.jpg格式输出:

mkdir -p images && pdftoppm -jpeg -r 300 mypdf.pdf images/pg



[产生约2MB大小的文件每pg]以最高质量(最低压缩)并仍以300 DPI的.jpg格式输出:

mkdir -p images && pdftoppm -jpeg -jpegopt quality=100 -r 300 mypdf.pdf images/pg



有关更多说明,选项和示例,请在此处查看我的完整答案:

https://askubuntu.com/questions/150100/extracting-embedded-images-from-a-pdf/1187844#1187844。

相关:


[如何将PDF变成带有pdf2searchablepdf的可搜索PDF] https://askubuntu.com/questions/473843/how-to-turn-a-pdf -into-a-text-searchable-pdf / 1187881#1187881

交叉链接:


如何转换在Linux中使用命令行将PDF转换成JPG吗?
https://unix.stackexchange.com/questions/11835/pdf-to-jpg-without-quality-loss-gscan2pdf/585574#585574




#7 楼

它还可以为您带来良好的效果:

exec("convert -geometry 1600x1600 -density 200x200 -quality 100 test.pdf test_image.jpg");


#8 楼

Linux用户在这里:我尝试使用convert命令行实用程序(用于PDF到PNG),但对结果不满意。我发现这样做更容易,而且效果更好:


用pdftk提取pdf页面


例如:pdftk file.pdf cat 3 output page3.pdf



GIMP打开(导入)pdf


重要:将导入Resolution100更改为300600 pixel/in



GIMP中以PNG格式导出(将文件扩展名更改为.png)。

编辑: Comments。使用的转换命令:

convert -density 300 -trim struct2vec.pdf -quality 100 struct2vec.png

GIMP:以300 dpi(px / in)导入;导出为PNG压缩级别3。

我还没有在命令行上使用GIMP(请参阅下面的我的评论)。





评论


如果您有数千页,可以自动执行吗?

– JBWhitmore
17年9月22日在18:28

@JBWhitmore:好问题。当然,编写pdftk命令很简单,因为它已经在命令行中了。我做了一个非常快速的Google搜索,发现GIMP具有批处理模式(我还没有尝试过,但是看起来也应该可以编写脚本):gimp.org/tutorials/Basic_Batch

–维多利亚·斯图尔特(Victoria Stuart)
17-09-22在22:26



@JBWhitmore在此问题/答案中显示了一个示例脚本来自动执行此转换:unix.stackexchange.com/questions/121293/…

–tsherwen
18年11月19日在12:25

@tsherwen,如果我正确阅读了该链接,则说明了如何自动执行convert命令。我对如何做到这一点不感到困惑。但是,此答案表示将GIMP用作步骤之一-此答案或链接都没有显示如何自动执行。

– JBWhitmore
18年11月19日在17:27

@JBWhitmore。我错误地只是在考虑转换问题。在阅读自动化注释时,我仅看到此答案的一部分提到了转换和您的问题。感谢您稍后在此线程上的答复,我将其与链接到的解决方案相结合并解决了我遇到的另一个问题。

–tsherwen
18年11月20日在14:37

#9 楼

在ImageMagick中,您可以执行“超级采样”。您可以指定较大的密度,然后根据最终输出尺寸的大小调整尺寸。例如,使用您的图像:

convert -density 600 test.pdf -background white -flatten -resize 25% test.png




下载图像以全分辨率查看以进行比较。.

如果您希望做进一步的处理,我不建议保存为JPG。

如果您希望输出与输入的大小相同,则将其大小调整为与输入的比率的倒数密度设为72。例如,-密度288和-调整大小25%。 288 = 4 * 72和25%= 1/4

密度越大,产生的质量越好,但是处理时间更长。

#10 楼

另一个建议是您可以使用GIMP。

只需将PDF文件加载到GIMP->中,另存为.xcf,即可对图像执行任何操作。

评论


通过命令行执行此操作的原因是,我有数千个页面需要此过程。

– JBWhitmore
13-10-24在13:09



此外,GIMP会在加载时呈现页面,因此在选择要加载的页面时需要设置分辨率。如果从加载时默认为100 DPI开始,则将输出参数设置为什么都没关系。

–基思·戴维斯(Keith Davies)
17年2月9日在1:29

#11 楼

我使用了pdf2image。一个简单的python库,其工作方式类似于charm。

首先在非linux机器上安装poppler。您可以只下载zip文件。解压缩程序文件,然后将bin添加到Machine Path。

之后,您可以在python类中使用pdf2image,例如:

from pdf2image import convert_from_path, convert_from_bytes
images_from_path = convert_from_path(
   inputfile,
   output_folder=outputpath,
   grayscale=True, fmt='jpeg')


我是
后来您可以将exe与文件输入和输出参数一起使用。我已在C#中使用它,并且一切正常。

图像质量很好。 OCR正常工作。

#12 楼

我使用icepdf一个开源的Java pdf引擎。检查办公室演示。

package image2pdf;

import org.icepdf.core.exceptions.PDFException;
import org.icepdf.core.exceptions.PDFSecurityException;
import org.icepdf.core.pobjects.Document;
import org.icepdf.core.pobjects.Page;
import org.icepdf.core.util.GraphicsRenderingHints;
import javax.imageio.ImageIO;
import java.awt.image.BufferedImage;
import java.awt.image.RenderedImage;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;

public class pdf2image {

   public static void main(String[] args) {

      Document document = new Document();
      try {
         document.setFile("C:\Users\Dell\Desktop\test.pdf");
      } catch (PDFException ex) {
         System.out.println("Error parsing PDF document " + ex);
      } catch (PDFSecurityException ex) {
         System.out.println("Error encryption not supported " + ex);
      } catch (FileNotFoundException ex) {
         System.out.println("Error file not found " + ex);
      } catch (IOException ex) {
         System.out.println("Error IOException " + ex);
      }

      // save page captures to file.
      float scale = 1.0f;
      float rotation = 0f;

      // Paint each pages content to an image and
      // write the image to file
      for (int i = 0; i < document.getNumberOfPages(); i++) {
         try {
         BufferedImage image = (BufferedImage) document.getPageImage(
             i, GraphicsRenderingHints.PRINT, Page.BOUNDARY_CROPBOX, rotation, scale);

         RenderedImage rendImage = image;
         try {
            System.out.println(" capturing page " + i);
            File file = new File("C:\Users\Dell\Desktop\test_imageCapture1_" + i + ".png");
            ImageIO.write(rendImage, "png", file);
         } catch (IOException e) {
            e.printStackTrace();
         }
         image.flush();
         }catch(Exception e){
             e.printStackTrace();
         }
      }

      // clean up resources
      document.dispose();
   }
}


我也尝试过imagemagick和pdftoppm,pdftoppm和icepdf都比imagemagick具有更高的分辨率。

#13 楼

请在拒绝投票之前注意,该解决方案适用于使用图形界面的Gimp,而不适用于使用命令行的ImageMagick,但是作为替代方案,它对我来说效果很好,这就是为什么我觉得有必要在此处分享。 br />
按照以下简单步骤从PDF文档中提取任何格式的图像


下载GIMP图像处理程序

安装后打开该程序
打开要提取图像的PDF文档
仅选择要提取图像的PDF文档的页面。
N / B:如果仅需要封面图像,仅选择第一页。
选择要从中提取图像的页面后,单击打开
打开页面时,在GIMP上单击文件菜单
在文件菜单中选择导出为
在弹出的对话框下方按扩展名(例如png)选择您喜欢的文件类型。
单击“导出”将图像导出到所需位置。
是然后您就可以检查文件浏览器中的导出图像了。

就这样。

希望对您有所帮助

评论


问题是使用命令行使用ImageMagick,而不是使用图形界面使用Gimp。

–悉尼
19年7月5日在8:58

#14 楼

您附加的PNG文件看起来真的很模糊。如果您需要对作为PDF预览生成的每个图像进行额外的后期处理,则会降低解决方案的性能。

2JPEG可以将附加到您的PDF文件转换为清晰的JPG并裁剪一次通话中的空白边距:

2jpeg.exe -src "C:\In\*.*" -dst "C:\Out" -oper Crop method:autocrop


评论


最初的PNG中的模糊性是首先激发问题的原因,并且公认的答案中的PNG相当清晰。

– JBWhitmore
14-10-13在17:35

#15 楼

使用以下命令行:

convert -geometry 3600x3600 -density 300x300 -quality 100 TEAM\ 4.pdf team4.png


这将正确地转换您所要求的文件。

#16 楼

以下python脚本可在任何Mac(Snow Leopard和更高版本)上使用。它可以在命令行中使用连续的PDF文件作为参数,也可以在Automator中放入“运行Shell脚本”操作,然后进行服务(在Mojave中使用“快速操作”)。

您可以在脚本中设置输出图像的分辨率。

可以从github下载脚本和快速操作。

#!/usr/bin/python
# coding: utf-8

import os, sys
import Quartz as Quartz
from LaunchServices import (kUTTypeJPEG, kUTTypeTIFF, kUTTypePNG, kCFAllocatorDefault) 

resolution = 300.0 #dpi
scale = resolution/72.0

cs = Quartz.CGColorSpaceCreateWithName(Quartz.kCGColorSpaceSRGB)
whiteColor = Quartz.CGColorCreate(cs, (1, 1, 1, 1))
# Options: kCGImageAlphaNoneSkipLast (no trans), kCGImageAlphaPremultipliedLast 
transparency = Quartz.kCGImageAlphaNoneSkipLast

#Save image to file
def writeImage (image, url, type, options):
    destination = Quartz.CGImageDestinationCreateWithURL(url, type, 1, None)
    Quartz.CGImageDestinationAddImage(destination, image, options)
    Quartz.CGImageDestinationFinalize(destination)
    return

def getFilename(filepath):
    i=0
    newName = filepath
    while os.path.exists(newName):
        i += 1
        newName = filepath + " %02d"%i
    return newName

if __name__ == '__main__':

    for filename in sys.argv[1:]:
        pdf = Quartz.CGPDFDocumentCreateWithProvider(Quartz.CGDataProviderCreateWithFilename(filename))
        numPages = Quartz.CGPDFDocumentGetNumberOfPages(pdf)
        shortName = os.path.splitext(filename)[0]
        prefix = os.path.splitext(os.path.basename(filename))[0]
        folderName = getFilename(shortName)
        try:
            os.mkdir(folderName)
        except:
            print "Can't create directory '%s'"%(folderName)
            sys.exit()

        # For each page, create a file
        for i in range (1, numPages+1):
            page = Quartz.CGPDFDocumentGetPage(pdf, i)
            if page:
        #Get mediabox
                mediaBox = Quartz.CGPDFPageGetBoxRect(page, Quartz.kCGPDFMediaBox)
                x = Quartz.CGRectGetWidth(mediaBox)
                y = Quartz.CGRectGetHeight(mediaBox)
                x *= scale
                y *= scale
                r = Quartz.CGRectMake(0,0,x, y)
        # Create a Bitmap Context, draw a white background and add the PDF
                writeContext = Quartz.CGBitmapContextCreate(None, int(x), int(y), 8, 0, cs, transparency)
                Quartz.CGContextSaveGState (writeContext)
                Quartz.CGContextScaleCTM(writeContext, scale,scale)
                Quartz.CGContextSetFillColorWithColor(writeContext, whiteColor)
                Quartz.CGContextFillRect(writeContext, r)
                Quartz.CGContextDrawPDFPage(writeContext, page)
                Quartz.CGContextRestoreGState(writeContext)
        # Convert to an "Image"
                image = Quartz.CGBitmapContextCreateImage(writeContext) 
        # Create unique filename per page
                outFile = folderName +"/" + prefix + " %03d.png"%i
                url = Quartz.CFURLCreateFromFileSystemRepresentation(kCFAllocatorDefault, outFile, len(outFile), False)
        # kUTTypeJPEG, kUTTypeTIFF, kUTTypePNG
                type = kUTTypePNG
        # See the full range of image properties on Apple's developer pages.
                options = {
                    Quartz.kCGImagePropertyDPIHeight: resolution,
                    Quartz.kCGImagePropertyDPIWidth: resolution
                    }
                writeImage (image, url, type, options)
                del page


#17 楼

您可以在LibreOffice Draw(通常预装在Ubuntu中)中进行操作:


在LibreOffice Draw中打开PDF文件。
滚动到所需的页面。

确保正确放置文本/图像元素。如果没有,则可以在页面上进行调整/编辑。
顶部菜单:文件>导出...
在右下方菜单中选择所需的图像格式。我建议使用PNG。
命名文件,然后单击“保存”。
将显示“选项”窗口,以便您调整分辨率和大小。
单击“确定”,就完成了。


#18 楼

在Mac上使用“预览”实际上非常容易。所有您需要做的就是在“预览”中打开文件并另存为(或导出)png或jpeg,但是请确保在窗口底部至少使用300 dpi以获得高质量的图像。

评论


如果您有数千页,可以自动执行吗?

– JBWhitmore
18年7月8日在3:39