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. Der Grund, warum ich QTextDocument verwenden möchte, ist, dass ich viele Tabellen und formatierten Text in meinem Dokument einfügen muss.
Mein Problem ist, dass QTextDocument::drawContents den Text immer mit der Bildschirmauflösung einfügt, die in meinem Fall 96 dpi beträgt. 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 Text von schlechter Qualität, was ich mir nicht leisten kann.
Meine Frage: Gibt es einen Weg, den Inhalt eines QTextDocument in hoher Auflösung zu zeichnen?
Der folgende Code erstellt eine PDF-Datei mit 2 Zeilen Text, eine gezeichnet mit QPainter::drawText und eine gezeichnet mit QTextDocument::drawContents. Ich habe eine Arial 8pt Schriftart verwendet, um das Problem der schlechten Qualität aufgrund der Skalierung zu verdeutlichen.
// Lese die Bildschirmauflösung für die Skalierung
QPrinter screenPrinter(QPrinter::ScreenResolution);
int screenResolution = screenPrinter.resolution();
// Definiere die Schriftart
QFont font;
font.setFamily("Arial");
font.setPointSize(8);
// Definiere die Positionen, um den Text einzufügen
QPoint textLocation1(20,10);
QPoint textLocation2(20,20);
// Definiere Druckereigenschaften
QPrinter printer(QPrinter::HighResolution);
printer.setOrientation(QPrinter::Portrait);
printer.setPaperSize(QPrinter::A4);
printer.setResolution(1200);
printer.setOutputFormat(QPrinter::PdfFormat);
printer.setOutputFileName("test.pdf");
// Schreibe Text mit QPainter::drawText
QPainter painter;
painter.begin(&printer);
painter.setFont(font);
painter.drawText(textLocation1, "QPainter::drawText");
// Schreibe Text mit 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 Stimmen
Das Problem scheint sich nicht bei einer PDF-Ausgabe zu zeigen, da der Text in der PDF-Datei mit keiner der beiden Methoden gerastert gespeichert wird (
QPainter
behandelt Text anders, auch wenn Sie ihn drehen oder neu skalieren). Gibt es einige Optionen in Adobe Reader zu ändern, um das Qualitätsproblem zu reproduzieren?0 Stimmen
Ich habe Foxit Reader (mit den Standardeinstellungen) verwendet, um die erstellte PDF-Datei zu öffnen. Ich führe den Code in einer Windows-Umgebung aus und verwende Qt 4.7.1, falls dies einen Unterschied macht. Ich bin tatsächlich überrascht, dass der Unterschied nicht im Adobe Reader angezeigt wird.
0 Stimmen
Es ist tatsächlich die Tatsache, dass eine Skalentransformation erforderlich ist, die mir sagt, dass der Text bei 96 dpi gezeichnet wird. Sehen Sie, was passiert, wenn die Skalentransformation ausgelassen wird und/oder wenn der Parameter, der dem Konstruktor des zweiten QPrinter-Objekts übergeben wird, auf QPrinter::ScreenResolution geändert wird.