Comment définir QTextDocument marges et d'autres propriétés (setHTML, imprimer au format pdf)?
J'ai le texte suivant certificate
classe pour la production de document pdf de certaines images et de données. Après le réglage de sources d'image, je l'appelle generate()
fonction et obtenir de test.pdf fichier de sortie. Le document est créé sur la base QTextDocument
classe à l'aide de setHtml(html)
méthode.
Le problème est que j'ai d'énormes espaces blancs autour du document, alors que je veux le titre de "RAPPORT" avec l'image du logo pour être sur le haut de la page. Je tiens également à ajouter de la bordure inférieure de la table, mais ce que je comprends, il n'est pas pris en charge par Qt (HTML pris en charge sous-ensemble).
Python3 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)
Je n'ai jamais beaucoup utilisé le html avant et n'a jamais travaillé avec QTextDocument, et il serait souhaitable que des conseils sur la façon de contrôler les marges du document et les propriétés de la table.
Autres biens liés à la je veux de contrôle de la décision - je utiliser les pixels taille de l'image et de la nécessité de connaître la page et la marge de tailles en pixels.
ÉDITÉ: La question est presque répondu par @mata. Je peux maintenant les marges et la résolution, mais ne comprends pas comment à l'image de contrôle et les tailles de police. E. g. si j'ai besoin d'une image est toujours de 50 mm de large, et d'en-tête html et texte principal tailles de police sont visuellement le même: comment la mettre en œuvre?
EDITED2: La dernière partie est résolu aussi. Voici code modifié par @mata, il donne le même résultat pour un dpi
valeur:
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)
...
Vous devez vous connecter pour publier un commentaire.
Vous pouvez spécifier la résolution que vous souhaitez utiliser dans le constructeur lorsque vous créez le QPrinter.
Puis, après vous avez défini le pagesize, vous pouvez utiliser
width
,height
etresolution
sur l'imprimante à fint que les valeurs, voici ce que j'ai pour Lettre (dpi-les valeurs peuvent être différentes, elles dépendent de l'écran ou de l'imprimante):Vous pouvez également régler le dpi directement à l'aide de
setResolution
.La taille donnée par la largeur et la hauteur de la taille de la page (la même que pageRect().size()), qui ist pas la même que la taille de papier - que la page a aussi des marges, que vous pouvez définir comme ceci:
cela définit les marges gauche et droite de 12 mm, supérieure à 16 mm et inférieure à 20 mm - juste pour exemple, si vous voulez moins d'espace blanc, vous pouvez évidemment utiliser des valeurs plus petites.
Et vous devez définir la taille du document à la taille de la taille:
comme vous l'avez remarqué vous-même, le sous-ensemble de l'html et du css permis est très limitée, spécialement pour la mise en forme de tableaux. Mais au lieu d'utiliser une limite inférieure sur la table que vous pouvez simplement utiliser un h, qui sera probablement regarder comme vous voulez.
Au moins, il n'a pas l'air mal si je test comme ceci:
pageRect()
la taille de la rect avec du texte à l'exclusion des marges (en pixels)? Pourquoi en changeant la largeur de l'image de "30%" rend tellement bizarre (sur la page)?pageRect()
renvoie ce que vous obtenez lorsque vous soustrayez les marges depaperRect()
(dans DevicePixel).