[英]how to convert pdf scanned image to high resolution tiff with best for ocr?
[英]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..." 。)
还要记住以下事实:
因此,无需调整大小; 添加-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 生成高质量图像的几个示例:
[每 pg 生成约 25 MB 大小的文件] Output 以300 DPI的未压缩.tif文件格式放入名为“images”的文件夹中,文件名为pg-1.tif 、 pg-2.tif 、 pg-3.tif , ETC:
mkdir -p images && pdftoppm -tiff -r 300 mypdf.pdf images/pg
[每 pg 产生约 1MB 大小的文件] Output .jpg格式, 300 DPI :
mkdir -p images && pdftoppm -jpeg -r 300 mypdf.pdf images/pg
[每 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 。
pdf2searchablepdf
] https://askubuntu.com/questions/473843/how-to-turn-a-pdf-into-a-text-searchable-pdf/1187881#1187881通常我以原始分辨率提取带有“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 file.pdf cat 3 output page3.pdf
GIMP
打开(导入)pdf
Resolution
从100
更改为300
或600 pixel/in
GIMP
中导出为 PNG(将文件扩展名更改为 .png)编辑:
根据Comments
中的要求添加了图片。 使用的转换命令:
convert -density 300 -trim struct2vec.pdf -quality 100 struct2vec.png
GIMP
:以 300 dpi (px/in) 导入; 导出为 PNG 压缩级别 3。
我没有在命令行上使用 GIMP(回复:我的评论,如下)。
另一个建议是您可以使用 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 文档中提取任何格式的图像
就这样。
我希望这有帮助
我使用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 高。
从 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 图像的分辨率。
#!/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中):
convert -density 300 * airbnb.pdf
对我来说看起来很完美
在 Mac 上使用 Preview 实际上很容易。 您所要做的就是在预览中打开文件并另存为(或导出)png 或 jpeg,但请确保在 window 的底部使用至少 300 dpi 以获得高质量的图像。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.