同一個操作執行兩次,就要考慮自動化!
大家好,又到了Python辦公自動化專題。
今天講的是各位一定會接觸到的PDF轉換,關於各種格式的文件轉換為PDF有很多第三方工具與網站可以實現,但是使用Python的好處不僅可以批量轉換,同時一旦腳本寫完了以后就可以一鍵執行,徹底解放雙手,那么本文就來盤一盤如何使用Python來將Word/Excel/PPT/Markdown/Html等各種格式的文件轉換為PDF!
Word轉PDF
Word轉PDF應該是最常見的需求了,畢竟使用PDF格式可以更方便展示文檔,雖然在Word中可以直接導出為PDF格式,但是使用Python可以批量轉換,更加高效。
目前在Python中針對Word轉換為PDF的庫有很多,比如win32就可以調用word底層vba,將word轉成pdf,或者comtypes等,但是這些常用的庫僅能在Windows機器上運行,所以為了照顧mac用戶本文使用一個比較小眾的庫docx2pdf,看名字就能知道這是專門用於word轉pdf,安裝很簡單
pip install docx2pdf
使用也比win32等庫更簡潔,一行代碼導入一行代碼轉換即可
from docx2pdf import convert
convert("input.docx", "output.pdf")
但是有人就會說雖然簡單,但是這個操作word本身就可以完成,好的接下來放大招,我們可以使用下面的代碼找到當前或者指定文件夾下的全部word文件
#查找當前目錄下的全部word文件
import os
import glob
from pathlib import Path
path = os.getcwd() + '/'
p = Path(path) #初始化構造Path對象
FileList=list(p.glob("**/*.docx"))
接下來只要寫一個循環就可以將該目錄下的全部word一次性轉換為PDF
for file in FileList:
convert(file,f"{file}.pdf")
就這樣,不到10行代碼,只要一秒,指定文件夾中5份Word就輕松轉換為PDF,現在還能使用我們之前自動化系列文章寫過的批量合並PDF結合一鍵合並這5份PDF!
Excel轉PDF
Excel轉PDF可能平時用的不多,但是作為Office全家桶中的重要工具,並且轉換完的表格可以復制所以我們也講一下。使用到的工具既不是常用的openpyxl也不是pandas,而是另一個專門用於處理PDF的庫fpdf
import pandas as pd
import numpy as np
df_1 = pd.DataFrame(np.random.randn(10, 2), columns=list('AB'))
為了方便講解我們使用Pandas和NumPy來創建一個示例數據文件,當然也可以使用從本地讀取
現在可以使用下面的代碼將這個表格轉換為PDF
from fpdf import FPDF
pdf = FPDF()
pdf.add_page()
pdf.set_xy(0, 0)
pdf.set_font('arial', 'B', 14)
pdf.cell(60)
pdf.cell(70, 10, 'Excel to PDF', 0, 2, 'C')
pdf.cell(-40)
pdf.cell(50, 10, 'Index Column', 1, 0, 'C')
pdf.cell(40, 10, 'A', 1, 0, 'C')
pdf.cell(40, 10, 'B', 1, 2, 'C')
pdf.cell(-90)
pdf.set_font('arial', '', 12)
for i in range(0, len(df_1)):
col_ind = str(i)
col_a = str(df_1.A.iloc[i])
col_b = str(df_1.B.iloc[i])
pdf.cell(50, 10, '%s' % (col_ind), 1, 0, 'C')
pdf.cell(40, 10, '%s' % (col_a), 0, 0, 'C')
pdf.cell(40, 10, '%s' % (col_b), 0, 2, 'C')
pdf.cell(-90)
pdf.output('Excel2PDF.pdf', 'F')
,其實思路和openpyxl類似,遍歷每一個單元格並寫入數據,只不過現在是往PDF文件中寫入。
PPT轉PDF
本節介紹一下PPT如何轉換為PDF,但是我搜了一大圈都沒有MAC用戶可以實現的方法,所以只能針對Windows去操作,使用到的就是在word2pdf中講到的comtypes
import sys
import os
import comtypes.client
#設置路徑
input_file_path = sys.argv[1]
output_file_path = sys.argv[2]
input_file_path = os.path.abspath(input_file_path)
output_file_path = os.path.abspath(output_file_path)
#創建PDF
powerpoint = comtypes.client.CreateObject("Powerpoint.Application")
powerpoint.Visible = 1
slides = powerpoint.Presentations.Open(input_file_path)
#保存PDF
slides.SaveAs(output_file_path, 32)
slides.Close()
相關參數與細節可以查閱comtypes官方文檔,因為我是mac所以沒有過多研究,在成功轉換之后就可以和我們之前的批量操作與合並進行結合實現自動化了!
md轉pdf
關於markdown轉pdf,幾乎所有markdown編輯器都支持導出為pdf格式,本以為這個需求並不高,但是研究了一圈發現很多老外造了很多md轉pdf的輪子,比如md2pdf、markdown2pdf、md2pdf-client等。因為大多數博客使用的是markdown格式,使用這些庫可以很好的將博客文章批量轉換為PDF文檔存儲。
早起都試了一圈,找到一個語法最簡單的markdown2pdf3,直接pip安裝即可,使用兩行代碼即可將一個md文件轉換為pdf
from markdown2pdf3 import *
convert_markdown_to_pdf('test.md') #你的markdown文件路徑
但是要注意的是如果有中文,還需要進行一些額外的設置,可以查閱官方文檔,不過現在就能和之前講的Word轉PDF結合,批量轉換指定路徑下的全部markdown文件為pdf,比如可以使用下面的代碼找到當前文件夾下的全部md文件
import os
import glob
from pathlib import Path
path = os.getcwd() + '/'
p = Path(path) #初始化構造Path對象
FileList=list(p.glob("**/*.md"))
html轉pdf
關於html也就是網頁轉為PDF是來問我最多的問題,其實很簡單,之前在Selenium爬取公眾號全部文章這篇文章中就提到使用PDFKIT即可,但是並不是直接pip安裝pdfkit就行,我們需要提前進入下面的網站選擇自己電腦系統對應的wkhtmltopdf下載安裝
https://wkhtmltopdf.org/downloads.html
安裝完使用pip安裝pdfkit
pip install pdfkit
現在我們就能使用兩行代碼轉換指定網頁為PDF格式,比如將我的第一篇自動化文章轉為PDF
看起來效果還是非常好的,所有格式包括代碼都完整的保存了下來,接下來怎么做就不用我多說了,比如你想下載一個公眾號所有文章為PDF格式,那就先將歷史文章URL提取出來,接着使用pdfkit轉換即可,而這兩步驟我們都已經詳細講解過了!