6

iTextSharp を使用して html を pdf に変換する

public static MemoryStream CreatePdfFromHtml(
        string html, List<Attachment> attachments)
    {
        MemoryStream msOutput = new MemoryStream();

        using (TextReader reader = new StringReader(html))
        using (Document document = new Document())
        {
            PdfWriter writer = PdfWriter.GetInstance(document, msOutput);
            document.Open();

            foreach (var a in attachments)
            {
                var image = iTextSharp.text.Image.GetInstance(a.File);
                document.Add(image);
            }

            XMLWorkerHelper.GetInstance().ParseXHtml(writer, document, reader);

            writer.CloseStream = false;
            document.Close();
            msOutput.Position = 0;
            return msOutput;
        }
    }

html には、このようにいくつかの埋め込み画像が含まれています。を使用して電子メールで同じ HTML が送信されるため、この方法が推奨されLinkedResourcesましたAlternateView

foreach (var a in attachments)
{
    //not production code
    html += string.Format("<img src=\"cid:{0}\"></img>", a.Id.ToString());
}

ただし、pdf が生成されると、画像 ID をhtml タグのsrc一部にリンクする方法がありません。img最終的に、pdfにはすべての画像が上に含まれ、次にHTMLが<img src...無視されます。

Paragraphs または ImageAbsolutePosition を使用していくつかの可能な解決策を読みましたが、それらは収まらないようです。

4

5 に答える 5

2

この方法を試してください:

           PdfWriter writer = PdfWriter.GetInstance(document, msOutput);
            document.Open();
            HTMLWorker worker = new HTMLWorker(document);

            Dictionary<string, object> providers = new Dictionary<string, object>();
            //Get url of the application
            string url = "http://www.url.com/" //url from which images are loaded
            //Bind image providers for the application
            providers.Add(HTMLWorker.IMG_BASEURL, url);
            //Bind the providers to the worker
            worker.SetProviders(providers);

            document.Open();
            worker.StartDocument();

            // Parse the html into the document

            worker.Parse(reader);
            worker.EndDocument();
            worker.Close();
            document.Close();
于 2013-02-05T12:22:38.157 に答える
1

前に、Itextsharp html pdf 生成で相対パスを使用すると問題があることがわかりました。前述のように、ImageAbsolutePosition を使用すると、段落を使用して画像を正しく配置する必要があるか、まだ html を使用する必要がある場合は、次のような直接パスを与える

 html += string.Format("<img src=https://www.mysite.com/"+a.Id.ToString()+".imageext"></img>");
于 2012-11-27T22:08:13.230 に答える
1

または、次のように Server.MapPath を使用して仮想パスを物理パスに変換できます。

imgPhoto.ImageUrl = Server.MapPath(imgPhoto.ImageUrl);
于 2013-02-05T12:11:43.313 に答える
-1
var logo = iTextSharp.text.Image.GetInstance(Server.MapPath("../Images/mevantage-logo.jpg"));
于 2016-09-09T05:03:03.907 に答える