Wie setzen QTextDocument Ränder und andere Eigenschaften (setHTML, drucken Sie pdf-Dateien)?
Habe ich Folgendes certificate
- Klasse zum erzeugen von pdf-Dokument aus Bildern und Daten. Nach der Einstellung Bild-Quellen, die ich nennen generate()
Funktion und testen erhalten.pdf-Ausgabe-Datei. Das Dokument wird erstellt, basierend auf QTextDocument
Klasse mit setHtml(html)
Methode.
Das problem ist, dass ich riesige weiße Bereiche rund um das Dokument, während ich will den Titel 'BERICHT' mit logo-Bild, um auf der ganz oben auf der Seite. Ich möchte auch hinzufügen, um den unteren Rand der Tabelle, aber so wie ich es verstehe, wird nicht unterstützt durch Qt (Unterstützt HTML-Teilmenge).
Python ist3-code:
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)
Habe ich nie ausgiebig html vor und noch nie gearbeitet mit QTextDocument, und würde schätzen jede Beratung, wie man Steuern Dokument die Margen und die Eigenschaften einer Tabelle.
Andere Verwandte Eigenschaft, die ich kontrollieren möchten, ist die Auflösung - ich nehme pixel, Bildgröße und wissen müssen, Seite und Marge Größen in Pixel.
BEARBEITET: Die Frage ist fast beantwortet von @mata. Ich kann jetzt alle Ränder und Auflösung, aber nicht verstehen, wie die Kontrolle Bild-und Schriftgrößen. E. g. wenn ich brauche, ein Bild ist immer 50mm breit und html-header und Haupttext schriftart, die Größen sind optisch die selben, wie es zu implementieren?
EDITED2: Der Letzte Teil ist, gelöst zu werden. Hier ist der modifizierte code von @mata, gibt es das gleiche Ergebnis für alle dpi
Wert:
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)
...
InformationsquelleAutor Katya | 2012-04-24
Du musst angemeldet sein, um einen Kommentar abzugeben.
Können Sie angeben, welche Auflösung Sie verwenden möchten, in den Konstruktor beim erstellen der QPrinter.
Dann, nachdem Sie sich gesetzt haben, pagesize, die Sie verwenden können
width
,height
undresolution
auf den Drucker finden Sie heraus, dass die Werte, hier ist, was ich für ein Brief (dpi-Werte können unterschiedlich sein, Sie hängen auf den Bildschirm oder den Drucker):Können Sie auch den dpi-Wert direkt mit
setResolution
.Die zurückgegebene Größe von Breite und Höhe wird die Größe der Seite (die gleiche wie pageRect().size()), das ist nicht das gleiche wie das Papierformat - die Seite hat auch Ränder, die Sie festlegen können, wie diese:
diese setzt Links und rechts Ränder auf 12mm, oben 16mm und unten zu 20mm - gerade zum Beispiel, wenn Sie wollen, weniger white space kann man offensichtlich nur kleinere Werte.
Und sollten Sie das Dokument die Größe, um die Größe der resultierenden Größe:
als Sie bemerkt habe, Sie selbst, die Teilmenge von html und css erlaubt ist, ist sehr beschränkt, die speziell für die Formatierung von Tabellen. Aber statt mit einem unteren Rand auf den Tisch, Sie konnte sich nur mit einer hr, die wahrscheinlich so Aussehen, wie Sie es wollen.
Zumindest ist es nicht schlecht Aussehen wenn ich es testen wie diese:
pageRect()
die Größe der rect-mit text, ohne Rand (in Pixel)? Warum ändern Bildbreite auf "30%" macht es so krass (von der Seite)?- ja, die änderung der dpi wird in dem text und Bilder eine andere Größe relativ zur Seite, als die Größe des elements (in Pixel) gleich bleibt, während havint mehr Pixel pro Seite. - es scheint, dass die Größe Attribute in der qt-html absolut, es gibt auch keine Erwähnung von relative Bild-Größen in der Dokumentation. das ist, warum es nicht richtig Aussehen. -
pageRect()
zurück, was Sie bekommen, wenn Sie die abziehen, die Ränder vonpaperRect()
(in DevicePixel).wenn Sie wollte, um eine flexiblere Nutzung von html haben, dann könnten Sie ein QWebView (von QtWebKit wenn installiert) zum Rendern der html -, obwohl das rendering wird wahrscheinlich langsamer sein, und das könnte ein problem sein, es Sie versuchen, um die Seite zu drucken, bevor es vollständig gerendert sind.
gelöst - siehe editiert ursprüngliche Frage. nochmals vielen Dank!
InformationsquelleAutor mata