.net ITextSharp एचटीएमएल पीडीएफ के लिए?




html-to-pdf (7)

मैं पेचकिन नामक एक और लाइब्रेरी का उपयोग करना पसंद करता हूं क्योंकि यह गैर तुच्छ HTML (जिसमें सीएसएस कक्षाएं भी हैं) को परिवर्तित करने में सक्षम है। यह संभव है क्योंकि यह लाइब्रेरी वेबकिट लेआउट इंजन का उपयोग करती है जिसका उपयोग क्रोम और सफारी जैसे ब्राउज़र द्वारा भी किया जाता है।

मैंने अपने ब्लॉग पर पेचकिन के साथ अपने अनुभव का विस्तार किया: http://codeutil.wordpress.com/2013/09/16/convert-html-to-pdf/

मैं जानना चाहता हूं कि ITextSharp में एचटीएमएल को पीडीएफ में बदलने की क्षमता है या नहीं। जो कुछ भी मैं बदलूंगा वह सिर्फ सादा पाठ होगा लेकिन दुर्भाग्य से ITextSharp पर कोई दस्तावेज नहीं है, इसलिए मैं यह निर्धारित नहीं कर सकता कि यह मेरे लिए एक व्यवहार्य समाधान होगा या नहीं।

अगर यह ऐसा नहीं कर सकता है, तो क्या कोई मुझे कुछ अच्छे, मुफ्त .NET पुस्तकालयों को इंगित कर सकता है जो एक साधारण सादा पाठ HTML दस्तावेज़ ले सकते हैं और इसे पीडीएफ में परिवर्तित कर सकते हैं?

तिया।


अगर मैं प्रतिष्ठा रखूं तो मैं एकमात्र मैनिमाडा का जवाब दूंगा - मैंने अभी पेचकिन का उपयोग करके पीडीएफ समाधान के लिए एएसपीनेट एचटीएमएल लागू किया है। परिणाम अद्भुत हैं।

पेचकिन के लिए एक नुजेट पैकेज है, लेकिन जैसा कि उपर्युक्त पोस्टर अपने ब्लॉग में उल्लेख करता है ( http://codeutil.wordpress.com/2013/09/16/convert-html-to-pdf/ - मुझे उम्मीद है कि उसे कोई फर्क नहीं पड़ता मैं इसे दोबारा पोस्ट कर रहा हूं), इस शाखा में एक स्मृति रिसाव तय की गई है:

https://github.com/tuespetre/Pechkin

उपर्युक्त ब्लॉग में इस पैकेज को शामिल करने के लिए विशिष्ट निर्देश हैं (यह 32 बिट डीएल है और इसकी आवश्यकता है .net4)। यहाँ मेरा कोड है। आने वाले एचटीएमएल वास्तव में एचटीएमएल एजिलिटी पैक के माध्यम से इकट्ठा किया जाता है (मैं चालान पीढ़ियों को स्वचालित कर रहा हूं):

public static byte[] PechkinPdf(string html)
{
  //Transform the HTML into PDF
  var pechkin = Factory.Create(new GlobalConfig());
  var pdf = pechkin.Convert(new ObjectConfig()
                          .SetLoadImages(true).SetZoomFactor(1.5)
                          .SetPrintBackground(true)
                          .SetScreenMediaType(true)
                          .SetCreateExternalLinks(true), html);

  //Return the PDF file
  return pdf;
}

फिर, धन्यवाद mayymada - आपका जवाब शानदार है।


इसमें HTML फ़ाइल को पीडीएफ में कनवर्ट करने की क्षमता है।

रूपांतरणों के लिए आवश्यक नामस्थान हैं:

using iTextSharp.text;
using iTextSharp.text.pdf;

और रूपांतरण और डाउनलोड फ़ाइल के लिए:

// Create a byte array that will eventually hold our final PDF
Byte[] bytes;

// Boilerplate iTextSharp setup here

// Create a stream that we can write to, in this case a MemoryStream
using (var ms = new MemoryStream())
{
    // Create an iTextSharp Document which is an abstraction of a PDF but **NOT** a PDF
    using (var doc = new Document())
    {
        // Create a writer that's bound to our PDF abstraction and our stream
        using (var writer = PdfWriter.GetInstance(doc, ms))
        {
            // Open the document for writing
            doc.Open();

            string finalHtml = string.Empty;

            // Read your html by database or file here and store it into finalHtml e.g. a string
            // XMLWorker also reads from a TextReader and not directly from a string
            using (var srHtml = new StringReader(finalHtml))
            {
                // Parse the HTML
                iTextSharp.tool.xml.XMLWorkerHelper.GetInstance().ParseXHtml(writer, doc, srHtml);
            }

            doc.Close();
        }
    }

    // After all of the PDF "stuff" above is done and closed but **before** we
    // close the MemoryStream, grab all of the active bytes from the stream
    bytes = ms.ToArray();
}

// Clear the response
Response.Clear();
MemoryStream mstream = new MemoryStream(bytes);

// Define response content type
Response.ContentType = "application/pdf";

// Give the name of file of pdf and add in to header
Response.AddHeader("content-disposition", "attachment;filename=invoice.pdf");
Response.Buffer = true;
mstream.WriteTo(Response.OutputStream);
Response.End();

एएसपीनेट एमवीसी नियंत्रक से पीडीएफ प्रतिक्रिया वापस करने के लिए मैं संस्करण 5.4.2 (nuget इंस्टॉल से) पर काम करने में सक्षम था। यदि आउटपुट की आवश्यकता है तो आउटपुट के लिए मेमोरीस्ट्रीम के बजाय फ़ाइलस्ट्रीम का उपयोग करने के लिए इसे संशोधित किया जा सकता है।

मैं इसे यहां पोस्ट करता हूं क्योंकि यह एचटीएमएल -> पीडीएफ रूपांतरण (छवियों को अनदेखा करने के लिए वर्तमान iTextSharp उपयोग का एक पूर्ण उदाहरण है, मैंने इसे देखा नहीं है क्योंकि मेरे उपयोग की आवश्यकता नहीं है)

यह iTextSharp के XmlWorkerHelper का उपयोग करता है, इसलिए आने वाली एचएमटीएल वैध एक्सएचटीएमएल होना चाहिए, इसलिए आपको अपने इनपुट के आधार पर कुछ फिक्सअप करने की आवश्यकता हो सकती है।

using iTextSharp.text.pdf;
using iTextSharp.tool.xml;
using System.IO;
using System.Web.Mvc;

namespace Sample.Web.Controllers
{
    public class PdfConverterController : Controller
    {
        [ValidateInput(false)]
        [HttpPost]
        public ActionResult HtmlToPdf(string html)
        {           

            html = @"<?xml version=""1.0"" encoding=""UTF-8""?>
                 <!DOCTYPE html 
                     PUBLIC ""-//W3C//DTD XHTML 1.0 Strict//EN""
                    ""http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"">
                 <html xmlns=""http://www.w3.org/1999/xhtml"" xml:lang=""en"" lang=""en"">
                    <head>
                        <title>Minimal XHTML 1.0 Document with W3C DTD</title>
                    </head>
                  <body>
                    " + html + "</body></html>";

            var bytes = System.Text.Encoding.UTF8.GetBytes(html);

            using (var input = new MemoryStream(bytes))
            {
                var output = new MemoryStream(); // this MemoryStream is closed by FileStreamResult

                var document = new iTextSharp.text.Document(iTextSharp.text.PageSize.LETTER, 50, 50, 50, 50);
                var writer = PdfWriter.GetInstance(document, output);
                writer.CloseStream = false;
                document.Open();

                var xmlWorker = XMLWorkerHelper.GetInstance();
                xmlWorker.ParseXHtml(writer, document, input, null);
                document.Close();
                output.Position = 0;

                return new FileStreamResult(output, "application/pdf");
            }
        }
    }
}

मैं कुछ हफ्ते पहले एक ही प्रश्न में आया था और यह मुझे मिला जो परिणाम मिला है। यह विधि एक पीडीएफ में एचटीएमएल का त्वरित डंप करता है। दस्तावेज को संभवतः कुछ प्रारूप tweaking की आवश्यकता होगी।

private MemoryStream createPDF(string html)
{
    MemoryStream msOutput = new MemoryStream();
    TextReader reader = new StringReader(html);

    // step 1: creation of a document-object
    Document document = new Document(PageSize.A4, 30, 30, 30, 30);

    // step 2:
    // we create a writer that listens to the document
    // and directs a XML-stream to a file
    PdfWriter writer = PdfWriter.GetInstance(document, msOutput);

    // step 3: we create a worker parse the document
    HTMLWorker worker = new HTMLWorker(document);

    // step 4: we open document and start the worker on the document
    document.Open();
    worker.StartDocument();

    // step 5: parse the html into the document
    worker.Parse(reader);

    // step 6: close the document and the worker
    worker.EndDocument();
    worker.Close();
    document.Close();

    return msOutput;
}

कुछ खुदाई करने के बाद मुझे आईटीक्स्टशर्प के साथ जो कुछ चाहिए, उसे पूरा करने का एक अच्छा तरीका मिला।

यहां कुछ नमूना कोड दिया गया है यदि यह भविष्य में किसी और की मदद करेगा:

protected void Page_Load(object sender, EventArgs e)
{
    Document document = new Document();
    try
    {
        PdfWriter.GetInstance(document, new FileStream("c:\\my.pdf", FileMode.Create));
        document.Open();
        WebClient wc = new WebClient();
        string htmlText = wc.DownloadString("http://localhost:59500/my.html");
        Response.Write(htmlText);
        List<IElement> htmlarraylist = HTMLWorker.ParseToList(new StringReader(htmlText), null);
        for (int k = 0; k < htmlarraylist.Count; k++)
        {
            document.Add((IElement)htmlarraylist[k]);
        }

        document.Close();
    }
    catch
    {
    }
}

यदि आप HTML सर्वर पर एचटीएमएल को पीडीएफ में परिवर्तित कर रहे हैं तो आप Rotativa का उपयोग कर सकते हैं:

Install-Package Rotativa

यह wkhtmltopdf पर आधारित है लेकिन इसमें iTextSharp की तुलना में बेहतर सीएसएस समर्थन है और एमवीसी (जो अधिकतर उपयोग किया जाता है) के साथ एकीकृत करने के लिए बहुत आसान है क्योंकि आप बस पीडीएफ के रूप में दृश्य को वापस कर सकते हैं:

public ActionResult GetPdf()
{
    //...
    return new ViewAsPdf(model);// and you are done!
} 




html-to-pdf