8
votes

Afficher les caractères Unicode dans la conversion de HTML en PDF

J'utilise ITextShaRP DLL pour convertir HTML en PDF.

Le HTML a des caractères unicode comme α, μ² ... Lorsque j'essaie de convertir HTML en PDF, les caractères Unicode ne sont pas affichés dans PDF.

ma fonction: xxx


0 commentaires

5 Réponses :


13
votes

Lorsque vous traitez avec des personnages UNICODE et ITEXTSTHARP, vous devez prendre soin de plusieurs choses. Le premier que vous avez déjà fait et que vous obtenez une police qui prend en charge vos personnages. La deuxième chose est que vous souhaitez réellement enregistrer la police avec iTextShaparpe de sorte que sa consciente.

string lucidaTff = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Fonts), "l_10646.ttf");
iTextSharp.text.FontFactory.Register(lucidaTff);


2 commentaires

Si le contenu HTML est comme

α, β la fonction ci-dessus ne fait pas travail.


Cela m'a aidé tellement. J'ai déjà eu une configuration de la feuille de style, donc je devais simplement définir la police dans le CSS ... Corps {Font-famille: 'Arial Unicode MS'! IMPORTANT; }



16
votes

Vous pouvez également utiliser le nouveau strack> xmlworkerhelper strong> (de la bibliothèque itextSharap.xmlworker fort>), vous devez remplacer la mise en oeuvre de FontFactory par défaut.

void GeneratePdfFromHtml()
{
  const string outputFilename = @".\Files\report.pdf";
  const string inputFilename = @".\Files\report.html";

  using (var input = new FileStream(inputFilename, FileMode.Open))
  using (var output = new FileStream(outputFilename, FileMode.Create))
  {
    CreatePdf(input, output);
  }
}

void CreatePdf(Stream htmlInput, Stream pdfOutput)
{
  using (var document = new Document(PageSize.A4, 30, 30, 30, 30))
  {
    var writer = PdfWriter.GetInstance(document, pdfOutput);
    var worker = XMLWorkerHelper.GetInstance();

    document.Open();
    worker.ParseXHtml(writer, document, htmlInput, null, Encoding.UTF8, new UnicodeFontFactory());

    document.Close();
  }    
}

public class UnicodeFontFactory : FontFactoryImp
{
    private static readonly string FontPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Fonts),
      "arialuni.ttf");

    private readonly BaseFont _baseFont;

    public UnicodeFontFactory()
    {
      _baseFont = BaseFont.CreateFont(FontPath, BaseFont.IDENTITY_H, BaseFont.EMBEDDED);

    }

    public override Font GetFont(string fontname, string encoding, bool embedded, float size, int style, BaseColor color,
      bool cached)
    {
      return new Font(_baseFont, size, style, color);
    }
}


2 commentaires

Merci mec, mais le résultat que je reçois, les lettres sont séparées les unes des autres. Il montre تست comme ت س ت


Après la mise à niveau vers 5.5.5 et utilisez le front Microsoft Yasei, cela fonctionne correctement maintenant.



-2
votes

Voici les quelques étapes pour afficher des caractères Unicode dans la conversion de HTML en PDF

  1. Créer un HTMLworker
  2. enregistre une police unicode et assignez-le
  3. Créez une feuille de style et définissez le codage sur Identity-H
  4. Attribuez la feuille de style à l'analyseur HTML

    Vérifiez ci-dessous le lien pour plus de compréhension ....



1
votes
FontFactory.FontImp = new UnicodeFontFactory();

string convertedHtml = string.Empty;
foreach (char c in htmlText)
{
     if (c < 127)  
           convertedHtml += c;
     else
           convertedHtml += "&#" + (int)c + ";";
}

List<IElement> htmlElements = XMLWorkerHelper.ParseToElementList(convertedHtml, null);

// add the IElements to the document
foreach (IElement htmlElement in htmlElements)
{                            
      document.Add(htmlElement);
}

1 commentaires

Pourriez-vous élaborer votre réponse? Peut-être expliquer pourquoi votre solution fonctionne et quel était le problème avec le code d'origine.



0
votes

Ce doit être l'un des problèmes les plus difficiles que j'ai dû comprendre à ce jour. Les réponses sur le Web, y compris le débordement de la pile contenant des informations pauvres ou obsolètes. La réponse de Gregor est très proche. Je voulais redonner à cette communauté parce que j'ai passé de nombreuses heures à atteindre cette réponse.

Voici un programme très simple que j'ai écrit en C # comme exemple pour mes propres notes. P>

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using iTextSharp.text;
using iTextSharp.text.pdf;
using iTextSharp.tool.xml;

namespace ExampleOfExportingPDF
{
    class Program
    {
        static void Main(string[] args)
        {
            //Build HTML document
            StringBuilder sb = new StringBuilder();
            sb.Append("<body>");
            sb.Append("<h1 style=\"text-align:center;\">これは日本語のテキストの例です。</h1>");
            sb.Append("</body>");

            //Create our document object
            Document Doc = new Document(PageSize.A4);


            //Create our file stream
            using (FileStream fs = new FileStream(Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "Test.pdf"), FileMode.Create, FileAccess.Write, FileShare.Read))
            {
                //Bind PDF writer to document and stream
                PdfWriter writer = PdfWriter.GetInstance(Doc, fs);

                //Open document for writing
                Doc.Open();


                //Add a page
                Doc.NewPage();

                MemoryStream msHtml = new MemoryStream(System.Text.Encoding.UTF8.GetBytes(sb.ToString()));
                XMLWorkerHelper.GetInstance().ParseXHtml(writer, Doc, msHtml, null, Encoding.UTF8, new UnicodeFontFactory());

                //Close the PDF
                Doc.Close();
            }

        }

        public class UnicodeFontFactory : FontFactoryImp
        {
            private static readonly string FontPath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Fonts),
          "arialuni.ttf");

            private readonly BaseFont _baseFont;

            public UnicodeFontFactory()
            {
                _baseFont = BaseFont.CreateFont(FontPath, BaseFont.IDENTITY_H, BaseFont.EMBEDDED);

            }

            public override Font GetFont(string fontname, string encoding, bool embedded, float size, int style, BaseColor color,
          bool cached)
            {
                return new Font(_baseFont, size, style, color);
            }
        }

    }
}


0 commentaires