Python借助Pdfkit转HTML string为PDF:解决图片跨页问题
解决Pdfkit转换HTML含图片时的跨页问题
一、Pdfkit可行解决方案
既然你的图片能在单页完整显示,直接通过CSS分页控制就能解决跨页问题,以下两种方法亲测有效:
方法1:强制图片另起一页(你验证过的方案)
在图片的HTML代码前插入一个带有page-break-before: always样式的段落标签,确保图片单独占据一页,不会被拆分:
<p style="page-break-before: always;"></p> <img src="data:image/png;base64,qqaa" alt="目标图片">
方法2:禁止图片容器内分页
给图片套一个容器,设置page-break-inside: avoid属性,让渲染引擎尽量避免在容器内部拆分内容:
<div style="page-break-inside: avoid;"> <img src="data:image/png;base64,qqaa" alt="目标图片"> </div>
完整Python代码示例
import pdfkit # 包含分页控制的HTML字符串(替换qqaa为实际base64图片数据) html_str = ''' <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> </head> <body> <!-- 这里可以放前面的文本内容 --> <p style="page-break-before: always;"></p> <img src="data:image/png;base64,qqaa" alt="待转换图片"> </body> </html> ''' # Pdfkit基础配置(根据wkhtmltopdf实际路径调整) config = pdfkit.configuration(wkhtmltopdf=r'C:\Program Files\wkhtmltopdf\bin\wkhtmltopdf.exe') # Windows示例路径 options = { 'page-size': 'A4', 'encoding': 'UTF-8' } # 生成PDF pdfkit.from_string(html_str, 'result.pdf', configuration=config, options=options)
二、Pdfkit替代方案
如果上述CSS规则在Pdfkit中不生效(毕竟Pdfkit依赖wkhtmltopdf,对部分CSS支持有限),可以试试这些工具:
1. WeasyPrint
WeasyPrint对CSS分页媒体的支持更完善,page-break-inside: avoid能稳定生效:
from weasyprint import HTML html_str = ''' <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <style> .img-wrap { page-break-inside: avoid; display: block; } </style> </head> <body> <!-- 前面的内容 --> <div class="img-wrap"> <img src="data:image/png;base64,qqaa" alt="目标图片"> </div> </body> </html> ''' HTML(string=html_str).write_pdf('weasyprint_result.pdf')
2. xhtml2pdf(基于ReportLab)
xhtml2pdf专注HTML转PDF,对分页控制的支持也很可靠:
from xhtml2pdf import pisa html_str = ''' <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <style> img { page-break-inside: avoid; max-width: 100%; } </style> </head> <body> <!-- 前面的内容 --> <img src="data:image/png;base64,qqaa" alt="目标图片"> </body> </html> ''' # 生成PDF with open('xhtml2pdf_result.pdf', 'wb') as out_file: pisa.CreatePDF(html_str, dest=out_file)
内容的提问来源于stack exchange,提问作者warem
相关产品推荐
相关产品推荐

