无法使用C#在asp.net中使用iTextSharp API将HTML标记导出为PDF?

无法使用C#在asp.net中使用iTextSharp API将HTML标记导出为PDF?,c#,asp.net,itextsharp,html-to-pdf,pdf-conversion,C#,Asp.net,Itextsharp,Html To Pdf,Pdf Conversion,我有一个HTML标记,其中包含HTML表和图像。我正在使用itextsharpapi将HTML标记转换为PDF。但是,不幸的是,iTextSharp无法将包含图像和表格的HTML标记导出为PDF 错误:未找到网络路径。 结果必须为: 代码: 使用iTextSharp.text; 使用iTextSharp.text.pdf; 使用iTextSharp.text.html; 使用System.Data.SqlClient; 使用系统文本; 使用iTextSharp.text.html.simple

我有一个
HTML
标记,其中包含
HTML
图像
。我正在使用
itextsharpapi
HTML标记转换为PDF
。但是,不幸的是,
iTextSharp
无法将包含图像和表格的
HTML
标记导出为PDF

错误:未找到网络路径。

结果必须为:

代码:

使用iTextSharp.text;
使用iTextSharp.text.pdf;
使用iTextSharp.text.html;
使用System.Data.SqlClient;
使用系统文本;
使用iTextSharp.text.html.simpleparser;
公共字符串strSelectUserListBuilder=@”

装箱单 将此纸条放在设备的盒子内。 项目 优惠 iPhone5 32GB(AT&T) $205.00
总报价:
215.00美元 您必须在2014年1月29日之前发货您的设备。

如果您在到期日后发送设备,我们将无法接受您的初始报价。 我们不接受已报告丢失或被盗的设备


“查找我的iPhone”必须关闭 此功能锁定您的设备,并将延迟或减少付款。 如何停用: 1.轻触主屏幕上的“设置”图标。 2.从设置菜单中点击iCloud。 3.如果“查找我的iPhone”已打开,请点击滑块将其关闭。 "; 受保护的无效HTMLToPDF() { 字符串htmlText=strSelectUserListBuilder.ToString(); 文档=新文档(); GetInstance(文档,新文件流(Request.PhysicalApplicationPath+“MySamplePDF.pdf”,FileMode.Create)); document.Open(); iTextSharp.text.html.simpleparser.HTMLWorker hw= 新的iTextSharp.text.html.simpleparser.HTMLWorker(文档); 解析(新的StringReader(htmlText)); document.Close(); } 受保护的无效页面加载(对象发送方、事件参数e) { HTMLToPDF(); }
我知道此错误是由于图像路径造成的。但是,无法解决。

有解决办法吗

谢谢你的帮助

看看:


您需要在每个img元素的src属性中提供完整的物理路径(例如,
),或者可以告诉iTextSharp所有图像的物理基本文件夹。

我能够通过使用特殊的提供程序正确呈现html

var baseUrl = string.Format("{0}://{1}", Request.Url.Scheme, Request.Url.Authority);

var html = ...;

Response.Clear();
Response.ClearContent();
Response.ClearHeaders();

Response.ContentEncoding = Encoding.UTF8;
Response.AddHeader("content-disposition", string.Format("attachment; filename={0}.pdf", fileName));
Response.ContentType = "application/pdf";

using (var ms = new MemoryStream())
{

    using (var doc = new Document())
    {                       
        using (var writer = PdfWriter.GetInstance(doc, ms))
        {
            doc.Open();

            var rootProvider = new CustomRootProvider(baseUrl, Request.PhysicalApplicationPath); //Server.MapPath(Request.ApplicationPath)

            FontFactory.RegisterDirectories();

            var htmlContext = new HtmlPipelineContext(null);

            htmlContext.SetTagFactory(Tags.GetHtmlTagProcessorFactory());                           

            htmlContext.SetImageProvider(rootProvider);

            htmlContext.SetLinkProvider(rootProvider);

            htmlContext.CharSet(Encoding.UTF8);

            var cssResolver = XMLWorkerHelper.GetInstance().GetDefaultCssResolver(true);

            var pipeline = new CssResolverPipeline(cssResolver,

            new HtmlPipeline(htmlContext, new PdfWriterPipeline(doc, writer)));

            var worker = new XMLWorker(pipeline, true);

            var p = new XMLParser(worker);

            using(var htmlStream = new MemoryStream(Encoding.UTF8.GetBytes(html)))
            {
                p.Parse(htmlStream, Encoding.UTF8);                         
            }       

            writer.CloseStream = false;
        }
        doc.Close();
    }
    ms.Position = 0;                    
    Response.BinaryWrite(ms.ToArray());
}

Response.Flush();
Response.End();

...

public class CustomRootProvider : AbstractImageProvider, ILinkProvider
{
    private string _baseUrl;
    private string _basePath;
    public CustomRootProvider(string baseUrl, string basePath)
    {
        _baseUrl = baseUrl;     
    }

    public override Image Retrieve(string src)
    {       
        var siteUrl = string.IsNullOrEmpty(_baseUrl) ? HttpContext.Current.Request.Url.AbsoluteUri.Replace(HttpContext.Current.Request.Url.PathAndQuery, string.Empty) : _baseUrl;

        siteUrl = VirtualPathUtility.RemoveTrailingSlash(siteUrl);      

        if (Uri.IsWellFormedUriString(src, UriKind.Relative))
        {
            src = new Uri(new Uri(siteUrl), src).ToString();            
        }

        try
        {
            return Image.GetInstance(src);
        }
        catch (Exception)
        {                       
            return Image.GetInstance(new Uri(new Uri(siteUrl), "/Content/Images/noimage.png").ToString());
        }

    }

    public override string GetImageRootPath()
    {
        return string.IsNullOrEmpty(_basePath) ? HttpContext.Current.Request.PhysicalApplicationPath : _basePath;
        //HttpContext.Current.Server.MapPath(HttpContext.Current.Request.ApplicationPath);
    }

    public string GetLinkRoot()
    {
        return string.IsNullOrEmpty(_baseUrl)
            ? HttpContext.Current.Request.Url.AbsoluteUri.Replace(HttpContext.Current.Request.Url.PathAndQuery, string.Empty)
            : _baseUrl;
    }
}
但在一些主机上,html unicode符号出现了奇怪的问题(在德语机器上可以,但在俄语机器上呈现不正确)。我试图在iTextSharp fontfactory中注册不同的字体,以使用不同的标记(css规则、字体面等)。什么都帮不了我。最后使用wkhtmltopdf和包装器(互联网上提供不同的包装器)。wkhtmltopdf开箱即用,效果非常好!:

var config = new GlobalConfig().SetMargins(0, 0, 0, 0).SetPaperSize(PaperKind.A4);

var pdfWriter = new SynchronizedPechkin(config);

var bytes = pdfWriter.Convert(new Uri(dataUrl));

Response.BinaryWrite(bytes);

强烈推荐

对你有用吗?pdf不是按照我展示的设计创建的。。。!它扭曲了…:(是的,但您是否尝试输入图像的完整物理路径(如我在回答中所建议的)?是的!图像渲染,但它会扭曲布局…:(
var config = new GlobalConfig().SetMargins(0, 0, 0, 0).SetPaperSize(PaperKind.A4);

var pdfWriter = new SynchronizedPechkin(config);

var bytes = pdfWriter.Convert(new Uri(dataUrl));

Response.BinaryWrite(bytes);