2014-01-07 6 views
0

У меня есть наценка HTML, которая имеет HTMLTable и Images. Я использую iTextSharp API для преобразования HTML markup to PDF. Но, к сожалению, iTextSharp не удалось экспортировать разметку HTML, содержащую изображения & Таблица в PDF.Невозможно экспортировать HTML-разметку в PDF с помощью iTextSharp API в asp.net с использованием C#?

Ошибка: сетевой путь не найден.

Результат должен быть: 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

Взгляните: creating pdf with itextsharp with images from database

Вам нужно либо предоставить полный физический путь в Src-атрибут каждого IMG-элементов (например, <img src="c:\myproject\images\image.jpg"/>) или есть возможность сказать iTextSharp папку физической базы для все ваши изображения.

0

Я был в состоянии корректно отобразить мой HTML на 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 Юникод символы на некоторых машинах хостинга (хорошо на немецком машине, но некорректный рендеринг на русском). Я пытался регистрировать различные шрифты с помощью 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); 

Очень рекомендую!

Смежные вопросы