PyQt5实现PDF预览

news2025/1/19 14:26:41

PyQt不支持PDF预览的,为了解决这个问题,本文思路是:想将PDF生成长图片,让后PyQt加载长图片达到预览效果。

步骤 1: PDF生成长图片程序

import fitz  # PyMuPDF
from PIL import Image


def pdf_to_long_image(pdf_path, output_path, scale=1.3):
    # 打开 PDF 文件
    doc = fitz.open(pdf_path)

    # 初始化图片列表
    images = []

    # 遍历 PDF 的每一页
    for page_num in range(len(doc)):
        page = doc[page_num]

            # 获取页面的缩放矩阵(可选,用于提高图片质量)
        mat = fitz.Matrix(scale, scale)

        # 获取页面的像素矩阵
        pix = page.get_pixmap(matrix=mat, alpha=False)

        # 将像素矩阵转换为 PIL Image 对象
        image = Image.frombytes(
            "RGB",
            [pix.width, pix.height],
            pix.samples,
            "raw",
            "RGB",
            pix.stride,
            -1
        )

        # 如果原始页面是旋转的,则对图片进行相应的旋转
        # if rotation != 0:
        image = image.rotate(180)
        image = image.transpose(Image.FLIP_LEFT_RIGHT)

        # 添加到图片列表
        images.append(image)

        # 释放资源
        pix = None

        # 计算长图片的总高度
    total_height = sum(img.height for img in images)

    # 创建一个新的空白图片来保存所有页面
    max_width = max(img.width for img in images)
    final_image = Image.new('RGB', (max_width, total_height))

    # 拼接所有图片到长图片上
    y_offset = 0
    for img in images:
        final_image.paste(img, (0, y_offset))
        y_offset += img.height

        # 保存长图片
    final_image.save(output_path)

步骤 2: 创建PyQt应用程序

我们将创建一个PyQt应用程序,其中包含一个按钮用于选择PDF文件,并在点击按钮后将所选的PDF文件转换为长图片并在窗口中显示。

首先,创建一个Python脚本文件,例如pdf_viewer.py,然后在其中添加以下代码:

import sys
from PyQt5.QtWidgets import QApplication, QMainWindow, QLabel, QVBoxLayout, QWidget, QScrollArea, QPushButton, QFileDialog
from PyQt5.QtGui import QPixmap
from pdf2image import convert_from_path

class PDFViewer(QMainWindow):
    def __init__(self):
        super().__init__()

        self.setWindowTitle("PDF Viewer")

        # 创建 QLabel 用于显示图片
        self.label = QLabel()

        # 创建一个滚动区域
        self.scroll_area = QScrollArea()
        self.scroll_area.setWidgetResizable(True)
        self.scroll_area.setWidget(self.label)

        # 创建一个布局并将滚动区域添加到其中
        layout = QVBoxLayout()
        layout.addWidget(self.scroll_area)

        # 创建一个按钮用于选择PDF文件并连接到槽函数
        self.preview_button = QPushButton("预览PDF")
        self.preview_button.clicked.connect(self.previewPDF)
        layout.addWidget(self.preview_button)

        # 创建一个主窗口中的中心容器并设置布局
        container = QWidget()
        container.setLayout(layout)
        self.setCentralWidget(container)

    def previewPDF(self):
        # 选择PDF文件
        file_path, _ = QFileDialog.getOpenFileName(self, "选择PDF文件", "", "PDF Files (*.pdf)")
        if file_path:
            # 将PDF转换为图像
            pass

if __name__ == '__main__':
    app = QApplication(sys.argv)
    window = PDFViewer()
    window.setGeometry(100, 100, 800, 600)
    window.show()
    sys.exit(app.exec_())

在这个代码中,我们创建了一个名为PDFViewer的类,它继承自QMainWindow。在PDFViewer类的初始化函数中,我们创建了一个用于显示图像的QLabel,并将其添加到一个可以滚动的区域中。然后,我们添加了一个按钮,用于选择要预览的PDF文件,并连接到previewPDF函数。在previewPDF函数中,我们打开文件对话框让用户选择PDF文件。

步骤 3: 创建临时文件夹,存放生成的图片

            with tempfile.TemporaryDirectory() as temp_dir:
                file = 'output.png'
                image_path = os.path.join(temp_dir, file)
                pdf_to_long_image(file_path,image_path)
                pixmap = QPixmap(image_path)
                self.label.setPixmap(pixmap)

将所选的PDF文件转换为图像,并将图像加载到QLabel中显示。

步骤 4: 运行结果如图

在这里插入图片描述

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

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

相关文章

pytorch-8 单层神经网络及激活函数

一、单层回归网络:线性回归 1. tensor手动实现单层回归神经网络的正向传播 # tensor手动实现单层回归神经网络的正向传播 import torch from torch.nn import functional as FX = torch.tensor([[1,0,0],[1,1,0],[1,0,1],[1,1,1]], dtype = torch.float32) # 特征张量 w =…

复制即用!纯htmlcss写的炫酷input输入框

一般我们写css样式都要用样式库,但是嫌麻烦,如果能找到现成的内容复制上去就很香了,下文是笔者觉得好看的纯html&css写的样式,可以直接复制到Vue等内,十分方便。 input组件 1) 下面这个很推荐&#…

HNCTF_RE复现(一)

baby_python hnctf.yuanshen.life:33276 网页打不开,只能 nc 连接远程服务器。 运行没有回显 利用pickletools库进行反编译为字节码(不知道为什么) # Python 3.10.12 from pickle import loads import pickletools main b"\x80\x04ct…

记某src通过越权拿下高危漏洞

在挖掘某SRC时,遇到了一个社区网站,社区站点是我在挖掘SRC时比较愿意遇到的,因为它们可探索的内容是较多的,幸运地,通过两个接口构造参数可进行越权,从而获得整个网站用户的信息。 图片以进行脱敏处理。在…

好看的html网站维护源码

源码介绍 好看的html网站维护源码,源码由HTMLCSSJS组成,记事本打开源码文件可以进行内容文字之类的修改,双击html文件可以本地运行效果,也可以上传到服务器里面, 源码截图 源码下载 好看的html网站维护源码

算法分析与设计复习__递归方程与分治

总结自:【算法设计与分析】期末考试突击课_哔哩哔哩_bilibili 1.递归,递归方程 1.1递归条件: 1.一个问题的解可以分解为几个子问题的解; 2.这个问题与分解之后的子问题,除了数据规模不同,求解思路完全一样; 3.存在…

嵌入式:四轴飞行器控制系统

目录 文章主题与命名环境准备四轴飞行器控制系统基础代码示例:实现四轴飞行器控制系统应用场景:航拍与农业喷洒问题解决方案与优化 1. 文章主题 文章主题 本教程将详细介绍如何在STM32嵌入式系统中使用C语言实现四轴飞行器控制系统,包括如…

汇凯金业:贵金属投资如何操作

投资贵金属虽然可能看起来令人生畏,但只要你知道如何操作,就可能会变得实际可行。以下是操作贵金属投资的基本步骤: 1. 了解市场 第一步是学习贵金属投资的基础知识,了解市场的运作方式,类型的区别(如黄金、白银、铂…

【一步一步了解Java系列】:探索Java逻辑控制

看到这句话的时候证明:此刻你我都在努力~ 加油陌生人~ 个人主页: Gu Gu Study ​​ 专栏:一步一步了解Java 喜欢的一句话: 常常会回顾努力的自己,所以要为自己的努…

【面试干货】一个数组的倒序

【面试干货】一个数组的倒序 1、实现思想2、代码实现 💖The Begin💖点点关注,收藏不迷路💖 1、实现思想 创建一个新的数组,然后将原数组的元素按相反的顺序复制到新数组中。 2、代码实现 package csdn;public class…

springboot 引用外配置json文件

场景 一些服务需要记录一些持久化的信息(没有数据库,redis,elasticsearch 可用) 我们就项目启动过程创建一个json 文件去记录工作内容的进程(json 可视化与改动非常方便) 实现效果 代码 application.yml…

【Unity Shader入门精要 第7章】基础纹理(三)

1. 渐变纹理 另外一种对于纹理的使用方式是通过渐变纹理为物体提供漫反射光照效果。 顾名思义,渐变纹理本身就是一张颜色渐变(可以是连续渐变,也可能是突变)的图片,这个渐变的过程模拟的就是光源从不同的角度照射物体…

Git—常用命令

官方 Git - Book (git-scm.com) 常用命令 命令作用git config --global user.name 用户名设置用户作者git config --global user.email 邮箱设置用户邮箱 git init初始化本地仓库git status查看本地仓库状态 git add 文件名 添加到暂存区git commit -m "提交日志…

【K8s】专题四:Kubernetes 安装方法之 Sealos

以下内容均来自个人笔记并重新梳理,如有错误欢迎指正!如果对您有帮助,烦请点赞、关注、转发!欢迎扫码关注个人公众号! 目录 一、Sealos 简介 二、Sealos 下载、安装 三、Sealos 部署 Kubernetes 集群 四、Sealos 常…

vue2人力资源项目9权限管理

页面搭建 <template><div class"container"><div class"app-container"><el-button size"mini" type"primary">添加权限</el-button><el-table-column label"名称" /><el-table-co…

反序列化漏洞【1】

1.不安全的反序列化漏洞介绍 序列化&#xff1a;将对象转换成字符串&#xff0c;目的是方便传输&#xff0c;关键词serialize a代表数组&#xff0c;数组里有三个元素&#xff0c;第一个元素下标为0&#xff0c;长度为7&#xff0c;内容为porsche&#xff1b;第二个元素下标为1…

rk3399 shell 测试串口 sttf

问题&#xff1a; 使用 ubunut shell 来对串口进行测试。 板卡上使用的是 USB 转串口&#xff0c; 使用了一片ch340 原理图如下&#xff1a; 再 ubuntu shell 的测试命令。 这里首先要 insmod 一下 ch340 的驱动&#xff0c;默认会有 /usr/sbin/ch34x.ko&#xff0c; 如果没…

创新指南 | 企业AI战略实施方案探讨(下):如何基于AI重构业务流程并落地实施

人工智能&#xff08;AI&#xff09;的浪潮已经席卷全球&#xff0c;成为推动现代企业发展的强大动力。AI技术不仅提升了企业的运营效率&#xff0c;还催生了新的商业模式和市场机会。本文将深入探讨AI的革新性应用案例&#xff0c;并提供一套企业落地AI的具体实施方案&#xf…

springboot3.0+继续使用springboot2.0配置会显示 `无法自动装配,找不到对应的Bean`解决方法

在 Spring Boot 3.0 中&#xff0c;Spring 团队对自动配置机制进行了重大变更&#xff0c;特别是 spring.factories 文件。spring.factories 文件已被 META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports 文件所取代。在springboot3.0继续使用…

SQL使用Groupby分组后,选择每个分组某个值最大的那一行

思路是&#xff1a; 先定位分组后某个值最大的值是多少根据值去全表匹配&#xff0c;得到对应的行 比如有个表&#xff1a; SELECT * FROM my_table按照sku_id分组后&#xff0c;选择record_date最大的那一行的全部值&#xff0c;先分组&#xff1a; SELECT sku_id,max(rec…