我想將 Tkinter 小部件的內容附加到現有 pdf 的末尾。
首先,我將小部件捕獲到 PIL 影像。然后,使用PyPDF2從影像創建中間臨時檔案時似乎需要,這感覺沒有必要。相反,我想直接附加影像,或者至少將影像轉換為無需寫入檔案即可附加的內容。
在下面的代碼片段中,我將影像保存為臨時 pdf,然后打開 pdf 并附加。這可行,但不是一個非常優雅的解決方案。
import tkinter as tk
from PIL import ImageGrab
import os
import PyPDF2
def process_pdf(widget, pdf_filepath):
""""Append Tkinter widget to pdf"""
# capture the widget
img = capture_widget(widget)
# create pdf merger object
merger = PyPDF2.PdfMerger()
# creating a pdf file object of original pdf and add to output
pdf_org = open(pdf_filepath, 'rb')
merger.append(pdf_org)
# NOTE I want to get rid of this step
# create temporary file, read it, append it to output, delete it.
temp_filename = pdf_filepath[:-4] "_temp.pdf"
img.save(temp_filename)
pdf_temp = open(temp_filename, 'rb')
merger.append(pdf_temp)
pdf_temp.close()
# write
outputfile = open(pdf_filepath, "wb")
merger.write(outputfile)
# clean up
pdf_org.close()
outputfile.close()
os.remove(temp_filename)
def capture_widget(widget):
"""Take screenshot of the passed widget"""
x0 = widget.winfo_rootx()
y0 = widget.winfo_rooty()
x1 = x0 widget.winfo_width()
y1 = y0 widget.winfo_height()
img = ImageGrab.grab((x0, y0, x1, y1))
return img
是否有人有一個更優雅的解決方案,不需要中間檔案,同時保留 PyPDF2 提供的靈活性?
謝謝。
uj5u.com熱心網友回復:
所以我能夠自己找到解決方案。訣竅是將 PIL 影像寫入位元組陣列(請參閱此問題),然后使用 img2pdf 將其轉換為 pdf。對于 img2pdf,在保存到位元組陣列時需要使用 format = "jpeg" 引數。
隨后,img2pdf 的結果可以寫入另一個 io.BytesIO() 流。由于它實作了 .read() 方法,因此 PyPDF2.PdfMerger() 可以讀取它。
下面是代碼,希望對某人有所幫助。
import io
import PyPDF2
import img2pdf
def process_pdf(widget, pdf_filepath):
""""Append Tkinter widget to pdf"""
# create pdf merger object
merger = PyPDF2.PdfMerger()
# creating a pdf file object of original pdf and add to output
pdf_org = open(pdf_filepath, 'rb')
merger.append(pdf_org)
pdf_org.close()
# capture the widget and rotate
img = capture_widget(widget)
# create img bytearray
img_byte_arr = io.BytesIO()
img.save(img_byte_arr, format = "jpeg", quality=100)
img_byte_arr = img_byte_arr.getvalue()
# create a pdf bytearray and do formatting using img2pdf
pdf_byte_arr = io.BytesIO()
layout_fun = img2pdf.get_layout_fun((img2pdf.mm_to_pt(210),img2pdf.mm_to_pt(297)))
pdf_byte_arr.write(img2pdf.convert(img_byte_arr, layout_fun=layout_fun))
merger.append(pdf_byte_arr)
# write
outputfile = open(pdf_filepath[:-4] "_appended.pdf", "wb")
merger.write(outputfile)
outputfile.close()
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/529228.html
標籤:Pythonpdftkinterpython成像库pypdf2
