【发布时间】:2012-05-05 04:35:36
【问题描述】:
我正在使用 QPrinter 和 QPainter 创建高分辨率 (1200 dpi) PDF 文档。我正在尝试使用 QTextDocument::drawContents 以相同的分辨率绘制文本。我想使用 QTextDocument 的原因是因为我需要在我的文档中包含许多表格和格式化文本。
我的问题是 QTextDocument::drawContents 总是以屏幕分辨率插入文本,在我的例子中是 96 dpi。到目前为止,我发现的所有解决方案都建议缩放文本以达到正确的大小。但是,这会导致文本质量低下,这是我无法承受的。
我的问题:有没有办法以高分辨率绘制 QTextDocument 的内容?
下面的代码创建了一个包含 2 行文本的 PDF 文件,其中一行使用 QPainter::drawText 绘制,另一行使用 QTextDocument::drawContents 绘制。我使用了 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();
【问题讨论】:
-
pdf 输出似乎没有显示该问题,因为使用任何一种方法都没有将文本光栅化存储在 PDF 文件中(
QPainter对文本的处理方式不同,即使您旋转或重新缩放它)。是否有一些选项可以更改 adobe reader 以重现低质量问题? -
我使用福昕阅读器(默认设置)打开创建的PDF文件。我在 Windows 环境中运行代码并使用 Qt 4.7.1,以防这些有所不同。我真的很惊讶 Adobe Reader 上没有显示差异。
-
确实需要进行比例转换,这告诉我文本是以 96 dpi 绘制的。看看当缩放转换被省略和/或当传递给第二个 QPrinter 对象的构造函数的参数更改为 QPrinter::ScreenResolution 时会发生什么。
标签: c++ qt pdf dpi qtextdocument