c# - iTextSharp Html 到 Pdf 图像 src

标签 c# itextsharp

使用 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 以这种方式包含多个嵌入图像。此方法是首选,因为使用 LinkedResources 通过电子邮件发送相同的 HTML在AlternateView .

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

但是,当生成 pdf 时,无法将图像 ID 与 src 链接起来。 img 的一部分标签。 最终,pdf 包含顶部的所有图像,然后是带有 <img src... 的 HTML忽略。

我已经阅读了几种使用 Paragraphs 或 ImageAbsolutePosition 的可能解决方案,但它们似乎不适合。

最佳答案

this site ,看起来这可行。

编辑:

这是引用站点的代码和文本

一直在使用 iTextSharp 及其 HTMLWorker 类将一个 HTML 页面呈现为 PDF 的人知道我在说什么:如果 HTML 包含具有相对路径的图像,您可能会得到“友好”的蓝屏!

enter image description here

这意味着 iTextShap 尝试获取一张相对路径为“images/screenshot.3.jpg”的图像作为本地文件“C:\images\screenshot.3.jpg”,因此,该图像不存在. 在对如何向 iTextSharp 提供正确图像进行大量研究后,我发现有人提到了“IImageProvider”接口(interface),该接口(interface)使 iTextSharp 能够使用自定义方法查找图像。好吧,我已经使用 iTextSharp 5.0.2.0 完成了一个示例。你可以在这里下载。

首先,您必须创建一个实现 IImageProvider 接口(interface)的类:

public class CustomItextImageProvider : IImageProvider
{
    #region IImageProvider Members
    public iTextSharp.text.Image GetImage(string src, Dictionary<string,string> imageProperties, ChainedProperties cprops, IDocListener doc)
    {
        string imageLocation = imageProperties["src"].ToString();
        string siteUrl = HttpContext.Current.Request.Url.AbsoluteUri.Replace(HttpContext.Current.Request.Url.AbsolutePath, "");

        if (siteUrl.EndsWith("/"))
            siteUrl = siteUrl.Substring(0, siteUrl.LastIndexOf("/"));

        iTextSharp.text.Image image = null;

        if (!imageLocation.StartsWith("http:") && !imageLocation.StartsWith("file:") && !imageLocation.StartsWith("https:") && !imageLocation.StartsWith("ftp:"))
            imageLocation = siteUrl + (imageLocation.StartsWith("/") ? "" : "/") + imageLocation; 

        return iTextSharp.text.Image.GetInstance(imageLocation);
    }
    #endregion
}

之后,在呈现 HTML 内容之前,您必须将此图像提供程序指定为 HTMLWorker 类的“img_provider”接口(interface)属性:

HTMLWorker worker = new HTMLWorker(document);
Dictionary<string, object> interfaceProps = new Dictionary<string, object>() { 
    {"img_provider", new CustomItextImageProvider()}
};
worker.InterfaceProps = interfaceProps;

现在,当您呈现 HTML 时,它应该可以处理相关图像。

尽管这是为 ASP.Net 制作的一个示例,但主要思想是如何在呈现 HTML 时为 iTextSharp 创建一个自定义图像提供程序,它可以用于任何应用程序,此外,这不仅可以帮助您获取图像从相对位置,我已经使用它(显然有更多代码)从需要身份验证的 SharePoint 或站点获取图像。

关于c# - iTextSharp Html 到 Pdf 图像 src,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13593758/

相关文章:

c# - Entity Framework 6 使用另一条记录的值更新现有记录

c# - 从pdf文件中读取超链接

c# - 来自预定义模板的多页 PDF 文档

c# - iTextSharp 创建带有空白页的 PDF

c# - 在 macOS 上编译/运行单个 C# 文件

c# - 通过服务器从 MySQL 数据库检索图像

c# - 如何在合并时删除空格

c# - 为 PDF 设置页边距、页眉和页脚而不重叠

c# - 有人能告诉我这个疯狂的 C++ 语句在 C# 中意味着什么吗?

c# - 使用 SaveFileDialog 保存图表图像