html - 如何设置 QTextDocument 边距和其他属性(setHTML,打印为 pdf)?

标签 html qt4 python-3.x pyqt4

我有以下 certificate 类,用于从一些图像和数据中生成 pdf 文档。设置图像源后,我调用 generate() 函数并获取 test.pdf 输出文件。该文档是基于 QTextDocument 类使用 setHtml(html) 方法创建的。

问题是文档周围有很大的空白,而我希望带有 Logo 图像的标题“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 几乎回答了这个问题。我现在可以设置任何边距和分辨率,但不明白如何控制图像和字体大小。例如。如果我需要图像始终为 50 毫米宽,并且 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)
...

最佳答案

您可以在创建 QPrinter 时在构造函数中指定要使用的分辨率。 然后在设置页面大小后,您可以在打印机上使用 widthheightresolution 来找出这些值,这就是我获得了 Letter(dpi 值可能不同,它们取决于屏幕或打印机):

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

您也可以使用 setResolution 直接设置 dpi。 width 和 height 返回的大小是页面大小(与 pageRect().size() 相同),它与纸张大小不同 - 因为页面也有边距,您可以这样设置:

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

这会将左右边距设置为 12 毫米,顶部为 16 毫米,底部为 20 毫米 - 举个例子,如果你想要更少的空白,你显然可以使用更小的值。 并且您应该将文档大小设置为结果大小的大小:

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)

关于html - 如何设置 QTextDocument 边距和其他属性(setHTML,打印为 pdf)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10294692/

相关文章:

html - 导入特定 Material 图标

c++ - 如何检查Qt中的当前光标形状

python - 如何在另一台PC上没有安装python的情况下打开python程序

python - Tkinter 与 Python 3.3 : Change colour of button on click

python - 构建 Python 3.7.1 - SSL 模块失败

javascript - 跨不同页面显示 JS var

html - Windows 媒体应用程序对我来说很奇怪 HTML CSS

c++ - 如何将 QMetaMethod 与 QObject::connect 一起使用

c++ - 是否可以在没有接收器实例的情况下将信号连接到静态插槽?

html - 定位段落 <p> 元素的后代