2015-11-11 14 views
18

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:

enter image description here

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:

  1. 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?)
  2. 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); 
} 

Trả lời

8

Có một số cách để tạo tài liệu PDF trong Qt. Bạn đã đề cập đến hai trong số họ. Tôi đề xuất một số cải tiến cho cách tiếp cận QTextDocument. Thay vì viết một cách thủ công QTextDocument, bạn có thể tạo nó từ văn bản được định dạng 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); 

Cảnh báo: QTextDocument hỗ trợ số limited subset của đánh dấu HTML 4.

+0

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)? –

+2

@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

+0

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. –

Các vấn đề liên quan