pyqt5+QWebEngineView+pdfjs+win32print实现pdf文件的预览、打印

一、pdf显示逻辑

import sys
from PyQt5 import QtCore, QtWidgets, QtWebEngineWidgetsPDFJS = 'file:///pdfjs-1.9.426-dist/web/viewer.html'
# PDFJS = 'file:///usr/share/pdf.js/web/viewer.html'
PDF = 'file:///D:/Code/report.pdf'class Window(QtWebEngineWidgets.QWebEngineView):def __init__(self):super().__init__()print('%s?file=%s' % (PDFJS, PDF))self.load(QtCore.QUrl.fromUserInput('%s?file=%s' % (PDFJS, PDF)))if __name__ == '__main__':app = QtWidgets.QApplication(sys.argv)window = Window()window.setGeometry(600, 50, 800, 600)window.show()sys.exit(app.exec_())

必要条件: 下载PDFJS1.9.426(版本太高可能不支持pyqt5显示),调用web文件夹下的 view.html文件。
注意: view.html.pdf文件的路径前需要加上file:///字符串,不然无法显示。原理可能涉及到前端技术,不过可以解释的是,当你用浏览器打开本地pdf文件时,路径前的确加了file:///。之前一直不知道是什么东西没有加一直显示不出来,无意间看到浏览器下本地pdf的路径豁然开朗。

在这里插入图片描述
二、完整代码

主界面

from PyQt5.QtCore import *
from PyQt5.QtWidgets import *
from pdfui import Ui_Form
import sys
import time
from tools import print_interfaceimport os
Pdf_path = ''
class ui_main(QMainWindow, Ui_Form):def __init__(self):super(ui_main, self).__init__()self.setupUi(self)self.pdf_view_btn.clicked.connect(self.show_report)#查看报表self.print_report_btn.clicked.connect(self.printpdf)#打印报表self.PDFJS = 'file:///pdfjs-1.9.426-dist/web/viewer.html' #已将不可用按钮设置为无法点击 button的disable属性def printpdf(self):if Pdf_path == '':passelse:printobject = print_interface.BridgeClass(Pdf_path)printobject.print_pdf()def show_report(self):self.name, _ = QFileDialog.getOpenFileName(self, 'Open File', './report_pdf', 'Image files (*.pdf)')print(self.name)self.load_pdf_in_qwebengineview(self.name)def load_pdf_in_qwebengineview(self,pdf_path):global Pdf_pathPdf_path = pdf_pathif pdf_path:file_path = 'file:///'+pdf_pathself.webEngineView.load(QUrl.fromUserInput('%s?file=%s' % (self.PDFJS, file_path)))def showMessage(self, message):result = QMessageBox.question(self, '提示', message, QMessageBox.Ok)if __name__ == '__main__':app = QApplication(sys.argv)window = ui_main()window.show()sys.exit(app.exec_())

UI

# -*- coding: utf-8 -*-# Form implementation generated from reading ui file 'pdfui.ui'
#
# Created by: PyQt5 UI code generator 5.15.9
#
# WARNING: Any manual changes made to this file will be lost when pyuic5 is
# run again.  Do not edit this file unless you know what you are doing.from PyQt5 import QtCore, QtGui, QtWidgetsclass Ui_Form(object):def setupUi(self, Form):Form.setObjectName("Form")Form.resize(851, 703)self.pdf_view_btn = QtWidgets.QPushButton(Form)self.pdf_view_btn.setGeometry(QtCore.QRect(320, 10, 75, 23))self.pdf_view_btn.setObjectName("pdf_view_btn")self.print_report_btn = QtWidgets.QPushButton(Form)self.print_report_btn.setGeometry(QtCore.QRect(440, 10, 75, 23))self.print_report_btn.setObjectName("print_report_btn")self.webEngineView = QtWebEngineWidgets.QWebEngineView(Form)self.webEngineView.setGeometry(QtCore.QRect(40, 40, 781, 651))self.webEngineView.setUrl(QtCore.QUrl("about:blank"))self.webEngineView.setObjectName("webEngineView")self.retranslateUi(Form)QtCore.QMetaObject.connectSlotsByName(Form)def retranslateUi(self, Form):_translate = QtCore.QCoreApplication.translateForm.setWindowTitle(_translate("Form", "Form"))self.pdf_view_btn.setText(_translate("Form", "查看报表"))self.print_report_btn.setText(_translate("Form", "打印报表"))
from PyQt5 import QtWebEngineWidgets

打印程序

# -*- coding:utf-8 -*-
import osimport win32print
import win32ui
from PIL import Image, ImageWin
import fitz  # fitz就是pip install PyMuPDF
import shutilclass BridgeClass():def __init__(self, Pdf_path):self.Pdf_path = Pdf_pathself.imagePath = 'image_temporary'def print_pdf(self):# 获取打印机信息https://blog.51cto.com/u_16213318/7916941print('...................')printer_name = win32print.GetDefaultPrinter()print(printer_name)num = self.pyMuPDF_fitz(self.Pdf_path, self.imagePath)for i in range(1):self.img_print(self.imagePath, printer_name, num)self.del_files(self.imagePath)def pyMuPDF_fitz(self,pdfPath, imagePath):# print(333)pdfDoc = fitz.open(pdfPath)for pg in range(pdfDoc.page_count):page = pdfDoc[pg]rotate = int(0)zoom_x = 2.6  # (1.33333333-->1056x816)   (2-->1584x1224)zoom_y = 2.6mat = fitz.Matrix(zoom_x, zoom_y).prerotate(rotate)pix = page.get_pixmap(matrix=mat, alpha=False)if not os.path.exists(self.imagePath):os.makedirs(self.imagePath)pix._writeIMG(self.imagePath + '/' + 'images_%s.png' % pg, format=1, jpg_quality=95)return pdfDoc.page_countdef img_print(self,imagePath, printer_name, num):for i in range(num):hDC = win32ui.CreateDC()hDC.CreatePrinterDC(printer_name)# 打开图片bmp = Image.open(imagePath + '/' + 'images_%s.png' % i)w, h = bmp.sizehDC.StartDoc(imagePath + '/' + 'images_%s.png' % i)hDC.StartPage()dib = ImageWin.Dib(bmp)# (10,10,1024,768)前面的两个数字是坐标,后面两个数字是打印纸张的大小# dib.draw(hDC.GetHandleOutput(), (0, 0, 4958, 7016))dib.draw(hDC.GetHandleOutput(), (0, 0, 4658, 6592))hDC.EndPage()hDC.EndDoc()hDC.DeleteDC()def del_files(self,dir_path):shutil.rmtree(dir_path)

三、整体资源下载(包括pdfjs、不用积分)
完成代码下载链接

四、参考资源
1.python - 如何在 PyQt 中使用 pdf.js 查看器呈现 PDF?

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/218316.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

数据结构:使用Stack完成表达式计算逻辑

题目: 给出如下串:sum(sum(sum(1,2),avg(3,5)),avg(avg(6,8),7)), 计算结果(保证输入任意上述接口均能输出正确结果) 思路: ​编辑 代码: import java.util.Stack;public class Test {public …

K8s 的 ResourceList进行加减操作工具类

背景 需要计算STS需要的资源并且扩容NameSpace的resourcequotas 方法 在Kubernetes Go客户端中,你可以使用一些基本的算术运算符来对ResourceList进行加减操作。ResourceList中的值是以v1.ResourceList类型表示的,这个类型实际上是一个map&#xff0c…

paddleocr文字识别变迁

数据挖掘 v3 UIM:无标注数据挖掘方案 UIM(Unlabeled Images Mining)是一种非常简单的无标注数据挖掘方案。核心思想是利用高精度的文本识别大模型对无标注数据进行预测,获取伪标签,并且选择预测置信度高的样本作为训…

LeetCode(57)合并两个有序链表【链表】【简单】

目录 1.题目2.答案3.提交结果截图 链接: 合并两个有序链表 1.题目 将两个升序链表合并为一个新的 升序 链表并返回。新链表是通过拼接给定的两个链表的所有节点组成的。 示例 1: 输入:l1 [1,2,4], l2 [1,3,4] 输出:[1,1,2,3,4…

修改naive ui默认样式,css变量值修改

新项目开发使用了naive ui组件库,使用组件时涉及到css样式修改,可以直接在组件父容器上使用组件内自带的css变量,组件会自动继承父容器的css变量值,不会影响其他页面使用; 示例:一个注册表单,两…

Centos7 配置Git

随笔记录 目录 1, 新建用户 2. 给用户设置密码相关操作 3. 为新用户添加sudo 权限 4. 配置Git 4.1 配置Git 4.2 查看id_ras.pub 5, 登录Git 配置SSH 秘钥 6. Centos7 登录Git 7. clone 指定branch到本地 8. 将新代码复制到指定路径 9. 上传指定代码 …

Zigbee课程设计系列文章

Zigbee课程设计系列文章 前言题目一、智能温室大棚系统设计要求设计方法文章链接 题目二、基于Zigbee技术的智能家居系统设计要求设计方法 题目三、自习室照明节能系统设计设计要求设计方法 题目四、冷库环境监测系统的设计设计要求设计方法 题目五、扩展题目设计要求 总结 前言…

生态系统NPP及碳源、碳汇模拟、土地利用变化、未来气候变化、空间动态模拟实践技术应用

碳中和可以从碳排放(碳源)和碳固定(碳汇)这两个侧面来理解。陆地生态系统在全球碳循环过程中有着重要作用,准确地评估陆地生态系统碳汇及碳源变化对于研究碳循环过程、预测气候变化及制定合理政策具有重要意义。 CASA(…

云运维管理,如何更快,更准,更高效

近几年,云计算在国内发展如火如荼,得益于此,政企的数字化进程也得到加速发展。越来越多的在云上构建和运行核心系统,新的运维问题也随之而来,如何掌握平台部署架构,管理云上云下资源,掌握具体资…

spark的宽依赖,窄依赖

在 Apache Spark 中,依赖关系是指 RDD(弹性分布式数据集)之间的关系。依赖关系的类型对于理解 Spark 的任务调度、分区和故障恢复等方面至关重要。Spark 中主要有两种类型的依赖关系:窄依赖(Narrow Dependency&#xf…

生产实践:基于K8S私有化交付要注意这几点问题

公众号「架构成长指南」,专注于生产实践、云原生、分布式系统、大数据技术分享 在使用 k8s 进行项目私有化部署时,会遇到很多问题,以下把作者经常遇到的一些问题以及需要注意的点分享给各位。 资源依赖问题 在进行私有化部署时,…

ceph-deploy 遇到的使用问题

问题一、RuntimeError: bootstrap-osd keyring not found; run ‘gatherkeys’ 当执行ceph-deploy命令时,提示找不到keyring文件。 解决思路:首先前往部署文件夹/etc/ceph-cluster/,检查密钥文件是否存在,不存在的话执行gatherkey…

期刊缩写查询网站

背景: 参考文献需要期刊缩写 问题描述 期刊不同缩写不同 解决方案: 网址一 网址二 网址三

字符设备驱动开发基础

一. 简介 本文简单了解一下,在字符设备驱动开发开始前对其一些基本认识。简单了解一下,应用程序与驱动的交互原理,以及字符设备驱动开发流程。 二. 字符设备驱动开发流程 1. 在 Linux 中一切皆为文件,驱动加载成功以后会在“…

数据爬虫:获取申万一级行业数据

目录 1. 获取访问接口 2. 链接网址 3. 链接名单 免责声明:本文由作者参考相关资料,并结合自身实践和思考独立完成,对全文内容的准确性、完整性或可靠性不作任何保证。同时,文中提及的数据仅作为举例使用,不构成推荐…

JAVA 导出报表 大数据量 sxssfworkbook的使用

sxssfworkbook 之前报表导出使用得是XSSFWorkbook 但是导出数据量过大的时候经常出现OOM,现在发现使用sxssfworkbook 减少内存压力 官网是这样介绍的: SXSSF (package: org.apache.poi.xssf.streaming) is an API-compatible streaming extension of X…

网站高性能架构设计——高性能数据库集群

从公众号转载,关注微信公众号掌握更多技术动态 --------------------------------------------------------------- 一、高性能数据库简介 1.高性能数据库方式 读写分离:将访问压力分散到集群中的多个节点,没有分散存储压力 分库分表&…

Maven 私服搭建

文章目录 配置模板servermirror RELEASE、SNAPSHOT版本区别发行版&#xff08;RELEASE&#xff09;快照&#xff08;SNAPSHOT&#xff09; mvn deploy 配置模板 server <!--第一个server-id要和下面的mirror中的id一致&#xff0c;代表拉取是也需要进行身份校验--> <…

Unity_使用FairyGUI搭建登录页面

Unity_使用FairyGUI搭建登录页面 1. 使用FairyGUI准备一个UI界面&#xff0c;例如&#xff1a;以下登录 2. 发布导出&#xff08;发布路径设置为Unity的Asset下任何路径&#xff09; 3. Unity编辑器安装FairyGUI包资源&#xff08;在资源商店找见并存储为我的资源&#xff0c;…

百度智能云战略与咨询高级总监詹颖:每个人都能在大模型驱动的数字化生态中找到立足之地

“ 大模型是皇冠上的明珠。 ” 整理 | 王娴 编辑 | 云舒 出品&#xff5c;极新 2023年11月28日&#xff0c;极新AIGC行业峰会在北京东升国际科学园顺利召开&#xff0c;百度智能云战略与咨询高级总监詹颖女士在会上做了题为《生成式 AI 驱动企业应用创新》的演讲。 重点…