如何在PyPDF中放大PDF内图片并旋转文本?实操问题求助
解决方案:直接从PDF提取图片字节转PIL编辑并替换
核心代码修正
以下是完整的修改后代码片段,包含必要的导入和关键逻辑:
import io from PIL import Image # 导入你使用的PDF处理库(比如PyPDF2的PdfReader/PdfWriter) while pagesAdded < num_of_validations and pagesAdded < 30: ## 定义票据裁剪区域 page.mediabox.upper_left = [10+208*(pagesAdded%3), height-90-79*(rowCount%10)] page.mediabox.lower_right = [175+208*(pagesAdded%3), height-30-79*(rowCount%10)] ## 处理QR码缩放与页面旋转 img = page.images[0] # 1. 将PDF图片字节直接转为PIL实例(无需临时文件) pil_img = Image.open(io.BytesIO(img.data)) # 2. 缩放图片:resize返回新对象,必须重新赋值才会生效 pil_img = pil_img.resize((250, 250), Image.Resampling.LANCZOS) # 3. 将修改后的图片转回字节流,保持原格式避免兼容性问题 buffer = io.BytesIO() pil_img.save(buffer, format=img.format) buffer.seek(0) # 将字节流指针移到开头 # 4. 替换PDF中的原图片 img.replace(buffer, quality=80) # 可选:旋转整个页面(快速解决文本旋转需求,角度按需调整,如90/180度) # page.rotate(90) ## 将处理后的票据页加入新PDF writer.add_page(page) pagesAdded += 1 # 补充计数逻辑,避免死循环
关键问题解析
- 避免临时文件:用
io.BytesIO把PDF图片的原始字节img.data包装成内存中的类文件对象,直接供PIL读取,全程无需写入本地文件,既高效又不占用额外存储空间。 - resize无响应的原因:PIL的
resize方法不会修改原图片对象,必须将返回的新图片实例重新赋值给变量,之前的代码因缺少赋值导致修改无效。 - 替代Martin的方案:新版PyPDF2中
img.image不再直接返回PIL实例,直接读取img.data获取原始字节是更稳定的实现方式。 - 文本旋转简化处理:如果不想单独处理文本旋转逻辑,直接调用
page.rotate(角度)旋转整个页面即可,完全符合你“QR码朝向不影响”的要求。
内容的提问来源于stack exchange,提问作者hutch
相关产品推荐
相关产品推荐

