文章目錄
一、說明
昨天突然想着把PDF轉成圖片,昨天嘗試了許久,沒有成功,然後就很納悶,圖片合成PDF就可以,應該轉成圖片也可以吧,然後網上各種找解決這個問題的方法。
如果需要圖片合成PDF的,可以參考一下我之前的一個博客:
使用img2pdf 模塊將目錄下圖片合併成pdf
二、PDF轉圖片
方法1:PyMuPDF(成功)
①、安裝PyMuPDF:
pip install PyMuPDF
②、轉換圖片代碼:
import datetime
import os
import fitz # fitz就是pip install PyMuPDF
def pyMuPDF_fitz(pdfPath, imagePath):
startTime_pdf2img = datetime.datetime.now() # 開始時間
print("imagePath=" + imagePath)
pdfDoc = fitz.open(pdfPath)
for pg in range(pdfDoc.pageCount):
page = pdfDoc[pg]
rotate = int(0)
# 每個尺寸的縮放係數爲1.3,這將爲我們生成分辨率提高2.6的圖像。
# 此處若是不做設置,默認圖片大小爲:792X612, dpi=96
zoom_x = 1.33333333 # (1.33333333-->1056x816) (2-->1584x1224)
zoom_y = 1.33333333
mat = fitz.Matrix(zoom_x, zoom_y).preRotate(rotate)
pix = page.getPixmap(matrix=mat, alpha=False)
if not os.path.exists(imagePath): # 判斷存放圖片的文件夾是否存在
os.makedirs(imagePath) # 若圖片文件夾不存在就創建
pix.writePNG(imagePath + '/' + 'images_%s.png' % pg) # 將圖片寫入指定的文件夾內
endTime_pdf2img = datetime.datetime.now() # 結束時間
print('pdf2img時間=', (endTime_pdf2img - startTime_pdf2img).seconds)
if __name__ == "__main__":
# 1、PDF地址
pdfPath = 'demo1.pdf'
# 2、需要儲存圖片的目錄
imagePath = './imgs'
pyMuPDF_fitz(pdfPath, imagePath)
使用時,只需要更改PDF地址和儲存圖片地址即可。
方法2:pdf2image(未成功)
①、安裝pdf2image
pip install pdf2image
②、安裝Poppler:
如果下載慢,可以下載我雲盤中的:
下載地址: 密碼:e17b
解壓之後放到自己的軟件盤,然後把bin目錄添加到系統環境變量。然後重啓電腦。
如果不重啓,轉換時會報錯:pdf2image.exceptions.PDFInfoNotInstalledError: Unable to get page count. Is poppler installed and in PATH?
。
但是我的重啓之後還有有問題,不知道爲什麼,只能回家用家裏電腦測試一下了,不知道是不是Windows弄不了。
我只是用了模塊官方几句代碼:就一直報錯:
from pdf2image import convert_from_path, convert_from_bytes
from pdf2image.exceptions import (
PDFInfoNotInstalledError,
PDFPageCountError,
PDFSyntaxError
)
images = convert_from_path('demo1.pdf')
報錯內容:
Exception in thread Thread-1:
Traceback (most recent call last):
File "D:\tools\Python3.6\lib\threading.py", line 916, in _bootstrap_inner
self.run()
File "D:\tools\Python3.6\lib\threading.py", line 864, in run
self._target(*self._args, **self._kwargs)
File "D:\tools\Python3.6\lib\subprocess.py", line 1084, in _readerthread
buffer.append(fh.read())
File "D:\tools\Python3.6\lib\codecs.py", line 322, in decode
(result, consumed) = self._buffer_decode(data, self.errors, final)
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xd6 in position 119: invalid continuation byte
Traceback (most recent call last):
File "D:\tools\Python3.6\lib\site-packages\pdf2image\pdf2image.py", line 420, in pdfinfo_from_path
raise ValueError
ValueError
During handling of the above exception, another exception occurred:
Traceback (most recent call last):
File "D:/zjf_workspace/000、爬蟲代碼-基礎的/scrapy_100_工具/8、圖片處理/6、pdf轉換成圖片/7、pdf2image模塊.py", line 9, in <module>
images = convert_from_path('demo1.pdf')
File "D:\tools\Python3.6\lib\site-packages\pdf2image\pdf2image.py", line 90, in convert_from_path
page_count = pdfinfo_from_path(pdf_path, userpw, poppler_path=poppler_path)["Pages"]
File "D:\tools\Python3.6\lib\site-packages\pdf2image\pdf2image.py", line 430, in pdfinfo_from_path
"Unable to get page count.\n%s" % err.decode("utf8", "ignore")
AttributeError: 'str' object has no attribute 'decode'
弄了快一天了,沒有弄出來這個問題,我找到好多相似的博客,但是都不能運行,而且人家好想都沒有出現這個問題,不知道我這裏咋會這樣,就先放這吧,後續如果解決再來補充。
方法3、wind(已經成功)
這個我昨天試了很久,一直報錯,今天看到一個文章,趕緊是卻少一個軟件Ghostscript,但是下載又好慢呀,不知道什麼鬼。
好像有個這個軟件Ghostscript:
打算按着這個文章,再次測試:
可以用第三方庫wand實,需要安裝wand 、imagemagick和ghostscript。作者都成功了,那我就再試試吧。
①、安裝wind
pip install Wand
②、安裝imagemagick
安裝過程注意勾選Install development headers and libraries for C and C++ 。安裝後設置MAGICK_HOME環境變量,值爲imagemagick的安裝路徑,並將安裝路徑加入path。
詳情可參照此頁面網頁鏈接。
③、安裝ghostscript
我做天一直嘗試,就是保錯:
報錯內容
Traceback (most recent call last):
File "D:/zjf_workspace/000、爬蟲代碼-基礎的/scrapy_100_工具/8、圖片處理/6、pdf轉換成圖片/1、wand.py", line 7, in <module>
image_pdf = Image(filename='demo1.pdf')
File "D:\tools\Python3.6\lib\site-packages\wand\image.py", line 8230, in __init__
units=units)
File "D:\tools\Python3.6\lib\site-packages\wand\image.py", line 8710, in read
self.raise_exception()
File "D:\tools\Python3.6\lib\site-packages\wand\resource.py", line 243, in raise_exception
raise e
wand.exceptions.DelegateError: FailedToExecuteCommand `"gswin32c.exe" -q -dQUIET -dSAFER -dBATCH -dNOPAUSE -dNOPROMPT -dMaxBitmap=500000000 -dAlignToPixels=0 -dGridFitTT=2 "-sDEVICE=pngalpha" -dTextAlphaBits=4 -dGraphicsAlphaBits=4 "-r72x72" "-sOutputFile=C:/Users/WB-ZJF~1/AppData/Local/Temp/magick-5508WXCmlxua21eN%d" "-fC:/Users/WB-ZJF~1/AppData/Local/Temp/magick-5508Te_4KPmLv3_D" "-fC:/Users/WB-ZJF~1/AppData/Local/Temp/magick-5508byOzda8sSbWf"' (ϵͳ�Ҳ���ָ�����ļ���
) @ error/delegate.c/ExternalDelegateCommand/459
感覺就是跟這個有關吧,但是下載又下載不動,估計也是隻能明天測試了,如果有Windows做成小夥伴歡迎賜教,我也只能回家再下載測試了,公司電腦不知道爲什麼下載不動。
我下載好的ghostscript
如果你看到這裏了,可以下載我下載好的:
我這個關於PDF轉圖片的所有軟件都放到這裏了,需要可以下載,比網上和度盤都下載快。
ghostscript的文件名稱:gs950w64.exe
軟件下載地址: 密碼:duym
④、代碼:
這個是我找到之後修改的,但是報錯問題還沒有解決,只能後續解決補充了。先用第一個方法用着吧。
上面幾個下載好就可以直接使用我這個代碼了,這個代碼是我成功測試之後的,修改PDF地址和圖片儲存地址即可。
# coding:utf-8
from wand.image import Image
def wind_imagemagick_ghostscript(pdf_path, imgs_dir):
# 將pdf文件轉爲jpg圖片文件
# ./PDF_FILE_NAME 爲pdf文件路徑和名稱
# image_pdf = Image(filename='./demo1.pdf', resolution=300)
image_pdf = Image(filename=pdf_path)
image_jpeg = image_pdf.convert('jpeg')
# wand已經將PDF中所有的獨立頁面都轉成了獨立的二進制圖像對象。我們可以遍歷這個大對象,並把它們加入到req_image序列中去。
req_image = []
for img in image_jpeg.sequence:
img_page = Image(image=img)
req_image.append(img_page.make_blob('jpeg'))
# 遍歷req_image,保存爲圖片文件
i = 0
for img in req_image:
ff = open(imgs_dir + '\\' + str(i) + '.jpeg', 'wb')
ff.write(img)
ff.close()
i += 1
if __name__ == '__main__':
pdf_path = r"demo1.pdf"
imgs_dir = r"imgs"
wind_imagemagick_ghostscript(pdf_path, imgs_dir)
方法4、imagemagick+ghostscript(已經成功)
這個還是我看到一篇博客:
之後,然後第三個方法也成功了,然後測試這個也成功了,具體步驟:
這些軟件可以直接去我的雲盤下載,如果失效自己就官網下載吧:
軟件集合下載地址: 密碼:duym
①、安裝imagemagick
安裝過程注意勾選Install development headers and libraries for C and C++ 。安裝後設置MAGICK_HOME環境變量,值爲imagemagick的安裝路徑,並將安裝路徑加入path。
詳情可參照此頁面網頁鏈接。
建議優先去我網盤下載(如果還有效)。
②、安裝ghostscript
如果你也是Windows64位,去我雲盤下載:
③、cmd命令轉換:
一個命令轉換:
magick .\demo1.pdf .\111\demo.jpg
查看執行命令和效果:
111目錄下面的圖片:(可以看出,自動從剛剛輸入的jpg前面自動demo後面加上遞增後綴,這個可以PDF的頁面順序下標對應)
④、一般只是轉換一倆個上一步就行了,如果數量過多,可以用python寫個腳本。
import os
def os_magick(pdf_path,img_dir,file_name):
os.system(r'magick {} {}/{}.jpg'.format(pdf_path,img_dir,file_name))
if __name__ == '__main__':
pdf_path = r"demo1.pdf"
img_dir = r'imgs3'
# 圖片名字的前綴
file_name = 'demo'
os_magick(pdf_path,img_dir,file_name)
注意點:
- pdf_path 和img_dir 必須填寫絕對路徑地址(我這裏我前面地址刪除了,看懂就好)
- 文件名的前綴可以自己定義
- 如果數量過多,並且需要儲存的文件夾不同,可以自動創建目錄,不過最後出入函數的還是絕對路徑。
我的這個生成效果:
參考:
https://github.com/Belval/pdf2image
ttp://blog.alivate.com.au/poppler-windows/
https://imagemagick.org/script/download.php#windows
http://docs.wand-py.org/en/0.4.4/guide/install.html#install-imagemagick-windows
https://ghostscript.com/download/gsdnld.html
https://www.jianshu.com/p/f57cc64b9f5e
https://www.twblogs.net/a/5d483d89bd9eee541c30323b
http://blog.sciencenet.cn/blog-597740-1136907.html
https://www.jb51.net/article/160622.htm
https://www.ancii.com/an676u83y/
https://blog.csdn.net/qq_24127015/article/details/85111371