从模板创建用于在 Qt 中打印的 PDF 文档

2024-01-23

我编写一个应用程序,当用户在对话框窗口中插入数据(文档标题、发件人姓名和地址等)时,我的应用程序应该根据该用户数据生成一个 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 的日期位于左侧,但是:

  1. 我无法理解更多文字 - 如何将画家“移动”到 不同位置,还可以打印发件人姓名、文档标题、 以及页面内的文档内容(是translate画家的方法够了,还是可以做得更简单?)
  2. 我不知道如何处理分页符,以防文档内容很长(会分布在 2 页或更多页上)

Thanks

EDIT

我也尝试过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方法。而不是手动编写QTextDocument,您可以从 HTML 格式的文本创建它。

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支持一个有限子集 http://doc.qt.io/qt-5/richtext-html-subset.htmlHTML 4 标记。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

从模板创建用于在 Qt 中打印的 PDF 文档 的相关文章

随机推荐

  • Eloquent chunk() 缺少一半结果

    我对 Laravel 的 ORM Eloquent chunk 方法有疑问 它错过了一些结果 这是一个测试查询 destinataires Destinataire where statut lt 3 gt where tokenized
  • Travis CI 可以为特定 Matrix 配置生成徽章吗?

    我正在针对两个不同版本的 SDK 测试我的库 稳定 SDK 和开发 SDK 具体来说 https travis ci org google serialization dart https travis ci org google seri
  • 检查号码是否在范围内

    我正在检查来自输入字段的号码是否在范围内 function timeCheck var time trim enterTime value Number prototype between function min max return t
  • 如何知道 Node.js Express 服务器何时启动并可供使用

    有一个应用程序 我想启动节点快速服务器 然后在服务器启动后立即在同一台计算机上自动启动浏览器 如何查询服务器是否已启动并准备就绪 我真的希望在 listen 调用上有某种回调 但似乎没有 我可以等待比我预期的时间更长的时间 但是这是在现场的
  • 用作 Google Chrome 书签

    先说一下我遇到的问题 我需要多次填写同一个网页 而且我需要填写的内容大部分是相同的 但分散在整个网页中 我想到的解决方案 我知道有一种方法可以创建一些 javascript 函数 将其放在 google 书签后面 这样当您在该页面上时 只需
  • Composer 2.0.8 问题 package-versions-deprecated

    使用 PHP 7 2 Installing composer package versions deprecated 1 8 0 Extracting archive Plugin initialization failed include
  • 可以裁剪相机预览吗?

    我还没有找到任何方法来裁剪相机预览然后将其显示在 SurfaceView 上 Android 是否可以裁剪相机预览 您可以在没有覆盖视图的情况下执行此操作 这不适用于所有情况 子类化 ViewGroup 将 SurfaceView 添加为唯
  • Jasper Reports 在新页面上的子报表

    我有一个 jasper 报告 由 6 个子报告组成 每个子报告都有自己的标题部分 现在我需要每个报告都从新页面开始 我尝试添加分页符 但它对我不起作用 在研究这个问题时 我遇到了一个设置技巧isTitleNewPage to true at
  • 服务器打印到标准输出而不是套接字

    我正在研究 UNIX 网络编程中的示例 并且我已将 daytimeclientserv c 改编成此处的代码 服务器按预期向客户端发送日期 时间字符串 但启动时收到的第一个请求除外 当我第一次运行服务器程序 在局域网中的另一台计算机上 时
  • Linq lambda 表达式中的布尔短路求值

    我有以下 Linq lambda 表达式 private IEnumerable
  • 使用 postgresql 数据库时,uwsgi 下的 django 应用程序无法启动

    我设置了一个应用程序AWS 上的 Ubuntu 14 04 gt NGINX gt UWSGI gt DJANGO 应用程序 使用 sqlite3 时该应用程序运行完全正常 但是当我使用django db backends postgres
  • ZfcUser 中的用户状态到底是什么?

    谁能告诉我 用户状态 是什么ZfcUser https github com ZF Commons ZfcUser正在做什么以及为什么我们可能需要它 这个用户状态是什么意思 我认为这不是它所指的角色 可以通过向 zfcuser global
  • Android/SQLite - WHERE 子句上的位操作

    我想知道在 Android 中是否可以做这样的事情 public Cursor getFlowsByCategory int type int categoryID int limit SQLiteDatabase db dbHelper
  • canvas 与 openGL 的功能是什么?

    我知道如果你向 openGL 发送静态且很少变化的纹理 例如像图块一样 openGL 会产生奇迹 但当你有不断变化的精灵时就不行了 是否有可能纯粹从画布上创建类似绑架这样的游戏 它的性能如何 可以使用画布创建诸如绑架之类的游戏 但最终您将在
  • 在经典 ASP 中使用“错误继续下一步”,以及如何处理错误

    大家好 我想问一个关于on error resume next 假设我们有一个循环来浏览记录集 例如 Do while not rs EOF query UPDATE conn execute query rs movenext loop
  • 如何减小tesseract生成的PDF的大小?

    我的 网络 应用程序的设置如下 我获取用户上传的 PDF 文件 对它们运行 OCR 并向他们显示 OCRed PDF 由于一切都在线 因此最小化生成的 PDF 文件的大小是减少用户加载和等待时间的关键 我从用户那里收到的文件是sample
  • 从 preg_match_all() 获取行号

    我正在使用 PHP 的 preg match all 来搜索使用 file get contents 导入的字符串 正则表达式返回匹配项 但我想知道在哪个行号找到这些匹配项 实现这一目标的最佳技术是什么 我可以将文件作为数组读取 并为每一行
  • Jekyll 将每个换行符转换为换行符

    我正在使用 Jekyll 和 kramdown 来制作一个静态站点 今天我注意到每当我将同一个句子继续到新行时 Jekyll 就会插入一个 br 标记那里 以前从未发生过这种情况 由于我所有的 Markdown 文件都没有超过 80 个字符
  • 用于清除 RStudio 中命令历史记录的命令或键盘快捷键

    相当于按 RStudio 历史记录窗口中的小扫帚按钮清除当前会话中的整个历史记录缓冲区的命令或键盘快捷键是什么 Note that I don t mean Ctrl L which clears the command window I
  • 从模板创建用于在 Qt 中打印的 PDF 文档

    我编写一个应用程序 当用户在对话框窗口中插入数据 文档标题 发件人姓名和地址等 时 我的应用程序应该根据该用户数据生成一个 pdf 文件 PDF 文件应该有定义的布局 如下所示 我尝试这样做QPdfWriter但在 pdf 中对齐文本时遇到