使用 QPdfWriter 创建 link

Create a link with QPdfWriter

我正在使用 PySide6 库在 Python 中编写 GUI 应用程序,我想编写 PDF。我通常使用 reportlab 库来编写 PDF,但我看到 PySide6 有一个 QPdfWriter class。如果 PySide6 足够,我想避免对 reportlab 的额外依赖,但我看不到在 PDF 中创建 link 的方法,无论是文档的一部分还是网站。

是否可以使用 QPdfWriter 将 link 添加到 PDF 中,还是它只支持绘图和文本?

这是一个示例,其中我创建了一个带有一些文本的 PDF,我想将文本转换为 link 到网页。

from PySide6.QtGui import QPdfWriter, QPainter, QPageSize
from PySide6.QtWidgets import QApplication

app = QApplication()
pdf = QPdfWriter('example.pdf')
pdf.setPageSize(QPageSize.Letter)
painter = QPainter(pdf)
painter.drawText(painter.window().width()//2,
                 painter.window().height()//2,
                 'https://donkirkby.github.io')
painter.end()

一种可能的解决方案是使用 QTextDocument:

from PySide6.QtGui import QGuiApplication, QPageSize, QPdfWriter, QTextDocument

app = QGuiApplication()

html = "<a href='https://donkirkby.github.io'>https://donkirkby.github.io</a>"


pdf = QPdfWriter("example.pdf")
pdf.setPageSize(QPageSize.Letter)

document = QTextDocument()
document.setHtml(html)
document.print_(pdf)

你可以使用QWebEnginePage,它在Qt6中还不可用所以应该使用PySide2作为例子:

from PySide2.QtWidgets import QApplication
from PySide2.QtWebEngineWidgets import QWebEnginePage

app = QApplication()

html = """
<!DOCTYPE html>
<html>
  <head>
    <title>Title of the document</title>
    <style>
        .container {
            position: absolute;
            top: 50%;
            left: 50%;
            -moz-transform: translateX(-50%) translateY(-50%);
            -webkit-transform: translateX(-50%) translateY(-50%);
            transform: translateX(-50%) translateY(-50%);
        }
    </style>
  </head>
  <body>
    <div class="container">
        <a href='https://donkirkby.github.io'>https://donkirkby.github.io</a>
    </div>
  </body>
</html>
"""

page = QWebEnginePage()


def handle_load_finished():
    page.printToPdf("example.pdf")


def handle_pdf_printing_finished():
    app.quit()


page.loadFinished.connect(handle_load_finished)
page.pdfPrintingFinished.connect(handle_pdf_printing_finished)

page.setHtml(html)


app.exec_()