使用Fitz添加PDF水印时部分页面水印翻转问题求助
PDF水印翻转问题的解决建议
针对你用PyMuPDF(fitz)添加水印时出现部分页面水印上下翻转的问题,可尝试以下方案:
1. 替换水印添加方式,直接使用Pixmap插入
避免通过临时PDF文档传递页面时引入的变换干扰,直接提取水印页面的像素图插入目标页面:
doc_report = fitz.open(report_pdf_path) doc_watermark = fitz.open(watermark_pdf_path) for i in range(doc_report.page_count): page = doc_report.load_page(i) watermark_page = doc_watermark.load_page(i) # 获取无额外变换的水印像素图 pix = watermark_page.get_pixmap(matrix=fitz.Matrix(1, 1)) # 插入像素图到目标页面,覆盖原有内容 page.insert_image(page.rect, pixmap=pix, overlay=True) doc_report.save(save_path, encryption=fitz.PDF_ENCRYPT_KEEP) doc_report.close() doc_watermark.close()
2. 调整变换矩阵纠正翻转
如果目标页面存在隐性的垂直翻转变换,可通过自定义矩阵抵消该影响:
doc_report = fitz.open(report_pdf_path) doc_watermark = fitz.open(watermark_pdf_path) for i in range(doc_report.page_count): page = doc_report.load_page(i) rect = page.rect # 构造垂直翻转的纠正矩阵:先翻转y轴,再平移抵消位置偏移 fix_matrix = fitz.Matrix(1, -1) * fitz.Matrix(1, 1).pretranslate(0, -rect.height) # 使用纠正后的矩阵显示水印页面 page.showPDFpage(rect, doc_watermark, pno=i, matrix=fix_matrix, overlay=True, keep_proportion=True) doc_report.save(save_path, encryption=fitz.PDF_ENCRYPT_KEEP) doc_report.close() doc_watermark.close()
3. 简化原代码逻辑,减少中间环节
去掉用于中转的临时PDF文档page_front,直接使用水印文档传入showPDFpage,避免中间步骤引入的变换异常:
doc_report = fitz.open(report_pdf_path) doc_watermark = fitz.open(watermark_pdf_path) for i in range(doc_report.page_count): page = doc_report.load_page(i) # 直接传入水印文档,指定对应页码 page.showPDFpage(page.rect, doc_watermark, pno=i, keep_proportion=True, overlay=True, rotate=0) doc_report.save(save_path, encryption=fitz.PDF_ENCRYPT_KEEP) doc_report.close() doc_watermark.close()
4. 排查水印PDF本身的问题
打开水印PDF文件,检查页面属性是否存在默认的翻转设置;也可以通过watermark_page.get_text("text")提取文本,查看文本方向是否异常,确认是否水印页面本身就包含翻转变换。
内容的提问来源于stack exchange,提问作者volion80
相关产品推荐
相关产品推荐

