利用Python實(shí)現(xiàn)文檔格式互轉(zhuǎn)的操作大全(PDF、Word、圖片、Markdown)
前言: 文檔格式不統(tǒng)一,轉(zhuǎn)換麻煩
我們?cè)谌粘I钪薪?jīng)常碰到這樣的場(chǎng)景。
客戶要求提交簡(jiǎn)歷必須是PDF,但你只有Word版,手動(dòng)轉(zhuǎn)換后格式全亂。
需要從PDF報(bào)告中提取圖表,卻發(fā)現(xiàn)無(wú)法直接復(fù)制,只能一張張截圖。
制作演示文稿,收集到的圖片大小、格式五花八門,插入后需要反復(fù)調(diào)整。
我們今天將手把手教你如何利用Python,輕松實(shí)現(xiàn):
PDF與圖片互轉(zhuǎn): 批量提取PDF中的圖片,或?qū)⒍鄨D合為PDF。
Word與PDF互轉(zhuǎn): 輕松實(shí)現(xiàn)Word批量轉(zhuǎn)PDF,甚至嘗試PDF轉(zhuǎn)Word。
Markdown文檔轉(zhuǎn)換: 讓你的極客筆記瞬間變成專業(yè)PDF/Word報(bào)告。
最終,你將擁有一個(gè)強(qiáng)大的文檔格式轉(zhuǎn)換工廠,
讓你的文件管理和傳輸效率翻倍,老板看了都點(diǎn)贊!
1.PDF與圖片互轉(zhuǎn):批量處理
PDF雖然方便查看,但要提取其中的圖片或?qū)⒋罅繄D片打包成PDF,手動(dòng)操作非常麻煩。
Python能幫你批量處理這些需求,實(shí)現(xiàn)PDF轉(zhuǎn)圖片和圖片轉(zhuǎn)PDF的自動(dòng)化!
如何實(shí)現(xiàn)呢?
PDF轉(zhuǎn)圖片: PyMuPDF可以渲染PDF頁(yè)面,并將其保存為圖片。
圖片轉(zhuǎn)PDF: Pillow可以創(chuàng)建圖片,PyMuPDF可以將圖片插入到PDF頁(yè)面。
1.1DF轉(zhuǎn)多張圖片:將PDF內(nèi)容提取為圖像
場(chǎng)景: 你收到一份有插圖的PDF報(bào)告,想把里面的圖表或每一頁(yè)都提取出來(lái)作為圖片素材,用于
PPT或網(wǎng)頁(yè)展示。手動(dòng)截圖不僅分辨率低,還耗時(shí)。
方案: 利用PyMuPDF,可以批量將PDF的每一頁(yè)高質(zhì)量地轉(zhuǎn)換為圖片,并支持多種圖片格式和分辨率。
安裝:
pip install PyMuPDF
代碼:
import fitz # PyMuPDF
import os
def pdf_to_images(pdf_path, output_folder, img_format="png", dpi=200):
"""
將PDF文件的每一頁(yè)轉(zhuǎn)換為一張圖片。
這是PDF轉(zhuǎn)圖片和Python文件轉(zhuǎn)換的核心功能。
:param pdf_path: 源PDF文件路徑
:param output_folder: 圖片輸出文件夾
:param img_format: 輸出圖片格式 (如 "png", "jpeg", "jpg")
:param dpi: 圖片分辨率 (Dots Per Inch),DPI越高圖片越清晰但文件越大
"""
if not os.path.exists(pdf_path): return print(f"? PDF文件不存在:{pdf_path}")
os.makedirs(output_folder, exist_ok=True)
print(f"?? 正在將 '{os.path.basename(pdf_path)}' 轉(zhuǎn)換為多張圖片...")
try:
doc = fitz.open(pdf_path)
zoom = dpi / 72 # 計(jì)算縮放比例 (1英寸=72點(diǎn))
mat = fitz.Matrix(zoom, zoom) # 縮放矩陣
for page_num in range(doc.page_count):
page = doc.load_page(page_num)
pix = page.get_pixmap(matrix=mat) # 獲取頁(yè)面的像素圖
output_image_path = os.path.join(output_folder, f"{os.path.splitext(os.path.basename(pdf_path))[0]}_page_{page_num+1}.{img_format}")
# 保存像素圖為圖片文件
pix.save(output_image_path)
print(f" ? 已生成圖片:'{os.path.basename(output_image_path)}'")
doc.close()
print(f"? PDF批量轉(zhuǎn)圖片完成!結(jié)果保存到:'{output_folder}'")
return True
except Exception as e:
print(f"? PDF轉(zhuǎn)圖片失?。簕e}")
return False
if __name__ == "__main__":
# 準(zhǔn)備測(cè)試PDF文件 (多頁(yè),包含文本和可能圖片)
source_pdf = os.path.expanduser("~/Desktop/presentation.pdf")
if not os.path.exists(source_pdf):
doc = fitz.open()
p1 = doc.new_page(); p1.insert_text(fitz.Point(50,50), "第一頁(yè)內(nèi)容和圖表");
p2 = doc.new_page(); p2.insert_text(fitz.Point(50,50), "第二頁(yè)內(nèi)容");
doc.save(source_pdf); doc.close()
output_images_folder = os.path.expanduser("~/Desktop/PDF轉(zhuǎn)圖片結(jié)果")
# 示例1:將PDF轉(zhuǎn)換為PNG圖片,分辨率200DPI
pdf_to_images(source_pdf, output_images_folder, img_format="png", dpi=200)
# 示例2:轉(zhuǎn)換為JPG圖片,分辨率300DPI (更高質(zhì)量,更大文件)
# pdf_to_images(source_pdf, os.path.join(os.path.dirname(output_images_folder), "PDF_to_JPG"), img_format="jpg", dpi=300)
操作:
安裝庫(kù): pip install PyMuPDF。
準(zhǔn)備PDF文件: 在桌面準(zhǔn)備一個(gè)多頁(yè)P(yáng)DF(如presentation.pdf)。
修改代碼路徑和參數(shù): 修改 source_pdf、output_images_folder 和 img_format/dpi。
運(yùn)行: 運(yùn)行 python pdf_to_images.py。
效果展示:


1.2多張圖片合并為一張PDF:快速制作PDF文檔
場(chǎng)景: 你有大量圖片(如掃描件、產(chǎn)品圖集、幻燈片截圖),需要將它們快速整理成一份PDF文檔,方便分享或存檔。
方案: PyMuPDF能讓你將多張圖片一鍵合并為一張多頁(yè)P(yáng)DF文檔,并可以控制每張圖片在PDF中的顯示方式。
代碼:
import fitz # PyMuPDF
from PIL import Image # 用于處理圖片
import os
def images_to_pdf(image_paths, output_pdf_path):
"""
將多張圖片合并為一個(gè)PDF文件。
這是Python文件轉(zhuǎn)換和圖片轉(zhuǎn)PDF的核心功能。
:param image_paths: 包含所有要合并的圖片文件路徑的列表
:param output_pdf_path: 輸出PDF文件路徑
"""
if not image_paths: return print("? 沒有提供圖片文件路徑。")
os.makedirs(os.path.dirname(output_pdf_path), exist_ok=True)
print(f"?? 正在合并 {len(image_paths)} 張圖片到 '{os.path.basename(output_pdf_path)}'...")
doc = fitz.open() # 創(chuàng)建一個(gè)新的PDF文檔
try:
for img_path in image_paths:
if not os.path.exists(img_path):
print(f"?? 圖片文件不存在,跳過:{os.path.basename(img_path)}")
continue
# 為每張圖片創(chuàng)建一個(gè)新頁(yè)面
# fitz.open(img_path) 可以直接打開圖片文件作為PDF文檔處理
img_doc = fitz.open(img_path)
new_page_width = img_doc[0].rect.width
new_page_height = img_doc[0].rect.height
img_doc.close() # 關(guān)閉臨時(shí)文檔
# 創(chuàng)建一個(gè)新頁(yè)面,尺寸與圖片匹配 (或者使用A4尺寸,然后縮放圖片)
page = doc.new_page(width=new_page_width, height=new_page_height)
# 插入圖片到頁(yè)面 (覆蓋整個(gè)頁(yè)面)
rect = page.rect # 頁(yè)面大小
page.insert_image(rect, filename=img_path)
print(f" ? 已添加圖片:'{os.path.basename(img_path)}' 到PDF。")
doc.save(output_pdf_path)
print(f"? 圖片合并到PDF完成!結(jié)果保存到:'{output_pdf_path}'")
return True
except Exception as e:
print(f"? 圖片合并到PDF失?。簕e}")
return False
finally:
doc.close()
if __name__ == "__main__":
# 準(zhǔn)備測(cè)試圖片文件 (多張)
img1_path = os.path.expanduser("~/Desktop/scan_page1.png")
img2_path = os.path.expanduser("~/Desktop/scan_page2.png")
output_pdf = os.path.expanduser("~/Desktop/scanned_document.pdf")
# 簡(jiǎn)單創(chuàng)建模擬圖片文件
if not os.path.exists(img1_path):
Image.new('RGB', (800, 600), color = 'red').save(img1_path)
if not os.path.exists(img2_path):
Image.new('RGB', (800, 600), color = 'blue').save(img2_path)
images_to_convert = [img1_path, img2_path]
images_to_pdf(images_to_convert, output_pdf)
步驟:
安裝庫(kù): pip install PyMuPDF Pillow。
準(zhǔn)備圖片文件: 在桌面準(zhǔn)備多張圖片文件(如scan_page1.png, scan_page2.png)。
修改代碼路徑: 修改 images_to_convert 列表中的路徑和 output_pdf。
運(yùn)行: 運(yùn)行 python images_to_pdf.py。
效果展示:

2.實(shí)現(xiàn)Word與PDF互轉(zhuǎn):一鍵搞定報(bào)告、合同格式!
Word和PDF是職場(chǎng)中最常用的兩種文檔格式。Python能幫你一鍵在它們之間進(jìn)行高效轉(zhuǎn)換,徹底告別文檔格式不統(tǒng)一的煩惱!
實(shí)現(xiàn):
Word轉(zhuǎn)PDF: 通常需要借助外部工具或虛擬打印功能,因?yàn)樗婕癢ord文檔的渲染。docx2pdf是一個(gè)不錯(cuò)的選擇。
PDF轉(zhuǎn)Word: 這是一個(gè)挑戰(zhàn)性任務(wù),因?yàn)镻DF主要用于顯示,不含結(jié)構(gòu)信息。雖然有庫(kù)能提取文本,但保留原始排版非常困難
2.1Word批量轉(zhuǎn)PDF:最常見的文檔分發(fā)需求
場(chǎng)景: 你需要將幾十份Word報(bào)告或合同轉(zhuǎn)換成PDF格式,方便分發(fā)和防止篡改。手動(dòng)另存為PDF,效率低下。
方案: docx2pdf庫(kù)能幫你一鍵批量將Word文檔轉(zhuǎn)換為PDF,并保持良好的格式。
代碼:
from docx2pdf import convert # 導(dǎo)入轉(zhuǎn)換函數(shù)
import os
def batch_word_to_pdf(source_folder, output_folder):
"""
批量將Word文檔轉(zhuǎn)換為PDF文件。
這是Word轉(zhuǎn)PDF和Python文件轉(zhuǎn)換的核心功能。
:param source_folder: 源Word文檔文件夾路徑
:param output_folder: 輸出PDF文件文件夾
"""
if not os.path.exists(source_folder): return print(f"? 源文件夾不存在:{source_folder}")
os.makedirs(output_folder, exist_ok=True)
print(f"?? 正在批量將 '{source_folder}' 下的Word文檔轉(zhuǎn)換為PDF...")
processed_count = 0
# 遍歷文件夾中的所有.docx文件
for filename in os.listdir(source_folder):
if filename.lower().endswith('.docx'):
source_path = os.path.join(source_folder, filename)
output_pdf_path = os.path.join(output_folder, os.path.splitext(filename)[0] + ".pdf")
try:
# **核心操作:調(diào)用 docx2pdf.convert()**
convert(source_path, output_pdf_path)
print(f" ? 轉(zhuǎn)換成功:'{filename}' -> '{os.path.basename(output_pdf_path)}'")
processed_count += 1
except Exception as e:
print(f"? 轉(zhuǎn)換 '{filename}' 失?。簕e}。請(qǐng)確保Office/WPS等已安裝。")
else:
print(f"?? 跳過非Word文件:{filename}")
print(f"? Word批量轉(zhuǎn)PDF完成!共轉(zhuǎn)換 {processed_count} 個(gè)文件。")
return True
if __name__ == "__main__":
# 準(zhǔn)備測(cè)試Word文檔 (放入一些.docx文件)
source_word_folder = os.path.expanduser("~/Desktop/MyWordReports")
output_pdf_folder = os.path.expanduser("~/Desktop/PDFReports")
os.makedirs(source_word_folder, exist_ok=True)
# 簡(jiǎn)單創(chuàng)建模擬Word文檔
from docx import Document as DocxDocument
if not os.path.exists(os.path.join(source_word_folder, "report1.docx")):
doc = DocxDocument(); doc.add_paragraph("這是報(bào)告1"); doc.save(os.path.join(source_word_folder, "report1.docx"))
if not os.path.exists(os.path.join(source_word_folder, "contract.docx")):
doc = DocxDocument(); doc.add_paragraph("這是一份合同"); doc.save(os.path.join(source_word_folder, "contract.docx"))
batch_word_to_pdf(source_word_folder, output_pdf_folder)
步驟:
安裝庫(kù): pip install docx2pdf。注意:docx2pdf庫(kù)需要你的系統(tǒng)安裝了Microsoft Office Word、WPS Office或LibreOffice,它會(huì)調(diào)用這些軟件進(jìn)行轉(zhuǎn)換。
準(zhǔn)備Word文件: 在桌面創(chuàng)建MyWordReports文件夾,放入一些.docx文件。
修改代碼路徑: 修改 source_word_folder 和 output_pdf_folder。
運(yùn)行: 運(yùn)行 python word_to_pdf.py。

效果展示:

2.2PDF轉(zhuǎn)Word:挑戰(zhàn)與限制并存的“逆向工程”
場(chǎng)景: 你收到一份PDF文檔,但需要對(duì)其內(nèi)容進(jìn)行編輯,或提取其結(jié)構(gòu)化信息到Word中。PDF的固定格式讓你束手無(wú)策。
方案: PDF轉(zhuǎn)Word是一個(gè)非常困難的“逆向工程”! 因?yàn)镻DF是用來(lái)“顯示”的,它不包含Word那樣的段落、字體、樣式等結(jié)構(gòu)化信息。
難點(diǎn):Python庫(kù)(如pdfminer.six、PyMuPDF用于提取文本,但要完美還原Word格式,幾乎不可能。通常需要借助外部專業(yè)工具(如Adobe Acrobat、在線轉(zhuǎn)換器)或復(fù)雜的OCR技術(shù)。PyMuPDF可以提取文本,但排版還原困難。
代碼:
import fitz # PyMuPDF
import os
def pdf_to_text(pdf_path, output_txt_path):
"""
從PDF文件中提取純文本內(nèi)容。
這是PDF轉(zhuǎn)Word(文本部分)的基礎(chǔ)。
:param pdf_path: 源PDF文件路徑
:param output_txt_path: 輸出文本文件路徑
"""
if not os.path.exists(pdf_path): return print(f"? PDF文件不存在:{pdf_path}")
os.makedirs(os.path.dirname(output_txt_path), exist_ok=True)
print(f"?? 正在從 '{os.path.basename(pdf_path)}' 提取文本...")
try:
doc = fitz.open(pdf_path)
text_content = ""
for page_num in range(doc.page_count):
page = doc.load_page(page_num)
text_content += page.get_text() # 提取頁(yè)面所有文本
doc.close()
with open(output_txt_path, "w", encoding="utf-8") as f:
f.write(text_content)
print(f"? 文本提取成功!保存到:'{output_txt_path}'")
return True
except Exception as e:
print(f"? 文本提取失?。簕e}")
return False
if __name__ == "__main__":
source_pdf = os.path.expanduser("~/Desktop/sample_pdf.pdf")
output_txt = os.path.expanduser("~/Desktop/extracted_text.txt")
# 簡(jiǎn)單創(chuàng)建模擬PDF文件
if not os.path.exists(source_pdf):
doc = fitz.open(); doc.new_page().insert_text((50,50), "這是PDF中的文本內(nèi)容。"); doc.save(source_pdf); doc.close()
pdf_to_text(source_pdf, output_txt)
步驟:
安裝庫(kù): pip install PyMuPDF。
準(zhǔn)備PDF文件: 在桌面準(zhǔn)備一個(gè)包含文本的PDF文件(如sample_pdf.pdf)。
修改代碼路徑: 修改 source_pdf 和 output_txt。
運(yùn)行: 運(yùn)行 python pdf_to_text.py。
效果展示:

3.Python實(shí)現(xiàn)Markdown轉(zhuǎn)PDF/Word
Markdown是一種輕量級(jí)標(biāo)記語(yǔ)言,它讓你用純文本輕松寫作,并能方便地轉(zhuǎn)換為各種文檔格式。Python結(jié)合pandoc(一個(gè)強(qiáng)大的文檔轉(zhuǎn)換工具)或特定的Markdown解析庫(kù),能幫你實(shí)現(xiàn)Markdown轉(zhuǎn)PDF或Markdown轉(zhuǎn)Word,這是Python文件轉(zhuǎn)換的高階應(yīng)用!
作用: Markdown文件通過解析器轉(zhuǎn)換為中間格式(如HTML),再由渲染器轉(zhuǎn)換為目標(biāo)格式。pandoc是命令行工具,Python可以調(diào)用它。
3.1Markdown語(yǔ)法速覽:簡(jiǎn)潔高效的寫作方式
Markdown語(yǔ)法簡(jiǎn)單直觀,常用語(yǔ)法如下:
| 語(yǔ)法 | 效果 | 示例 |
|---|---|---|
| # 標(biāo)題 | 一級(jí)標(biāo)題 | # 這是標(biāo)題 |
| 粗體 | 粗體 | 重要 |
| 斜體 | 斜體 | 強(qiáng)調(diào) |
| - 列表項(xiàng) | 無(wú)序列表 | - 項(xiàng)目1 |
| 1. 列表項(xiàng) | 有序列表 | 1. 步驟1 |
| 鏈接 | 超鏈接 | CSDN |
代碼 | 行內(nèi)代碼 | print() |
| 代碼塊 | python ... |
3.2Markdown轉(zhuǎn)PDF/Word:用Python打通文檔生態(tài)
場(chǎng)景: 你用Markdown寫了大量筆記和文檔,現(xiàn)在需要將它們導(dǎo)出為專業(yè)排版的PDF報(bào)告或Word文檔,方便分享給非技術(shù)人員。
方案: 我們可以通過Python調(diào)用pandoc命令行工具,實(shí)現(xiàn)Markdown文件到PDF或Word的轉(zhuǎn)換。這需要你的系統(tǒng)安裝pandoc。
安裝Pandoc:
訪問Pandoc官網(wǎng) (pandoc.org) 下載并安裝。安裝后,確保pandoc已添加到系統(tǒng)環(huán)境變量。
在終端運(yùn)行 pandoc --version 驗(yàn)證安裝。
代碼:
步驟:
安裝Pandoc: 從pandoc.org下載并安裝,并確保其添加到系統(tǒng)PATH。如果轉(zhuǎn)PDF,你還需要安裝一個(gè)LaTeX發(fā)行版(如MiKTeX for Windows, TeX Live for Linux/macOS)。
準(zhǔn)備Markdown文件: 在桌面創(chuàng)建my_notes.md。
修改代碼路徑: 修改 source_md 等路徑。
運(yùn)行: 運(yùn)行 python markdown_converter.py。
效果展示:

4.你的“文檔格式轉(zhuǎn)換工廠”!
我們深入學(xué)習(xí)了PyMuPDF、Pillow、docx2pdf、subprocess等庫(kù)/工具,實(shí)現(xiàn)了:
PDF與圖片互轉(zhuǎn): 輕松將PDF頁(yè)面批量轉(zhuǎn)換為圖片,或?qū)⒍鄰垐D片合并為PDF,實(shí)現(xiàn)像素級(jí)掌控。
Word與PDF互轉(zhuǎn): 一鍵批量將Word轉(zhuǎn)PDF,并知曉PDF轉(zhuǎn)Word的挑戰(zhàn)與提取文本方法。
Markdown文檔轉(zhuǎn)換: 利用pandoc,將Markdown筆記轉(zhuǎn)換為專業(yè)的PDF/Word文檔。
5.尾聲:文檔格式互轉(zhuǎn),解鎖文件管理新維度!
通過本篇文章,你已經(jīng)掌握了文檔格式互轉(zhuǎn)的強(qiáng)大能力,為你的辦公自動(dòng)化之旅又增添了一個(gè)重量級(jí)技能!你學(xué)會(huì)了如何利用Python和外部工具,高效地實(shí)現(xiàn)PDF、Word、圖片、Markdown之間的各種轉(zhuǎn)換。
除了今天學(xué)到的格式轉(zhuǎn)換功能,你還希望Python能幫你實(shí)現(xiàn)哪些更復(fù)雜的文檔處理需求?比如:自動(dòng)將Excel數(shù)據(jù)填充到PDF表單?或者實(shí)現(xiàn)PDF的批量OCR識(shí)別?
以上就是利用Python實(shí)現(xiàn)文檔格式互轉(zhuǎn)的操作大全(PDF、Word、圖片、Markdown)的詳細(xì)內(nèi)容,更多關(guān)于Python文檔格式互轉(zhuǎn)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Python警察與小偷的實(shí)現(xiàn)之一客戶端與服務(wù)端通信實(shí)例
這篇文章主要介紹了Python警察與小偷的實(shí)現(xiàn)之一客戶端與服務(wù)端通信實(shí)例,并附有難點(diǎn)及易錯(cuò)點(diǎn)的分析與說明,需要的朋友可以參考下2014-10-10
利用Python+Opencv實(shí)現(xiàn)車牌自動(dòng)識(shí)別完整代碼
這篇文章主要介紹了如何使用Python和OpenCV進(jìn)行車牌識(shí)別,包括圖像預(yù)處理、車牌定位、分割和模板匹配等步驟,通過實(shí)戰(zhàn)項(xiàng)目,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下2025-04-04
python+opencv實(shí)現(xiàn)堆疊圖片
這篇文章主要為大家詳細(xì)介紹了python+opencv實(shí)現(xiàn)堆疊圖片,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-04-04
基于python的BP神經(jīng)網(wǎng)絡(luò)及異或?qū)崿F(xiàn)過程解析
這篇文章主要介紹了基于python的BP神經(jīng)網(wǎng)絡(luò)及異或?qū)崿F(xiàn)過程解析,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2019-09-09
淺談python3發(fā)送post請(qǐng)求參數(shù)為空的情況
今天小編就為大家分享一篇淺談python3發(fā)送post請(qǐng)求參數(shù)為空的情況,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧2018-12-12
Python 列表 sort()函數(shù)使用實(shí)例詳解
這篇文章主要介紹了Python 列表 sort()函數(shù)使用詳解,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2023-07-07
Pandas DataFrame 取一行數(shù)據(jù)會(huì)得到Series的方法
今天小編就為大家分享一篇Pandas DataFrame 取一行數(shù)據(jù)會(huì)得到Series的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧2018-11-11
Python使用combinations實(shí)現(xiàn)排列組合的方法
今天小編就為大家分享一篇Python使用combinations實(shí)現(xiàn)排列組合的方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來(lái)看看吧2018-11-11

