如何将多个QTextBrowser实例打印成一个PDF文件?

时间:2015-05-26 13:56:52

标签: c++ qt pdf qtextbrowser

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

我天真的做法就是这样,但这是错误的:

ip_subnets = ip.scan(/\d+/).map(&:to_i) # you can use split('.') instead of scan
ip_subnets.all? { |i| (0..255).include?(i) } && 
  ip_subnets.any? { |i| i != 0 } && 
  ip_subnets.size == 4

但是,这将在每次#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... } 调用时重新启动打印机,从新PDF文件开始,覆盖旧文件。

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

2 个答案:

答案 0 :(得分:1)

您可以通过在与QPainter设备关联的QPrinter对象上呈现内容来实现此目的

// 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();

答案 1 :(得分: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);

  // ...