ITextSharp - שגיאה לא ברורה..
-
כתבתי את הקוד הבא לפעולת שרת שאמורה להחזיר קובץ PDF של קבלה:
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(); } //ממיר את הרייזור לסטרינג של HTML string html = AVRHelperMethod.RenderViewToString(ControllerContext, "~/Views/ManageOrganization/CreateRecieptInHtml.cshtml", donat, true); string fileName = "RecieptNo" + donat.Id + "Date" + DateTime.Now+".pdf"; using (StringWriter sw = new StringWriter()) { using (HtmlTextWriter hw = new HtmlTextWriter(sw)) { //Export HTML String as PDF. StringReader sr = new StringReader(html); Document pdfDoc = new Document(iTextSharp.text.PageSize.A4, 10f, 10f, 10f, 0f); HTMLWorker htmlparser = new HTMLWorker(pdfDoc); using (PdfWriter writer = PdfWriter.GetInstance(pdfDoc, Response.OutputStream)) { pdfDoc.Open(); htmlparser.Parse(sr); pdfDoc.Close(); } Response.ContentType = "application/pdf"; Response.AddHeader("content-disposition", "attachment;filename=" + fileName); Response.Cache.SetCacheability(HttpCacheability.NoCache); Response.Write(pdfDoc); Response.End(); } } //לא ידעתי מה לכתוב ב return return null; }
הבעיה היא שבשורה 28 הוא זורק לי שגיאה: "ההפניה לאובייקט לא הוגדרה למופע של אובייקט". אולם בתוך האובייקט הזה אכן נמצא הסטרינג המיוחל.. אז מה הוא רוצה ממני?? כמו כן, בכל הדוגמאות שמצאתי באינטרנט כך כתבו וכנראה זה עבד להם - אז מאי שנא?!
פורסם במקור בפורום CODE613 ב16/03/2016 09:49 (+02:00)
-
ייתכן שבדוגמאות באינטרט השתמשו עם דירסאות ישנות יותר.
לפי מה שנראה הPdfWriter מחסל את המסמך אולי בגלל טיפול כושל בשגיאה פנימית.
בסטאק יש תשובה ארוכה (http://stackoverflow.com/a/25164258/1271037) עם שלוש דוגמאות, ניסיתי לפחות את הראשונה והיא עובדת אבל כפי שהוא כתב היא לא יודעת לטפל בCSS שאיננו מוטמע באלמנט.
תוכל לנסות את האחרות. למשל זה עובד לי:byte[] content; using (var ms = new MemoryStream()) { using (var doc = new Document()) { using (var writer = PdfWriter.GetInstance(doc, ms)) { doc.Open(); using (var htmlWorker = new iTextSharp.text.html.simpleparser.HTMLWorker(doc)) using (var sr = new StringReader(html)) htmlWorker.Parse(sr); doc.Close(); } } content = ms.ToArray(); }
בכל מקרה הכתיבה של המתודה לא מתאימה לMVC כי המתודה אמורה להחזיר בעצמה את התשובה בצורת FIleContentResult או FileStreamResult. חפש mvc action pdf result.
פורסם במקור בפורום CODE613 ב16/03/2016 16:18 (+02:00)
-
אני חושב שאתה אמור לשמור את הקובץ PDF בשרת, ואז להחזיר לינק לקובץ, ואם הדפדפן תומך בהצגת קבצי PDF הוא יציג אותו ואם הוא לא תומך הוא יתן אפשרות להוריד אותו.
מיותר ואף מסבך. בסופו של יום מה שמגיע ללקוח זה אותו זרם בתים שנמצא לך בזיכרון. כל דרך שטובה בקובץ פיזי מוגשת ע"י הIIS כתשובת HTTP, אז למה לא לעשות זאת ישירות?
ובכל מקרה השאלה לא הייתה על איך להחזיר PDF, אלא איך לייצר אותו.פורסם במקור בפורום CODE613 ב16/03/2016 19:29 (+02:00)
-
רחמים - נראה לי שחבל לשמור על השרת, חבל סתם לתפוס מקום של האחסון, וגם בשביל מה? זה לא איזה קובץ שאמורים לקרוא אותו מיליון פעם - זה סה"כ קבלה, שהוא צריך פעם אחת ודי. אם ירצה יותר - תמיד יוכל לקבל העתק, אך לא נראה לי שבשביל זה כדאי להחזיק בDB הפניה למיקום בו שמור הקובץ, וגם להחזיק אותו פיזית על השרת.
כמו כן, כמו שדוד ל.ט. אמר כלל לא הצלחתי לייצר את הקובץ.
אכן, כפי שכתבתי באשכול השני בסוף הצלחתי ע"י הספריה שעוטפת את wkhtmltopdf, ואכן זה גם הוריד ישירות את הקובץ ללקוח מהדפדפן.
אך הוא לא מכיר את הספריה של הCSS, וזה כרגע האתגר שאני מנסה להתמודד איתו.פורסם במקור בפורום CODE613 ב16/03/2016 20:40 (+02:00)