web-dev-qa-db-ja.com

生成PDF HTMLコードに基づいて(iTextSharp、PDFSharp?)

ライブラリはPDFSharpできます-のようにiTextSharp-生成PDFファイル*HTMLフォーマットを考慮に入れます*?(太字(強い)、間隔(br)など)

以前、私はiTextSharpを使用し、そのような方法で大まかに処理しました(以下のコード):

 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 ();

PDFクラスオブジェクトを扱うドキュメントHTMLWorker..)に適切なHTMLフォームに組み込まれているため、PDFSharpPDFSharp同様のソリューションがあります

21
TomashUfx

私はこの質問が古いことを知っていますが、ここにそれを行うためのきれいな方法があります...

HtmlRendererPDFSharp と組み合わせて使用​​すると、これを実現できます。

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();

どうやら自動アンチエイリアスが原因で、最終的な画像が少しぼやけていると報告する人もいます。これを修正する方法についての投稿メッセージは次のとおりです: http://forum.pdfsharp.com/viewtopic.php?f=2&t=1811&start=

17
Diego

いいえ、現在PDFsharpにはHTMLファイルを解析するためのコードは含まれていません。

古い質問ですが、上記のどれもうまくいきませんでした。次に、_ HtmlRenderergeneratepdfメソッドを pdfsharp と組み合わせて試しました。それが役に立てば幸い:HtmlRenderer.pdfsharpという名前のnugetをインストールする必要があります。

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

昨年開発したプロジェクトで、wkhtmltopdf( http://wkhtmltopdf.org/ )を使用してhtmlからpdfを生成し、ファイルを読み取ってユーザーに返しました。

それは私にとってはうまくいき、あなたにとってはアイディアかもしれません...

3
wahrheit

私は本当に古い質問があることを知っていますが、HTMLをPDFにレンダリングする正確な方法を実際に言う人がいないことを理解しています。私のテストに基づいて、正常に実行するには次のコードが必要であることがわかりました。

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");

別の方法がありますが、サイズに問題がある可能性があります。

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

特定のHTML文字列のみをPDFに書き込み、残りは不要にする場合は、HtmlContainer from TheArtOfDev HtmlRenderer を使用できます。このスニペットでは、 V 1.5.1

using PdfSharp.Pdf;
using PdfSharp;
using PdfSharp.Drawing;
using TheArtOfDev.HtmlRenderer.PdfSharp;

//create a pdf document
using (PdfDocument doc = new PdfDocument())
{
    doc.Info.Title = "StackOverflow Demo PDF";

    //add a page
    PdfPage page = doc.AddPage();
    page.Size = PageSize.A4;

    //fonts and styles
    XFont font = new XFont("Arial", 10, XFontStyle.Regular);
    XSolidBrush brush = new XSolidBrush(XColor.FromArgb(0, 0, 0));

    using (XGraphics gfx = XGraphics.FromPdfPage(page))
    {
        //write a normal string
        gfx.DrawString("A normal string written to the PDF.", font, brush, new XRect(15, 15, page.Width, page.Height), XStringFormats.TopLeft);

        //write the html string to the pdf
        using (var container = new HtmlContainer())
        {
            var pageSize = new XSize(page.Width, page.Height);

            container.Location = new XPoint(15,  45);
            container.MaxSize = pageSize;
            container.PageSize = pageSize;
            container.SetHtml("This is a <b>HTML</b> string <u>written</u> to the <font color=\"red\">PDF</font>.<br><br><a href=\"http://www.google.nl\">www.google.nl</a>");

            using (var measure = XGraphics.CreateMeasureContext(pageSize, XGraphicsUnit.Point, XPageDirection.Downwards))
            {
                container.PerformLayout(measure);
            }

            gfx.IntersectClip(new XRect(0, 0, page.Width, page.Height));

            container.PerformPaint(gfx);
        }
    }

    //write the pdf to a byte array to serve as download, attach to an email etc.
    byte[] bin;
    using (MemoryStream stream = new MemoryStream())
    {
        doc.Save(stream, false);
        bin = stream.ToArray();
    }
}
2
VDWWD

アプリで簡単な解析が必要で、HTML入力を制御できる場合は、独自のライブラリを作成できます。

プロジェクトの1つで作成しましたが、特定のアプリケーションに関連するカスタム機能のため、残念ながらまだ共有できません。

基本的に、基本的なHTMLからPDFを実装するには、次のロジックに従う必要があります。

  1. タグの単純なHTML解析
  2. 太字、斜体、左、中央などの一般的なスタイルを認識するロジックを作成し、これらのプロパティを使用してPDFSharpクラスを作成し、HTMLのスタイル属性として追加されるParaに割り当てます。
  3. テーブルタグを処理し、PDFに行と列を追加する
  4. 段落を追加する段落タグ。

ここでは、実装に基づいてロジックの非常に広範な概要を説明しました。

あなたははるかに良いアイデアを持っているかもしれません:)

参照することもできます: HTMLテーブルのコンテンツをPDF asp.netでiTextSharpを使用してドキュメント化

1
Tejasvi Hegde

HTMLレンダラーPDF PdfSharpを使用 は、HTMLからPDFを生成できます

  1. 画像として、または
  2. テキストとして

pDFに挿入する前。

画像としてレンダリングするには、Diego回答のコードを参照してください。

テキストとしてレンダリングするには、以下のコードを参照してください:

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; }";
}

HTMLコード

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

this について聞いたことがありますか。私は非常に遅く答えるかもしれませんが、私はそれが役立つと思いました。それは非常にシンプルでうまく機能します。

var htmlContent = String.Format("<body>Hello world: {0}</body>", 
        DateTime.Now);
var htmlToPdf = new NReco.PdfGenerator.HtmlToPdfConverter();
var pdfBytes = htmlToPdf.GeneratePdf(htmlContent);

編集:HTMLコードをPDF 'PDFSharp'を使用して変換することについて質問があり、そのことがわかりましたPDFSharpはそれを行うことができません。それからNRecoについて知り、それが私のために働いたので、それが私のような誰かを助けるかもしれないと感じました。

0
Murali Krishna