pyqt5中使用QWebEngineView组件显示PDF文件,因PDF有表单可编辑,需要进行保存,使用page().printToPdf后发现PDF表单变为不可编辑,有没有办法可进行保存但可使此PDF文件仍可二次编辑呢?
3条回答 默认 最新
关注让 “紫雾凌寒” 来帮你回答,本回答结合 DeepSeek
如果还有问题,请评论或点击头像私信,如果有帮助到您, 请关注、采纳、点赞
- 关键点分析:
- 使用QWebEngineView显示可编辑的PDF表单。
- 使用page().printToPdf保存后表单变为不可编辑。 - 解决方案:
- 一种可能的解决方法是使用QWebEnginePage.runJavaScript来获取表单数据,然后再使用其他库(如reportlab等)来重新生成带有表单数据的PDF文件。
- 示例代码如下:
import sys import PyQt5.QtWidgets as QtWidgets import PyQt5.QtWebEngineWidgets as QtWebEngineWidgets class PdfFormWidget(QtWidgets.QWidget): def __init__(self): super().__init__() self.initUI() def initUI(self): self.setWindowTitle('PDF Form Handling') self.setGeometry(100, 100, 800, 600) self.web_view = QtWebEngineWidgets.QWebEngineView() self.web_view.load(QtWebEngineWidgets.QUrl.fromLocalFile('your_pdf_file.pdf')) self.web_view.show() self.save_button = QtWidgets.QPushButton('Save', self) self.save_button.clicked.connect(self.save_pdf) self.save_button.move(350, 560) def save_pdf(self): self.web_view.page().runJavaScript(''' var formData = {}; var fields = document.querySelectorAll('input, select, textarea'); for (var i = 0; i < fields.length; i++) { var field = fields[i]; formData[field.name] = field.value; } return formData; ''', self.handle_js_result) def handle_js_result(self, result): # 这里的result就是表单数据,接下来可以用reportlab等库重新生成PDF # 示例代码(使用reportlab) from reportlab.pdfgen import canvas from reportlab.lib.pagesizes import letter c = canvas.Canvas('new_pdf.pdf', pagesize=letter) # 这里可以根据表单数据填充新的PDF c.drawString(100, 100, '表单数据已保存到新PDF') c.save() if __name__ == '__main__': app = QtWidgets.QApplication(sys.argv) ex = PdfFormWidget() sys.exit(app.exec_())- 多种解决方案优缺点:
- 使用QWebEnginePage.runJavaScript获取数据再生成PDF:- 优点:可以灵活地处理表单数据,按照自己的需求重新生成PDF,能保证表单数据的准确性和可编辑性。
- 缺点:实现相对复杂,需要对PDF生成库(如
reportlab)有一定了解,并且可能需要根据PDF的具体表单结构进行调整。 - 尝试其他保存方式:
- 优点:如果能找到合适的保存方式,可能实现起来相对简单。
- 缺点:目前已知的
page().printToPdf不行,其他方式可能也存在兼容性问题或者难以满足需求。
- 总结:
- 当使用QWebEngineView显示可编辑PDF表单并保存时,page().printToPdf会导致表单不可编辑。通过QWebEnginePage.runJavaScript获取表单数据,再利用其他PDF生成库重新生成PDF是一种可行的解决办法,但实现过程需要一定的技术积累和调试。
希望以上解答对您有所帮助。如果您有任何疑问,欢迎在评论区提出。
解决 无用评论 打赏 举报- 关键点分析: