PYQT5 - 链接到导出的 pdf 中的页面

Posted

技术标签:

【中文标题】PYQT5 - 链接到导出的 pdf 中的页面【英文标题】:PYQT5 - Link to page in exported pdf 【发布时间】:2022-01-11 00:08:10 【问题描述】:

我正在创建一个应用程序来为用户绘制指令。 创建说明的人可以添加多个页面,然后将它们导出为 .pdf。 所有这些都很好,只是我似乎无法获得不同页面之间的链接。

我想添加一个初始页面,该页面将显示所有页面并具有指向它们的链接(目录),并在每个页面上添加一个按钮,该按钮将链接到下一页/上一页。

我目前要导出的是这个:

def __export_page_to_pdf(self):
    """ Export the current pages to pdf. . """
    printer = QtPrintSupport.QPrinter()
    printer.setOutputFormat(QtPrintSupport.QPrinter.PdfFormat)
    printer.setOutputFileName("instructions.pdf")
    printer.setPageSize(QtGui.QPageSize(self.__page.size, QtGui.QPageSize.Point))

    painter = QtGui.QPainter(printer)
    for page_number in range(self.__page_count):
        self.set_page(page_number)

        x_scale = self.__page.size.width() / self.width()
        y_scale = self.__page.size.height() / self.height()
        painter.scale(x_scale, y_scale)

        self.render(painter)

        if page_number < self.__page_count - 1:
            painter.resetTransform()
            printer.newPage()
    painter.end()

self.set_page(page_number) 更改当前页面,以便可以呈现请求的页面。 self.set_page(0) 包含带有目录的页面。

所有页面都显示在 QGraphicsScene 中。 对于如何在这些页面之间创建链接的任何提示,我将不胜感激。

【问题讨论】:

以这种方式使用 QPrinter 只会创建一系列图像(每页一个)并将它们存储在 pdf 中,因此生成的文件几乎没有内部结构。您需要从 QTextDocument 打印以获取链接,但在 Qt5 的 pdf 支持中存在许多错误,这意味着内部链接无法正常工作 - 请参阅:QTBUG-83458。这意味着您需要使用第三方 pdf 库来获得所需的输出。 【参考方案1】:

在ekhumoro回复后,我调查了第三方软件。 PyMuPdf 包可以实现我所寻求的功能。 采取的步骤是将文本/图像放在原始 pdf 中。然后使用 PyMuPdf 包使用类似于这个的 sn-p:

import fitz # This is the import name for PyMuPdf. Use pip install PyMuPdf to install
doc = fitz.open("test.pdf")
new_link = 
    "kind": 1, # I am unsure what this does but it is required.
    "from": fitz.Rect(32, 504, 50, 534), # Locaton of the link.
    "page": 1, # The page to link to.
    "to": fitz.Point(0, 0), # The location on the new page.
    "zoom": 0 # The zoom of the new page.


for i in range(doc.page_count): # Use this method of iterating to prevent pages not being edited.
    page_link = dict(new_link) # Copy template.
    page_link["page"] = i + 1 # Update page to link to.
    doc[i].insert_link(page_link) # Insert the link.

【讨论】:

以上是关于PYQT5 - 链接到导出的 pdf 中的页面的主要内容,如果未能解决你的问题,请参考以下文章

如何快速将 swagger 导出 PDF、markdown

如何使用 PyQt5 Python 将 QTableWidget 数据转换为 PDF

如何更改数据表中的导出 PDF 页面大小?

使用剑道导出pdf在页面末尾中断的图像/内容块

如何通过mPDF将信息导出到一个单独页面的pdf文件中

导出到 pdf 溢出到不同的页面