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)
...
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
- 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
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