如何以文本模式打印QWebEngineView中显示的页面?
QWebEngineView打印结果为图像而非文本的解决办法
方案1:通过PDF中转打印(推荐)
直接调用QWebEngineView.print()会默认采用光栅化渲染,导致输出为图像。改用printToPdf()生成PDF后再打印,能完整保留文本的矢量属性,实现浏览器式的文本打印效果。
示例代码:
from PySide6.QtWidgets import QPrintDialog from PySide6.QtPrintSupport import QPrinter, QPainter from PySide6.QtCore import QByteArray from PySide6.QtPdf import QPdfDocument def print_as_text(self): print_dialog = QPrintDialog(self) if print_dialog.exec() != QPrintDialog.Accepted: return target_printer = print_dialog.printer() # 生成页面PDF数据 def on_pdf_ready(pdf_data: QByteArray): if not pdf_data: return # 加载PDF文档 pdf_doc = QPdfDocument() if not pdf_doc.loadFromData(pdf_data): return # 逐页打印 painter = QPainter(target_printer) for page_idx in range(pdf_doc.pageCount()): # 匹配页面尺寸与打印区域 page_size = pdf_doc.pageSize(page_idx) painter.setViewport(painter.window().rect()) painter.setWindow(page_size.toRect()) # 渲染当前页 pdf_doc.render(page_idx, painter) # 非最后一页则新增打印页 if page_idx < pdf_doc.pageCount() - 1: target_printer.newPage() painter.end() # 触发PDF生成 self.wevReport.page().printToPdf(on_pdf_ready)
方案2:调整QWebEngine渲染设置
通过修改QWebEngine的设置,强制启用矢量渲染模式,避免光栅化输出:
from PySide6.QtWebEngineWidgets import QWebEngineSettings # 在初始化QWebEngineView后添加以下设置 self.wevReport.settings().setAttribute( QWebEngineSettings.WebAttribute.PrintElementBackgrounds, True ) self.wevReport.settings().setAttribute( QWebEngineSettings.WebAttribute.Accelerated2dCanvasEnabled, True ) self.wevReport.settings().setAttribute( QWebEngineSettings.WebAttribute.WebGLEnabled, True )
注:该方案在部分环境(如老旧显卡、特定打印机驱动)下可能不生效,优先选择方案1。
额外排查点
- 检查HTML页面的打印样式(
@media print),避免包含强制将文本转为图像的CSS属性(比如transform、filter等)。 - 确认打印机驱动支持矢量打印,部分低端打印机可能会自动将矢量内容转为图像输出。
内容的提问来源于stack exchange,提问作者JLPrieto
相关产品推荐
相关产品推荐

