我编写了一个应用程序,当用户在对话窗口中插入数据(文档标题、发件人姓名和地址等),然后我的应用程序应该从该用户数据生成一个 pdf 文件。
PDF 文件应该有定义的布局,像这样:
我尝试使用 QPdfWriter
执行此操作,但在对齐 pdf 中的文本时遇到问题。这是我的代码:
#include <QApplication>
#include <QtCore>
#include <QPrinter>
#include <QPdfWriter>
#include <QPainter>
QString currDate()
{
QDate date = QDate::currentDate();
return date.toString("dd.MM.yyyy");
}
void pdf(QString filename)
{
QPdfWriter writer(filename);
writer.setPageSize(QPagedPaintDevice::A4);
writer.setPageMargins(QMargins(30, 30, 30, 30));
QPainter painter(&writer);
painter.setPen(Qt::black);
painter.setFont(QFont("Times", 10));
QRect r = painter.viewport();
QString citydate = "City, ";
citydate += currDate();
painter.drawText(r, Qt::AlignRight, citydate);
QString sender = "COMPANY XYZ\n";
sender += "Random Street 12/314A\n";
sender += "123-1232 City\n";
painter.drawText(r, Qt::AlignLeft, sender);
painter.end();
}
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
pdf("example1.pdf");
return a.exec();
}
打印到 pdf 的日期在左边,但是:
- 我无法处理更多文字 - 如何将画家“移动”到
不同的位置,还打印发件人姓名、文档标题、
以及页面内的文档内容(painter的
translate
方法够不够,还是可以做的更简单点?) - 我不知道如何处理分页符,以防文档内容很长(会分布在 2 页或更多页上)
谢谢
编辑
我也尝试了 QTextDocument
方法,但是它很难编写任何文档,几乎所有示例都可以在网络上找到。我只想到了这个:
void pdf(QString filename)
{
QPrinter printer(QPrinter::PrinterResolution);
printer.setOutputFormat(QPrinter::PdfFormat);
printer.setPaperSize(QPrinter::A4);
printer.setOutputFileName(filename);
printer.setPageMargins(QMarginsF(30, 30, 30, 30));
QFont headerFont("Times New Roman", 8);
QFont titleFont("Times New Roman", 14, QFont::Bold);
QTextCharFormat txtformat = QTextCharFormat();
QTextDocument doc;
doc.setPageSize(printer.pageRect().size());
QTextCursor* cursor = new QTextCursor(&doc);
txtformat.setFont(headerFont);
cursor->insertText("Company XYZ", txtformat);
cursor->movePosition(QTextCursor::Right && QTextCursor::EndOfLine, QTextCursor::KeepAnchor, 1000);
cursor->insertText(currDate(), txtformat);
doc.print(&printer);
}
最佳答案
有几种方法可以在 Qt 中创建 PDF 文档。你已经提到了其中两个。我建议对 QTextDocument
方法进行一些改进。您可以从 HTML 格式的文本创建它,而不是手动编写 QTextDocument
。
QString html =
"<div align=right>"
"City, 11/11/2015"
"</div>"
"<div align=left>"
"Sender Name<br>"
"street 34/56A<br>"
"121-43 city"
"</div>"
"<h1 align=center>DOCUMENT TITLE</h1>"
"<p align=justify>"
"document content document content document content document content document content document content document content document content document content document content "
"document content document content document content document content document content document content document content document content document content document content "
"</p>"
"<div align=right>sincerly</div>";
QTextDocument document;
document.setHtml(html);
QPrinter printer(QPrinter::PrinterResolution);
printer.setOutputFormat(QPrinter::PdfFormat);
printer.setPaperSize(QPrinter::A4);
printer.setOutputFileName("/tmp/test.pdf");
printer.setPageMargins(QMarginsF(15, 15, 15, 15));
document.print(&printer);
警告:QTextDocument
支持 limited subset HTML 4 标记。
关于c++ - 从模板创建用于在 Qt 中打印的 PDF 文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33654060/