2012-11-27 19 views
5

को iTextSharpiTextSharp एचटीएमएल पीडीएफ छवि src

public static MemoryStream CreatePdfFromHtml(
     string html, List<Attachment> attachments) 
    { 
     MemoryStream msOutput = new MemoryStream(); 

     using (TextReader reader = new StringReader(html)) 
     using (Document document = new Document()) 
     { 
      PdfWriter writer = PdfWriter.GetInstance(document, msOutput); 
      document.Open(); 

      foreach (var a in attachments) 
      { 
       var image = iTextSharp.text.Image.GetInstance(a.File); 
       document.Add(image); 
      } 

      XMLWorkerHelper.GetInstance().ParseXHtml(writer, document, reader); 

      writer.CloseStream = false; 
      document.Close(); 
      msOutput.Position = 0; 
      return msOutput; 
     } 
    } 

एचटीएमएल कई एम्बेडेड छवियों इस तरह से होता है का उपयोग कर पीडीएफ करने के लिए एक एचटीएमएल बदलें। इस विधि को प्राथमिकता दी गई थी क्योंकि उसी HTML को का उपयोग करके AlternateView में ईमेल के माध्यम से भेजा जाता है।

foreach (var a in attachments) 
{ 
    //not production code 
    html += string.Format("<img src=\"cid:{0}\"></img>", a.Id.ToString()); 
} 

हालांकि, जब पीडीएफ उत्पन्न हो जाता है, वहाँ img HTML टैग का src भाग के साथ छवि आईडी से जोड़ने के लिए कोई रास्ता नहीं है। आखिरकार, पीडीएफ में सभी छवियां शीर्ष पर हैं और फिर <img src... के साथ HTML को अनदेखा किया गया है।

मैं या तो पैराग्राफ या ImageAbsolutePosition का उपयोग कर कई संभव समाधान पढ़ा है, लेकिन वे में फिट करने के लिए नहीं है।

उत्तर

1

मैंने पहले पाया एक मुद्दा है कि वहाँ है जब आप के रूप में iTextSharp एचटीएमएल पीडीएफ पीढ़ी में रिश्तेदार पथ का उपयोग आप आप की तरह

html += string.Format("<img src=https://www.mysite.com/"+a.Id.ToString()+".imageext"></img>"); 
1

प्रत्यक्ष पथ कुछ देना करने के लिए होगा आप ImageAbsolutePosition जो आप सही तरीके से या अगर आप अभी भी एचटीएमएल उपयोग करना चाहते हैं अपने चित्र को स्थान देने पैराग्राफ का उपयोग करने की आवश्यकता होगी उपयोग कर सकते हैं उल्लेख या आप वर्चुअल पथ परिवर्तित कर सकते हैं सर्वर के साथ भौतिक पथ के लिए। मैपपैथ इस तरह:

imgPhoto.ImageUrl = Server.MapPath(imgPhoto.ImageUrl); 
1

इस तरह का प्रयास करें: this site

  PdfWriter writer = PdfWriter.GetInstance(document, msOutput); 
      document.Open(); 
      HTMLWorker worker = new HTMLWorker(document); 

      Dictionary<string, object> providers = new Dictionary<string, object>(); 
      //Get url of the application 
      string url = "http://www.url.com/" //url from which images are loaded 
      //Bind image providers for the application 
      providers.Add(HTMLWorker.IMG_BASEURL, url); 
      //Bind the providers to the worker 
      worker.SetProviders(providers); 

      document.Open(); 
      worker.StartDocument(); 

      // Parse the html into the document 

      worker.Parse(reader); 
      worker.EndDocument(); 
      worker.Close(); 
      document.Close(); 
2

पर देखो, लगता है कि यह काम कर सकते हैं।

संपादित करें:

यहाँ कोड और संदर्भित साइट

लोग जो पीडीएफ के लिए एक HTML पृष्ठ प्रतिपादन के लिए iTextSharp और उसके HTMLWorker वर्ग के साथ काम कर रहा है से पाठ है जानता है कि मैं क्या कर रहा हूँ इसके बारे में बात करते हुए: यदि HTML में सापेक्ष पथ वाली छवियां हैं तो आपको शायद "दोस्ताना" पीले रंग की स्क्रीन मिल जाएगी!

enter image description here

इसका मतलब है कि iTextShap रिश्तेदार पथ "छवियों/screenshot.3.jpg" स्थानीय फ़ाइल के रूप में के साथ एक छवि प्राप्त करने की कोशिश "C: \ छवियों \ screenshot.3.jpg", इसलिए, वह छवि मौजूद नहीं है। iTextSharp को सही छवि प्रदान करने के तरीके के बारे में बहुत सारे शोध करने के बाद मैंने पाया कि एक व्यक्ति ने "IImageProvider" इंटरफ़ेस का उल्लेख किया है जो iTextSharp को कस्टम विधियों का उपयोग करके छवि ढूंढने की क्षमता देता है। खैर, मैंने iTextSharp 5.0.2.0 का उपयोग करके एक उदाहरण किया है। आप द्वारा इसे यहां पर डाउनलोड किया जा सकता है।

तुम सब एक वर्ग है कि IImageProvider इंटरफ़ेस लागू करता है बनाने के लिए पर पहली:

public class CustomItextImageProvider : IImageProvider 
{ 
    #region IImageProvider Members 
    public iTextSharp.text.Image GetImage(string src, Dictionary<string,string> imageProperties, ChainedProperties cprops, IDocListener doc) 
    { 
     string imageLocation = imageProperties["src"].ToString(); 
     string siteUrl = HttpContext.Current.Request.Url.AbsoluteUri.Replace(HttpContext.Current.Request.Url.AbsolutePath, ""); 

     if (siteUrl.EndsWith("/")) 
      siteUrl = siteUrl.Substring(0, siteUrl.LastIndexOf("/")); 

     iTextSharp.text.Image image = null; 

     if (!imageLocation.StartsWith("http:") && !imageLocation.StartsWith("file:") && !imageLocation.StartsWith("https:") && !imageLocation.StartsWith("ftp:")) 
      imageLocation = siteUrl + (imageLocation.StartsWith("/") ? "" : "/") + imageLocation; 

     return iTextSharp.text.Image.GetInstance(imageLocation); 
    } 
    #endregion 
} 

यह करने के बाद आप प्रतिपादन से पहले HTMLWorker वर्ग के "img_provider" इंटरफेस संपत्ति के रूप में इस छवि प्रदाता आवंटित करने के लिए है एचटीएमएल सामग्री:

HTMLWorker worker = new HTMLWorker(document); 
Dictionary<string, object> interfaceProps = new Dictionary<string, object>() { 
    {"img_provider", new CustomItextImageProvider()} 
}; 
worker.InterfaceProps = interfaceProps; 

अब, जब आप अपना एचटीएमएल प्रस्तुत करते हैं तो इसे सापेक्ष छवियों के साथ काम करना चाहिए।

एल्थॉट यह एएसपी.Net के लिए एक उदाहरण है, मुख्य विचार यह है कि HTML को प्रस्तुत करते समय iTextSharp के लिए एक कस्टम छवि प्रदाता कैसे बनाया जाए और इसका उपयोग किसी भी एप्लिकेशन पर भी किया जा सके, यह न केवल आपको प्राप्त करने में मदद कर सकता है किसी रिश्तेदार स्थान से छवियों, मैंने इसे इस्तेमाल किया है (जाहिर है) अधिक जानकारी के साथ, SharePoint या साइट्स से छवियां प्राप्त करने के लिए जिन्हें प्रमाणीकरण की आवश्यकता होती है।

+0

@ क्लोपेट्रा मैंने संदर्भित वेबसाइट से कोड और टेक्स्ट जोड़ा है। – Pierre

-1
var logo = iTextSharp.text.Image.GetInstance(Server.MapPath("../Images/mevantage-logo.jpg")); 
+0

ओपी ने स्पष्ट रूप से संकेत दिया कि छवियां एक HTML का हिस्सा हैं जो अंततः XmlWorker के माध्यम से चलती है। इस प्रकार, कोड की आपकी लाइन मेल नहीं खाती है। – mkl