2012-04-24 236 views
6

我有以下certificate類生產PDF文件的一些圖像和數據。設置圖像源後,我調用generate()函數並獲取test.pdf輸出文件。該文檔基於QTextDocument類使用setHtml(html)方法創建。如何設置QTextDocument邊距和其他屬性(setHTML,print to pdf)?

問題是我在文檔周圍有巨大的空白區域,而我希望帶有徽標圖像的標題'REPORT'位於頁面的頂部。我也想在表格中添加較低的邊框,但據我所知它不支持Qt(Supported HTML Subset)。

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) 

我從來沒有廣泛使用的HTML之前從不與另外,QTextDocument工作,並希望瞭解有關如何控制文檔的頁邊距和表屬性的任何意見。

我想要控制的其他相關屬性是分辨率 - 我使用像素圖像大小,並需要知道頁面和邊距大小(像素)。

編輯:這個問題幾乎回答@mata。我現在可以設置任何邊距和分辨率,但不知道如何控制圖像和字體大小。例如。如果我需要一個圖像總是50mm寬,並且html標題和主文本字體大小在視覺上是相同的 - 如何實現它?

EDITED2:最後一部分也解決了。這裏是由@mata修改後的代碼,它給出了相同的結果對於任何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) 
... 

回答

6

您可以指定要在創建QPrinter則在構造函數中使用的分辨率。 然後,在設置頁面大小後,您可以在打印機上使用width,heightresolution來找出該值,這裏是我得到的Letter(dpi值可以不同,它們取決於屏幕或打印機):

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

您還可以使用setResolution直接設置dpi。 由寬度和高度返回的大小是頁面大小(與pageRect()。size()相同),它與紙張大小不一樣 - 頁面也有頁邊距,您可以這樣設置:

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

這將左右邊距設置爲12mm,頂部到16mm和底部到20mm - 例如,如果您想要較少的空白空間,您顯然可以使用較小的值。 你應該文件大小設置爲所產生的大小尺寸:

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

因爲你已經注意到自己,HTML和CSS允許的子集是非常有限的,特別是格式化的表格。但不是在桌子上使用較低的邊框,您可以使用小時,這可能看起來像你想要的。 至少它看起來並不壞,如果我測試它是這樣的:

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

謝謝你的一個很好的例子!我是對的,通過改變分辨率,所有的字體大小都會改變?至少我從96到200的分辨率看到不同之處。有什麼方法可以使相對大小的一切?或者我應該使用絕對大小,並始終從頁面大小重新計算它們? 'pageRect()'是否包含邊距(以像素爲單位)的文本的大小?爲什麼將圖像寬度更改爲「30%」使其變得如此奇怪(頁面外)? – Katya 2012-04-26 12:34:16

+0

- 是的,更改dpi將導致文本和圖像相對於頁面的大小不同,因爲元素的大小(以像素爲單位)保持不變,同時每頁有更多像素。 - 似乎qt-html中的大小屬性必須是絕對的,文檔中也沒有提及相對圖像大小。這就是爲什麼它看起來不正確。 - 'pageRect()'返回當你從'paperRect()'(在_DevicePixel_)中減去邊距時得到的結果。 – mata 2012-04-26 15:26:59

+0

如果你想使用更靈活的HTML,那麼你可以使用QWebView(如果安裝了QtWebKit)來渲染HTML,儘管渲染可能會慢得多 - 這可能是一個問題,它試圖打印頁面之前完全呈現。 – mata 2012-04-26 15:33:12

相關問題