将PDF转换为高分辨率的图像

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

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

这是我当前的最好的尝试。正如你所看到的,修剪工作很好,我只是需要锐化的分辨率相当多。这是我正在使用的命令:

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

我试着做了以下有意识的决定:

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

任何建议,请在最终的PNG/JPEG图像的分辨率更高,将非常感谢!

437145 次浏览

看来以下方法是有效的:

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

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

 

(为了真的< em > < / em >查看和欣赏两者之间的差异,右键单击每个并选择“在新选项卡中打开图像…”。)

还要记住以下事实:

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

所以,不需要调整大小;添加-density标志。密度值150很奇怪——尝试一个范围的值会导致图像在两个方向上看起来都很糟糕!

它也会给你带来好的结果:

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

我个人喜欢这个。

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上参数的描述是在这里

我发现,当使用convert使用的底层gs(又名Ghostscript)命令将大型pdf批量处理为png和jpg时,它既更快又更稳定。

你可以在convert -verbose的输出中看到这个命令,那里还有一些可能的调整(YMMV),这些调整很难/不可能直接通过convert访问。

然而,使用gs将更难进行修剪和锐化,因此,正如我所说的,YMMV!

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

只需在GIMP->中加载PDF文件,另存为.xcf,然后你就可以对图像做任何你想做的事情了。

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

2 jpeg可以转换PDF文件,你附加到一个漂亮的锐化JPG和裁剪空边距在一个调用:

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

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

使用这个命令行:

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

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

通常我在原生分辨率下用'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

随着最近的“popler -util”;(0.50+, 2016)你可以使用-所有保存有损为JPG和无损为png,所以一个简单的:

$ pdfimages -all fileName.pdf fileName

从PDF中提取总是最好的质量内容。

在小提供的Win平台上,您必须下载最近的(0.68,2018)' popler -util'二进制从: http://blog.alivate.com.au/poppler-windows/ < / p >

这里的Linux用户:我尝试了convert命令行实用程序(用于PDF到PNG),我对结果不满意。我发现这样做更简单,效果也更好:

  • 使用PDFTK提取PDF页面
    • 例如:pdftk file.pdf cat 3 output page3.pdf
    • 李< / ul > < / >
    • 使用GIMP打开(导入)pdf
      • 重要:将导入Resolution100更改为300600 pixel/in
      • 李< / ul > < / >
      • GIMP导出为PNG(更改文件扩展名为。PNG)

      编辑:

      根据Comments中的要求,添加了图片。转换命令使用:

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

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

      我没有在命令行上使用GIMP(回复:我的评论,在下面)。

      pdf2png

      enter image description here

在mac电脑上使用预览其实很容易做到。你所要做的就是在预览中打开文件,并另存(或导出)png或jpeg格式,但要确保你在窗口底部使用至少300 dpi来获得高质量的图像。

下面的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

在ImageMagick中,你可以做“超级采样”。您可以指定一个较大的密度,然后根据最终输出大小调整大小。以你的图片为例:

convert -density 600 test.pdf -background white -flatten -resize 25% test.png
< p > < br > enter image description here < / p >

下载图像以完整的分辨率进行比较。

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

如果你想要输出与输入相同的大小,那么将大小调整为密度与72之比的倒数。例如,-density 288和-resize 25%。288=4*72, 25%=1/4

密度越大,得到的质量越好,但需要更长的加工时间。

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

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

  1. 下载GIMP图像处理程序
  2. 安装完成后打开程序
  3. 打开要提取图像的PDF文档
  4. 只选择要从中提取图像的PDF文档的页面。 N/B:如果您只需要封面图片,则只选择第一页
  5. 选择要从中提取图像的页面后,单击打开
  6. 点击文件菜单当GIMP页面打开时
  7. 在文件菜单中选择出口的
  8. 在弹出的对话框下面选择你喜欢的扩展文件类型(比如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有高分辨率。

我在convert上真的没有很好的成功[2020年5月更新:实际上:它对我来说几乎从来没有起过作用],但我在pdftoppm上取得了非常好的成功。下面是几个从PDF生成高质量图像的例子:

  1. [每pg产生约25mb大小的文件]将未压缩的.tif文件格式输出到名为“images”的文件夹中,文件名为气管无名动脉瘘管的pg - 1.气管无名动脉瘘管的pg - 2.气管无名动脉瘘管的pg - 3.等:

     mkdir -p images && pdftoppm -tiff -r 300 mypdf.pdf images/pg
    
  2. [每pg产生大约1mb大小的文件]在300 DPIjpg格式输出:

     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
    

要了解更多解释、选项和示例,请参阅我的完整答案:

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

相关:

  1. [如何将PDF转换为可搜索的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. 585574年< a href = " https://unix.stackexchange.com/questions/11835/pdf-to-jpg-without-quality-loss-gscan2pdf/585574 " > https://unix.stackexchange.com/questions/11835/pdf-to-jpg-without-quality-loss-gscan2pdf/585574 # 585574 < / >

你可以在LibreOffice画中执行(通常在Ubuntu中预安装):

  1. 在LibreOffice Draw中打开PDF文件。
  2. 滚动到需要的页面。
  3. 确保文本/图像元素被正确放置。如果没有,可以在页面上进行调整/编辑。
  4. 顶部菜单:文件>导出…
  5. 在右下角菜单中选择所需的图像格式。我推荐PNG。
  6. 命名文件并单击Save。
  7. 选项窗口将出现,因此您可以调整分辨率和大小。
  8. 单击OK,就完成了。

我已经使用了pdf2image。一个简单的python库,工作起来很有魅力。

首先在非linux机器上安装波普尔。你可以下载压缩包。在“程序文件”中解压,并将bin添加到“机器路径”中。

之后,你可以像这样在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。 稍后,您可以使用带有文件输入和输出参数的exe。我已经在c#中使用了它,事情工作得很好

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

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

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"');

地点:

-density 300 = dpi

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

质量100 =质量vs压缩(100%质量)

平……对于多页,不要使用“扁平化”;

convert -density 300 * airbnb.pdf

在我看来很完美

对于窗户(在W11上测试):

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

你需要安装:

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

< p >内容 https://www.ghostscript.com/releases/gsdnld.html < / p >

额外的信息:

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

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

  • 前面提到的convert命令已弃用,改用magick

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

抽取OP“样本”;要求是一个清晰的修剪图像尽可能小,但保持良好的可读性。和这里结果是96dpi在58 KB(一个非常小的增加矢量源54 KB)仍然保持良好的形象,即使放大。将其与上面接受的答案图像中的72 dpi (226 KB)进行比较。

enter image description here

关键是任何图像处理器都可以通过脚本从命令行批量运行,使用配置文件作为输入,所以这里IrfanView(带或不带GS)被设置为自动裁剪pdf页面,并在默认的96 dpi输出到PNG,仅使用16个灰色阴影的4个BitPerPixel颜色。
尺寸可以通过降低分辨率到72来进一步减小,但96是PNG屏幕显示的最佳设置