QTはpdfQPdfWriterを生成します



Qt Generates Pdf Qpdfwriter



qtで何をしても、最終的にはレポートやチャートを作成することから逃れることはできません。ここでは、qtを使用してPDFレポートを生成します。

QTはpdfを生成します(QPdfWriter)

Qtはパッケージ化されたクラスを提供します QPdfWriterクラス



QPdfWriterクラスは、描画デバイスとして使用できるpdfを生成するクラスです。
QPdfWriterは、qpanterを使用して、一連の描画コマンドからPDFを生成します。 newPage()メソッドを使用して、複数のページを作成できます。
ヘッダーファイルを紹介します:#include

レポートのPDFは、背景画像、ステッカー、テキストの3つの部分に分割する必要があります。 QPdfWriterをビルドするには、QPainterを使用してスライドインします。



  • 背景画像は、会社情報、レポートテーブルのタイトル、レポートのタイトル、レポートのページ番号など、すべてのレポートで同じ内容です。
  • ステッカーは固定サイズの写真ですが、レポートごとに内容が異なります。欠陥の場所、欠陥の写真、病変の写真、再構成の結果、チャートのスクリーンショットなど。
  • テキストは、患者の名前、テストカーのモデル、テスト結果など、各レポートの特定のコンテンツです。

1.1ビルドディレクトリを選択します

this->ReloadImage() QFileDialog file_dialog file_dialog.setAcceptMode(QFileDialog::AcceptSave) file_dialog.setWindowTitle('Save PDF') file_dialog.setViewMode(QFileDialog::Detail) file_dialog.setOption(QFileDialog::DontResolveSymlinks) file_dialog.setNameFilters(QStringList() << 'PDF File (*.pdf)') file_dialog.setDefaultSuffix('pdf') if (!file_dialog.exec() || file_dialog.selectedFiles().size() == 0) { return } QString path = file_dialog.selectedFiles()[0]

1.2QPdfWriterを構築する

QPdfWriter writer(path) writer.setPageSize(QPdfWriter::A4) writer.setPageMargins(QMargins(0, 0, 0, 0)) writer.setResolution(300)

その他のパラメータ:

  1. void QPdfWriter :: setCreator(const QString&creator)
    ドキュメントの作成者を作成者として設定します。
  2. bool QPdfWriter :: setPageLayout(const QPageLayout&newPageLayout)
    PDFページレイアウトをnewPageLayoutに設定します。お奨め 新しいページ () または QPainter :: begin() 先立って
    画像
  3. bool QPdfWriter :: setPageMargins(const QMarginsF&margins)
    現在のページレイアウト単位でPDFの余白を設定します。お奨め 新しいページ () または QPainter :: begin() 先立って
  4. bool QPdfWriter :: setPageMargins(const QMarginsF&margins、QPageLayout :: Unit units)
    指定された単位で定義されたPDFマージンを設定します。お奨め 新しいページ () または QPainter :: begin() 先立って
  5. bool QPdfWriter :: setPageOrientation(QPageLayout :: Orientation Orientation)
    PDFページの向きを設定します。お奨め 新しいページ () または QPainter :: begin() 先立って
  6. bool QPdfWriter :: setPageSize(const QPageSize&pageSize)
    PDFのページサイズをページサイズに設定します。お奨め 新しいページ () または QPainter :: begin() 先立って
  7. void QPdfWriter :: setPdfVersion(QPagedPaintDevice :: PdfVersion version)
    このライターのPDFバージョンをバージョンに設定します。
  8. void QPdfWriter :: setResolution(int resolve)
    PDFの解像度をDPIで設定します。
  9. void QPdfWriter :: setTitle(const QString&title)
    作成するドキュメントのタイトルを「タイトル」に設定します。
  10. QString QPdfWriter :: title()const
    ドキュメントのタイトルを返します。

1.3コンテンツを書く

個人的には、レポートを作成する最善の方法は、レポート画像、レポートの背景、およびレポートテキストを固定した高解像度の画像を作成することであると感じています。その後、PDFに画像を貼り付け、位置に応じて異なるパラメータやアイコンなどをPDFに挿入します。

1.3.1開始点として0,0を使用して背景画像を描画します

QPainter painter(&writer) painter.setRenderHint(QPainter::Antialiasing) painter.setBrush(QBrush(QColor(90, 90, 96))) painter.setPen(Qt::transparent) painter.drawRect(painter.viewport()) painter.drawPixmap( 0, 0, QPixmap('report/background.png'))

1.3.2チャートや欠陥の場所など、生成されたグラフィックを貼り付けます。各画像の位置を計算する必要があります

// picture QString md5 emit SignalGetCurrentMd5Out(md5) painter.drawPixmap( 140, 1995, 547, 547, QPixmap(QString('./session/%1/screenshoot01.png').arg(md5)) .scaled(547, 547)) painter.drawPixmap( 140 + 547, 1995, 547, 547, QPixmap(QString('./session/%1/screenshoot02.png').arg(md5)) .scaled(547, 547)) painter.drawPixmap( 140 + 547 * 2, 1995, 547, 547, QPixmap(QString('./session/%1/screenshoot03.png').arg(md5)) .scaled(547, 547)) painter.drawPixmap( 140 + 547 * 3, 1995, 547, 547, QPixmap(QString('./session/%1/screenshoot04.png').arg(md5)) .scaled(547, 547)) painter.drawPixmap( 140, 1995 + 547, QPixmap(QString('./session/%1/screenshoot05.png').arg(md5)) .scaled(1095, 401)) painter.drawPixmap( 140 + 1095, 1995 + 547, QPixmap(QString('./session/%1/screenshoot06.png').arg(md5)) .scaled(1095, 401))

1.3.2投稿テキスト、さまざまな情報など。テキストのサイズ、色、位置は事前に計算する必要があります

// text QFont font painter.setPen(Qt::black) font.setPointSize(12) painter.setFont(font) DicomInfo dicom_info emit SignalGetDicomInfoOut(GlobalEnum::FIRST, dicom_info) QString name_str = dicom_info.GetDicomTag('Patient's Name') QString sex = dicom_info.GetDicomTag('Patient's Sex') QString sex_str if (sex.front() == 'M') { sex_str = tr('male') } else if (sex.front() == 'F') { sex_str = tr('Female') } else { sex_str = ('') } QString brith_str = dicom_info.GetDicomTag('Patient's Birth Date') QString patient_id_str = dicom_info.GetDicomTag('Patient ID') QString current_time_str = QDateTime::currentDateTime().toString('yyyy-MM-dd') painter.drawText(145, 660, name_str)// name painter.drawText(440, 660, sex_str)// gender painter.drawText(690, 660, brith_str)// Date of birth painter.drawText(2080, 600, patient_id_str)// id painter.drawText(145, 885, current_time_str)//Report date painter.drawText(145, 1035, 'ML-00001')// id painter.drawText(145, 1185, ui->doctor_edit->text())// Doctors painter.drawText(145, 1330, 'XXXXXXXXXX')// institution font.setPointSize(8) painter.setFont(font) painter.setPen(Qt::black) painter.drawText(1300, 1100, 2290 - 1300, 1280 - 1110, Qt::TextWordWrap | Qt::AlignLeft, ' ' + ui->description_edit->toPlainText()) //analysis font.setPointSize(10) painter.setFont(font) QTreeWidgetItem *item = ui->treeWidget->topLevelItem(0) if (item) { painter.drawText(175, 1550, item->text(0))// location painter.drawText(490, 1550, item->text(5))// length painter.drawText(765, 1550, item->text(1))// Diameter stenosis percentage painter.drawText(1180, 1550, item->text(2))// percentage of area stenosis painter.drawText(1575, 1550, item->text(3))// minimum lumen diameter if(item->text(4).toDouble() > 0.8) { painter.setPen(Qt::green) } else { painter.setPen(Qt::red) } painter.drawText(2040, 1550, item->text(4))// ffr }

1.4まとめ

レポートPDFは、背景画像、テクスチャ、テキストの3つの部分に分割する必要があります。 QPdfWriterをビルドするには、QPainterを使用してスライドインします。



1.4.1drawTextワードラップ

テキストは自動的に長方形のフレームに折り返されます

painter.drawText(1300, 1100, 2290 - 1300, 1280 - 1110, Qt::TextWordWrap | Qt::AlignLeft, ' ' + ui->description_edit->toPlainText()) //analysis

1.4.2drawPixmapは画像サイズを設定します

QString md5 emit SignalGetCurrentMd5Out(md5) painter.drawPixmap( 140, 1995, 547, 547, QPixmap(QString('./session/%1/screenshoot01.png').arg(md5)) .scaled(547, 547))

画像を保存するときは、SmoothTransformationを使用することをお勧めします。もちろん、必要がなければ写真を保存する必要はありません。

full_screen->copy(x, y, w, h) .scaled(480, 480, Qt::KeepAspectRatio, Qt::SmoothTransformation) .save(file_path, 'bmp')

1.4.3drawTextのテキストの色とサイズをカスタマイズする

QTreeWidgetItem *item = ui->treeWidget->topLevelItem(0) if (item) { font.setPointSize(8) painter.setFont(font) painter.setPen(Qt::black) painter.drawText(175, 1550, item->text(0))// location painter.drawText(490, 1550, item->text(5))// length painter.drawText(765, 1550, item->text(1))// Diameter stenosis percentage painter.drawText(1180, 1550, item->text(2))// percentage of area stenosis painter.drawText(1575, 1550, item->text(3))// minimum lumen diameter if(item->text(4).toDouble() > 0.8) { painter.setPen(Qt::green) } else { painter.setPen(Qt::red) } font.setPointSize(10) painter.setFont(font) painter.drawText(2040, 1550, item->text(4))// ffr }

1.4.4複数のPDF

** newPage()を使用します 次の画像に移動して、背景画像、ステッカー、テキストを作成します。各PDFの余白が同じである場合、それを変更する必要はありません。 newPage()**前に新しいマージンを設定します。