2012-04-24 31 views
8

Estoy creando un documento PDF de alta resolución (1200 ppp) utilizando QPrinter y QPainter. Estoy tratando de dibujar texto en la misma resolución usando QTextDocument :: drawContents. La razón por la que quiero usar QTextDocument es porque necesito incluir muchas tablas y texto formateado en mi documento.QTextDocument :: drawContents solo se procesa a 96 dpi

Mi problema es que QTextDocument :: drawContents siempre inserta el texto en la resolución de pantalla, que es 96 dpi en mi caso. Todas las soluciones que he encontrado hasta ahora sugieren escalar el texto para lograr el tamaño correcto. Sin embargo, esto da como resultado texto de baja calidad, que no puedo permitirme.

Mi pregunta: ¿Hay alguna forma de dibujar el contenido de un QTextDocument a alta resolución?

El siguiente código crea un archivo PDF con 2 líneas de texto, una dibujada usando QPainter :: drawText y una dibujada usando QTextDocument :: drawContents. He usado una fuente Arial 8pt para enfatizar el problema de la baja calidad resultante de la escala.

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

El problema no parece mostrar con una salida de PDF, ya que el texto no se almacena rasterizar en el archivo PDF con cualquiera de los métodos ('QPainter' trata de texto diferente, incluso cuando lo gira o lo reescanea). ¿Hay algunas opciones para cambiar en Adobe Reader para reproducir el problema de baja calidad? – alexisdm

+0

Utilicé Foxit Reader (con la configuración predeterminada) para abrir el archivo PDF creado. Estoy ejecutando el código en un entorno de Windows y utilizando Qt 4.7.1, en caso de que estos hagan una diferencia. De hecho, me sorprende que la diferencia no se muestre en Adobe Reader. – d11

+0

Es realmente el hecho de que se requiere una transformación de escala que me dice que el texto se dibuja a 96 ppp. Vea qué sucede cuando se omite la transformación de escala y/o cuando el parámetro pasado al constructor del segundo objeto QPrinter se cambia a QPrinter :: ScreenResolution. – d11

Respuesta

7

El QTextDocument utilizar su propio dispositivo de pintura para el diseño que por defecto a una resolución de pantalla.
Se puede cambiar con:

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

Gracias. Esto es exactamente lo que estaba buscando. – d11

+0

cuando quería usar doc.documentLayout() -> setPaintDevice (& printer); antes de configurar el tamaño de página, el programa falla, aunque he inicializado la impresora y el documento –

Cuestiones relacionadas