2012-04-24 7 views
8

sto creando una ad alta risoluzione (1200 dpi) documento PDF utilizzando QPrinter e QPainter. Sto cercando di disegnare il testo alla stessa risoluzione usando QTextDocument :: drawContents. La ragione per cui voglio usare QTextDocument è perché ho bisogno di includere molte tabelle e testo formattato nel mio documento.QTextDocument :: drawContents rende solo a 96 dpi

mio problema è che QTextDocument :: drawContents inserisce sempre il testo alla risoluzione dello schermo, che è di 96 dpi nel mio caso. Tutte le soluzioni che ho trovato finora suggeriscono di ridimensionare il testo per ottenere la dimensione corretta. Tuttavia, questo si traduce in testo di bassa qualità, che non posso permettermi.

La mia domanda: C'è un modo per attirare i contenuti di un QTextDocument ad alta risoluzione?

Il codice seguente crea un file PDF con 2 righe di testo, una disegnata utilizzando QPainter :: drawText e una disegnata utilizzando QTextDocument :: drawContents. Ho usato un font Arial 8pt per enfatizzare il problema della bassa qualità risultante dal ridimensionamento.

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

Il problema non sembra mostrare con un file PDF, perché il testo non viene memorizzato rasterizzato nel file PDF con entrambi i metodi ('QPainter' tratta testo in modo diverso, anche quando lo ruotate o lo ridimensionate). C'è qualche possibilità di cambiare nel lettore Adobe per riprodurre il problema di bassa qualità? – alexisdm

+0

Ho usato Foxit Reader (con le impostazioni predefinite) per aprire il file PDF creato. Sto eseguendo il codice su un ambiente Windows e usando Qt 4.7.1, nel caso in cui questi facciano la differenza. Sono davvero sorpreso che la differenza non venga visualizzata su Adobe Reader. – d11

+0

E 'davvero il fatto che sia richiesta una trasformazione di scala che mi dice che il testo viene disegnato a 96 dpi. Vedere cosa succede quando la trasformazione di scala viene omesso e/o quando il parametro passato al costruttore del secondo oggetto QPrinter viene modificato QPrinter :: ScreenResolution. – d11

risposta

7

Il QTextDocument utilizzare il proprio dispositivo di disegno per il layout, che è di default a risoluzione dello schermo.
che è possibile sostituire con:

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

Grazie. Questo e 'esattamente quello che stavo cercando. – d11

+0

quando volevo usare doc.documentLayout() -> setPaintDevice (& printer); prima di impostare la dimensione della pagina, il programma si blocca, anche se ho inizializzato la stampante e il documento –