简体   繁体   中英

Unable to Export HTML Markup to PDF using iTextSharp API in asp.net using C#?

I have an HTML markup which has HTML Table and Images in it. I am using iTextSharp API to convert the HTML markup to PDF . But, unfortunately the iTextSharp fails to export the HTML markup containing the Images & Table to PDF.

Error:The network path was not found.

Result must be: 在此处输入图片说明

Code:

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();
}

I know this error is due the Image Path. But, not able to resolve.

Any Solution?

Help Appreciated!

Take a look at: creating pdf with itextsharp with images from database

You need to either provide the full physical path in the src-attribute of every img-elements (eg <img src="c:\\myproject\\images\\image.jpg"/> ) or there is a possibility to tell iTextSharp the physical base folder for all your images.

I was able to render my html correctly by useiung special providers

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;
    }
}

But was having strange problems with html unicode symbols on some hosting machines (ok in german machine but incorrect rendering on russian). I was trying to register differern fonts with iTextSharp fontfactory, to play with different markup (css rules, font-faces etc). Nothing helped me. This was ended with using wkhtmltopdf with wrapper Pechkin (different wrappers available on the internet). wkhtmltopdf works just great out of the box!:

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);

Highly recommend!

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM