在孩子的學習過程中,我們常常會遇到這樣的困擾:學校老師發的作業是以 A3 格式的 PDF 文件呈現的,然而家里的打印機卻只支持 A4 打印。這時候,要是能有一個簡單的方法把 A3 的 PDF 轉換為 A4 可打印的格式就好了。別擔心,今天我就來分享一下我是如何用 Python 編寫一個實用的轉換程序,輕松解決這個問題的。
我通過編寫 Python 程序,借助幾個常見的 Python 庫,實現了將 A3 格式的 PDF 文件進行分割和重新組合,最終生成適合 A4 打印機打印的 PDF 文件。整個過程只需要簡單的幾個步驟,就可以讓原本無法直接打印的作業變得可以輕松打印出來。
這個程序主要完成了以下幾個關鍵的任務:
- PDF 轉圖片:把 A3 格式的 PDF 文件逐頁轉換為圖片,并將這些圖片保存到一個專門的文件夾中。這樣做的好處是方便后續對頁面內容進行處理。
- 圖片分割:將生成的圖片從中間左右分割成兩張,模擬將 A3 頁面拆分成兩個 A4 頁面的效果。分割后的圖片會被保存到另一個新的文件夾中。
- 圖片合并成 PDF:按照文件名的順序,將分割后的圖片重新合并成一個新的 PDF 文件。這個新的 PDF 文件就是適合 A4 打印機打印的格式了。
下面是具體的代碼實現:
#!/usr/bin/python3
# -*- coding: utf-8 -*-import fitz
import time
import os
import sys
import cv2
import numpy as np
from fpdf import FPDF
from PIL import Image# pip install PyMuPDF
# pip install opencv-python
# pip install fpdf
# pip install Pillow
# 將pdf分割為圖片,并建立一個images1文件夾保存之 傳入要拆解的pdf文件名
def to_image(file_name):dir1 = get_filename_without_ext(file_name) + "_images1"if not os.path.exists(dir1):os.mkdir(dir1)time_start = time.time()doc = fitz.open(file_name)rotate = int(0)zoom_x = 2.0zoom_y = 2.0trans = fitz.Matrix(zoom_x, zoom_y)print("%s開始轉換..." % file_name)pg = 0for page in doc:timep_start = time.time()pg += 1pm = page.get_pixmap(matrix=trans, alpha=False)new_full_name = dir1 + "/" + file_name.split(".")[0]filename1 = "{0:s}{1:0>3d}.jpg".format(new_full_name, pg)pm.save(filename1)timep_end = time.time()print('第 ' + str(pg) + ' 頁生成圖片累計用時:' + str(timep_end - timep_start))time_end = time.time()print('拆解累計用時:' + str(time_end - time_start))# 將images1文件夾中的每個圖片,左右分割為兩張,并新建images2文件夾以保存文件
def cut_img(file_name):dir1 = get_filename_without_ext(file_name) + "_images1"for img in os.listdir(dir1):#print(img)#image = cv2.imread(dir1 + "/" + img)#解決路徑中含有中文的問題image = cv2.imdecode(np.fromfile(dir1 + "/" + img, dtype=np.uint8), cv2.IMREAD_COLOR)if image is None:print("failed to load image")else:x0 = int(image.shape[1]/2)print('x:' + str(x0))dir2 = get_filename_without_ext(file_name) + "_images2"if not os.path.exists(dir2):os.mkdir(dir2)img1 = image[:, 0:x0-100]img2 = image[:, x0-100:]#cv2.imwrite(dir2 + "/" + img[:-4] + '1.jpg', img1)#cv2.imwrite(dir2 + "/" + img[:-4] + '2.jpg', img2)#解決路徑中含有中文的問題cv2.imencode('.jpg', img1)[1].tofile(dir2 + "/" + img[:-4] + '1.jpg')cv2.imencode('.jpg', img2)[1].tofile(dir2 + "/" + img[:-4] + '2.jpg')# 將images2文件夾中的圖片合并成為一個pdf,按照文件名的順序 傳入輸出的pdf文件名
def makePdf(file_name, pdfFileName):dir2 = get_filename_without_ext(file_name) + "_images2"print(dir2)listPages = [dir2 + "/" + imgFileName for imgFileName in os.listdir(dir2)]#print(listPages)cover = Image.open(listPages[0])if cover is None:print('cover is none')else:width, height = cover.sizepdf = FPDF(unit="pt", format = [width, height])for page in listPages:pdf.add_page()pdf.image(page, 0, 0)pdf.output(pdfFileName, "F")# 獲取文件名不帶后綴
def get_filename_without_ext(filepath):filename_with_extension = os.path.basename(filepath)filename, file_extension = os.path.splitext(filename_with_extension)return filenamedef check(question):option = input(">> " + question + " Yes(Y) // No(N): \n>> ")return option == "Y" or option == "yes" or option == "Yes" or option == "y"def fileObj(filePath):print(">> 載入成功, 當前文件對象路徑:" + filePath + "\n")while True:print("### 當前文件對象路徑:" + filePath + " ###\n")option = input("請選擇要執行的操作: 分割(S), 合并(M), 退出當前對象(Q)\n>>")option = option.upper()if option == "S" and check("是否分割"):to_image(filePath)cut_img(filePath)if option == "M" and check("是否合并"):makePdf(filePath, get_filename_without_ext(filePath) + "_result.pdf")if option == "Q":print(">> 處理完畢\n")breakdef main():print("歡迎使用pdf切割程序\n")while True:option = input("請輸入PDF文件路徑:\n>>")if option == 'exit' or option == 'quit' or option == 'q':print(">> 退出!\n")breakelif option == '':print(">> 輸入為空\n")elif option == 'help' or option == '-h':print(">> 請輸入PDF文件路徑:\n")else:if not os.path.exists(option):print(">> 路徑出錯!,請重新輸入PDF路徑:\n")continuefileObj(option)# 執行
if __name__ == "__main__":if len(sys.argv) < 2:main()else:uipath = sys.argv[1]to_image(uipath)cut_img(uipath)makePdf(uipath, get_filename_without_ext(uipath) + "_result.pdf")
通過運行這個程序,你只需要輸入 A3 格式 PDF 文件的路徑,程序就會自動完成分割和合并的操作,最終生成一個適合 A4 打印機打印的 PDF 文件。是不是很方便呢?
?