Py3和PyQt5下的QPrinter边距

时间:2018-03-18 18:22:57

标签: python-3.x pyqt5 margins qprinter

我正在使用Python3和PyQt5更新我的程序,我使用QPrinter将不同的小文本(以及图像)关联到单个PDF文档中。该程序的Python2和PyQt4版本运行良好,但是通过在PyQt5(和QPrinter)下传递它我的边距有问题(之后它们太宽了);似乎setPageMargins效果不佳(至少不如QPrinter的PyQt4版本)。我写了一个小小的脚本,灵感来自我的程序中的一个:

#!/usr/bin/python
#-*- coding: utf-8 -*-

import sys, os
from PyQt5.QtPrintSupport import QPrinter
from PyQt5.QtGui import QTextDocument
from PyQt5.QtWidgets import QApplication

class Html_vers_pdf_fiche_eleve(QPrinter):
    def __init__(self, niv_de_classe, nbre_seances, titre_prog, num_seq, incitation, demande, vocabulaire, questions, texte_ref_art_1, texte_ref_art_2, texte_ref_art_3, vignette_img_src_1, vignette_img_src_2, vignette_img_src_3, marge_gauche, marge_haute, marge_droite, marge_basse, police_normaux_caracteres, police_petits_caracteres):
        super(Html_vers_pdf_fiche_eleve, self).__init__(QPrinter.HighResolution)

        # Rubriques ...
        variable_001 = "Classe :"
        variable_002 = "Date :"
        variable_003 = "Durée :"
        variable_004 = "Nom :"
        variable_005 = "Prénom :"
        variable_006 = "Titre de la progression :"
        variable_007 = "Séquence n° :"
        variable_008 = "Incitation :"
        variable_009 = "Demande :"
        variable_010 = "Vocabulaire :"
        variable_011 = "Questions (répondre derrière cette feuille) EVENTUELLEMENT ECRIRE UN COMMENTAIRE :"
        variable_012 = ''
        variable_014 = "Travaux d'artistes (références) :"
        variable_015 = "Les élèves, évaluez vontre travail en utilisant les smileys juste en dessous de Eval Elève"
        variable_016 = "Eval Elève"
        variable_017 = "Evaluation Professeur"
        variable_018 = "Ci-dessous se trouvent les critères d'évaluation des compétences travaillées en arts plastiques"

        # HTML ; écriture de l'entête
        html_entete = '''<html><head><title></title>'''+'''\n'''+'''<style type="text/css">'''+'''\n'''+'''table { border-style:solid;border-width:1.3px;border-color:#3c3c3c;font-size:'''+str(police_normaux_caracteres)+'''pt;font-family: "DejaVu Sans, sans-serif" }'''+'''\n'''+'''</style>'''+'''\n'''+'''</head>'''+'''\n'''+'''<body>'''+'''\n'''

        # HTML ; écriture du niveau de classe, de la date et de la durée
        html_tab_ligne_0 = '''<table width="100%" cellpadding="3"
        cellspacing="0.5">'''+'''\n'''+'''<tr>'''+'''\n'''+'''<td width="22%"><p><b>'''+str(variable_001)+''' '''+str(niv_de_classe)+'''ème</b></p></td>'''+'''\n'''+'''<td width="35%"><p><b>'''+str(variable_002)+'''</b></p></td>'''+'''\n'''+'''<td width="43%"><p><b>'''+str(variable_003)+''' '''+nbre_seances+'''</b></p></td>'''+'''\n'''+'''</tr>'''+'''\n'''+'''</table>'''+'''\n'''

        # HTML ; écriture du nom et du prénom
        html_tab_ligne_1 = '''<table width="100%" cellpadding="3"
        cellspacing="0.5">'''+'''\n'''+'''<tr>'''+'''\n'''+'''<td width="50%"><p><b>'''+str(variable_004)+'''</b></p></td>'''+'''\n'''+'''<td width="50%"><p><b>'''+str(variable_005)+'''</b></p></td>'''+'''\n'''+'''</tr>'''+'''\n'''+'''</table>'''+'''\n'''

        # HTML ; écriture du titre de la progression et du numéro de la séquence
        html_tab_ligne_2 = '''<table width="100%" cellpadding="3"
        cellspacing="0.6">'''+'''\n'''+'''<tr>'''+'''\n'''+'''<td width="83%"><p><b><u>'''+str(variable_006)+'''</u>'''+''' '''+titre_prog+'''</b></p></td>'''+'''\n'''+'''<td width="17%"><p><u><b>'''+str(variable_007)+'''</u>'''+''' <b>'''+str(num_seq)+'''</b></p></td>'''+'''\n'''+'''</tr>'''+'''\n'''+'''</table>'''+'''\n'''

        # HTML ; écriture de l'incitation
        html_tab_ligne_3 = '''<table width="100%" cellpadding="3"
        cellspacing="0.5">'''+'''\n'''+'''<tr>'''+'''\n'''+'''<td width="100%" bgcolor="#e1dede"><p><b><u>'''+str(variable_008)+'''</u>'''+''' '''+incitation+'''</b></p></td>'''+'''\n'''+'''</tr>'''+'''\n'''+'''</table>'''+'''\n'''

        # HTML ; écriture de la demande
        html_tab_ligne_4 = '''<table width="100%" cellpadding="3"
        cellspacing="0.6">'''+'''\n'''+'''<tr>'''+'''\n'''+'''<td width="100%" bgcolor="#e1dede"><p><b><u>'''+str(variable_009)+'''</u></b>'''+''' '''+demande+'''</p></td>'''+'''\n'''+'''</tr>'''+'''\n'''+'''</table>'''+'''\n'''

        # HTML ; écriture de l'entête de la liste des mots de vocabulaire
        html_tab_ligne_5 = '''<table width="100%" cellpadding="3"
        cellspacing="0.5" bgcolor="#cccccc">'''+'''\n'''+'''<tr>'''+'''\n'''+'''<td width="100%"><p><b><u>'''+str(variable_010)+'''</u></b></p></td>'''+'''\n'''+'''</tr>'''+'''\n'''+'''</table>'''+'''\n'''

        # HTML ; écriture de la liste des mots de vocabulaire
        html_tab_ligne_6 = '''<table width="100%" cellpadding="3"
        cellspacing="0.5">'''+'''\n'''+'''<tr>'''+'''\n'''+'''<td width="100%"><p>'''+vocabulaire+'''</p></td>'''+'''\n'''+'''</tr>'''+'''\n'''+'''</table>'''+'''\n'''

        # HTML ; écriture de l'entête des questions posées aux élèves
        html_tab_ligne_7 = '''<table width="100%" cellpadding="3"
        cellspacing="0.5" bgcolor="#cccccc">'''+'''\n'''+'''<tr>'''+'''\n'''+'''<td width="100%"><p><u><b>'''+str(variable_011)+'''</b></u></p></td>'''+'''\n'''+'''</tr>'''+'''\n'''+'''</table>'''+'''\n'''

        # HTML ; écriture des questions posées aux élèves
        html_tab_ligne_8 = '''<table width="100%" cellpadding="3"
        cellspacing="0.5">'''+'''\n'''+'''<tr>'''+'''\n'''+'''<td width="100%"><p><b>'''+questions+'''</b></p></td>'''+'''\n'''+'''</tr>'''+'''\n'''+'''</table>'''+'''\n'''

        # HTML ; écriture de l'entête Travaux d'artistes (références)
        html_tab_ligne_9 = '''<table width="100%" cellpadding="3"
        cellspacing="0.5" bgcolor="#cccccc">'''+'''\n'''+'''<tr>'''+'''\n'''+'''<td width="100%"><p><u><b>'''+str(variable_014)+'''</b></u></p></td>'''+'''\n'''+'''</tr>'''+'''\n'''+'''</table>'''+'''\n'''
        #html_tab_ligne_9 = html_tab_ligne_9.decode('utf-8')

        # HTML ; écriture du nom de l'artiste, de l'oeuvre, d'un résumé et des vignettes correspondantes
        html_tab_ligne_10 = '''<table width="100%" cellpadding="3"
        cellspacing="0.5">'''+'''\n'''+'''<tr>'''+'''\n'''+'''<td width="33%"><font color="#000000" size="'''+str(police_petits_caracteres)+'''" family="DejaVu Sans, sans-serif"><b>'''+texte_ref_art_1+'''</b></font><br />'''+'''<div align="center">'''+vignette_img_src_1+'''</div><p />'''+'''</td>'''+'''\n'''+'''<td width="33%"><font color="#000000" size="'''+str(police_petits_caracteres)+'''" family="DejaVu Sans, sans-serif"><b>'''+texte_ref_art_2+'''</b></font><br />'''+'''<div align="center">'''+vignette_img_src_2+'''</div><p />'''+'''</td>'''+'''\n'''+'''<td width="34%"><font color="#000000" size="'''+str(police_petits_caracteres)+'''" family="DejaVu Sans, sans-serif"><b>'''+texte_ref_art_3+'''</b></font><br />'''+'''<div align="center">'''+vignette_img_src_3+'''</div><p />'''+'''</td>'''+'''\n'''+'''</tr>'''+'''\n'''+'''</table>'''+'''\n'''

        # HTML ; écriture de la fin de la page
        html_body_html_final = '''</body></html>'''

        #
        self.doc = QTextDocument()

        # Ecriture de la syntaxe HTML finale
        self.doc.setHtml(html_entete + html_tab_ligne_0 + html_tab_ligne_1 + html_tab_ligne_2 + html_tab_ligne_3 + html_tab_ligne_4 + html_tab_ligne_5 + html_tab_ligne_6 + html_tab_ligne_7 + html_tab_ligne_8 + html_tab_ligne_9 + html_tab_ligne_10 + html_body_html_final)

        # Ecriture du fichier PDF par QPrinter
        self.printer = QPrinter(QPrinter.HighResolution)
        self.printer.setOutputFormat(QPrinter.PdfFormat)
        self.printer.setOrientation(QPrinter.Portrait)
        self.printer.setPaperSize(QPrinter.A4)
        # La taille des marges est convertie en millimètres
        self.printer.setPageMargins(int(marge_gauche*10), int(marge_haute*10), int(marge_droite*10),  int(marge_basse*10), QPrinter.Millimeter)

        print("Le fichier pdf a été crée !")
        self.printer.setOutputFileName("test.pdf")

        # Ecriture finale du fichier PDF
        self.doc.print_(self.printer)


if __name__ == '__main__':
    app = QApplication(sys.argv)
    #############################################
    # Pictures (3 pictures)
    img_ref_art_1 = os.path.expanduser('~')+os.sep+"college/cours/Cours_Travaux_a_faire__COLLEGE_NOUVEAUX_PROGRAMMES/Niveau_3eme_cycle_4/sequence_eleve/tom_wesselmann_still_life_20_vue_01.jpg"
    img_ref_art_2 = os.path.expanduser('~')+os.sep+"college/cours/Cours_Travaux_a_faire__COLLEGE_NOUVEAUX_PROGRAMMES/Niveau_3eme_cycle_4/sequence_eleve/georges_melies_le_voyage_ds_la_lune_1902.png"
    img_ref_art_3 = os.path.expanduser('~')+os.sep+"college/cours/Cours_Travaux_a_faire__COLLEGE_NOUVEAUX_PROGRAMMES/Niveau_3eme_cycle_4/sequence_eleve/louise_nevelson_sky_cathedral_bois_peint_en_noir_1958.png"
    # (Réglages) Valeurs des marges
    marge_gauche = 0.00 # marge en cm
    marge_droite = 0.00 # marge en cm
    marge_haute = 0.00 # marge en cm
    marge_basse = 0.00 # marge en cm
    # (Réglages) Taille de la police
    # ------------------------------------------
    # Texte partie générale (taille de la police)
    taille_police_texte_general = 8 # (valeurs entre 6 et 10, 8 par défaut)
    # Texte travaux d'artistes et évaluation (taille de la police)
    taille_police_trav_artist = 2 # (valeurs 1 ou 2, 2 par défaut)
    liste_vocab = ['<b><u>Mot de vocabulaire 1 :</u></b> La définition du mot de vocabulaire 1 ... '+'bla bla blablablabla '*10+'<br />', '<b><u>Mot de vocabulaire 2 :</u></b> La définition du mot de vocabulaire 2.<br />', '<b><u>Mot de vocabulaire 3 :</u></b> La définition du mot de vocabulaire 3 ...'+'bla bla blablablabla '*14+'<br />', '<b><u>Mot de vocabulaire 4 :</u></b> La définition du mot de vocabulaire 4 ...'+'bla bla blablablabla '*17+'<br />', '<b><u>Mot de vocabulaire 5 :</u></b> La définition du mot de vocabulaire 5.<br />', '<b><u>Mot de vocabulaire 6 :</u></b> La définition du mot de vocabulaire 6.<br />', '<b><u>Mot de vocabulaire 7 :</u></b> La définition du mot de vocabulaire 7 ...'+'bla bla blablablabla '*5+'<br />', '<b><u>Mot de vocabulaire 8 :</u></b> La définition du mot de vocabulaire 8.']
    liste_questions = ["1) Est-ce que QPrinter est intéressant ?, ... oui en fait.<br />", "2) Est-ce que c'est facile à manipuler ?, ... oui quand on a compris comment ça fonctionne.<br />", "3) Est-ce que QPrinter est pratique ?, ... oui oui !, dans mon cas pour faire quelque chose en full Python, sans devoir appeler (et embarquer) un programme tiers."]
    liste_textes_art = ['''* Tom Wesselmann, "Still Life 20" (1962). Résumé du contexte de l'oeuvre ... '''+"bla bla blablablabla "*16, '''* Georges Meliès, "Le voyage dans la lune" (1902). Résumé du contexte de l'oeuvre ...'''+"bla bla blablablabla "*18, '''* Louise Nevelson, "Sky cathedral" (1958) ... bois peint en noir ...'''+"bla bla blablablabla "*10]
    liste_img_src_ref_art = ['''<img src="'''+img_ref_art_1+'''"'''+''' width="150" height="146" />''', '''<img src="'''+img_ref_art_2+'''"'''+''' width="150" height="100" />''', '''<img src="'''+img_ref_art_3+'''"'''+''' width="150" height="109" />''']
    #############################################
    # Appel de la classe
    Html_vers_pdf_fiche_eleve(3, "2 à 3 séances", "&quot; Une progression avec un titre &quot;", 1, "&quot; Une incitation qui n'en dit pas trop ! &quot;", "La demande est faite pour faire en sorte que l'élève comprenne un peu plus ce qu'il y a à faire mais en même temps cette demande ne lui donne pas trop de pistes de travail afin que la situation problème (énoncée par l'incitation) soit tout de même présente."+" Blabla blablabla "+"blablabla blabla"*32, ''.join(liste_vocab), ''.join(liste_questions), liste_textes_art[0], liste_textes_art[1], liste_textes_art[2], liste_img_src_ref_art[0], liste_img_src_ref_art[1], liste_img_src_ref_art[2], marge_gauche, marge_haute, marge_droite, marge_basse, taille_police_texte_general, taille_police_trav_artist)

输出:

screenshot

也许这是这个级别的PyQt5错误,或者在保证金管理中是否改变了使用QPrinter的语法?

我的Python版本:3.4.3和我的PyQt5版本:5.2.1。

你能帮助我吗?

0 个答案:

没有答案