qq_45509873 2025-11-18 20:53 采纳率: 0%
浏览 7

pyqt5中使用QWebEngineView组件操作PDF表单保存的问题

pyqt5中使用QWebEngineView组件显示PDF文件,因PDF有表单可编辑,需要进行保存,使用page().printToPdf后发现PDF表单变为不可编辑,有没有办法可进行保存但可使此PDF文件仍可二次编辑呢?

  • 写回答

3条回答 默认 最新

  • 紫雾凌寒 新星创作者: 人工智能技术领域 2025-11-18 20:55
    关注

    让 “紫雾凌寒” 来帮你回答,本回答结合 DeepSeek

    如果还有问题,请评论或点击头像私信,如果有帮助到您, 请关注、采纳、点赞

    1. 关键点分析:
      - 使用QWebEngineView显示可编辑的PDF表单。
      - 使用page().printToPdf保存后表单变为不可编辑。
    2. 解决方案:
      - 一种可能的解决方法是使用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_())
    
    1. 多种解决方案优缺点:
      - 使用QWebEnginePage.runJavaScript获取数据再生成PDF
      • 优点:可以灵活地处理表单数据,按照自己的需求重新生成PDF,能保证表单数据的准确性和可编辑性。
      • 缺点:实现相对复杂,需要对PDF生成库(如reportlab)有一定了解,并且可能需要根据PDF的具体表单结构进行调整。
      • 尝试其他保存方式
      • 优点:如果能找到合适的保存方式,可能实现起来相对简单。
      • 缺点:目前已知的page().printToPdf不行,其他方式可能也存在兼容性问题或者难以满足需求。
    2. 总结:
      - 当使用QWebEngineView显示可编辑PDF表单并保存时,page().printToPdf会导致表单不可编辑。通过QWebEnginePage.runJavaScript获取表单数据,再利用其他PDF生成库重新生成PDF是一种可行的解决办法,但实现过程需要一定的技术积累和调试。

    希望以上解答对您有所帮助。如果您有任何疑问,欢迎在评论区提出。

    评论

报告相同问题?

问题事件

  • 创建了问题 11月18日