繁体   English   中英

将PDF转换为高分辨率图像

[英]Convert PDF to image with high resolution

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

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

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

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

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

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

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

似乎以下工作:

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

结果是左图 将此与我原始命令的结果(右图)进行比较:

(要真正了解和欣赏两者之间的差异,请右键单击每个和 select "Open Image in New Tab..." 。)

还要记住以下事实:

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

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

我个人喜欢这个。

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

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

-density 300设置渲染 PDF 的 dpi。

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

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

-sharpen这样的东西不能很好地处理文本,因为它们会撤销你的字体渲染系统为使其更清晰所做的事情。

如果您真的希望它被炸毁,请在此处使用 resize 并可能使用更大的 dpi 值,例如targetDPI * scalingFactor这将以您想要的分辨率/大小呈现 PDF。

imagemagick.org 上的参数说明在这里

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

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

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

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

     mkdir -p images && pdftoppm -jpeg -r 300 mypdf.pdf images/pg
  3. [每 pg 生成约 2MB 大小的文件] Output以最高质量(最小压缩)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

有关的:

  1. [How to turn a PDF into a searchable PDF w/ pdf2searchablepdf ] https://askubuntu.com/questions/473843/how-to-turn-a-pdf-into-a-text-searchable-pdf/1187881#1187881
  2. 交联:
    1. 如何使用 Linux 中的命令行将 PDF 转换为 JPG?
    2. https://unix.stackexchange.com/questions/11835/pdf-to-jpg-without-quality-loss-gscan2pdf/585574#585574

通常我以原始分辨率提取带有“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-util”(0.50+,2016),您可以使用 -all 将有损保存为 jpg 并将无损保存为 png,所以很简单:

$ pdfimages -all fileName.pdf fileName

始终从 PDF 中提取尽可能高质量的内容。

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

在 ImageMagick 中,您可以进行“超级采样”。 您指定一个大的密度,然后根据最终 output 大小的需要调整大小。 例如,您的图像:

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


在此处输入图像描述

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

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

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

密度越大,最终的质量越好,但处理时间会更长。

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

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

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

它还为您提供了良好的结果:

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

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(回复:我的评论,如下)。

pdf2png

在此处输入图像描述

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

只需在 GIMP->save as.xcf 中加载 PDF 文件,然后您就可以对图像进行任何操作。

我用过pdf2image 一个简单的 python 库,就像魅力一样。

首先在非 linux 机器上安装poppler 您只需下载 zip。 在 Program Files 中解压缩并将 bin 添加到 Machine Path。

之后,您可以像这样在 python class 中使用 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。 稍后您可以使用带有文件输入和 output 参数的 exe。 我在 C# 中使用过它,一切正常。

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

对于Windows (在 W11 上测试):

magick.exe -verbose -density 150 "input.pdf" -quality 100 -sharpen 0x1.0 output.jpg

你需要安装:

ImageMagick https://imagemagick.org/index.php

ghostscript https://www.ghostscript.com/releases/gsdnld.html

附加信息:

  • 注意使用-flatten参数,因为它只能生成第一页作为图像

  • 使用-scene 1参数以图像名称从索引 1 开始

  • 问题中提到的convert命令已被弃用,取而代之的是magick

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

2JPEG可以将您附加的 PDF 文件转换为一个很好的锐化 JPG 并在一次调用中裁剪空白边距:

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

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

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

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

就这样。

我希望这有帮助

我使用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 高。

从 iOS Swift 中的 Pdf 获取图像 最佳解决方案

func imageFromPdf(pdfUrl : URL,atIndex index : Int, closure:@escaping((UIImage)->Void)){
    
    autoreleasepool {
        
        // Instantiate a `CGPDFDocument` from the PDF file's URL.
        guard let document = PDFDocument(url: pdfUrl) else { return }
        
        // Get the first page of the PDF document.
        guard let page = document.page(at: index) else { return }
        
        // Fetch the page rect for the page we want to render.
        let pageRect = page.bounds(for: .mediaBox)
        
        let renderer = UIGraphicsImageRenderer(size: pageRect.size)
        let img = renderer.image { ctx in
            // Set and fill the background color.
            UIColor.white.set()
            ctx.fill(CGRect(x: 0, y: 0, width: pageRect.width, height: pageRect.height))
            
            // Translate the context so that we only draw the `cropRect`.
            ctx.cgContext.translateBy(x: -pageRect.origin.x, y: pageRect.size.height - pageRect.origin.y)
            
            // Flip the context vertically because the Core Graphics coordinate system starts from the bottom.
            ctx.cgContext.scaleBy(x: 1.0, y: -1.0)
            
            // Draw the PDF page.
            page.draw(with: .mediaBox, to: ctx.cgContext)
        }
        closure(img)

    }
    
    
}

//用法

    let pdfUrl = URL(fileURLWithPath: "PDF URL")
    self.imageFromPdf2(pdfUrl: pdfUrl, atIndex: 0) { imageIS in
        
    }

这适用于从多个 PDF 和图像文件创建单个文件:

php exec('convert -density 300 -trim "/path/to/input_filename_1.png" "/path/to/input_filename_2.pdf" "/path/to/input_filename_3.png" -quality 100 "/path/to/output_filename_0.pdf"');

在哪里:

-密度 300 = dpi

-trim = 一些关于透明度的东西 - 使边缘看起来光滑,看起来

-quality 100 = 质量与压缩(100 % 质量)

-flatten... 对于多页,不要使用“flatten”

这里的许多答案都集中在使用 OP 问题设置的 magick(或其依赖项 GhostScript)上,其中一些建议将 Gimp 作为替代方案,但没有描述为什么某些设置可能最适合不同的情况。

以 OP“样本”为例,要求是清晰的修剪图像尽可能小,但仍保持良好的可读性。 这里的结果是 58 KB 中的 96 dpi(在矢量源 54 KB 上略有增加),但即使放大也保留了良好的图像。与上面接受的答案图像中的 72 dpi(226 KB)进行比较。

在此处输入图像描述

关键是任何图像处理器都可以编写脚本以使用配置文件作为输入从命令行批量运行,因此此处 IrfanView(带或不带 GS)设置为自动裁剪 pdf 页面和 output,默认为 96 dpi只使用 4 BitPerPixel 颜色的 16 种灰度到 PNG。
通过将分辨率降低到 72 可以进一步减小尺寸,但 96 是 PNG 屏幕显示的最佳设置。

使用这个命令行:

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

这应该按照您的要求正确转换文件。

以下 python 脚本适用于任何 Mac(Snow Leopard 及更高版本)。 它可以在命令行上与连续的 PDF 文件作为 arguments 一起使用,或者您可以在 Automator 中放入 Run Shell 脚本动作,并在 Mojave 中进行服务(快速操作)。

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

可以从 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

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

  1. 在 LibreOffice Draw 中打开 PDF 文件。
  2. 滚动到您需要的页面。
  3. 确保正确放置文本/图像元素。 如果没有,您可以在页面上调整/编辑它们。
  4. 顶部菜单:文件 > 导出...
  5. Select 右下角菜单中您需要的图像格式。 我推荐PNG。
  6. 命名您的文件,然后单击保存。
  7. 选项 window 将出现,因此您可以调整分辨率和大小。
  8. 单击确定,您就完成了。
convert -density 300 * airbnb.pdf

对我来说看起来很完美

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM