Comment définir une police dans reportlab Canvas en python?

J'utilise reportlab pour créer des fichiers PDF. Lorsque j'essaie de définir une police en utilisant la méthode suivante, j'obtiens un KeyError:

pdf = Canvas('test.pdf')
pdf.setFont('Tahoma', 16)

, Mais si j'utilise 'Courier' au lieu de 'Tahoma', il n'est pas un problème. Comment puis-je utiliser Tahoma?

28
demandé sur Jason Sundram 2011-02-04 18:45:17

3 réponses

Peut-être Tahoma est une police TrueType, et vous devez d'abord l'enregistrer. Selon le guide de L'utilisateur de ReportLab, vous devez faire ceci:

from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.ttfonts import TTFont

pdfmetrics.registerFont(TTFont('Vera', 'Vera.ttf'))
pdfmetrics.registerFont(TTFont('VeraBd', 'VeraBd.ttf'))
pdfmetrics.registerFont(TTFont('VeraIt', 'VeraIt.ttf'))
pdfmetrics.registerFont(TTFont('VeraBI', 'VeraBI.ttf'))

canvas.setFont('Vera', 32)
canvas.drawString(10, 150, "Some text encoded in UTF-8")
canvas.drawString(10, 100, "In the Vera TT Font!")

L'objet canvas a une méthode getAvailableFonts qui doit renvoyer toutes les polices actuellement enregistrées (et donc utilisables).

45
répondu Reiner Gerecke 2011-02-04 15:59:03

En ajoutant la police DejaVuSans à l'application, j'ai résolu mon problème. Voici l'extrait de code

pdfmetrics.registerFont(TTFont('DejaVuSans','DejaVuSans.ttf'))

Et utilisez UTF8 pour tout le codage.:)

0
répondu Dark Matter 2016-02-22 09:37:00

Commencez par la réponse de Reiner.

Il est parfait avec une mise en garde.

Reportlab recherche uniquement les polices dans dossiers prédéfinis :

TTFSearchPath = (
            'c:/winnt/fonts',
            'c:/windows/fonts',
            '/usr/lib/X11/fonts/TrueType/',
            '/usr/share/fonts/truetype',
            '/usr/share/fonts',             #Linux, Fedora
            '/usr/share/fonts/dejavu',      #Linux, Fedora
            '%(REPORTLAB_DIR)s/fonts',      #special
            '%(REPORTLAB_DIR)s/../fonts',   #special
            '%(REPORTLAB_DIR)s/../../fonts',#special
            '%(CWD)s/fonts',                #special
            '~/fonts',
            '~/.fonts',
            '%(XDG_DATA_HOME)s/fonts',
            '~/.local/share/fonts',
            #mac os X - from
            #http://developer.apple.com/technotes/tn/tn2024.html
            '~/Library/Fonts',
            '/Library/Fonts',
            '/Network/Library/Fonts',
            '/System/Library/Fonts',
            )

Si vous essayez d'utiliser une police ttf que vous avez téléchargée hors d'internet, et que vous souhaitez que cette police soit disponible sur tous vos serveurs, je suggère ce qui suit:

  • Ajoutez la police à votre projet dans n'importe quel répertoire. par exemple: / project_root / app / lib / reportlabs / fonts /
  • Assurez-vous que vous avez quelque chose comme BASE_DIR / ROOT_DIR dans vos paramètres:

    BASE_DIR = os.path.dirname(os.path.dirname(os.path.abspath(__file__)))
    
  • Ajoutez la ligne suivante à un fichier python qui génère un fichier pdf:

    from django.conf import settings
    rl_config.TTFSearchPath.append(str(settings.BASE_DIR) + '/app/lib/reportlabs/fonts')
    pdfmetrics.registerFont(TTFont('Copperplate', 'Copperplate-Gothic-Bold.ttf'))
    
0
répondu Pranay Majmundar 2018-09-21 20:41:01