如何将 QTextBrowser 的多个实例打印到一个 PDF 文件中?

Posted

技术标签:

【中文标题】如何将 QTextBrowser 的多个实例打印到一个 PDF 文件中?【英文标题】:How to print multiple instances of QTextBrowser into one PDF file? 【发布时间】:2015-05-26 13:56:51 【问题描述】:

我正在开发的 QT 应用程序附带一个教程。每章都是一个独立的 html 文件,每个文件可以跨越多个页面。现在我想将它们打印成一个 PDF 文件(带有页码)。

我的幼稚做法是这样的,但这是错误的:

#include <QApplication>
#include <QPrinter>
#include <QTextBrowser>
#include <QUrl>

int main(int argc, char *argv[])

  QApplication app(argc, argv);

  QPrinter printer;
  printer.setOutputFormat(QPrinter::PdfFormat);
  printer.setOutputFileName("/tmp/test.pdf");

  QTextBrowser *tp = new QTextBrowser();

  tp->setSource(QUrl("qrc:///help/tutorial_item_1.html"));
  tp->print(&printer);

  tp->setSource(QUrl("qrc:///help/tutorial_item_2.html"));
  tp->print(&printer);

  tp->setSource(QUrl("qrc:///help/tutorial_item_3.html"));
  tp->print(&printer);

  // etc...

但是,这将在每次调用 print() 时重新启动打印机,从一个新的 PDF 文件开始,覆盖旧文件。

使用 QT 将所有 HTML 打印到一个 PDF 文件中的简单解决方案是什么?

【问题讨论】:

可以合并两个文本浏览器的内容,一步打印出来 每次打印后尝试printer.newPage() 【参考方案1】:

在您的“幼稚方法”上进行开发,我可以通过将多个页面附加到父 QTextEdit 来打印串联的 html 文件。它可能也可以使用第二个QTextBrowser 来代替。

  // ...
  QTextBrowser *tp = new QTextBrowser();
  QTextEdit te;

  tp->setSource(QUrl("qrc:///help/tutorial_item_1.html"));
  te.append(tp->toHtml());

  tp->setSource(QUrl("qrc:///help/tutorial_item_2.html"));
  te.append(tp->toHtml());

  te.print(&printer);

  // ...

【讨论】:

【参考方案2】:

您可以通过在链接到QPrinter 设备的QPainter 对象上呈现您的内容来实现此目的

// Sample code ahead ~>
QPrinter printer;
printer.setOutputFormat(QPrinter::PdfFormat);
printer.setOutputFileName("C:\\test.pdf");
printer.setFullPage(true);
printer.setPageSize(QPrinter::A4);
QTextBrowser tb;

QPainter painter;
painter.begin(&printer);

QRect rect = printer.pageRect();
tb.resize(rect.width(), rect.height());


  QFile file("C:\\test1.html");
  if(file.open(QIODevice::ReadOnly)) 
    QTextStream ts(&file);
    tb.setHtml(ts.readAll());
    file.close();
    tb.render(&painter, QPoint(0,0));
  


if(printer.newPage() == false)
  qDebug() << "ERROR";


  QFile file("C:\\test2.html");
  if(file.open(QIODevice::ReadOnly)) 
    QTextStream ts(&file);
    tb.setHtml(ts.readAll());
    file.close();
    tb.render(&painter, QPoint(0,0));
  

painter.end();

【讨论】:

感谢您的建议。但是,在我的情况下它没有帮助,tb.render() 不处理多页 HTML 内容。

以上是关于如何将 QTextBrowser 的多个实例打印到一个 PDF 文件中?的主要内容,如果未能解决你的问题,请参考以下文章

PyQt如何添加到QTextBrowser的链接

如何将 QTextBrowser(其中包含 html 表)的光标移动到 PyQt5 中的特定行?

如何在 qtextbrowser 中添加超链接和用户可点击操作

Python PyQt5 中QtextBrowser打印程序log,只输出一次不知道原因

尝试使用具有并行循环的多个 GhostScript 实例进行打印。

如何清除pyqt5中qtextbrowser的内容?