csdndenglu 2023-11-14 09:19 采纳率: 100%
浏览 17
已结题

QT5.9.2中QPrinter+QTextEdit+html导出PDF不能指定换页位置

QT5.9.2中QPrinter + QTextEdit + html导出PDF不能指定换页位置,html中加入下面分页的div也不管用,导致如下图中的位置被截断:

img


```html
<div style=‘page-break-after:always’;></div> 


代码不完整,仅作为示例:
    QString strHTML = "<div style=‘page-break-after:always’;>第1页</div>第2页 "
    QTextEdit* m_textEdit;//要显示到的QTextEdit控件
    QPrinter* m_printer;
    m_textEdit->insertHtml(strHTML);
    m_textEdit->append("\n");
    m_printer->setOutputFormat(QPrinter::PdfFormat);
    m_printer->setPageSize(QPrinter::A4);
    m_printer->setOutputFileName(filename);
    m_printer->setPageMargins(QMarginsF(0, 20, 0, 20), QPageLayout::Millimeter);
    m_textEdit->document()->setPageSize(QSizeF(m_printer->pageRect().size()));//将文档大小设置为QPrinter的大小,否则页边距会异常
    m_textEdit->document()->print(m_printer);//和m_textEdit->print(m_printer);效果一样

```

  • 写回答

1条回答 默认 最新

  • 普通网友 2023-11-14 09:24
    关注

    在HTML中使用<div style="page-break-after:always;"></div>的方式来指定换页位置在QPrinter和QTextEdit结合导出PDF时可能无法生效。这是因为QPrinter在处理HTML时可能不完全支持CSS的全部功能。

    为了解决这个问题,你可以使用QTextDocument来代替QTextEdit,并使用QTextCursor来控制文档内容的插入和换页操作。以下是一个示例代码:

    QString strHTML = "<div>第1页</div><div style=\"page-break-before:always;\"></div><div>第2页</div>";
    QTextDocument textDocument;
    textDocument.setHtml(strHTML);
    
    QPrinter printer;
    printer.setOutputFormat(QPrinter::PdfFormat);
    printer.setPageSize(QPrinter::A4);
    printer.setOutputFileName(filename);
    
    textDocument.setPageSize(printer.pageRect().size());
    textDocument.print(&printer);
    

    在上述示例中,我们创建了一个QTextDocument对象textDocument,并使用setHtml()方法设置HTML内容。在HTML中,我们使用<div>元素分别表示第1页和第2页,并在第2页的<div>元素上添加了style属性page-break-before:always;来指定在此处换页。

    然后,我们创建了一个QPrinter对象printer,设置了输出格式、页面大小和输出文件名。

    最后,我们使用setPageSize()方法将文档大小设置为打印机的页面大小,并使用print()方法将文档打印到打印机上。

    通过使用QTextDocument,我们可以更灵活地控制文档内容和换页位置,从而解决了QPrinter和QTextEdit结合导出PDF时无法指定换页位置的问题。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 11月22日
  • 已采纳回答 11月14日
  • 修改了问题 11月14日
  • 修改了问题 11月14日
  • 展开全部