9

certificateいくつかの画像とデータからpdfドキュメントを作成するための次のクラスがあります。画像ソースを設定したら、generate()関数を呼び出して test.pdf 出力ファイルを取得します。ドキュメントはメソッドQTextDocumentを使用するクラスに基づいて作成されます。setHtml(html)

問題は、ページの一番上にロゴ画像付きのタイトル「REPORT」を配置したいのに、ドキュメントの周りに大きな空白があることです。テーブルに下の境界線も追加したいのですが、私が理解しているように、Qt (サポートされている HTML サブセット) ではサポートされていません。

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 を使用したこともありませんでした。ドキュメントのマージンとテーブルのプロパティを制御する方法についてアドバイスをいただければ幸いです。

制御したいその他の関連プロパティは解像度です。ピクセル画像サイズを使用し、ページと余白のサイズをピクセル単位で知る必要があります。

EDITED:質問は@mataによってほぼ回答されています。任意の余白と解像度を設定できるようになりましたが、画像とフォント サイズを制御する方法がわかりません。たとえば、画像の幅が常に 50 mm で、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)
...
4

1 に答える 1

12

QPrinterを作成するときに、コンストラクターで使用する解像度を指定できます。次に、ページサイズを設定した後、を使用して、プリンターでその値を確認できます。widthこれheightresolutionLetterで取得したものです(dpi値は異なる場合があり、画面またはプリンターによって異なります)。

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

を使用してdpiを直接設定することもできますsetResolution。幅と高さで返されるサイズはページサイズ(pageRect()。size()と同じ)です。これは用紙サイズとは異なります。ページにも余白があり、次のように設定できます。

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

これにより、左右の余白が12mm、上が16mm、下が20mmに設定されます。たとえば、空白を少なくしたい場合は、明らかに小さい値を使用できます。そして、ドキュメントサイズを結果のサイズのサイズに設定する必要があります。

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

お気づきのように、許可されるhtmlとcssのサブセットは、特にテーブルのフォーマットのために非常に制限されています。ただし、テーブルの下の境界線を使用する代わりに、hrを使用することもできます。これは、おそらく必要なように見えます。少なくとも、次のようにテストしてもそれほど悪くはありません。

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)
于 2012-04-25T19:33:04.230 に答える