wkhtmltopdf: שגיאת "שרת לא נמצא"
-
טוב, אז אני כבר מיואש..
אני יורה לכל הכיוונים ומנסה להשתמש בכל מיני אפשרויות כדי להמיר מHTML ל PDF ובשום צורה אני לא מצליח..
אני כבר יומיים על הסיפור הזה.. ואני מתחיל להתייאש
ניסיתי שוב עם wkhtml והפעם בעטיפה אחרת :lol: - ע"י הספריה הזאת שהוספתי אותה דרך NuGet, והקוד הוא כזה:string fileName = "RecieptNo" + donat.Id + "Date" + DateTime.Now + ".pdf"; string url = Url.Action("CreateRecieptInHtml", new { id = id }); MemoryStream memory = new MemoryStream(); PdfDocument document = new PdfDocument() { Url = url }; PdfOutput output = new PdfOutput() { OutputStream = memory }; PdfConvert.ConvertHtmlToPdf(document, output); memory.Position = 0; return File(memory, "application/pdf", Server.UrlEncode(fileName));
ואני מקבל את השגיאה הזאת: "Exit with code 1 due to network error: HostNotFoundError".
וביתר הרחבה:Html to PDF conversion of '/ManageOrganization/CreateRecieptInHtml/40' failed. Wkhtmltopdf output: Loading pages (1/6) [> ] 0% [======> ] 10% Error: Failed loading page http:///ManageOrganization/CreateRecieptInHtml/40 (sometimes it will work just to ignore this error with --load-error-handling ignore) Exit with code 1 due to network error: HostNotFoundError
את אותה שגיאה קיבלתי גם כשהשתמשתי בספריה הקודמת שהזכרתי : , אבל חשבתי שאולי הבעיה שזה לא רץ על localhost.. אח"כ חשבתי שאולי הבעיה היא שהוא לא מצליח לטעון את הHTML מהשרת כי אין לו את ההרשאה הדרושה - אז הוספתי [AllowAnonimous] מעל הפונקציה הזאת, אך דבר לא הועיל...
אשמח לעזרה!!
תודה רבה רבה!
אברהםפורסם במקור בפורום CODE613 ב16/03/2016 10:33 (+02:00)
-
אתה פונה בשרת לurl של עצמך בשביל לקבל את הhtml? גם אחרי שנפתור את בעייתך כדאי לפשט את המסורבלות הזו.
אבל השגיאה אצלך ברורה מאוד: שמת בריקפוינט לבדוק מה הurl? הוא יחסי, ונראה ככה: "/CreateRecieptInHtml?id=50". אז בשביל הדפדפן זה כתובת יחסית לדף בו הוא נמצא משא"כ בצד השרת. כתובת מוחלטת אתה יכול להשיג ככה http://stackoverflow.com/a/3066943/1271037.אבל כל הסיפור הזה לתשאל את השרת כדי לבל את הhtml מרונדר נראה לי סיבוך. חיפשתי בגוגל איך לגשת לפלט של razor מצד השרת (mvc action get output string) ומצאתי http://stackoverflow.com/a/2759898/1271037. קח את התוצאה השניה, ואז עם הסטרינג (שזה למעשה הhtml שאחרי רנדור הrazor) שים לממיר במקום url ככה:
PdfDocument document = new PdfDocument() { Html = MyRenderedString };
פורסם במקור בפורום CODE613 ב16/03/2016 13:34 (+02:00)
-
@דוד ל.ט.
אבל כל הסיפור הזה לתשאל את השרת כדי לבל את הhtml מרונדר נראה לי סיבוך. חיפשתי בגוגל איך לגשת לפלט של razor מצד השרת (mvc action get output string) ומצאתי http://stackoverflow.com/a/2759898/1271037. קח את התוצאה השניה, ואז עם הסטרינג (שזה למעשה הhtml שאחרי רנדור הrazor) שים לממיר במקום url ככה:
PdfDocument document = new PdfDocument() { Html = MyRenderedString };
מעולה!! זה אכן עובד עכשיו.
בהתחלה באמת ניסיתי עם סטרינג וזה לא עבד.. אז חשבתי שאולי אם הוא יגש בצורה עצמאית לשרת זה יעבוד יותר טוב, וניסיתי גם את הדרך הזאת שגם היא לא עבדה...
גם לאחר ששיניתי זה זרק שגיאה, אבל אז הוספתי את השורה הזאת שמורה לו להתעלם משגיאות: " --load-media-error-handling ignore " של כשל בטעינה של ספריות חיצוניות וזה אכן עובד..
העניין הוא שלא הצלחתי למצוא איך לשלוח לו את הפרמטר הזה, אז חזרתי לספריה הראשונה שניסיתי () וזה אכן עבד.
לסיכומו של ענין הנה הקוד המלא - אם זה יעזור למישהו:public ActionResult CreateReciept(int? id) { if (id == null) { return new HttpStatusCodeResult(HttpStatusCode.BadRequest); } var donat = loadDonationsVM().Where(x => x.Id == id).FirstOrDefault(); if (donat == null) { return HttpNotFound(); } string fileName = "RecieptNo" + donat.Id + ".pdf"; string html = AVRHelperMethod.RenderViewToString(ControllerContext, "~/Views/ManageOrganization/CreateRecieptInHtml.cshtml", donat, true); MemoryStream memory = new MemoryStream(); var htmlToPDF = new HtmlToPdfConverter(); var pdfBytes = htmlToPDF.GeneratePdf(html); htmlToPDF.CustomWkHtmlArgs = " --load-media-error-handling ignore "; htmlToPDF.GeneratePdf(html, null, memory); memory.Position = 0; return File(memory, "application/pdf", Server.UrlEncode(fileName)); }
תודה רבה!
פורסם במקור בפורום CODE613 ב16/03/2016 15:41 (+02:00)
-
הנה קובץ לדוגמא:
RecieptNo42 (4).pdf
השתמשתי בספריה שהזכרתי ואכן היא עושה את העבודה בצורה מאד פשוטה והיא כוללת גם את התמונות וקבצי הCSS הכלולים בHTML.
צריך רק שההפניה אליהם תהיה עם URL מוחלט ולא יחסי, וזה עובד יופי.
רק הבעיה היא שזה לא רץ על AZURE ולכן אני צריך לנסות לעשות זאת עם ITextSharp שזה קצת יותר מסובך..תודה לכולם!
פורסם במקור בפורום CODE613 ב16/03/2016 21:14 (+02:00)