Tôi đang tạo tài liệu PDF có độ phân giải cao (1200 dpi) bằng QPrinter và QPainter. Tôi đang cố gắng để vẽ văn bản ở độ phân giải tương tự bằng cách sử dụng QTextDocument :: drawContents. Lý do tôi muốn sử dụng QTextDocument là vì tôi cần bao gồm nhiều bảng và văn bản được định dạng trong tài liệu của mình.QTextDocument :: drawContents chỉ hiển thị ở 96 dpi
Vấn đề của tôi là QTextDocument :: drawContents luôn chèn văn bản ở độ phân giải màn hình, 96 dpi trong trường hợp của tôi. Tất cả các giải pháp tôi đã tìm thấy cho đến nay đề nghị mở rộng văn bản để đạt được kích thước chính xác. Tuy nhiên, điều này dẫn đến văn bản chất lượng thấp, mà tôi không thể mua được.
Câu hỏi của tôi: Có cách nào để vẽ nội dung của QTextDocument ở độ phân giải cao không?
Đoạn mã dưới đây tạo tệp PDF có 2 dòng văn bản, một đoạn được vẽ bằng cách sử dụng QPainter :: drawText và một được vẽ bằng QTextDocument :: drawContents. Tôi đã sử dụng phông chữ Arial 8pt để nhấn mạnh vấn đề chất lượng thấp do việc mở rộng quy mô.
// 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();
Vấn đề dường như không hiển thị với một đầu ra pdf, vì văn bản không được lưu trữ rasterized trong file PDF với một trong hai phương pháp ('QPainter' đối xử với văn bản khác nhau, thậm chí khi bạn xoay hoặc rescale nó). Có một số tùy chọn để thay đổi trong trình đọc adobe để tái tạo vấn đề chất lượng thấp không? – alexisdm
Tôi đã sử dụng Foxit Reader (có cài đặt mặc định) để mở tệp PDF đã tạo. Tôi đang chạy mã trên môi trường Windows và sử dụng Qt 4.7.1, trong trường hợp chúng tạo ra sự khác biệt. Tôi thực sự ngạc nhiên rằng sự khác biệt không hiển thị trên Adobe Reader. – d11
Nó thực sự là một thực tế là một quy mô chuyển đổi là cần thiết mà nói với tôi rằng văn bản được rút ra ở 96 dpi. Xem điều gì sẽ xảy ra khi phép biến đổi tỷ lệ bị bỏ qua và/hoặc khi tham số được truyền cho hàm tạo của đối tượng QPrinter thứ hai được thay đổi thành QPrinter :: ScreenResolution. – d11