将A尺寸(8.5"×11")PDF转换为B尺寸(11"×17")PDF的技术求助
解决方案
你的代码存在几个关键问题,导致尺寸转换和合并效果不符合预期:
- 合并顺序颠倒:应该以B尺寸页面为底版,把处理好的A尺寸内容(带标签)合并到右侧,而非反过来用A页面合并B空白页
- 合并时错误传入了
PdfReader对象而非单页:page.merge_page(temptwo_pdf)这里应该传入temptwo_pdf.pages[0] - 最终保存时写错了对象:最后一步应该写入
Finaltwo_output_pdf而非Final_output_pdf,之前的合并操作等于白做
更高效的做法是直接用Canvas创建B尺寸页面,再把带标签的A内容合并到指定位置,不需要依赖外部空白B尺寸PDF文件。以下是修正后的完整代码:
from reportlab.lib.pagesizes import letter, ledger from reportlab.pdfgen import canvas from PyPDF2 import PdfReader, PdfWriter import os # 定义尺寸常量:A尺寸为letter(8.5×11英寸),B尺寸为ledger(11×17英寸) A_SIZE = letter B_SIZE = ledger # 计算A内容在B页面的右侧偏移量:B宽度17英寸 - A宽度8.5英寸 = 8.5英寸,转PDF单位(1英寸=72点) OFFSET_X = (17 - 8.5) * 72 OFFSET_Y = 0 # 垂直方向对齐底部,无需偏移 # 生成带标签的临时PDF c = canvas.Canvas("temp.pdf", pagesize=A_SIZE) c.setFont(Font, Font_size) c.setFillColorRGB(1, 0, 0) # 红色文字 c.drawString(LABEL_ONE_position_width, LABEL_ONE_position_height, LABEL_ONE) c.drawString(LABEL_TWO_position_width, LABEL_TWO_position_height, LABEL_TWO) c.save() # 读取临时标签页和原A尺寸PDF temp_pdf = PdfReader(open("temp.pdf", "rb")) temp_page = temp_pdf.pages[0] # 注意:替换成你的原A尺寸PDF路径 existing_pdf = PdfReader(open("你的原PDF文件路径", "rb")) # 第一步:给原PDF每页添加标签 labeled_pdf = PdfWriter() for page in existing_pdf.pages: page.merge_page(temp_page) labeled_pdf.add_page(page) # 第二步:将带标签的A尺寸页面转换为B尺寸,内容固定在右侧 final_pdf = PdfWriter() for labeled_page in labeled_pdf.pages: # 创建B尺寸空白页作为底版 b_blank_writer = PdfWriter() b_blank_writer.add_blank_page(width=B_SIZE[0], height=B_SIZE[1]) b_page = b_blank_writer.pages[0] # 用带偏移的合并方法,把A内容放到B页面右侧 b_page.merge_translated_page(labeled_page, OFFSET_X, OFFSET_Y) final_pdf.add_page(b_page) # 保存最终PDF output_file_path = f"{newpath}\{ROW}_{PART_NUMBER:.0f}_{SHEETCOUNT}.pdf" with open(output_file_path, "wb") as output_file: final_pdf.write(output_file) # 清理临时资源 temp_pdf.stream.close() os.remove("temp.pdf")
关键改进说明
- 使用
merge_translated_page替代普通merge_page,通过偏移量精准控制A内容在B页面的位置 - 直接生成B尺寸空白页,无需依赖外部空白PDF文件,避免路径依赖问题
- 拆分逻辑为「加标签」和「转尺寸」两步,更清晰易维护
内容的提问来源于stack exchange,提问作者Nick Wester
相关产品推荐
相关产品推荐

