2012-04-24 12 views
8

QPrinterとQPainterを使用して高解像度(1200 dpi)PDFドキュメントを作成しています。 QTextDocument :: drawContentsを使用して同じ解像度でテキストを描画しようとしています。 QTextDocumentを使用する理由は、ドキュメントに多数のテーブルと書式設定されたテキストを含める必要があるためです。QTextDocument :: drawContentsは96 dpiでレンダリングする

私の問題は、QTextDocument :: drawContentsは常に私の場合は96 dpiの画面解像度でテキストを挿入することです。私が今までに見つけたすべての解決策は、正しいサイズを得るためにテキストを拡大縮小することを提案しています。しかし、これは低品質のテキストをもたらします。

私の質問:QTextDocumentの内容を高解像度で描画する方法はありますか?

次のコードは、2行のテキスト(QPainter :: drawTextを使用して描画したものとQTextDocument :: drawContentsを使用して描画したもの)を含むPDFファイルを作成します。私は、スケーリングによる低品質の問題を強調するために、Arial 8ptフォントを使用しました。

// Read the screen resolution for scaling 
QPrinter screenPrinter(QPrinter::ScreenResolution); 
int screenResolution = screenPrinter.resolution(); 

// Setup the font 
QFont font; 
font.setFamily("Arial"); 
font.setPointSize(8); 

// Define locations to insert text 
QPoint textLocation1(20,10); 
QPoint textLocation2(20,20); 

// Define printer properties 
QPrinter printer(QPrinter::HighResolution); 
printer.setOrientation(QPrinter::Portrait); 
printer.setPaperSize(QPrinter::A4); 
printer.setResolution(1200); 
printer.setOutputFormat(QPrinter::PdfFormat); 
printer.setOutputFileName("test.pdf");  

// Write text using QPainter::drawText 
QPainter painter; 
painter.begin(&printer); 
painter.setFont(font); 
painter.drawText(textLocation1, "QPainter::drawText"); 

// Write text using QTextDocument::drawContents 
QTextDocument doc; 
doc.setPageSize(printer.pageRect().size()); 
QTextCursor cursor(&doc); 
QTextCharFormat charFormat; 
charFormat.setFont(font); 
cursor.insertText("QTextDocument::drawContents", charFormat); 
painter.save(); 
painter.translate(textLocation2); 
painter.scale(printer.resolution()/screenResolution, printer.resolution()/screenResolution); 
doc.drawContents(&painter); 
painter.restore(); 
painter.end(); 
+0

テキストがさえ方法( 'QPainter'は異なり、テキストを扱い、のいずれかでPDFファイルにラスタライズされ保存されていないため、問題は、PDF出力で表示されていないようですあなたがそれを回転させるか、または再スケーリングするとき)。低品質の問題を再現するためにAdobe Readerで変更するオプションがありますか? – alexisdm

+0

作成したPDFファイルを開くためにFoxit Reader(デフォルト設定)を使用しました。私はWindows環境上でコードを実行しており、Qt 4.7.1を使用しています。私は実際にはAdobe Readerにその違いが表示されないことに驚いています。 – d11

+0

実際には、テキストが96 dpiで描画されていることを示すスケール変換が必要です。縮尺変換が省略された場合や、2番目のQPrinterオブジェクトのコンストラクタに渡されたパラメータがQPrinter :: ScreenResolutionに変更された場合にどうなるかを確認してください。 – d11

答えて

7

QTextDocumentは画面解像度にデフォルトでレイアウトするための独自の塗装装置を使用します。
あなたがして、それを変更することができます。

doc.documentLayout()->setPaintDevice(&printer); 
// just before 
doc.setPageSize(printer.pageRect().size()); 
+0

ありがとうございます。これはまさに私が探していたものです。 – d11

+0

私はdoc.documentLayout() - > setPaintDevice(&printer)を使いたかったのですが、ページサイズを設定する前に、プログラムがクラッシュし、プリンタとドキュメントを初期化していますが –

関連する問題