2014-01-07 91 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); 

強烈推薦!

相關問題