2012-04-24 3 views
8

Ich erstelle ein hochauflösendes (1200 dpi) PDF-Dokument mit QPrinter und QPainter. Ich versuche, Text mit der gleichen Auflösung mit QTextDocument :: drawContents zu zeichnen. Ich möchte QTextDocument verwenden, weil ich viele Tabellen und formatierten Text in mein Dokument einfügen muss.QTextDocument :: drawContents wird nur mit 96 dpi gerendert

Mein Problem ist, dass QTextDocument :: drawContents immer den Text mit der Bildschirmauflösung einfügt, die 96 dpi in meinem Fall ist. Alle Lösungen, die ich bisher gefunden habe, schlagen vor, den Text zu skalieren, um die richtige Größe zu erreichen. Dies führt jedoch zu qualitativ minderwertigen Texten, die ich mir nicht leisten kann.

Meine Frage: Gibt es eine Möglichkeit, den Inhalt eines QTextDocument mit einer hohen Auflösung zu zeichnen?

Der folgende Code erstellt eine PDF-Datei mit 2 Textzeilen, eine mit QPainter :: drawText und eine mit QTextDocument :: drawContents. Ich habe eine Schriftart Arial 8pt verwendet, um das Problem der geringen Qualität hervorzuheben, die aus der Skalierung resultiert.

// 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

Das Problem scheint nicht mit einer PDF-Ausgabe zu zeigen, weil der Text nicht in der PDF-Datei mit beiden Methoden ('QPainter' behandelt Text anders, gerastert gespeichert ist sogar wenn Sie es drehen oder neu skalieren). Gibt es im Adobe Reader einige Optionen, um das Problem niedriger Qualität zu reproduzieren? – alexisdm

+0

Ich habe Foxit Reader (mit Standardeinstellungen) verwendet, um die erstellte PDF-Datei zu öffnen. Ich verwende den Code in einer Windows-Umgebung und verwende Qt 4.7.1, falls diese einen Unterschied machen. Ich bin wirklich überrascht, dass der Unterschied nicht auf Adobe Reader angezeigt wird. – d11

+0

Es ist wirklich die Tatsache, dass eine Maßstabsumwandlung erforderlich ist, die mir sagt, dass der Text mit 96 dpi gezeichnet wird. Sehen Sie, was passiert, wenn die Maßstabsumwandlung weggelassen wird und/oder wenn der Parameter, der an den Konstruktor des zweiten QPrinter-Objekts übergeben wird, in QPrinter :: ScreenResolution geändert wird. – d11

Antwort

7

Die QTextDocument sein eigenes Zeichengerät für das Layout verwenden, die bei Bildschirmauflösung standardmäßig ist.
Sie können es mit ändern:

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

Danke. Genau das habe ich gesucht. – d11

+0

wenn ich doc.documentLayout() verwenden wollte -> setPaintDevice (& printer); vor dem Einstellen der Seitengröße stürzt das Programm ab, obwohl ich den Drucker und das Dokument initialisiert habe –