PyQt5实现PDF预览

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: 运行结果如图

在这里插入图片描述

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

时尚IT男

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值