2015-11-11 18 views
18

ユーザがダイアログウィンドウ(文書のタイトル、送信者の名前と住所など)にデータを挿入した後、アプリケーションがこのユーザデータからpdfファイルを生成する必要があります。テンプレートからQtで印刷するためのPDF文書を作成する

PDFファイルは、レイアウトを定義しておく必要があり、このような何か:

enter image description here

私はQPdfWriterでこれを実行しようとしましたが、PDF内のテキストを揃える問題を抱えています。ここに私のコードは次のとおりです。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(); 
} 

日が左側にある、しかし:

  1. 私はさらに、テキストに問題がある - 別の場所に画家を「移動」する方法を、印刷することも送信者の名前、ドキュメントのタイトル、 、ページ内のドキュメントのコンテンツ(十分な数のペインタの方法がありますか?
  2. ドキュメントの内容非常に長くなります(2ページ以上に広がります)

おかげ

EDIT

は、私はまた、QTextDocumentアプローチを試してみましたが、そのハードは、Web上で利用できるほぼすべての例で、任意の文書を書くこと。

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); 
} 

答えて

8

QtでPDF文書を作成する方法はいくつかあります。あなたはすでにそれらの2つを言いました。私は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); 

警告:QTextDocumentlimited subset HTMLのマークアップ4をサポートしています。

+0

ありがとうございます。 3つのこと:1)ページ番号を取り除く方法? 3)ページ番号を、たとえば左または中央に移動できますか? 3)私はあなたのアプローチがページ区切りを自動的に処理することを知っています(古いページが終わると新しいページに行きます)。しかし、QTextCursorを使って同じことを達成する方法を知っていますか? –

+2

@Brian Brown 1)文書にページがない場合は、現在のページ番号が各ページの下部に印刷されます。ページサイズが指定されている場合、ドキュメントのページが変更されます。したがって、ページ番号を取り除くには、ページサイズを設定する必要があります: 'document.setPageSize(printer.pageRect()。size());'。 2)ページ番号の位置がハードコードされているため、変更することはできません。 3) 'QTextDocument'は、ドキュメントがどのように作成されたかにかかわらず、ページを自動的に分割します。 – Meefte

+0

ありがとうございます。あなたのアプローチを 'setHtml'メソッドで使用しました。しかし、QtextCursorと同様のクラスで同じ効果を達成する方法を知りたいのですが、Qtのドキュメントは少なくとも私にとってはこれでは不十分です。 –

関連する問題