दिलचस्प पोस्ट
मैं अपने एंड्रॉइड फोन के यूयूआईडी को एक आवेदन में कैसे प्राप्त करूं? JQuery के साथ कई वर्गों का चयन करना ओरेकल में कॉलमों को अल्पविराम विभाजित किए गए मान को विभाजित करें रिलीज कॉम ऑब्जेक्ट बनाम फाइनलरेलीकॉम ऑब्जेक्ट का उपयोग कब किया जाए? फेसबुक ग्राफ़ एपीआई का इस्तेमाल करते हुए पेज की तरह 'पसंद' त्रुटि: xxx डिस्क्वार्ड क्वालिफायर के 'यह' तर्क के रूप में XXX पास करना सीएसएस विभाजन 100% पृष्ठ की ऊँचाई बढ़ाएं awk जगह में संशोधन को बचाने node.js को एक फ़ोल्डर में सभी फाइलों की आवश्यकता है? "गैर-स्थिर विधि का एक स्थैतिक संदर्भ से संदर्भ नहीं किया जा सकता है" का पीछे क्या कारण है? "Excel में संपादित करें" या "फ़ोटो संपादित करें" एक्सटेंशन जोड़ें बूटस्ट्रैप आइकन स्थानीय रूप से लोड किए जाते हैं लेकिन ऑनलाइन नहीं होते हैं मोंगोज़: अद्वितीय होने के लिए फ़ील्ड के संयोजन को कैसे परिभाषित करना है? PHP के लिए सबसे आसान फॉर्म सत्यापन पुस्तकालय? Python के अनुरोध मॉड्यूल का उपयोग करके वेबसाइट पर "लॉग इन" कैसे करें?

एचटीएमएल से पीडीएफ जेनरेट करने के लिए wkhtmltopdf कॉलिंग

मैं एक HTML फ़ाइल से एक पीडीएफ फाइल बनाने का प्रयास कर रहा हूं। थोड़ा मैंने पाया है के आसपास देखने के बाद: wkhtmltopdf परिपूर्ण होना मुझे एएसपी .नेट सर्वर से .exe को कॉल करना होगा। मैंने कोशिश की है:

Process p = new Process(); p.StartInfo.UseShellExecute = false; p.StartInfo.FileName = HttpContext.Current.Server.MapPath("wkhtmltopdf.exe"); p.StartInfo.Arguments = "TestPDF.htm TestPDF.pdf"; p.Start(); p.WaitForExit(); 

सर्वर पर बनाई गई किसी भी फाइल की सफलता के साथ नहीं। क्या कोई मुझे सही दिशा में एक संकेतक दे सकता है? मैं साइट के शीर्ष स्तर निर्देशिका पर wkhtmltopdf.exe फ़ाइल डाल दिया। क्या कहीं और रखा जाना चाहिए?


संपादित करें: यदि कोई भी गतिशील रूप से html से पीडीएफ फाइल बनाने के लिए बेहतर उपाय है, तो कृपया मुझे बताएं

वेब के समाधान से एकत्रित समाधान "एचटीएमएल से पीडीएफ जेनरेट करने के लिए wkhtmltopdf कॉलिंग"

अद्यतन करें:
मेरा जवाब नीचे, डिस्क पर पीडीएफ फाइल बनाता है। मैंने तब उस फ़ाइल को उपयोगकर्ता ब्राउज़र में एक डाउनलोड के रूप में स्ट्रीम किया था। हाथ की जवाब की तरह कुछ का उपयोग करने के लिए नीचे देखें wkhtml2pdf को एक स्ट्रीम में आउटपुट के बजाय प्राप्त करने के लिए और फिर उसे सीधे उपयोगकर्ता को भेजें – जो फ़ाइल अनुमतियों आदि के साथ बहुत सारे मुद्दों को बाई करेगा।

मेरा मूल जवाब:
सुनिश्चित करें कि आपने PDF के लिए एक आउटपुट पथ निर्दिष्ट किया है जो आपके सर्वर पर चलने वाले IIS की ASP.NET प्रक्रिया (आमतौर पर NETWORK_SERVICE मुझे लगता है) द्वारा लिखने योग्य है।

मेरा इस तरह दिखता है (और यह काम करता है):

 /// <summary> /// Convert Html page at a given URL to a PDF file using open-source tool wkhtml2pdf /// </summary> /// <param name="Url"></param> /// <param name="outputFilename"></param> /// <returns></returns> public static bool HtmlToPdf(string Url, string outputFilename) { // assemble destination PDF file name string filename = ConfigurationManager.AppSettings["ExportFilePath"] + "\\" + outputFilename + ".pdf"; // get proj no for header Project project = new Project(int.Parse(outputFilename)); var p = new System.Diagnostics.Process(); p.StartInfo.FileName = ConfigurationManager.AppSettings["HtmlToPdfExePath"]; string switches = "--print-media-type "; switches += "--margin-top 4mm --margin-bottom 4mm --margin-right 0mm --margin-left 0mm "; switches += "--page-size A4 "; switches += "--no-background "; switches += "--redirect-delay 100"; p.StartInfo.Arguments = switches + " " + Url + " " + filename; p.StartInfo.UseShellExecute = false; // needs to be false in order to redirect output p.StartInfo.RedirectStandardOutput = true; p.StartInfo.RedirectStandardError = true; p.StartInfo.RedirectStandardInput = true; // redirect all 3, as it should be all 3 or none p.StartInfo.WorkingDirectory = StripFilenameFromFullPath(p.StartInfo.FileName); p.Start(); // read the output here... string output = p.StandardOutput.ReadToEnd(); // ...then wait n milliseconds for exit (as after exit, it can't read the output) p.WaitForExit(60000); // read the exit code, close process int returnCode = p.ExitCode; p.Close(); // if 0 or 2, it worked (not sure about other values, I want a better way to confirm this) return (returnCode == 0 || returnCode == 2); } 

मुझे एक ही समस्या थी जब मैंने एक एमएसएमएक् करने की कोशिश की खिड़की सेवा के साथ, लेकिन यह किसी कारण से बहुत धीमी थी (प्रक्रिया हिस्सा)।

यह अंततः काम किया जाता है:

 private void DoDownload() { var url = Request.Url.GetLeftPart(UriPartial.Authority) + "/CPCDownload.aspx?IsPDF=False?UserID=" + this.CurrentUser.UserID.ToString(); var file = WKHtmlToPdf(url); if (file != null) { Response.ContentType = "Application/pdf"; Response.BinaryWrite(file); Response.End(); } } public byte[] WKHtmlToPdf(string url) { var fileName = " - "; var wkhtmlDir = "C:\\Program Files\\wkhtmltopdf\\"; var wkhtml = "C:\\Program Files\\wkhtmltopdf\\wkhtmltopdf.exe"; var p = new Process(); p.StartInfo.CreateNoWindow = true; p.StartInfo.RedirectStandardOutput = true; p.StartInfo.RedirectStandardError = true; p.StartInfo.RedirectStandardInput = true; p.StartInfo.UseShellExecute = false; p.StartInfo.FileName = wkhtml; p.StartInfo.WorkingDirectory = wkhtmlDir; string switches = ""; switches += "--print-media-type "; switches += "--margin-top 10mm --margin-bottom 10mm --margin-right 10mm --margin-left 10mm "; switches += "--page-size Letter "; p.StartInfo.Arguments = switches + " " + url + " " + fileName; p.Start(); //read output byte[] buffer = new byte[32768]; byte[] file; using(var ms = new MemoryStream()) { while(true) { int read = p.StandardOutput.BaseStream.Read(buffer, 0,buffer.Length); if(read <=0) { break; } ms.Write(buffer, 0, read); } file = ms.ToArray(); } // wait or exit p.WaitForExit(60000); // read the exit code, close process int returnCode = p.ExitCode; p.Close(); return returnCode == 0 ? file : null; } 

धन्यवाद ग्राहम एम्ब्रोस और बाकी सभी

ठीक है, तो यह एक पुराना सवाल है, लेकिन एक उत्कृष्ट एक और जब से मुझे कोई अच्छा जवाब नहीं मिला, मैंने अपना खुद बनाया 🙂 इसके अलावा, मैंने इस सुपर सरल परियोजना को गिटहब को पोस्ट किया है।

यहां कुछ नमूना कोड है:

 var pdfData = HtmlToXConverter.ConvertToPdf("<h1>SOO COOL!</h1>"); 

यहां कुछ प्रमुख बिंदु हैं:

  • कोई पी / आग्रह नहीं
  • कोई नई प्रक्रिया नहीं बना रही है
  • कोई फ़ाइल-सिस्टम नहीं (सभी रैम में)
  • Intellisense, आदि के साथ नेटिव .NET DLL
  • एक पीडीएफ या पीएनजी ( HtmlToXConverter.ConvertToPng ) उत्पन्न करने की योग्यता

Wkhtmltopdf लाइब्रेरी के लिए सी # रैपर लाइब्रेरी (पी / इंवेक का उपयोग करके) देखें : https://github.com/pruiz/WkHtmlToXSharp

कई कारण हैं कि यह आम तौर पर एक बुरा विचार है। यदि आप दुर्घटना होने पर एक्जीक्यूटेबल्स को नियंत्रित करने जा रहे हैं, जो कि पैदा की जाती है लेकिन स्मृति में रहती रहती है? इनकार के सेवा के हमलों के बारे में, या यदि कुछ दुर्भावनापूर्ण टेस्ट पीडीएफ एचटीएम में मिलता है?

मेरी समझ यह है कि ASP.NET उपयोगकर्ता खाते को स्थानीय रूप से लॉगऑन का अधिकार नहीं होगा। इसे निष्पादन योग्य तक पहुंचने और फ़ाइल सिस्टम पर लिखने के लिए सही फ़ाइल अनुमतियां भी होनी चाहिए। आपको स्थानीय सुरक्षा नीति को संपादित करने और एएसपीएनईटी उपयोगकर्ता खाते (शायद एएसपीएनईटी) स्थानीय रूप से लॉगऑन करने की आवश्यकता है (यह डिफ़ॉल्ट रूप से सूची को अस्वीकार कर सकता है)। उसके बाद आपको अन्य फाइलों के लिए NTFS फाइल सिस्टम पर अनुमतियों को संपादित करना होगा। यदि आप एक साझा होस्टिंग वातावरण में हैं तो आपको आवश्यक विन्यास को लागू करना असंभव हो सकता है।

इस तरह एक बाह्य निष्पादन योग्य का उपयोग करने का सबसे अच्छा तरीका है एएसपी.नेट कोड से नौकरी की कतार और किसी तरह की सेवा की कतार की निगरानी करें यदि आप ऐसा करते हैं तो आप अपने आप को हर प्रकार की बुरी चीजों से बचाएंगे। उपयोगकर्ता खाते को बदलने के साथ रखरखाव के मुद्दों को मेरे विचार में प्रयास के लायक नहीं हैं, और एक सेवा की स्थापना या अनुसूचित नौकरी एक दर्द है, इसकी सिर्फ एक बेहतर डिजाइन एएसपी.नेट पृष्ठ को आउटपुट के लिए परिणाम कतार का चुनाव करना चाहिए और आप उपयोगकर्ता को प्रतीक्षा पेज के साथ पेश कर सकते हैं। यह ज्यादातर मामलों में स्वीकार्य है

आप wkhtmltopdf को "आउटपुट फाइल" के रूप में निर्दिष्ट करके इसे आउटपुट को दक्षिण में भेज सकते हैं। आप तब प्रक्रिया से आउटपुट को प्रतिक्रिया स्ट्रीम में पढ़ सकते हैं और फ़ाइल सिस्टम को लिखने के साथ अनुमति मुद्दों से बच सकते हैं।

प्रश्न / उत्तर / उपरोक्त सभी टिप्पणियों के लिए धन्यवाद मैं इस पर आया था जब मैं WKHTML को पीडीएफ के लिए अपनी सी # आवरण लिख रहा था और उसने मुझे कई समस्याओं का उत्तर दिया मैंने इस बारे में एक ब्लॉग पोस्ट में लिखना समाप्त किया – जिसमें मेरी आवरण भी शामिल है (आपको इसमें कोई संदेह नहीं है कि ऊपर से प्रविष्टियों से "प्रेरणा" मेरे कोड में निकलती है …)

http://icanmakethiswork.blogspot.de/2012/04/making-pdfs-from-html-in-c-using.html

धन्यवाद फिर लोग!

एएसपी। नेट प्रक्रिया में शायद निर्देशिका तक लिखना पहुंच नहीं है।

इसे %TEMP% पर लिखने का प्रयास करें, और देखें कि क्या यह काम करता है।

इसके अलावा, अपने एएसपी। नेट पेज को प्रोसेस की स्टडआउट और स्टेडरर गूंज करें, और त्रुटि संदेशों की जांच करें।

आम तौर पर कोड वापसी = 0 आ रही है यदि पीडीएफ फाइल ठीक से और सही तरीके से बनाई गई है। यदि यह नहीं बनाया गया है तो मान -ve श्रेणी में है।

 using System; using System.Diagnostics; using System.Web; public partial class pdftest : System.Web.UI.Page { protected void Page_Load(object sender, EventArgs e) { } private void fn_test() { try { string url = HttpContext.Current.Request.Url.AbsoluteUri; Response.Write(url); ProcessStartInfo startInfo = new ProcessStartInfo(); startInfo.FileName = @"C:\PROGRA~1\WKHTML~1\wkhtmltopdf.exe";//"wkhtmltopdf.exe"; startInfo.Arguments = url + @" C:\test" + Guid.NewGuid().ToString() + ".pdf"; Process.Start(startInfo); } catch (Exception ex) { string xx = ex.Message.ToString(); Response.Write("<br>" + xx); } } protected void btn_test_Click(object sender, EventArgs e) { fn_test(); } }