Tôi viết một ứng dụng, khi người dùng chèn dữ liệu vào cửa sổ hộp thoại (tên tài liệu, tên người gửi và địa chỉ, v.v.) và ứng dụng của tôi sẽ tạo tệp pdf từ dữ liệu người dùng này.Tạo tài liệu PDF để in bằng Qt từ mẫu
tập tin PDF nên đã xác định bố cục, một cái gì đó như thế này:
Tôi cố gắng để làm điều này với QPdfWriter
nhưng có vấn đề sắp xếp văn bản trong pdf. Dưới đây là mã của tôi:
#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();
}
Ngày in sang pdf được ở bên trái, nhưng:
- Tôi gặp rắc rối với văn bản hơn nữa - làm thế nào để "di chuyển" họa sĩ để địa điểm khác nhau, để in cũng là tên người gửi, tiêu đề tài liệu, và nội dung tài liệu bên trong trang (là phương pháp
translate
của họa sĩ đủ hoặc có thể được thực hiện đơn giản hơn?) - Tôi không biết cách xử lý ngắt trang, trong trường hợp nội dung tài liệu sẽ rất dài (sẽ trải rộng trên 2 trang trở lên)
Cảm ơn
EDIT
Tôi cũng đã cố gắng tiếp cận QTextDocument
, nhưng nó khó có thể viết bất kỳ tài liệu, với hầu hết các ví dụ có sẵn trên web. Tôi chỉ đưa ra điều này:
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);
}
Cảm ơn bạn. Ba điều: 1) làm thế nào để thoát khỏi số trang? 3) tôi có thể di chuyển số trang, ví dụ, ở bên trái hoặc giữa nó? 3) Tôi thấy rằng cách tiếp cận của bạn xử lý ngắt trang tự động (đi đến trang mới khi trang cũ kết thúc), tuy nhiên, bạn có biết làm thế nào để đạt được cùng một bằng cách sử dụng 'QTextCursor' (phương pháp thứ hai của tôi)? –
@Brian Brown 1) Nếu tài liệu không được phân trang, số trang hiện tại sẽ được in ở cuối mỗi trang. Tài liệu được phân trang nếu kích thước trang được chỉ định. Vì vậy, để loại bỏ số trang, bạn cần đặt kích thước trang: 'document.setPageSize (printer.pageRect(). Size());'. 2) Vị trí của một số trang được mã hóa cứng, bạn không thể thay đổi nó. 3) Trang xử lý 'QTextDocument' ngắt tự động, bất kể tài liệu được tạo ra như thế nào. – Meefte
Cảm ơn bạn. Tôi đã sử dụng phương pháp của bạn với phương thức 'setHtml'. Tuy nhiên, tôi muốn biết làm thế nào để đạt được hiệu quả tương tự với 'QTextCursor' và các lớp tương tự, vì tài liệu Qt là không đủ cho điều này, ít nhất là đối với tôi. –