web-dev-qa-db-fra.com

Utilisation de polices dans le système avec iTextSharp

Je veux utiliser iTextSharp pour écrire du texte. J'utilise cette méthode:

var font = BaseFont.CreateFont(BaseFont.TIMES_BOLD, BaseFont.WINANSI, BaseFont.EMBEDDED);

Ma question est la suivante: iTextSharp prend-il en charge toutes les polices du répertoire de polices système?

Supposons que j'ai une police appelée "mycoolfont" sélectionnée par l'utilisateur dans la boîte de dialogue de sélection de police. Puis-je créer une nouvelle police iTextSharp comme celle-ci?

var font = BaseFont.CreateFont("mycoolfont", BaseFont.WINANSI, BaseFont.EMBEDDED);
overContent.SetFontAndSize(font, fontSize);

MISE À JOUR:

J'ai essayé var font = BaseFont.CreateFont("Verdana", BaseFont.WINANSI, BaseFont.EMBEDDED); mais j'ai eu l'erreur "Verdana" n'est pas reconnu par itextsharp

12
techno

Vous devez d'abord enregistrer la police, puis la récupérer à partir de FontFactory (et ne pas la créer à chaque fois):

public static iTextSharp.text.Font GetTahoma()
{
    var fontName = "Tahoma";
    if (!FontFactory.IsRegistered(fontName))
    {
         var fontPath = Environment.GetEnvironmentVariable("SystemRoot") + "\\fonts\\tahoma.ttf";
         FontFactory.Register(fontPath);
    }
    return FontFactory.GetFont(fontName, BaseFont.IDENTITY_H, BaseFont.EMBEDDED); 
}
19
VahidN

J'ai fini par combiner les 2 réponses ici dans cette méthode:

public static Font GetFont(string fontName, string filename)
{
    if (!FontFactory.IsRegistered(fontName))
    {
        var fontPath = Environment.GetEnvironmentVariable("SystemRoot") + "\\fonts\\" + filename;
        FontFactory.Register(fontPath);
    }
    return FontFactory.GetFont(fontName, BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
}

Que j'utilise ensuite dans mon code comme ceci:

writer.DirectContent.SetFontAndSize(GetFont("Franklin Gothic Medium Cond", "FRAMDCN.TTF").BaseFont, 24f);

Sous Windows, vous pouvez trouver le nom de fichier de la police dans la feuille de propriétés de la police:

enter image description here

J'ai également constaté que vous devez utiliser le nom exact de la police dans l'onglet Détails:

enter image description here

10
Matthew Lock

Je poste ceci car quelqu'un d'autre pourrait trouver cela utile. J'ai eu un problème similaire lorsque j'ai exécuté mon code sur le serveur. La raison étant itextsharp n'a pas pu trouver le style de police dans OS. Mon PDF a montré un style de police aléatoire quand il n'a pas pu trouver la police (erreur de jetée). J'ai copié les fichiers de police requis (.ttf) dans mon dossier bin de projet et utilisé le code suivant.

public static BaseFont GetFont(string fontName)
{
    return BaseFont.CreateFont(HttpContext.Current.Server.MapPath("~/Bin/" +   fontName + ".ttf"), BaseFont.CP1252, BaseFont.EMBEDDED);
}

Ici, je reçois la police souhaitée

`BaseFont sm = GetFont("comic"); //The fontName here should exactly match` the` file name in bin folder
5

Dans le cas où cette variation aide quelqu'un. Ceci est une variation de la réponse de VahidN.

Dans cette solution, vous pouvez utiliser (au moins sur notre système de fichiers) les polices du dossier fonts de Visual Studio. Cela crée un projet Visual Studio plus autonome (et potentiellement plus "portable"). Donc, plutôt que d'essayer de trouver le dossier des polices sur votre système d'exploitation Windows ... qui pourrait changer la prochaine fois que Windows développera un nouveau système d'exploitation, les polices sont toutes dans votre projet.

Veuillez noter que j'ai besoin que "BaseFont.EMBEDDED" soit vrai pour mon projet particulier. Ce n'est généralement pas nécessaire pour tous les projets (voir les autres réponses sur cette page). Veuillez varier les arguments de "FontFactory.GetFont ()" selon les besoins de votre projet. Il existe de nombreuses surcharges disponibles.

Remarque: le dossier des polices du système de fichiers Windows ne doit pas changer. Mais est-il garanti de rester au même endroit dans la prochaine version de Windows? De plus, si vous chargez votre projet sur un nouvel ordinateur parce que votre disque dur est tombé en panne et que vous utilisez une sauvegarde de projet ... la police dont vous avez besoin se trouve-t-elle déjà dans le dossier des polices de votre système de fichiers Windows? Si oui, tant mieux. Sinon, vous devez aller le chercher. Pas grand-chose en général. Mais, si vous aviez lié la police de façon permanente à votre projet via cette solution, c'est un tracas de moins.

La principale modification apportée au code est:

Au lieu de 'Environment.GetEnvironmentVariable ("SystemRoot")'

Utilisez: System.Web.Hosting.HostingEnvironment.MapPath ("\")

Notez également que le fichier de police 'ttf' a été placé dans le dossier 'fonts' de mon projet: font files in fonts directory in Visual Studio Project

public static iTextSharp.text.Font GetFontAwesome()
{
string fontName = "fontawesome";
if (!FontFactory.IsRegistered(fontName))
{
var fontPath = System.Web.Hosting.HostingEnvironment.MapPath("\\") + "fonts\\fontawesome-webfont.ttf";
FontFactory.Register(fontPath, fontName);
}

var FontColour = new BaseColor(0, 0, 0); // optional... ints 0, 0, 0 are red, green, blue
int FontStyle = iTextSharp.text.Font.NORMAL;  // optional
float FontSize = iTextSharp.text.Font.DEFAULTSIZE;  // optional

return FontFactory.GetFont(fontName, BaseFont.IDENTITY_H, BaseFont.EMBEDDED, FontSize, FontStyle, FontColour );
 // last 3 arguments can be removed
}

Appelez ensuite la fonction ...

var fontawesomeFont = GetFontAwesome ();

L'utilisation de la fonction:

    Paragraph paragraph = new Paragraph();
    paragraph.Add(new Chunk("Hello world! "));
    paragraph.Add(new Chunk("\xf118", fontawesomeFont));
    paragraph.Add(new Chunk("\xf14a", fontawesomeFont));
    paragraph.Add(new Chunk("\xf0c8", fontawesomeFont));
    paragraph.Add(new Chunk("\xf046", fontawesomeFont)); 
    paragraph.Add(new Chunk("\xf096", fontawesomeFont)); 

    document.Add(paragraph);

Cette variation vous permet également de changer la couleur comme vous le souhaitez via 'new BaseColor (0, 0, 0)' ci-dessus. (Si vous le souhaitez, essayez (255,0,0) pour une police rouge.)

FYI - Spécifique à fontawesome

J'utilise les codes géniaux des cheatsheet de: https://fontawesome.com/v4.7.0/cheatsheet/

1
Michael M.