背景是小舅子要想要截取PDF里面的圖片。在網上找了一段代碼,如下
import fitz
import
re
import
os
file_path
=
r
'C:\xxx\xxx.pdf'
# PDF 文件路徑
dir_path
=
r
'C:\xxx'
# 存放圖片的文件夾
def
pdf2image1(path, pic_path):
checkIM
=
r
"/Subtype(?= */Image)"
pdf
=
fitz.
open
(path)
lenXREF
=
pdf._getXrefLength()
count
=
1
for
i
in
range
(
1
, lenXREF):
text
=
pdf._getXrefString(i)
isImage
=
re.search(checkIM, text)
if
not
isImage:
continue
pix
=
fitz.Pixmap(pdf, i)
new_name
=
f
"img_{count}.png"
pix.writePNG(os.path.join(pic_path, new_name))
count
+
=
1
pix
=
None
pdf2image1(file_path, dir_path)
運行的時候報錯 Decument 沒有 _getXrefString 、_getXrefLength方法,然后網上沒有找到解決辦法,找我看了一下
然后去第三方庫里面 fitz 里面看了一下
發現 _getXrefString 這個方法確實沒有
然后理解了一下代碼_getXrefLength 這個函數大概是獲取PDF總頁數
_getXrefString 這個是獲取PDF對應頁內容的
在fitz 庫里面找到了實現這獲取總頁數的函數 和 一個替代函數 獲取當前頁的image 函數。如果當前頁沒有image返回null
分別是 xref_length 和 extract_image
然后改了一下代碼,運行,發現 search 這里也報錯
找到第三方庫的這個函數,發現傳參的時候,第二個參數是String類型的,而我替換的函數extract_image 返回的是個數組。所以 做了一下強轉。修改后代碼如下
# -*- coding: utf-8 -*-
import fitz
import re
import os
file_path = r'C:\Users\xxx\Desktop\新建文件夾\xxx.pdf' # PDF 文件路徑
dir_path = r'C:\Users\xxx\Desktop\test' # 存放圖片的文件夾
def pdf2image1(path, pic_path):
checkIM = r"image"
pdf = fitz.open(path)
lenXREF = pdf.xref_length()
count = 1
for i in range(1, lenXREF):
text = pdf.extract_image(i)
print(text)
isImage = re.search(checkIM, str(text))
if not isImage:
continue
pix = fitz.Pixmap(pdf, i)
new_name = f"img_{count}.png"
pix.writePNG(os.path.join(pic_path, new_name))
count += 1
pix = None
pdf2image1(file_path, dir_path)
