- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有以下 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 时在构造函数中指定要使用的分辨率。然后在设置页面大小后,您可以在打印机上使用 width
、height
和 resolution
来找出这些值,这就是我获得了 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/
我需要制作一个非常大的 QTextDocument 的预览版拷贝(在富文本模式下)。所以,我需要类似 clone() 函数的东西,但能够指定限制。IE。 克隆(int maxChars)。正如我从 c
我想使用 setDefaultStyleSheet 函数将一些自定义样式表应用到 QTextDocument,但是它被忽略了。 根据this帖子我应该在设置html内容后添加样式表,但这并没有解决我的
有一段Qt/C++代码: #include #include #include #include int main(int argc, char *argv[]) { QCoreApp
我正在尝试从 QTextDocument 生成一个 PDF 文件,工作正常。当我只想为特定的 使用自定义字体时,问题就来了目的。我尝试使用 QFontDatabase::addApplication
我尝试使用 QTextDocument 在 QImage 上绘制文本。如何设置默认(“正文”)样式? 目前我使用 标签,像这样 QPainter painter(_image); QTextDocum
我想在 QTextDocument 中的文本周围有一个唯一的左边框 我认为所需的 css 是 Hello World 但假设我有这个 qt 代码 #include #include #incl
我的程序使用几个不同的 QTextBrowser 向用户显示内容。其中一些内容带有图像。我将其从文件加载到 QPixmap 中,并将它们添加到要显示的文本文档中。 假设这样一段代码: QTextBro
给定一个具有特定宽度和高度的QTextDocument,有没有办法获取给定页面的内容(如果页面上有图像,则为纯文本+图像URL)给定它页码? 这是我想要实现的示例: QString getTextFo
我正在编写一个将地址直接打印到信封上的应用程序。我正在使用 QTextDocument,问题是它的方法 print() 添加了页码,这在信封中是不正确的。 一些代码,以备不时之需: void Main
给定一个特定的宽度,我想找出 QTextDocument 的高度.换句话说,如果 QTextEdit包含 QTextDocument w 宽,它的最小高度 h 是多少,以便在不需要滚动条的情况下完全显
我目前正在为我的大学类(class)开发一个简单的在线纯文本编辑器。我用 QTextDocument::contentsChange(index, charsRemoved, charsAdded)确
我正在尝试打印 QTextEdit 的内容。为此,我正在使用 QTextDocument::print(QPrinter*)。这样做,页码会自动添加到页面的右下角。 有什么方法可以改变它的格式/移动它
美好的一天,问题很简单:使用 setHtml() 方法时,我无法在 QTextDocument 中换行。我的输入是: "Hello World a" 我的输出是: 你好 世界a 这意味着斜体和粗体文
我认为问题完全出在 QTextDocument 对非标准字体的管理上。尽管如此,我还是会概述我正在做的事情,以防我忽略了其余代码中的某些内容。 我正在尝试混合打印富文本(使用支持 qt 的 html
我想计算 QTextDocument 中每行的边界矩形(位置、大小)。我尝试绘制每一行提供的矩形,但我遇到了麻烦! 这是我做的: QTextBlock currentBlock = tempDocum
我对 QTextDocument::size() 有疑问 每次用户手动向 TextEdit 输入内容时,文档的大小都会更新。 (所以在 SIGNAL textChanged 中它工作正常)。但是,我通
我正在努力解决 QT5 问题。我正在尝试构建(然后在 QPainter 对象上绘制)一个 HTML 表格。这是我的代码: QTextDocument td; QString table_style=
在较早的 stackoverflow 之后 discussion ,我正在尝试使用 Qt 和 QTextDocument 生成包含文本和图像的 pdf。 这是我作为 MCVE 的代码: #includ
我有这个设置: // ... // variable document is a QTextDocument* which has some 'RichText' + 'Images' QTextEd
我想生成一个包含文本和 QChart 的 pdf 报告。我目前使用 QTextDocument 并将图表作为图像添加到其中,然后我使用 QPdfWriter 导出为 pdf。 #include #i
我是一名优秀的程序员,十分优秀!