Image 如何从扫描的pdf中提取图像

Image 如何从扫描的pdf中提取图像,image,pdf,Image,Pdf,我使用Tesseract从扫描的PDF中提取文本。其中一些文件还包含图像。有没有办法得到这些图像 我通过在tiff文件中转换来为tesseract准备扫描的pdf。但我找不到任何命令行工具来从中提取图像,就像pdfimages对“文本”pdf所做的那样 有没有一种工具(或多种工具的组合)可以帮助我完成这项工作?您将无法使用Tesseract OCR进行图像处理,因为这不是它设计的目的。最好先使用工具提取图像,然后再使用Tesseract获取文本 通过xPDF,您可以从PDFimages中获得一些

我使用Tesseract从扫描的PDF中提取文本。其中一些文件还包含图像。有没有办法得到这些图像

我通过在tiff文件中转换来为tesseract准备扫描的pdf。但我找不到任何命令行工具来从中提取图像,就像pdfimages对“文本”pdf所做的那样


有没有一种工具(或多种工具的组合)可以帮助我完成这项工作?

您将无法使用Tesseract OCR进行图像处理,因为这不是它设计的目的。最好先使用工具提取图像,然后再使用Tesseract获取文本

通过xPDF,您可以从PDFimages中获得一些使用

您需要下载R、Rstudio、xPDFreader和PDFtools来完成这项工作。确保您的程序文件可以在“环境变量”(如果使用Windows)中找到,以便R可以找到程序

然后做类似的事情来转换它。有关PDFimages的帮助,请参阅文档中的选项。这就是语法的用法(特别是在paste0之后)。注意选项的位置。它们必须位于文件输入名称之前:

  #("PDF to PPM")      
      files <- tools::file_path_sans_ext(list.files(path = dest, pattern = 
 "pdf", full.names = TRUE))
    lapply(files, function(i){
      shell(shQuote(paste0("pdftoppm -f 1 -l 10 -r 300 ", i,".pdf", " ",i)))
      })

在许多情况下,当有人拥有PDF文件,并且他们想要“获取”图像时,将页面本身呈现为图像通常是令人满意的。但是,如果确实要提取图像,则需要小心使用何种工具,并调查其声誉和输出质量

要认识到的第一件重要事情是,如果工具声称“从PDF中提取TIFF”或“从PDF中提取JPG”,那么它们会误导您,因为PDF中不包含JPEG或TIFF图像。产生混淆的原因是,这两种光栅图像格式可以使用的压缩技术在PDF中用于压缩图像数据,但这与JPG文件与PDF“共存”不同

有很多工具,但是你会发现质量会有很大的差异。有些可以很好地处理简单的PDF,但有大小限制,或者复杂的PDF只会使其崩溃或挂起。有些可以很好地处理RGB数据,但它只是跳过或错误地处理了其他颜色空间。有些文件不允许您对数据进行粒度控制,只需提取所有内容并将其重新压缩为JPEG。最重要的是,图像数据往往会以某种方式损坏,您使用的技术必须能够优雅地处理这些情况

如果您计划将此作为企业解决方案的一部分进行部署,则需要一个能够处理大多数PDF的工具。

1。使用 2.使用以下提取脚本: 在新的图像文件夹中查找剪切的图像。 查看跟踪文件夹中所做的操作,以确保没有遗漏任何图像

活动 它将处理所有图像并查找图像中的形状。如果找到的形状大于可配置的大小,它将填充最大边界框,剪切图像并将其保存在新图像中,此外,它将创建名为traces的文件夹,其中显示所有边界框

如果您想找到较小的图像,只需减小最小宽度和最小高度,但是如果设置得太低,它将找到每个字符

在我的测试中,它工作得非常好,只是找到了一些太多的图像

提取图像.py 信用 基本算法由提供,作为对该问题的回答:


在Poppler包中查找
pdfimages
。@MarkSetchell当我将pdfimages与扫描的pdf一起使用时,它会提取完整的页面,而不仅仅是图像。我认为这是一个只用于“文本”pdf的工具,而不是扫描的。扫描的pdf通常每页包含一个位图图像,在这个位图图像上有该页的所有扫描内容。像这样的文本与其他文本的分离通常不会发生。因此,当您从PDF中提取图像资源时,您将获得整个页面内容的位图。@MarkSetchell True。但使用Tesseract,我将位图图像中的文本转换为tiff。我正在寻找一个工具来处理图像。谢谢@Mitchell,但我怀疑我的问题不够清楚:)让我试着澄清一下:当然我知道你不能用Tesseract来处理,这就是为什么我要求一个可能不存在的命令行工具。我尝试了你的解决方案,但如前所述,它不会检测PDF(或tiff)中的图像,而是将整个页面提取为图像,这不是我想要的。啊,对不起,我帮不了你什么忙。
pdftoppm -f 1 -l 10 -r 300 stuff.pdf stuff.ppm
pdfimages mydoc.pdf
./extractImages.py images*
#!/bin/env python 

import cv2
import numpy as np
import os
from pathlib import Path

def extractImagesFromFile(inputFilename, outputDirectory, tracing=False, tracingDirectory=""):
    
    # Settings:
    minimumWidth = 100
    minimumHeight = 100
    greenColor = (36, 255, 12)
    traceWidth = 2
    
    # Load image, grayscale, Otsu's threshold
    image = cv2.imread(inputFilename)
    original = image.copy()
    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    thresh = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)[1]

    # Find contours, obtain bounding box, extract and save ROI
    ROI_number = 1
    cnts = cv2.findContours(thresh, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
    cnts = cnts[0] if len(cnts) == 2 else cnts[1]
    for c in cnts:
        x, y, w, h = cv2.boundingRect(c)
        if w >= minimumWidth and h >= minimumHeight:
            cv2.rectangle(image, (x, y), (x + w, y + h), greenColor, traceWidth)
            ROI = original[y:y+h, x:x+w]
            outImage = os.path.join(outputDirectory, '{}_{}.png'.format(Path(inputFilename).stem, ROI_number))
            cv2.imwrite(outImage, ROI)
            ROI_number += 1
    if tracing:
        outImage = os.path.join(tracingDirectory, Path(inputFilename).stem + '_trace.png')
        cv2.imwrite(outImage, image)

def main(files):

    tracingEnabled = True
    outputDirectory = 'images'
    tracingDirectory = 'tracing'

    # Create the output directory if it does not exist
    outputPath = Path.cwd() / outputDirectory
    outputPath.mkdir(exist_ok=True)

    if tracingEnabled:
        tracingPath = Path.cwd() / tracingDirectory
        tracingPath.mkdir(exist_ok=True)

    for f in files:
        print("Prcessing {}".format(f))
        if Path(f).is_file():
            extractImagesFromFile(f, outputDirectory, tracingEnabled, tracingDirectory)
        else:
            print("Invalid file: {}".format(f))

if __name__ == "__main__":
    import argparse
    from glob import glob
    parser = argparse.ArgumentParser()  
    parser.add_argument("fileNames", nargs='*') 
    args = parser.parse_args()  
    fileNames = list()  
    for arg in args.fileNames:  
        fileNames += glob(arg)  
    main(fileNames)