2012-04-24 13 views
8

पर प्रस्तुत करता है मैं QPrinter और QPainter का उपयोग कर एक उच्च-रिज़ॉल्यूशन (1200 डीपीआई) पीडीएफ दस्तावेज़ बना रहा हूं। मैं QTextDocument :: drawContents का उपयोग कर उसी रिज़ॉल्यूशन पर टेक्स्ट खींचने की कोशिश कर रहा हूं। कारण मैं QTextDocument का उपयोग करना चाहता हूं क्योंकि मुझे अपने दस्तावेज़ में कई तालिकाओं और स्वरूपित पाठ को शामिल करने की आवश्यकता है।QTextDocument :: drawContents केवल 96 डीपीआई

मेरी समस्या यह है कि QTextDocument :: drawContents हमेशा स्क्रीन रिज़ॉल्यूशन पर टेक्स्ट डालें, जो मेरे मामले में 9 6 डीपीआई है। मेरे द्वारा अब तक पाए गए सभी समाधान सही आकार को प्राप्त करने के लिए पाठ को स्केल करने का सुझाव देते हैं। हालांकि, इसका परिणाम कम गुणवत्ता वाले पाठ में होता है, जिसे मैं बर्दाश्त नहीं कर सकता।

मेरा प्रश्न: क्या एक उच्च संकल्प पर QTextDocument की सामग्री को आकर्षित करने का कोई तरीका है?

नीचे दिया गया कोड एक पीडीएफ फ़ाइल बनाता है जिसमें पाठ की 2 पंक्तियां होती हैं, एक QPainter :: drawText का उपयोग करके खींचा जाता है और QTextDocument :: drawContents का उपयोग करके खींचा जाता है। स्केलिंग के परिणामस्वरूप निम्न गुणवत्ता की समस्या पर जोर देने के लिए मैंने एरियल 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(); 
+0

समस्या एक PDF उत्पादन के साथ दिखाने के लिए प्रतीत नहीं होता है क्योंकि पाठ या तो विधि के साथ पीडीएफ फाइल में rasterized संग्रहीत नहीं है ('QPainter' अलग ढंग से पाठ व्यवहार करता है, यहां तक ​​कि जब आप घुमाते हैं या इसे पुन: सहेजते हैं)। कम गुणवत्ता वाली समस्या को पुन: पेश करने के लिए एडोब रीडर में बदलने के लिए कुछ विकल्प हैं? – alexisdm

+0

मैंने बनाई गई पीडीएफ फ़ाइल खोलने के लिए फॉक्सिट रीडर (डिफ़ॉल्ट सेटिंग्स के साथ) का उपयोग किया। मैं विंडोज वातावरण पर कोड चला रहा हूं और क्यूटी 4.7.1 का उपयोग कर रहा हूं, अगर इससे कोई फर्क पड़ता है। मैं वास्तव में हैरान हूं कि अंतर एडोब रीडर पर दिखाई नहीं देता है। – d11

+0

यह वास्तव में तथ्य है कि एक पैमाने परिवर्तन की आवश्यकता है जो मुझे बताता है कि पाठ 96 डीपीआई पर खींचा जा रहा है। देखें कि स्केल रूपांतरण कब छोड़ा जाता है और/या जब दूसरी QPrinter ऑब्जेक्ट के कन्स्ट्रक्टर को पारित पैरामीटर QPrinter :: ScreenResolution में बदल जाता है तो क्या होता है। – d11

उत्तर

7

QTextDocument लेआउट जो स्क्रीन रिज़ॉल्यूशन पर डिफ़ॉल्ट रूप से है के लिए अपने स्वयं के रंग उपकरण का उपयोग करें।
आप के साथ इसे बदल सकते हैं:,

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

धन्यवाद। यही वह है जिसकी तलाश में मैं हूं। – d11

+0

जब मैं doc.documentLayout() -> setPaintDevice (& प्रिंटर) का उपयोग करना चाहता था; पेज आकार सेट करने से पहले, प्रोग्राम क्रैश हो जाता है, घटनाक्रम मैंने प्रिंटर और दस्तावेज़ शुरू किया –

संबंधित मुद्दे