如何从ScrolledText获取文本生成PDF?代码生成空白PDF求助
解决ScrolledText内容生成PDF空白的问题
你的代码核心问题是Paragraph绘制的坐标超出了PDF页面的可视范围,另外还有文本处理的小细节问题,导致生成的PDF显示空白。以下是修改后的完整代码,以及关键修改点说明:
修改后的代码
from tkinter import * import tkinter as tk from tkinter.filedialog import asksaveasfilename from reportlab.pdfgen import canvas from reportlab.lib.styles import ParagraphStyle from reportlab.platypus import Paragraph from reportlab.lib.pagesizes import A4 from tkinter import scrolledtext my_w = tk.Tk() my_w.geometry("400x300") my_w.title("PDF GENERATOR") b1 = tk.Button(text='Generate PDF', command=lambda: gen_pdf()) b1.grid(row=2, column=0, padx=20, pady=10) infodescr = tk.scrolledtext.ScrolledText(my_w, width=70, height=12, wrap=WORD, font=('calibre', 12)) infodescr.grid(row=1, column=0, sticky=E+W+N+S, padx=5, pady=5) infodescr.insert(INSERT, "Hello this is the sample pdf \n you are welcome!") my_Style = ParagraphStyle('My Para style', fontName="Times-Roman", fontSize=16, alignment=0, borderWidth=2, borderColor='#FFFF00', backColor='#F1F1F1', borderPadding=(20, 20, 20), leading=20) width, height = A4 def gen_pdf(): my_path = asksaveasfilename(filetypes=[('PDF files', '*.pdf')], defaultextension=".pdf") if my_path: # 去掉末尾多余的换行符 text = infodescr.get("1.0", END-1c) # 替换换行为reportlab识别的换行标签 text = text.replace('\n', '<BR/>') p1 = Paragraph(text, my_Style) c = canvas.Canvas(my_path, pagesize=A4) # 设置Paragraph的可用宽度(页面宽度减100,左右留边) p1.wrapOn(c, width - 100, height) # 调整绘制坐标到页面可视区域内(x=50, y=height-100,从上方往下100单位开始绘制) p1.drawOn(c, 50, height - 100) c.save() my_w.mainloop()
关键修改点
- 坐标修正:A4页面实际尺寸为(595.276, 841.89),你原来的
width - 800和height - 1000都是负数,导致内容绘制到了页面之外,改成50和height - 100后,内容会显示在页面可视区域内。 - 文本处理优化:用
END-1c获取文本,去掉ScrolledText默认添加的末尾换行符,避免PDF中多出空行;同时把换行符替换为reportlab能识别的<BR/>标签(你原来写的<BR/>是HTML转义后的字符,reportlab无法识别)。 - wrapOn参数调整:把wrapOn的高度设为页面高度,确保Paragraph能正确计算换行逻辑。
内容的提问来源于stack exchange,提问作者Prashant Priyadarshi
相关产品推荐
相关产品推荐

