Python & OpenCV
Is there any Native Supports for Grabbing Images from PDFs or Create some sort of Object in Python that can contain the Images from a pdf that then can be access via OpenCV? I've l
Solution 1:
Edit: I've made a modification in the code following the comment of @Dan MaĊĦek
You can achieve this (load the PDF embedded images into OpenCV without writing intermediate objects on disk) using PyMuPDF and Numpy.
In this example, I'm using this pdf file.
import fitz
import cv2
import numpy as np
def pix2np(pix):
im = np.frombuffer(pix.samples, dtype=np.uint8).reshape(pix.h, pix.w, pix.n)
im = np.ascontiguousarray(im[..., [2, 1, 0]]) # rgb to bgr
return im
doc = fitz.open('NGM_2018_Media_Kit.pdf')
# entire page
# pix = doc.getPagePixmap(0, alpha=False)
# first page , 5th image, xref element
pix = fitz.Pixmap(doc, doc.getPageImageList(0)[4][0])
im = pix2np(pix)
cv2.putText(im, 'Azul fellawen', (100, 100),
cv2.FONT_HERSHEY_SIMPLEX, 1.,
(18, 156, 243), 2, cv2.LINE_AA)
cv2.imwrite('sample_0.png', im)
Solution 2:
I've grabbed the images from an pdf containing images as well as text.
You can save the images using pix.writePNG() or just show it using cv2.imshow(), whichever suits you best.
import fitz #pymupdf
from cv2 import cv2
import numpy as np
def pix2np(pix):
im = np.frombuffer(pix.samples, dtype=np.uint8).reshape(pix.h, pix.w, pix.n)
im = np.ascontiguousarray(im[..., [2, 1, 0]]) # rgb to bgr
return im
def convertPdf(filename):
doc = fitz.open(filename)
#count = 0
for i in range(len(doc)):
for img in doc.getPageImageList(i):
xref = img[0]
pix = fitz.Pixmap(doc, xref)
#if pix.n < 5: # this is GRAY or RGB
# To save it to the disk
#pix.writePNG(f"p{count}.png")
im = pix2np(pix)
cv2.imshow("image",im)
cv2.waitKey(0)
#count += 1
pix = None
if __name__ == "__main__":
filename = "sample.pdf"
convertPdf(filename)

Post a Comment for "Python & OpenCV"