web-dev-qa-db-fra.com

Produire PDF basé sur le code HTML (iTextSharp, PDFSharp?)

Est-ce que la bibliothèque PDFSharp peut - comme iTextSharp - générer des PDF fichiers * prend en compte le formatage HTML *? (gras (fort), espacement (br), etc.)

Auparavant, j'utilisais iTextSharp et je le manipulais grossièrement (code ci-dessous):

 string encodingMetaTag = "<meta http-equiv=\"Content-Type\" content=\"text/html; charset=utf-8\" />";
 string htmlCode = "text <div> <b> bold </ b> or <u> underlined </ u> <div/>";

 var sr = new StringReader (encodingMetaTag + htmlCode);
 var pdfDoc = new Document (PageSize.A4, 10f, 10f, 10f, 0f);
 var = new HTMLWorker htmlparser (pdfDoc);
 PdfWriter.GetInstance (pdfDoc, HttpContext.Current.Response.OutputStream);
 pdfDoc.Open ();
 htmlparser.Parse (sr);
 pdfDoc.Close ();

incorporé dans le formulaire HTML approprié à un document PDF traité avec l'objet de classe HTMLWorker .. alors, qu'en est-il de PDFSharp?La solution PDFSharp est-elle similaire?

16
TomashUfx

Je sais que cette question est ancienne, mais voici une façon propre de le faire ...

Vous pouvez utiliser HtmlRenderer combiné avec PDFSharp pour ce faire:

Bitmap bitmap = new Bitmap(1200, 1800);
Graphics g = Graphics.FromImage(bitmap);
HtmlRenderer.HtmlContainer c = new HtmlRenderer.HtmlContainer();
c.SetHtml("<html><body style='font-size:20px'>Whatever</body></html>");
c.PerformPaint(g);
PdfDocument doc = new PdfDocument();
PdfPage page = new PdfPage();
XImage img = XImage.FromGdiPlusImage(bitmap);
doc.Pages.Add(page);
XGraphics xgr = XGraphics.FromPdfPage(doc.Pages[0]);
xgr.DrawImage(img, 0, 0);
doc.Save(@"C:\test.pdf");
doc.Close();

Certaines personnes signalent que l'image finale est un peu floue, apparemment à cause de l'anti-aliasing automatique. Voici un message sur comment résoudre ce problème: http://forum.pdfsharp.com/viewtopic.php?f=2&t=1811&start=0

14
Diego

Non, PDFsharp n'inclut pas actuellement de code pour analyser les fichiers HTML.

5
Vive la déraison

Ancienne question, mais aucune des réponses ci-dessus n’a fonctionné pour moi. Ensuite, j'ai essayé la méthode generatepdf de HtmlRenderer en combinaison de pdfsharp . J'espère que cela vous aidera: Vous devez installer un nuget nommé HtmlRenderer.pdfsharp.

var doc = TheArtOfDev.HtmlRenderer.PdfSharp.PdfGenerator.GeneratePdf("Your html in a string",PageSize.A4);
  PdfPage page = new PdfPage();
  XImage img = XImage.FromGdiPlusImage(bitmap);
  doc.Pages.Add(page);
  XGraphics xgr = XGraphics.FromPdfPage(doc.Pages[0]);
  xgr.DrawImage(img, 0, 0);
  doc.Save(Server.MapPath("test.pdf"));
  doc.Close();
3
Rohit Arora

Dans un projet que j'ai développé l'année dernière, j'ai utilisé wkhtmltopdf ( http://wkhtmltopdf.org/ ) pour générer un fichier pdf à partir de HTML, puis j'ai lu le fichier et renvoyé le à l'utilisateur.

Cela fonctionne bien pour moi et cela pourrait être une idée pour vous ...

3
wahrheit

Je sais que la question est très ancienne, mais je me rends compte que personne ne dit en réalité de méthode précise pour convertir un code HTML en fichier PDF. Sur la base de mon test, j'ai découvert que vous aviez besoin du code suivant pour réussir.

Bitmap bitmap = new Bitmap(790, 1800);
Graphics g = Graphics.FromImage(bitmap);
XGraphics xg = XGraphics.FromGraphics(g, new XSize(bitmap.Width, bitmap.Height));
TheArtOfDev.HtmlRenderer.PdfSharp.HtmlContainer c = new TheArtOfDev.HtmlRenderer.PdfSharp.HtmlContainer();
c.SetHtml("Your html in a string here");

PdfDocument pdf = new PdfDocument();
PdfPage page = new PdfPage();
XImage img = XImage.FromGdiPlusImage(bitmap);
pdf.Pages.Add(page);
XGraphics xgr = XGraphics.FromPdfPage(pdf.Pages[0]);
c.PerformLayout(xgr);
c.PerformPaint(xgr);
xgr.DrawImage(img, 0, 0);
pdf.Save("test.pdf");

Il y a une autre façon de faire mais vous pourriez avoir des problèmes avec la taille.

PdfDocument pdf = PdfGenerator.GeneratePdf(text, PageSize.A4);
pdf.Save("test.pdf");
2
Ezequiel

Si vous avez besoin d'une analyse simple dans votre application et que vous avez le contrôle sur l'entrée HTML, vous pouvez écrire votre propre bibliothèque pour cela.

J'en ai créé un dans l'un de mes projets, mais malheureusement, il ne peut pas encore être partagé en raison de fonctionnalités personnalisées liées à une application spécifique.

Fondamentalement, vous devez suivre la logique suivante pour implémenter du HTML au PDF de base:

  1. Analyse HTML simple des balises
  2. Créez une logique pour reconnaître les styles courants (gras, italique, gauche, centre, etc.) et créez une classe PDFSharp avec ces propriétés et affectez-la à Para, qui sera ajoutée en tant qu'attributs de style au format HTML
  3. Gérer les balises de tableau et ajouter des lignes et des colonnes au format PDF
  4. Balises de paragraphe pour ajouter des paragraphes.

J'ai donné un très large aperçu de la logique ici basée sur ma mise en œuvre.

Vous avez peut-être une bien meilleure idée :)

Vous pouvez également vous référer à: Écrire le contenu du tableau HTML dans PDF doc en utilisant iTextSharp dans asp.net

1
Tejasvi Hegde

HTML Renderer for PDF utilisant PdfSharp peut générer un PDF à partir d'un fichier HTML 

  1. en tant qu'image, ou 
  2. comme texte

avant d'insérer au format PDF.

Pour rendre une image, veuillez vous référer au code de Diego answer.

Pour rendre le texte, référez-vous au code ci-dessous:

static void Main(string[] args)
{
    string html = File.ReadAllText(@"C:\Temp\Test.html");
    PdfDocument pdf = PdfGenerator.GeneratePdf(html, PageSize.A4, 20, null, OnStylesheetLoad, OnImageLoadPdfSharp);
    pdf.Save(@"C:\Temp\Test.pdf");
}

public static void OnImageLoadPdfSharp(object sender, HtmlImageLoadEventArgs e)
{
    var imgObj = Image.FromFile(@"C:\Temp\Test.png");
    e.Callback(XImage.FromGdiPlusImage(imgObj));    
}

public static void OnStylesheetLoad(object sender, HtmlStylesheetLoadEventArgs e)
{
    e.SetStyleSheet = @"h1, h2, h3 { color: navy; font-weight:normal; }";
}

Code HTML

<html>
    <head>
        <title></title>
        <link rel="Stylesheet" href="StyleSheet" />      
    </head>
    <body>
        <h1>Images
            <img src="ImageIcon" />
        </h1>
    </body>
</html>
1
sanme98