将PDF转换为高分辨率图像


328

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

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

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

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

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

  • 将其调整为更大的尺寸(对分辨率没有影响)
  • 使质量尽可能高
  • 使用-sharpen(我尝试了一系列值)

任何对提高最终PNG / JPEG图像分辨率的建议都将不胜感激!


我不知道,您也可以尝试链接 ...
卡诺克2011年


如果你是在Mac上,看看该手册页sips的“脚本化的图像处理系统”。这是macOS内置的命令行图像编辑器,适用于PDF和许多其他图像类型。
ghoti

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

Answers:


386

看来以下工作原理:

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

结果为左侧图像。将其与我原始命令的结果(右图)进行比较:

  

(要真正看到并欣赏两者之间的区别,请右键单击每个并选择“在新选项卡中打开图像...”。)

还请记住以下事实:

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

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


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

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

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

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

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

152

我个人喜欢这样。

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

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

-density 300 设置渲染PDF的dpi。

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

-quality 100 将JPEG压缩质量设置为最高质量。

诸如此类的东西-sharpen不适用于文本,因为它们会撤消字体渲染系统所做的使它更易读的事情。

如果您确实希望将其炸毁,请在此处使用调整大小,并可能使用较大的dpi值(例如,targetDPI * scalingFactor 那将使PDF达到您想要的分辨率/大小)。

这里 imagemagick.org上的参数说明


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

使用convert我们将如何知道转换了多少页面?
基兰·雷迪

嗯,这绝对是要走的路。碰撞光源密度并去除光源-sharpen。质量比使用默认设置好得多,并且比使用更加自然-sharpen
约书亚·品特

19

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


1
在不使用Imagemagick的情况下,此解决方案似乎最符合透明转换的精神。pdftoppm也可以输出JPEG和PNG。
亚伦·布里克

19

通常,我使用原始分辨率的'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

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

13

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

您可以在的输出中看到该命令,convert -verbose并且那里还有一些可能的调整(YMMV),很难/不可能直接通过进行调整convert

但是,使用进行修剪和锐化会比较困难gs,所以,正如我所说的,YMMV!


10

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

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

7

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

  • 用pdftk提取pdf页面
    • 例如: pdftk file.pdf cat 3 output page3.pdf
  • 打开(导入)该PDF文件 GIMP
    • 重要:将导入Resolution从更改100300600 pixel/in
  • GIMP导出为PNG时(将文件扩展名更改为.png)

编辑:

按照中的要求添加了图片Comments。使用的转换命令:

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

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

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

pdf2png

在此处输入图片说明


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

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

1
@JBWhitmore在此问题/答案中显示了用于自动完成此转换的示例脚本:unix.stackexchange.com/questions/121293/…–
tsherwen

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

1
@JBWhitmore。我错误地只是在思考关于的问题convertconvert在阅读自动化注释时,我只看到该答案的一部分以及您的问题。感谢您稍后对此线程的回答,我将其与链接到的解决方案相结合并解决了我遇到的另一个问题。
tsherwen

7

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

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

    mkdir -p images && pdftoppm -tiff -r 300 mypdf.pdf images/pg
    
  2. [每pg产生1MB大小的文件] 以300 DPI的.jpg格式输出:

    mkdir -p images && pdftoppm -jpeg -r 300 mypdf.pdf images/pg
    
  3. [每pg产生约2MB大小的文件]以.jpg格式输出,质量最高(压缩最低),但仍为300 DPI

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

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

/ubuntu/150100/extracting-embedded-images-from-a-pdf/1187844#1187844

有关:

  1. [如何通过w /将PDF转换为可搜索的PDF pdf2searchablepdf] /ubuntu/473843/how-to-turn-a-pdf-into-a-text-searchable-pdf/1187881#1187881
  2. 交联:
    1. 如何在Linux中使用命令行将PDF转换为JPG?
    2. /unix/11835/pdf-to-jpg-without-quality-loss-gscan2pdf/585574#585574

6

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

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


在此处输入图片说明

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

如果您希望进行进一步处理,建议不要保存为JPG。

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

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


3

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

只需将GIMP-> PDF文件加载为.xcf,然后就可以对图像执行任何操作。


9
通过命令行执行此操作的原因是,我有成千上万的页面需要此过程。
JBWhitmore

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

1

我使用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();
   }
}

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


1

请在不赞成投票之前注意,该解决方案适用于使用图形界面的Gimp,而不适用于使用命令行的ImageMagick,但是作为替代方案,它对我来说效果很好,这就是为什么我觉得有必要在此处分享。

请按照以下简单步骤从PDF文档中提取任何格式的图像

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

就这样。

我希望这有帮助


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

0

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

2JPEG可以转换您附加到一个不错的JPG的PDF文件并在一次调用中裁剪空白边距:

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

最初的问题是最初的PNG中的模糊性,而在公认的答案中,PNG非常清晰。
JBWhitmore


0

以下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

0

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

  1. 在LibreOffice Draw中打开PDF文件。
  2. 滚动到所需的页面。
  3. 确保正确放置文本/图像元素。如果没有,您可以在页面上调整/编辑它们。
  4. 顶部菜单:文件>导出...
  5. 在右下菜单中选择所需的图像格式。我推荐PNG。
  6. 为文件命名,然后单击“保存”。
  7. 将出现“选项”窗口,因此您可以调整分辨率和尺寸。
  8. 单击确定,完成。

0

我使用了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')

我对python不好,但是能够执行它。稍后,您可以将exe与文件输入和输出参数一起使用。我已经在C#中使用它,并且一切正常。

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


-1

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


6
如果您有数千页,可以自动执行吗?
JBWhitmore '18
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.