c# - HTML को पीडीएफ में.NET में कनवर्ट करें




pdf itextsharp (20)

मैं एक समारोह में एचटीएमएल सामग्री पास करके एक पीडीएफ उत्पन्न करना चाहता हूँ। मैंने इसके लिए iTextSharp का उपयोग किया है, लेकिन यह टेबल पर मुकाबला करने पर अच्छा प्रदर्शन नहीं करता है और लेआउट बस गन्दा हो जाता है।

क्या कोई बेहतर तरीका है?


2018 के अपडेट, और चलिए मानक एचटीएमएल + सीएसएस = पीडीएफ समीकरण का उपयोग करते हैं!

एचटीएमएल से पीडीएफ मांगों के लिए अच्छी खबर है। जैसा कि इस जवाब से पता चला है , डब्ल्यू 3 सी मानक css-break-3 समस्या को हल करेगा ... परीक्षण के बाद 2017 या 2018 में निश्चित सिफारिश में बदलने के लिए योजना के साथ उम्मीदवार की सिफारिश है।

जैसा कि मानक नहीं है, सी # के लिए प्लगइन के साथ समाधान हैं, जैसा print-css.rocks द्वारा दिखाया गया है।



अधिकांश एचटीएमएल पीडीएफ कनवर्टर आईई पर एचटीएमएल पार्सिंग और प्रतिपादन करने के लिए निर्भर करता है। जब उपयोगकर्ता अपने आईई अपडेट करता है तो यह तोड़ सकता है। Here एक ऐसा है जो आईई पर भरोसा नहीं करता है।

कोड इस तरह कुछ है:

EO.Pdf.HtmlToPdf.ConvertHtml(htmlText, pdfFileName);

कई अन्य कन्वर्टर्स की तरह, आप टेक्स्ट, फ़ाइल नाम या यूआरएल पास कर सकते हैं। परिणाम फ़ाइल या स्ट्रीम में सहेजा जा सकता है।


आप स्पिर की जांच भी कर सकते हैं, यह आपको कोड के इस साधारण टुकड़े के साथ HTML to PDF बनाने की अनुमति देता है

 string htmlCode = "<p>This is a p tag</p>";

//use single thread to generate the pdf from above html code
Thread thread = new Thread(() =>
{ pdf.LoadFromHTML(htmlCode, false, setting, htmlLayoutFormat); });
thread.SetApartmentState(ApartmentState.STA);
thread.Start();
thread.Join();

// Save the file to PDF and preview it.
pdf.SaveToFile("output.pdf");
System.Diagnostics.Process.Start("output.pdf");

विस्तृत लेख: एएसपीनेट सी # में एचटीएमएल को पीडीएफ में कैसे परिवर्तित करें


एचटीएमएल को सीधे पीडीएफ पर पार्स करने के बजाय, आप अपने एचटीएमएल पेज का बिटमैप बना सकते हैं और फिर बिटमैप को अपने पीडीएफ में डालें, उदाहरण के लिए iTextSharp

यहां एक कोड है कि एक यूआरएल का बिटमैप कैसे प्राप्त करें। मैंने इसे SO पर कहीं कहीं पाया, अगर मुझे स्रोत मिल जाए तो मैं इसे लिंक करूंगा।

public System.Drawing.Bitmap HTMLToImage(String strHTML)
{
    System.Drawing.Bitmap myBitmap = null;

    System.Threading.Thread myThread = new System.Threading.Thread(delegate()
    {
        // create a hidden web browser, which will navigate to the page
        System.Windows.Forms.WebBrowser myWebBrowser = new System.Windows.Forms.WebBrowser();
        // we don't want scrollbars on our image
        myWebBrowser.ScrollBarsEnabled = false;
        // don't let any errors shine through
        myWebBrowser.ScriptErrorsSuppressed = true;
        // let's load up that page!    
        myWebBrowser.Navigate("about:blank");

        // wait until the page is fully loaded
        while (myWebBrowser.ReadyState != System.Windows.Forms.WebBrowserReadyState.Complete)
            System.Windows.Forms.Application.DoEvents();

        myWebBrowser.Document.Body.InnerHtml = strHTML;

        // set the size of our web browser to be the same size as the page
        int intScrollPadding = 20;
        int intDocumentWidth = myWebBrowser.Document.Body.ScrollRectangle.Width + intScrollPadding;
        int intDocumentHeight = myWebBrowser.Document.Body.ScrollRectangle.Height + intScrollPadding;
        myWebBrowser.Width = intDocumentWidth;
        myWebBrowser.Height = intDocumentHeight;
        // a bitmap that we will draw to
        myBitmap = new System.Drawing.Bitmap(intDocumentWidth - intScrollPadding, intDocumentHeight - intScrollPadding);
        // draw the web browser to the bitmap
        myWebBrowser.DrawToBitmap(myBitmap, new System.Drawing.Rectangle(0, 0, intDocumentWidth - intScrollPadding, intDocumentHeight - intScrollPadding));
    });
    myThread.SetApartmentState(System.Threading.ApartmentState.STA);
    myThread.Start();
    myThread.Join();

    return myBitmap;
}

एबीसीपीडीएफ.नेट (http://www.websupergoo.com/abcpdf-5.htm)

हम उपयोग करते हैं और अनुशंसा करते हैं।

बहुत अच्छा घटक, यह न केवल एक वेबपृष्ठ को एक छवि की तरह पीडीएफ में परिवर्तित करता है बल्कि वास्तव में पाठ, छवि, स्वरूपण इत्यादि को रूपांतरित करता है ...

यह मुफ़्त नहीं है लेकिन यह सस्ता है।



नीचे iTextSharp (iTextSharp + itextsharp.xmlworker) का उपयोग कर पीडीएफ में एचटीएमएल + सीएसएस को परिवर्तित करने का एक उदाहरण है

using iTextSharp.text;
using iTextSharp.text.pdf;
using iTextSharp.tool.xml;


byte[] pdf; // result will be here

var cssText = File.ReadAllText(MapPath("~/css/test.css"));
var html = File.ReadAllText(MapPath("~/css/test.html"));

using (var memoryStream = new MemoryStream())
{
        var document = new Document(PageSize.A4, 50, 50, 60, 60);
        var writer = PdfWriter.GetInstance(document, memoryStream);
        document.Open();

        using (var cssMemoryStream = new MemoryStream(System.Text.Encoding.UTF8.GetBytes(cssText)))
        {
            using (var htmlMemoryStream = new MemoryStream(System.Text.Encoding.UTF8.GetBytes(html)))
            {
                XMLWorkerHelper.GetInstance().ParseXHtml(writer, document, htmlMemoryStream, cssMemoryStream);
            }
        }

        document.Close();

        pdf = memoryStream.ToArray();
}

मैं Rotativa पैकेज के लेखक हूँ। यह सीधे रेज़र दृश्यों से पीडीएफ फाइलें बनाने की अनुमति देता है:

https://www.nuget.org/packages/Rotativa/

उपयोग करने के लिए तुच्छ और आपके लेआउट पर पूर्ण नियंत्रण है क्योंकि आप अपने मॉडल और व्यूबैग कंटेनर से डेटा के साथ रेज़र दृश्यों का उपयोग कर सकते हैं।

मैंने Azure पर एक सास संस्करण विकसित किया। यह WebApi या किसी भी .NET ऐप, सेवा, Azure वेबसाइट, Azure webjob, जो भी चलता है, से इसका उपयोग करना आसान बनाता है। नेट।

http://www.rotativahq.com/

मुफ्त खाते उपलब्ध हैं।


मैं गंभीरता से NReco की सिफारिश करता NReco । इसमें मुफ्त और भुगतान किया गया संस्करण है, और वास्तव में इसके लायक है। यह पृष्ठभूमि में wkhtmtopdf का उपयोग करता है, लेकिन आपको केवल एक असेंबली की आवश्यकता है। बहुत खुबस।

उपयोग का उदाहरण:

NuGet माध्यम से स्थापित करें।

var htmlContent = String.Format("<body>Hello world: {0}</body>", DateTime.Now);
var pdfBytes = (new NReco.PdfGenerator.HtmlToPdfConverter()).GeneratePdf(htmlContent);

अस्वीकरण: मैं डेवलपर नहीं हूं, सिर्फ परियोजना का एक प्रशंसक हूं :)


मैंने http://www.html-to-pdf.net/ एक्सपीटीपीडीएफ http://www.html-to-pdf.net/ इस्तेमाल किया। एक सभ्य नौकरी है। दुर्भाग्य से, यह मुफ़्त नहीं है।


मैंने निम्नलिखित लाइब्रेरी को एचटीएमएल को पीडीएफ में परिवर्तित करने में अधिक प्रभावी पाया।
nuget : https://www.nuget.org/packages/Select.HtmlToPdf/


यदि आप itextsharp dll का उपयोग कर रहे हैं, तो तीसरे पक्ष के डीएल (प्लगइन) को जोड़ने की कोई ज़रूरत नहीं है, मुझे लगता है कि आप XMLworker का उपयोग कर रहे हैं इसके बजाय xmlworker का उपयोग करें, आप आसानी से अपने एचटीएमएल को पीडीएफ में परिवर्तित कर सकते हैं।

कुछ सीएसएस काम नहीं करेंगे वे समर्थित सीएसएस हैं
उदाहरण संदर्भ के साथ पूर्ण व्याख्या यहां क्लिक करें


        MemoryStream memStream = new MemoryStream();
        TextReader xmlString = new StringReader(outXml);
        using (Document document = new Document())
        {
            PdfWriter writer = PdfWriter.GetInstance(document, memStream);
            //document.SetPageSize(iTextSharp.text.PageSize.A4);
            document.Open();
            byte[] byteArray = System.Text.Encoding.UTF8.GetBytes(outXml);
            MemoryStream ms = new MemoryStream(byteArray);
            XMLWorkerHelper.GetInstance().ParseXHtml(writer, document, ms, System.Text.Encoding.UTF8);
            document.Close();
        }

        Response.ContentType = "application/pdf";
        Response.AddHeader("content-disposition", "attachment;filename=" + filename + ".pdf");
        Response.Cache.SetCacheability(HttpCacheability.NoCache);
        Response.BinaryWrite(memStream.ToArray());
        Response.End();
        Response.Flush();

यदि आप चाहते हैं कि उपयोगकर्ता ब्राउज़र में प्रस्तुत पृष्ठ के पीडीएफ को डाउनलोड करे तो समस्या का सबसे आसान समाधान है

window.print(); 

क्लाइंट साइड पर यह उपयोगकर्ता को वर्तमान पृष्ठ के पीडीएफ को सहेजने के लिए प्रेरित करेगा। आप शैली को जोड़कर पीडीएफ की उपस्थिति को भी अनुकूलित कर सकते हैं

<link rel="stylesheet" type="text/css" href="print.css" media="print">

प्रिंटिंग के दौरान एचटीएमएल पर print.css लागू किया जाता है।

सीमा

आप सर्वर को सर्वर पर स्टोर नहीं कर सकते हैं। पृष्ठ को मुद्रित करने के लिए उपयोगकर्ता संकेत मैन्युअल रूप से पृष्ठ को सहेजना था। पृष्ठ को एक टैब में प्रस्तुत किया जाना चाहिए।


यदि आपको वास्तव में एक सत्य की आवश्यकता नहीं है। नेट पीडीएफ लाइब्रेरी, पीडीएफ टूल्स के लिए कई मुफ्त HTML हैं , जिनमें से कई कमांड लाइन से चल सकते हैं।

एक समाधान उन लोगों में से एक को चुनना होगा और उसके बाद सी # में एक पतली आवरण लिखना होगा। उदाहरण के लिए, इस ट्यूटोरियल में किया गया है।


यह आपके पास मौजूद किसी भी अन्य आवश्यकताओं पर निर्भर करता है।

एक वास्तव में सरल लेकिन आसानी से तैनाती समाधान एचटीएमएल लोड करने के लिए वेबब्राउज़र नियंत्रण का उपयोग करना और फिर स्थानीय रूप से स्थापित पीडीएफ प्रिंटर पर प्रिंट विधि प्रिंटिंग का उपयोग करना है। कई मुफ्त पीडीएफ प्रिंटर उपलब्ध हैं और वेबब्रोसर नियंत्रण नेट फ्रेमवर्क का हिस्सा है।

संपादित करें: यदि आप एचटीएमएल PDFizer है तो आप नौकरी करने के लिए PDFizer का उपयोग कर सकते हैं।


पीडीएफ विजन अच्छा है। हालांकि, आपको इसका उपयोग करने के लिए पूर्ण ट्रस्ट होना चाहिए। मैंने पहले ही ईमेल किया है और पूछा है कि क्यों मेरा एचटीएमएल सर्वर पर परिवर्तित नहीं किया जा रहा था, लेकिन यह स्थानीयहोस्ट पर ठीक काम करता था।


आवश्यक पीडीएफ का उपयोग एचटीएमएल को पीडीएफ में परिवर्तित करने के लिए किया जा सकता है: सी # नमूना । यहां से जुड़ा नमूना एएसपी.नेट आधारित है, लेकिन पुस्तकालय का उपयोग विंडोज फॉर्म, डब्ल्यूपीएफ, एएसपी.नेट वेबफॉर्म, और एएसपी.नेट एमवीसी से किया जा सकता है। पुस्तकालय विभिन्न HTML प्रतिपादन इंजनों का उपयोग करने का विकल्प प्रदान करता है: इंटरनेट एक्सप्लोरर (डिफ़ॉल्ट) और वेबकिट (सर्वोत्तम आउटपुट)।

यदि आप अर्हता प्राप्त करते हैं तो नियंत्रण के पूरे सूट समुदाय लाइसेंस कार्यक्रम के माध्यम से मुफ्त (वाणिज्यिक अनुप्रयोगों) के लिए भी उपलब्ध है। सामुदायिक लाइसेंस पूर्ण उत्पाद है जिसमें कोई सीमा या वॉटरमार्क नहीं है।

नोट: मैं सिंकफ्यूजन के लिए काम करता हूं।


Winnovative कनवर्टर के साथ आप एक एचटीएमएल स्ट्रिंग को एक पंक्ति में परिवर्तित कर सकते हैं

byte[] outPdfBuffer = htmlToPdfConverter.ConvertHtml(htmlString, baseUrl);

मूल URL का उपयोग HTML स्ट्रिंग में सापेक्ष URL द्वारा संदर्भित छवियों को हल करने के लिए किया जाता है। वैकल्पिक रूप से आप HTML टैग में पूर्ण URL का उपयोग कर सकते हैं या छवि टैग के लिए src = "data: image / png" का उपयोग कर छवियों को एम्बेड कर सकते हैं।

विनोवेटिव कनवर्टर के बारे में 'fubaar' उपयोगकर्ता टिप्पणी के जवाब में, एक सुधार आवश्यक है। कनवर्टर IE को प्रतिपादन इंजन के रूप में उपयोग नहीं करता है। यह वास्तव में किसी भी स्थापित सॉफ्टवेयर पर निर्भर नहीं है और प्रतिपादन वेबकिट इंजन के साथ संगत है।


संपादित करें: पीडीएफएसआरपी का उपयोग करके पीडीएफ के लिए नया सुझाव एचटीएमएल रेंडरर

(Wkhtmltopdf को आजमाने और इसे टालने का सुझाव देने के बाद)

HtmlRenderer.PdfSharp एक 100% पूरी तरह से सी # प्रबंधित कोड है , उपयोग करने में आसान है, थ्रेड सुरक्षित है और सबसे महत्वपूर्ण रूप से मुफ़्त ( नया बीएसडी लाइसेंस ) समाधान है।

प्रयोग

  1. HtmlRenderer.PdfSharp nuget पैकेज डाउनलोड करें।
  2. उदाहरण विधि का प्रयोग करें।

    public static Byte[] PdfSharpConvert(String html)
    {
        Byte[] res = null;
        using (MemoryStream ms = new MemoryStream())
        {
            var pdf = TheArtOfDev.HtmlRenderer.PdfSharp.PdfGenerator.GeneratePdf(html, PdfSharp.PageSize.A4);
            pdf.Save(ms);
            res = ms.ToArray();
        }
        return res;
    }
    

एक बहुत अच्छा वैकल्पिक iTextSharp का एक निशुल्क संस्करण है

संस्करण 4.1.6 तक iTextSharp को 476 तक एलजीपीएल लाइसेंस और संस्करणों के तहत लाइसेंस प्राप्त किया गया था (या यहां तक ​​कि फोर्क भी हो सकते हैं) पैकेज के रूप में उपलब्ध हैं और इसका उपयोग स्वतंत्र रूप से किया जा सकता है। बेशक कोई भी जारी 5+ iTextSharp उपयोग कर सकते हैं।

मैंने अपनी परियोजना पर wkhtmltopdf समाधान को एकीकृत करने की कोशिश की और बाधाओं का एक गुच्छा था।

मैं व्यक्तिगत कारणों से निम्नलिखित कारणों से होस्टेड एंटरप्राइज़ अनुप्रयोगों पर wkhtmltopdf- आधारित समाधानों का उपयोग करने से बचूंगा

  1. सबसे पहले wkhtmltopdf सी ++ लागू नहीं किया गया है सी #, और आपको अपने सी # कोड में एम्बेड करने वाली विभिन्न समस्याओं का अनुभव होगा, खासकर जब आपकी परियोजना के 32 बिट और 64 बिट बिल्डों के बीच स्विचिंग हो। विभिन्न मशीनों पर "अमान्य प्रारूप अपवाद" से बचने के लिए सशर्त परियोजना निर्माण इत्यादि सहित कई कामकाजों को आजमाएं।
  2. यदि आप अपनी खुद की आभासी मशीन का प्रबंधन करते हैं तो ठीक है। लेकिन अगर आपकी परियोजना एक बाधित माहौल में चल रही है जैसे ( Azure (वास्तव में मंगलपैंचिन लेखक द्वारा वर्णित एज़ूर के साथ असंभव है), लोचदार बीनस्टॉक इत्यादि) यह केवल पर्यावरण के लिए wkhtmltopdf के लिए उस वातावरण को कॉन्फ़िगर करने के लिए एक दुःस्वप्न है।
  3. wkhtmltopdf आपके सर्वर के भीतर फाइलें बना रहा है, इसलिए आपको उपयोगकर्ता अनुमतियों को प्रबंधित करना होगा और wkhtmltopdf कहां चल रहा है, जहां "लिखना" पहुंच प्रदान करना होगा।
  4. Wkhtmltopdf एक स्टैंडअलोन एप्लिकेशन के रूप में चल रहा है, इसलिए यह आपके आईआईएस एप्लिकेशन पूल द्वारा प्रबंधित नहीं है । इसलिए आपको इसे किसी अन्य मशीन पर सेवा के रूप में होस्ट करना होगा या आपको अपने प्रोडक्शन सर्वर के साथ बड़ी प्रसंस्करण स्पाइक्स और मेमोरी खपत का अनुभव होगा।
  5. यह पीडीएफ उत्पन्न करने के लिए अस्थायी फ़ाइलों का उपयोग करता है, और मामलों में एडब्ल्यूएस ईसी 2 की तरह, जो वास्तव में धीमी डिस्क है I / o यह एक बड़ी प्रदर्शन समस्या है।
  6. सबसे नफरत है "कई उपयोगकर्ताओं द्वारा रिपोर्ट की गई DLL 'wkhtmltox.dll' त्रुटि लोड करने में असमर्थ।

--- पूर्व संपादन खंड ---

किसी भी व्यक्ति जो सरल अनुप्रयोगों / वातावरण में एचटीएमएल से पीडीएफ उत्पन्न करना चाहता है, मैं अपनी पुरानी पोस्ट को सुझाव के रूप में छोड़ देता हूं।

TuesPechkin

https://www.nuget.org/packages/TuesPechkin/

या खासकर एमवीसी वेब अनुप्रयोगों के लिए (लेकिन मुझे लगता है कि आप इसे किसी भी .NET एप्लिकेशन में उपयोग कर सकते हैं)

Rotativa

https://www.nuget.org/packages/Rotativa/

वे एचटीएमएल को पीडीएफ में परिवर्तित करने के लिए wkhtmtopdf बाइनरी का उपयोग करते हैं। जो पृष्ठों को प्रतिपादित करने के लिए वेबकिट इंजन का उपयोग करता है ताकि यह सीएसएस स्टाइल शीट को भी पार्स कर सके।

वे सी # के साथ निर्बाध एकीकरण का उपयोग करने में आसान प्रदान करते हैं।

Rotativa किसी भी रेजर व्यू से सीधे पीडीएफ उत्पन्न कर सकते हैं।

इसके अतिरिक्त वास्तविक दुनिया वेब अनुप्रयोगों के लिए वे थ्रेड सुरक्षा आदि का भी प्रबंधन करते हैं ...





itextsharp