2012-04-24 19 views
6

Tôi có lớp certificate sau đây để tạo tài liệu pdf trong một số hình ảnh và dữ liệu. Sau khi thiết lập các nguồn hình ảnh, tôi gọi hàm generate() và nhận tệp output.pdf. Tài liệu được tạo dựa trên lớp học QTextDocument sử dụng phương pháp setHtml(html).Cách đặt lề QTextDocument và các thuộc tính khác (setHTML, in sang pdf)?

Vấn đề là tôi có khoảng trắng lớn xung quanh tài liệu, trong khi tôi muốn tiêu đề 'BÁO CÁO' có hình logo ở trên cùng của trang. Tôi cũng muốn thêm đường viền thấp hơn vào bảng, nhưng vì tôi hiểu nó không được hỗ trợ bởi Qt (Supported HTML Subset).

đang Python3:

class certificate: 

def __init__(self): 
    self.logo = None 
    pdffile = 'test.pdf' 
    self.histogram = None 
    self.printer = QPrinter() 
    self.printer.setPageSize(QPrinter.Letter) 
    self.printer.setOutputFormat(QPrinter.PdfFormat) 
    self.printer.setOutputFileName(pdffile) 

def generate(self): 
    document = QTextDocument() 
    html = "" 
    html += ('<head><title>Report</title><style></style></head>' 
       '<body><table width="100%"><tr>' 
        '<td><img src="{}" width="30"></td>' 
        '<td><h1>REPORT</h1></td>' 
       '</tr></table>' 
       '<p align=right><img src="{}" width="300"></p>' 
       '<p align=right>Sample</p></body>').format(self.logo, self.histogram) 
    document.setHtml(html) 
    document.print_(self.printer) 

tôi không bao giờ sử dụng rộng rãi html trước và không bao giờ làm việc với QTextDocument, và sẽ đánh giá cao bất kỳ lời khuyên về cách để kiểm soát lợi nhuận tài liệu và tài sản bàn.

Thuộc tính liên quan khác mà tôi muốn kiểm soát là độ phân giải - tôi sử dụng kích thước hình ảnh pixel và cần biết kích thước trang và lề theo pixel.

CHỈNH SỬA: Câu hỏi gần như được trả lời bởi @mata. Bây giờ tôi có thể đặt bất kỳ lề và độ phân giải nào, nhưng không hiểu cách kiểm soát kích thước hình ảnh và phông chữ. Ví dụ. nếu tôi cần một hình ảnh luôn rộng 50mm và tiêu đề html và kích thước phông chữ văn bản chính đều giống nhau - cách triển khai nó?

EDITED2: Phần cuối cùng cũng được giải quyết. Dưới đây là sửa đổi mã bởi @mata, nó mang lại cho kết quả tương tự cho giá trị bất kỳ dpi:

dpi=96 

document = QTextDocument() 
html = """ 
<head> 
    <title>Report</title> 
    <style> 
    </style> 
</head> 
<body> 
    <table width="100%"> 
     <tr> 
      <td><img src="{0}" width="{1}"></td> 
      <td><h1>REPORT</h1></td> 
     </tr> 
    </table> 
    <hr> 
    <p align=right><img src="{2}" width="{3}"></p> 
    <p align=right>Sample</p> 
</body> 
""".format('D:\Documents\IST Projects\diashape\docbook\Installation\images\istlogo_medium.png', 
       40*dpi/96, 
       'D:\Documents\IST Projects\diashape\docbook\Installation\images\istlogo_medium.png', 
       200*dpi/96) 

document.setHtml(html) 

printer = QPrinter() 
font = QFont() 
font.setPointSize(12*dpi/96) 
document.setDefaultFont(font) 
printer.setResolution(dpi) 
... 

Trả lời

6

Bạn có thể chỉ định những gì phân giải mà bạn muốn sử dụng trong các nhà xây dựng khi bạn tạo QPrinter. Sau khi bạn đã đặt trang, bạn có thể sử dụng các trang width, heightresolution trên máy in để giải thích các giá trị đó, đây là những gì tôi nhận được cho Thư (giá trị dpi có thể khác nhau, chúng phụ thuộc vào màn hình hoặc máy in):

QPrinter(QPrinter.ScreenResolution) # 96dpi, 752x992 
QPrinter(QPrinter.PrinterResolution) # 72dpi, 564x744 
QPrinter(QPrinter.HighResolution)  # 1200dpi, 9400x12400 

Bạn cũng có thể đặt dpi trực tiếp bằng cách sử dụng setResolution. Kích thước được trả về theo chiều rộng và chiều cao là kích thước trang (giống như pageRect(). Size()), mà không giống như kích thước giấy - vì trang cũng có lề, bạn có thể đặt như sau:

printer.setPageMargins(12, 16, 12, 20, QPrinter.Millimeter) 

bộ này lề trái và phải đến 12mm, từ 16mm đến dưới 20mm - ví dụ: nếu bạn muốn ít khoảng trắng hơn, bạn có thể chỉ sử dụng các giá trị nhỏ hơn. Và bạn nên thiết lập kích thước tài liệu với kích thước của kích thước quả:

document.setPageSize(QSizeF(printer.pageRect().size())) 

như bạn đã nhận thấy chính mình, các tập hợp con của html và css cho phép là rất hạn chế, đặc biệt cho các định dạng bảng. Nhưng thay vì sử dụng một đường viền thấp hơn trên bàn, bạn có thể sử dụng một giờ, mà có lẽ sẽ trông giống như bạn muốn nó. Ít nhất nó không có vẻ xấu nếu tôi kiểm tra nó như thế này:

from PyQt4.QtGui import * 
from PyQt4.QtCore import * 

a=QApplication([]) 
document = QTextDocument() 
html = """ 
<head> 
    <title>Report</title> 
    <style> 
    </style> 
</head> 
<body> 
    <table width="100%"> 
     <tr> 
      <td><img src="{}" width="30"></td> 
      <td><h1>REPORT</h1></td> 
     </tr> 
    </table> 
    <hr> 
    <p align=right><img src="{}" width="300"></p> 
    <p align=right>Sample</p> 
</body> 
""".format('', '') 

document.setHtml(html) 

printer = QPrinter() 
printer.setResolution(96) 
printer.setPageSize(QPrinter.Letter) 
printer.setOutputFormat(QPrinter.PdfFormat) 
printer.setOutputFileName("test.pdf") 
printer.setPageMargins(12, 16, 12, 20, QPrinter.Millimeter) 
document.setPageSize(QSizeF(printer.pageRect().size())) 
print(document.pageSize(), printer.resolution(), printer.pageRect()) 

document.print_(printer) 
+0

Cảm ơn bạn đã cho một ví dụ tuyệt vời! Tôi có phải bằng cách thay đổi độ phân giải tất cả các kích thước phông chữ thay đổi không?Ít nhất tôi thấy sự khác biệt khi tôi thay đổi từ độ phân giải 96 đến 200. Có cách nào để làm mọi thứ có kích thước tương đối không? Hoặc tôi có nên sử dụng kích thước tuyệt đối và luôn tính toán lại kích thước của chúng từ kích thước trang không? Là 'pageRect()' kích thước của rect với văn bản không bao gồm lề (tính bằng pixel)? Tại sao thay đổi chiều rộng hình ảnh thành "30%" làm cho nó quá khủng khiếp (ngoài trang)? – Katya

+0

- vâng, việc thay đổi dpi sẽ dẫn đến văn bản và hình ảnh có kích thước khác với trang, vì kích thước của các phần tử (tính bằng pixel) giữ nguyên trong khi nhiều pixel hơn trên mỗi trang. - có vẻ như các thuộc tính kích thước trong qt-html phải tuyệt đối, cũng không đề cập đến kích thước hình ảnh tương đối trong tài liệu. đó là lý do tại sao nó không nhìn đúng. - 'pageRect()' trả về những gì bạn nhận được khi bạn trừ các lề từ 'paperRect()' (trong _DevicePixel_). – mata

+0

nếu bạn muốn sử dụng html linh hoạt hơn, bạn có thể sử dụng QWebView (từ QtWebKit nếu được cài đặt) để hiển thị html, độ phân giải có thể sẽ chậm hơn nhiều - có thể là vấn đề bạn cố gắng in trang trước đó hoàn toàn kết xuất. – mata

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