2012-04-24 24 views
8

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(); 
+0

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

+0

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

+0

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

Trả lời

7

Sử dụng thiết bị sơn riêng cho bố cục theo mặc định ở độ phân giải màn hình.
Bạn có thể thay đổi nó với:

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

Cảm ơn bạn. Điều này thật đúng với gì mà tôi đã tìm kiếm. – d11

+0

khi tôi muốn sử dụng doc.documentLayout() -> setPaintDevice (& printer); trước khi thiết lập kích thước trang, chương trình bị treo, dù tôi đã khởi tạo máy in và tài liệu –

Các vấn đề liên quan