2012-04-24 3 views
8

QPrinter 및 QPainter를 사용하여 고해상도 (1200 dpi) PDF 문서를 만듭니다. QTextDocument :: drawContents 사용하여 같은 해상도로 텍스트를 그리려면 노력하고있어. QTextDocument를 사용하려는 이유는 내 문서에 여러 테이블과 서식있는 텍스트를 포함해야하기 때문입니다.QTextDocument :: drawContents는 96 dpi로만 렌더링됩니다.

제 문제는 QTextDocument :: drawContents가 항상 화면 해상도 (필자의 경우 96 dpi)에 텍스트를 삽입한다는 것입니다. 지금까지 발견 한 모든 해결책은 정확한 크기를 얻기 위해 텍스트 크기를 조정하는 것이 좋습니다. 그러나, 이것은 저 품질의 텍스트를 만들어 내지 못합니다.

내 질문 : QTextDocument의 내용을 고해상도로 그리는 방법이 있습니까?

아래 코드는 QPainter :: drawText를 사용하여 그려진 텍스트와 QTextDocument :: drawContents를 사용하여 그려진 텍스트의 두 줄로 된 PDF 파일을 만듭니다. 저는 스케일링으로 인한 낮은 품질의 문제를 강조하기 위해 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(); 
+0

문제는 PDF 출력을 표시하지 않는 것 ('QPainter' 심지어 다른 텍스트를 취급 회전하거나 크기를 재조정 할 때). 낮은 품질의 문제를 재현하기 위해 Adobe Reader에서 변경할 수있는 옵션이 있습니까? – alexisdm

+0

Foxit Reader (기본 설정)를 사용하여 생성 된 PDF 파일을 열었습니다. Windows 환경에서 코드를 실행하고 Qt 4.7.1을 사용합니다. 차이점이 Adobe Reader에 표시되지 않는다는 사실은 사실 놀랍습니다. – d11

+0

실제로 텍스트가 96dpi로 그려지는 스케일 변환이 필요하다는 사실이 사실입니다. 축척 변환이 생략되거나 두 번째 QPrinter 객체의 생성자에 전달 된 매개 변수가 QPrinter :: ScreenResolution으로 변경 될 때 어떤 일이 발생하는지 확인하십시오. – d11

답변

7

QTextDocument은 기본적으로 화면 해상도에서 레이아웃을 위해 자체 페인트 장치를 사용합니다.
당신은 그것을 변경할 수 있습니다 텍스트가 두 방법 중 하나를 가진 PDF 파일로 래스터 화되어 저장되지 않기 때문에,

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

감사합니다. 이것은 내가 찾고 있었던 바로 그 것이다. – d11

+0

내가 doc.documentLayout() -> setPaintDevice (& printer)를 사용하려고 할 때; 페이지 크기를 설정하기 전에 프로그램이 중단되고 프린터 및 문서가 초기화됩니다. –