2014-01-07 55 views
0

我有一个HTML标记,其中有HTMLTableImages。我正在使用iTextSharp API来转换HTML markup to PDF。但是,不幸的是,iTextSharp无法将包含图像&表的HTML标记导出为PDF。无法使用C#在asp.net中使用iTextSharp API将HTML标记导出为PDF?

错误:未找到网络路径。

结果必然是: enter image description here

代码:

using iTextSharp.text; 
using iTextSharp.text.pdf; 
using iTextSharp.text.html; 
using System.Data.SqlClient; 
using System.Text; 
using iTextSharp.text.html.simpleparser; 
public string strSelectUserListBuilder = @" <div style='width: 50%; border: 1 solid #000000; padding-bottom: 100; padding-left: 100; 
     padding-right: 100; text-align: justify; text-justify: inter-word;'> 
     <br /> 
     <table> 
      <tr> 
       <td> 
        <div id='divLeft'> 
         <p> 
          <img src='/images/log_out.png' width='200' height='100' /></p> 
         <h2> 
          Packing slip</h2> 
         <h3> 
          Place this slip inside the box with your device.</h3> 
         <div id='divDeviceList' style='width: 600; text-align: left;' border='0' cellpadding='3' 
          cellspacing='1' rules='BOTH' frame='BOX'> 
          <table style='width: 600;'> 
           <tr> 
            <td> 
             <strong> ITEM</strong> 
            </td> 
            <td> 
             <strong> OFFER</strong> 
            </td> 
           </tr> 
           <tr> 
            <td> 
             iPhone 5 32GB (AT&T) 
            </td> 
            <td> 
             $205.00 
            </td> 
           </tr> 

           <tr> 
            <td align='right'> 
            <hr /> 
            <strong><h3>Total Offer: &nbsp;</h3></strong> 
            </td> 
            <td> 
            <hr /> 
             <strong> <h3> $215.00</h3></strong> 
            </td> 
           </tr> 

          </table> 


         </div> 

          <h3> 
           You have until 01/29/2014 to ship your device.</h3> 
         <p style='padding:10;'> 
          <i>If you send your device after the expiration date we cannot honor your initial offer. 
           We will not accept devices that have been reported lost or stolen.</i></p> 
         <br /> 
        </div> 
       </td> 
       <td> 
        <div id='divRight'> 
        <div style='text-align:right;padding:15;'> <img src='/images/google-login.png' alt='barcode' /></div> 
         <table cellpadding='3' style='border: 1 solid orange;padding:20;'> 

         </tr> 
          <tr align='center'> 
           <td> 
            <img src='/images/google-login.png' /> 
           </td> 
          </tr> 
          <tr> 
           <td> 
            <h3> 
             'Find my iPhone' must be turned off</h3> 
           </td> 
          </tr> 
          <tr> 
           <td> 
            This feature locks your device and will delay or reduce payment. 
           </td> 
          </tr> 
          <tr> 
           <td> 
           <strong>How to deactivate:</strong></td> 
          </tr> 
          <tr> 
           <td> 
            1. Tap the “settings” icon on your homescreen.</td> 
          </tr> 
          <tr> 
           <td> 
            2. Tap iCloud from the settings menu. </td> 
          </tr> 
          <tr> 
           <td> 
            3. If 'Find My iPhone' is on, tap the slider to turn it off.</td> 
          </tr> 
         </table> 
        </div>"; 

protected void HTMLToPDF() 
    { 

     String htmlText = strSelectUserListBuilder.ToString(); 
     Document document = new Document(); 
     PdfWriter.GetInstance(document, new FileStream(Request.PhysicalApplicationPath + "MySamplePDF.pdf", FileMode.Create)); 
     document.Open(); 
     iTextSharp.text.html.simpleparser.HTMLWorker hw = 
        new iTextSharp.text.html.simpleparser.HTMLWorker(document); 
     hw.Parse(new StringReader(htmlText)); 
     document.Close(); 
    } 

protected void Page_Load(object sender, EventArgs e) 
{ 
     HTMLToPDF(); 
} 

我知道这个错误是由于图像路径。但是,无法解决。

任何解决方案?

帮助赞赏!

+0

它为你工作吗? –

+0

pdf不是按照我所展示的设计创建的......!它扭曲... :( –

+0

是的,但你有没有试图进入图像的完整物理路径(如我在我的回答中所建议的)? –

回答

0

我能够通过useiung特殊提供商

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但有奇怪的问题,对一些托管机HTML的Unicode符号(确定在德国的机器,但俄罗斯不正确渲染)。我正在尝试使用iTextSharp fontfactory注册不同的字体,以使用不同的标记(CSS规则,字体等)。没有什么帮助我。这结束与使用wkhtmltopdf与包装Pechkin(互联网上可用的不同包装)。 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); 

强烈推荐!

相关问题