2013-01-17 2 views
2

J'ai utilisé reportlab pdfgen pour créer des documents PDF dynamiques pour l'impression. Cela fonctionne très bien depuis plusieurs années.Reportlab pdfgen prise en charge des polices TrueType

Nous organisons une levée de fonds et nous souhaitons générer des reçus PDF avec la police «thème» que nous utilisons (en particulier talldeco.ttf).

J'ai mis la police aucun problème en utilisant les éléments suivants:

 from reportlab.pdfbase import pdfmetrics 
     from reportlab.pdfbase.ttfonts import TTFont 
     ttfFile = "/usr/share/fonts/truetype/ttf-tall-deco/TALLDECO.TTF" 
     pdfmetrics.registerFont(TTFont("TallDeco", ttfFile)) 
     p.setFont("TallDeco", 18) # Was Times-Bold... 

Maintenant vient la question: une partie du texte doit être en gras et en italique, et le TallDeco vient juste avec 1 fichier (contrairement à certains les autres polices). Je peux mettre en gras et en italique du texte dans cette police dans openoffice.

Selon le guide de l'utilisateur de reportlab (http://www.reportlab.com/software/opensource/rl-toolkit/guide/) page 53, il devrait être possible et ils montrent du code et les résultats, mais notre logiciel utilise des appels drawString au lieu de paragraphes. Une application de test basée sur l'exemple noté ci-dessus:

 from reportlab.pdfbase import pdfmetrics 
     from reportlab.pdfbase.ttfonts import TTFont 
     from reportlab.pdfbase.pdfmetrics import registerFontFamily 
     ttfFile = "/usr/share/fonts/truetype/ttf-tall-deco/TALLDECO.TTF" 
     pdfmetrics.registerFont(TTFont("TallDeco", ttfFile)) 
     registerFontFamily('TallDeco',normal='TallDeco',bold='TallDeco-Bold',italic='TallDeco-Italic',boldItalic='TallDeco-BoldItalic') 
     p.setFont("TallDeco-Bold", 18) # Was Times-Bold... 

Donne juste une erreur de clé sur 'TallDeco-Bold'.

Des suggestions?

Répondre

-2

Les polices bold, italic et boldItalic doivent être définies.

pdfmetrics.registerFont(TTFont("TallDeco-Bold", ttfFile)) 
pdfmetrics.registerFont(TTFont("TallDeco-Italic", ttfFile)) 
pdfmetrics.registerFont(TTFont("TallDeco-BoldItalic", ttfFile)) 

Mais parce qu'ils pointent tous à la même ttfFile la sortie tous ressembler à la valeur par défaut TallDeco dire pas gras ou en italique

+0

Cela ne résout rien – Alvaro

+0

Ce n'est pas une solution et dépendent de fichier TTF, il pourrait même finir avec des erreurs comme ' redéfinition de l'objet nommé: 'toUnicodeCMap: AAAAAA + Font'' – DimmuR

3

TTFont a un paramètre subfontIndex.

Les œuvres suivantes pour moi (en utilisant reportlab 3.0 sur OS X):

menlo_path = "/System/Library/Fonts/Menlo.ttc" 
pdfmetrics.registerFont(ttfonts.TTFont("Menlo", menlo_path, 
             subfontIndex=0)) 
pdfmetrics.registerFont(ttfonts.TTFont("Menlo-Bold", menlo_path, 
             subfontIndex=1)) 
pdfmetrics.registerFont(ttfonts.TTFont("Menlo-Italic", menlo_path, 
             subfontIndex=2)) 
pdfmetrics.registerFont(ttfonts.TTFont("Menlo-BoldItalic", menlo_path, 
             subfontIndex=3)) 
pdfmetrics.registerFontFamily("Menlo", normal="Menlo", bold="Menlo-Bold", 
           italic="Menlo-Italic", 
           boldItalic="Menlo-boldItalic") 
+0

Même s'il ne résout pas la question d'origine, cette méthode a fonctionné pour moi lors de l'utilisation de Consolas qui inclut les variations de style en tant que fichiers séparés. – Todd

Questions connexes