2012-04-24 16 views
6

Bazı görüntüler ve verilerin dışarı pdf belgesini üretmek için aşağıdaki certificate sınıf var. Görüntü kaynaklarını ayarladıktan sonra generate() işlevini çağırın ve test.pdf çıktı dosyasını alın. Belge, setHtml(html) yöntemini kullanarak QTextDocument sınıfına dayanarak oluşturulur. QTextDocument kenar boşlukları ve diğer özellikler nasıl ayarlanır (setHTML, pdf'ye yazdır)?

sorun

Ben sayfanın en üstünde olmak logosu görüntü ile başlığı 'RAPORU' isterken ben, belge etrafında kocaman beyaz boşluk olması. Tabloya alt kenarlık eklemek istiyorum, ancak anladığım kadarıyla Qt ( Supported HTML Subset) tarafından desteklenmiyor.

Python3 kodu:

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) 

ben yoğun önce html hiç kullanılmamış ve QTextDocument ile hiç çalışmamış ve belge marjları ve tablo özelliklerini kontrol etmek konusunda herhangi bir tavsiye takdir ediyorum. Ben kontrol etmek isteyen

Diğer ilgili mülkiyet çözünürlük - Ben piksel görüntü boyutunu kullanmak ve piksel sayfası ve kenar boyutlarını bilmemiz gerekir. DÜZENLENMİŞ

: soru neredeyse @mata tarafından cevaplanır. Artık her kenar boşluğunu ve çözünürlüğü ayarlayabilirim, ancak görüntü ve yazı tipi boyutlarını nasıl kontrol edeceğimi anlamıyorum. Örneğin. Buna ihtiyacım varsa, her zaman görüntü 50 mm genişliğinde ve html başlığı ve ana metin yazı tipi boyutları görsel olarak aynı - nasıl uygulanır?

EDITED2: son bölüm de çözüldü. İşte @mata tarafından kod değiştirilir, herhangi dpi değeri aynı sonucu verir:

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

cevap

6

Sen sen QPrinter oluştururken oluşturucu içinde kullanmak istediğiniz çözünürlüğü belirleyebilirsiniz. Sayfaları ayarladıktan sonra, yazıcıda width, height ve resolution değerlerini kullanabilirsiniz. Bu değerler Letter için var (dpi değerleri farklı olabilir, bunlar ekrana veya yazıcı): Ayrıca doğrudan setResolution kullanarak dpi ayarlayabilirsiniz

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

. genişlik ve yükseklik tarafından döndürülen boyutu sayfa boyutu kağıt boyutu ile aynı değildir ist, - sayfa Ayrıca, bu gibi ayarlayabilir kenar, olduğu gibi (aynı pageRect() boyutu().):

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

bu, sol ve sağ kenar boşluklarını 12 mm'ye, 16 mm'ye ve alttan 20 mm'ye ayarlar - örneğin daha az beyaz alan istiyorsanız, yalnızca daha küçük değerler kullanabilirsiniz. Ve çıkan boyutuna boyutuna belge boyutunu ayarlamak gerekir: Kendini, izin verilen html ve css alt kümesini fark ettik olarak

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

özel tabloları biçimlendirmek için, çok sınırlıdır. Ancak masada daha düşük bir sınır kullanmak yerine, muhtemelen istediğiniz gibi görünecek bir saat kullanabilirsiniz. En azından şu şekilde test edersem o kadar da kötü görünmez:

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

Mükemmel bir örnek için teşekkür ederiz! Çözümü değiştirerek tüm yazı tipi boyutlarının alse değiştiğini doğru mu?En azından 96 ile 200 çözünürlük arasında değiştiğimde farkı görüyorum. Her şeyi göreli büyüklükte yapmak için herhangi bir yolu var mı? Veya mutlak boyutları kullanmalı ve bunları her zaman sayfa boyutundan yeniden hesaplamalı mıyım? PageRect(), kenar boşlukları (piksel cinsinden) hariç metin ile rect'in boyutu mu? Görüntü genişliğini "% 30" olarak değiştirmek neden bu kadar garip (sayfa dışı) yapar? – Katya

+0

- Evet, dpi'nin değiştirilmesi, sayfaya göre farklı bir boyutta metin ve resimlerin oluşmasına neden olacak, çünkü (piksel cinsinden) öğelerin boyutu aynı kalırken sayfa başına daha fazla piksel harcar. - qt-html'deki boyut özniteliklerinin mutlak olması gerektiği gibi, belgelerdeki göreli görüntü boyutlarından da bahsedilmiyor gibi görünüyor. bu yüzden doğru görünmüyor. - 'pageRect()', kenar boşluklarını 'paperRect() '(_DevicePixel_)' den çıkardığınızda aldığınız şeyi döndürür. – mata

+0

Daha esnek bir HTML kullanmak istiyorsanız, bir QWebView (yüklüyse QtWebKit'ten) kullanabilirsiniz, bu nedenle, oluşturma muhtemelen çok daha yavaş olacaktır - bu sorun, sayfa daha önce yazdırmaya çalıştığınızda sorun olabilir tamamen işlenmiş. – mata

İlgili konular