簡體   English   中英

如何將 PDF 轉換為 opencv-python 可讀的圖像?

[英]How to convert PDF into image readable by opencv-python?

我正在使用以下代碼在圖像文本上繪制矩形以匹配日期模式及其工作正常。

import re
import cv2
import pytesseract
from PIL import Image
from pytesseract import Output

img = cv2.imread('invoice-sample.jpg')
d = pytesseract.image_to_data(img, output_type=Output.DICT)
keys = list(d.keys())

date_pattern = '^(0[1-9]|[12][0-9]|3[01])/(0[1-9]|1[012])/(19|20)\d\d$'

n_boxes = len(d['text'])
for i in range(n_boxes):
    if int(d['conf'][i]) > 60:
        if re.match(date_pattern, d['text'][i]):
            (x, y, w, h) = (d['left'][i], d['top'][i], d['width'][i], d['height'][i])
            img = cv2.rectangle(img, (x, y), (x + w, y + h), (0, 255, 0), 2)

cv2.imshow('img', img)
cv2.waitKey(0)
img.save("sample.pdf")

現在,最后我得到了一個 PDF 在匹配的日期模式上帶有矩形。

我想給這個程序掃描 PDF 作為輸入而不是上面的圖像。 它首先應將 PDF 轉換為 opencv 可讀的圖像格式,進行與上述相同的處理。 請幫忙。 (任何解決方法都可以。我需要一個解決方案,我可以將 PDF 轉換為圖像並直接使用它,而不是保存在磁盤上並從那里再次讀取它們。因為我有很多 PDF 需要處理。)

有一個名為 pdf2image 的庫。 您可以使用pip install pdf2image安裝它。 然后,您可以使用以下命令將 pdf 的頁面轉換為所需格式的圖像:

from pdf2image import convert_from_path

pages = convert_from_path("pdf_file_to_convert")
for page in pages:
    page.save("page_image.jpg", "jpg")

現在您可以使用此圖像應用 opencv 函數。

您可以使用BytesIO來完成您的工作,而無需保存文件:

from io import BytesIO
from PIL import Image

with BytesIO() as f:
   page.save(f, format="jpg")
   f.seek(0)
   img_page = Image.open(f)

您可以使用庫pdf2image 使用以下命令安裝: pip install pdf2image 然后,您可以將文件轉換為 cv2 可讀的一個或多個圖像。 下一個代碼示例會將 PIL 圖像轉換為 cv2 可讀的內容:

注意:以下代碼需要numpy pip install numpy

from pdf2image import convert_from_path
import numpy as np

images_of_pdf = convert_from_path('source2.pdf')  # Convert PDF to List of PIL Images
readable_images_of_pdf = []  # Create a list for thr for loop to put the images into
for PIL_Image in images_of_pdf:
    readable_images_of_pdf.append(np.array(PIL_Image))  # Add items to list

下一段代碼可以將 pdf 轉換成 cv2 可讀的大圖:

import cv2
import numpy as np
from pdf2image import convert_from_path

image_of_pdf = np.concatenate(tuple(convert_from_path('/path/to/pdf/source.pdf')), axis=0)

pdf2image 庫的convert_from_path() function 返回一個列表,其中包含 PIL 圖像格式的每個 pdf 頁面。 我們將列表轉換為 numpy 連接 function的元組以將圖像堆疊在一起。 如果您希望它們並排,您可以將軸 integer 更改為 1,表示您想要沿 y 軸連接圖像。 下一段代碼將在屏幕上顯示圖像:

cv2.imshow("Image of PDF", image_of_pdf)
cv2.waitKey(0)

這可能會在太大的屏幕上創建 window。 要調整屏幕圖像的大小,您將使用以下代碼,該代碼使用 cv2 的內置調整大小 function:

import cv2
from pdf2image import convert_from_path
import numpy as np
image_of_pdf = np.concatenate(tuple(convert_from_path('source2.pdf')), axis=0)
size = 0.15 # 0.15 is equal to 15% of the original size.
resized = cv2.resize(image_of_pdf, (int(image_of_pdf.shape[:2][1] * size), int(image_of_pdf.shape[:2][0] * size)))
cv2.imshow("Image of PDF", resized)
cv2.waitKey(0)

在 1920x1080 的顯示器上,0.15 的大小可以舒適地顯示 3 頁的文檔。 缺點是質量大大降低。 如果您想將頁面分開,您可以使用原始的convert_from_path() function。 以下代碼分別顯示每一頁,到 go 到下一頁按任意鍵:

import cv2
from pdf2image import convert_from_path
import numpy

images_of_pdf = convert_from_path('source2.pdf')  # Convert PDF to List of PIL Images
count = 0  # Start counting which page we're on
while True:
    cv2.imshow(f"Image of PDF Page {count + 1}", numpy.array(images_of_pdf[count]))  # Display the page with it's number
    cv2.waitKey(0)  # Wait until key is pressed
    cv2.destroyWindow(f"Image of PDF Page {count + 1}")  # Destroy the following window
    count += 1  # Add to the counter by 1
    if count == len(images_of_pdf):
        break  # Break out of the while loop before you get an "IndexError: list index out of range"

兩行代碼從 PDF 到 opencv 就緒數組。 我還添加了代碼來調整和查看 opencv 圖像。 不保存到磁盤。

# imports
from pdf2image import convert_from_path
import cv2
import numpy as np

# convert PDF to image then to array ready for opencv
pages = convert_from_path('sample.pdf')
img = np.array(pages[0])

# opencv code to view image
img = cv2.resize(img, None, fx=0.5, fy=0.5)
cv2.imshow("img", img)
cv2.waitKey(0)
cv2.destroyAllWindows()

請記住,如果您的 Windows PATH 變量中沒有 poppler,您可以提供convert_form_path的路徑

poppler_path = r'C:\path_to_poppler'
pages = convert_from_path('sample.pdf', poppler_path=poppler_path)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM