דילוג לתוכן
  • דף הבית
  • קטגוריות
  • פוסטים אחרונים
  • משתמשים
  • חיפוש
  • חוקי הפורום
כיווץ
תחומים

תחומים - פורום חרדי מקצועי

💡 רוצה לזכור קריאת שמע בזמן? לחץ כאן!
  1. דף הבית
  2. תכנות
  3. ארכיון code613m
  4. ITextSharp - שגיאה לא ברורה..

ITextSharp - שגיאה לא ברורה..

מתוזמן נעוץ נעול הועבר ארכיון code613m
5 פוסטים 3 כותבים 338 צפיות
  • מהישן לחדש
  • מהחדש לישן
  • הכי הרבה הצבעות
התחברו כדי לפרסם תגובה
נושא זה נמחק. רק משתמשים עם הרשאות מתאימות יוכלו לצפות בו.
  • A מנותק
    A מנותק
    avr416
    כתב ב נערך לאחרונה על ידי
    #1

    כתבתי את הקוד הבא לפעולת שרת שאמורה להחזיר קובץ 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)

    תגובה 1 תגובה אחרונה
    0
    • dovidD מחובר
      dovidD מחובר
      dovid ניהול
      כתב ב נערך לאחרונה על ידי
      #2

      ייתכן שבדוגמאות באינטרט השתמשו עם דירסאות ישנות יותר.
      לפי מה שנראה ה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)

      מנטור אישי למתכנתים (ולא רק) – להתקדם לשלב הבא!

      בכל נושא אפשר ליצור קשר dovid@tchumim.com

      תגובה 1 תגובה אחרונה
      1
      • רחמיםר מנותק
        רחמיםר מנותק
        רחמים מורחק
        כתב ב נערך לאחרונה על ידי
        #3

        אני חושב שאתה אמור לשמור את הקובץ PDF בשרת, ואז להחזיר לינק לקובץ, ואם הדפדפן תומך בהצגת קבצי PDF הוא יציג אותו ואם הוא לא תומך הוא יתן אפשרות להוריד אותו.

        פורסם במקור בפורום CODE613 ב16/03/2016 19:15 (+02:00)

        תגובה 1 תגובה אחרונה
        1
        • dovidD מחובר
          dovidD מחובר
          dovid ניהול
          כתב ב נערך לאחרונה על ידי
          #4

          @רחמים

          אני חושב שאתה אמור לשמור את הקובץ PDF בשרת, ואז להחזיר לינק לקובץ, ואם הדפדפן תומך בהצגת קבצי PDF הוא יציג אותו ואם הוא לא תומך הוא יתן אפשרות להוריד אותו.

          מיותר ואף מסבך. בסופו של יום מה שמגיע ללקוח זה אותו זרם בתים שנמצא לך בזיכרון. כל דרך שטובה בקובץ פיזי מוגשת ע"י הIIS כתשובת HTTP, אז למה לא לעשות זאת ישירות?
          ובכל מקרה השאלה לא הייתה על איך להחזיר PDF, אלא איך לייצר אותו.

          פורסם במקור בפורום CODE613 ב16/03/2016 19:29 (+02:00)

          מנטור אישי למתכנתים (ולא רק) – להתקדם לשלב הבא!

          בכל נושא אפשר ליצור קשר dovid@tchumim.com

          תגובה 1 תגובה אחרונה
          1
          • A מנותק
            A מנותק
            avr416
            כתב ב נערך לאחרונה על ידי
            #5

            רחמים - נראה לי שחבל לשמור על השרת, חבל סתם לתפוס מקום של האחסון, וגם בשביל מה? זה לא איזה קובץ שאמורים לקרוא אותו מיליון פעם - זה סה"כ קבלה, שהוא צריך פעם אחת ודי. אם ירצה יותר - תמיד יוכל לקבל העתק, אך לא נראה לי שבשביל זה כדאי להחזיק בDB הפניה למיקום בו שמור הקובץ, וגם להחזיק אותו פיזית על השרת.
            כמו כן, כמו שדוד ל.ט. אמר כלל לא הצלחתי לייצר את הקובץ.
            אכן, כפי שכתבתי באשכול השני בסוף הצלחתי ע"י הספריה שעוטפת את wkhtmltopdf, ואכן זה גם הוריד ישירות את הקובץ ללקוח מהדפדפן.
            אך הוא לא מכיר את הספריה של הCSS, וזה כרגע האתגר שאני מנסה להתמודד איתו.

            פורסם במקור בפורום CODE613 ב16/03/2016 20:40 (+02:00)

            תגובה 1 תגובה אחרונה
            0

            בא תתחבר לדף היומי!
            • התחברות

            • אין לך חשבון עדיין? הרשמה

            • התחברו או הירשמו כדי לחפש.
            • פוסט ראשון
              פוסט אחרון
            0
            • דף הבית
            • קטגוריות
            • פוסטים אחרונים
            • משתמשים
            • חיפוש
            • חוקי הפורום