PdfViewer throws "Unsupported Stream Type" when using Memorystream

2 posts, 1 answers
  1. Johannes
    Johannes avatar
    16 posts
    Member since:
    Nov 2012

    Posted 20 Aug 2014 Link to this post

    I'm creating a PDF file using the PdfStamper in iTextSharp and return the PDF as a memorystream object to the calling function, that is then used to display the PDF in Teleriks PDF Viewer Component for WinForms. That's the objective.Right now, creating the PDF works as it should, and it returns the data to the Calling function, and in the Calling function, should I write the memorystream contents to a file stream and then open it in Adobe Reader Everything looks just fine.However, if I choose to display the PDF in the PDF Viewer Control I just get an "Unsupported Stream type" error.Now, I figured something was wrong in the PDF data so I decided to create the PDF file, save it to disk, then read it to a memorystream in the Calling function and display that memorystream in the PDF Viewer and that, for some to me unknown reason, works.... I really can't get my head around this and need some help.

    So, this won't work:

    //The Calling function
        private void dlgViewPDF_Load(object sender, EventArgs e)
    {
        MemoryStream ms = PDFcreator.GeneratePDFdata(id);
     
       rPdfView.LoadDocument(ms);
    }
     
    //The PDF generator
    public static MemoryStream GeneratePDFdata(string id)
    {
                MemoryStream ms = new MemoryStream();
     
                string sTemplate = string.Concat(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "\\template.pdf");
     
                PdfReader pdfReader = new PdfReader(sTemplate);
                PdfStamper pdfStamper = new PdfStamper(pdfReader, ms);
     
                PdfContentByte cb = pdfStamper.GetOverContent(1);
     
                BaseFont baseFont = BaseFont.CreateFont(BaseFont.HELVETICA, BaseFont.CP1250, BaseFont.EMBEDDED);
                BaseFont baseFontBold = BaseFont.CreateFont(BaseFont.HELVETICA_BOLD, BaseFont.CP1250, BaseFont.EMBEDDED);
                cb.SetColorFill(iTextSharp.text.Color.BLACK);
                cb.SetFontAndSize(baseFontBold, 14);
     
                cb.BeginText();
                cb.ShowTextAligned(PdfContentByte.ALIGN_LEFT, "TEST!!", 385, 750, 0);
                cb.EndText();
     
                cb.SetColorStroke(new CMYKColor(0f, 0f, 0f, 1f));
                cb.SetColorFill(new CMYKColor(0f, 0f, 0f, 1f));
     
                cb.MoveTo(139, 398);
                cb.LineTo(146, 398);
                cb.LineTo(146, 391);
                cb.LineTo(139, 391);
                cb.ClosePathEoFillStroke();
     
                pdfStamper.Close();
                pdfReader.Close();
     
                return ms;
    }

    But this WILL work:
    //The Calling function
    private void dlgViewPDF_Load(object sender, EventArgs e)
    {
        MemoryStream ms = new MemoryStream();
     
        FileStream file = new FileStream(@"c:\temp\testfile.pdf", FileMode.Open, FileAccess.Read);
     
        byte[] bytes = new byte[file.Length];
        file.Read(bytes, 0, (int)file.Length);
        ms.Write(bytes, 0, (int)file.Length);
     
        rPdfView.LoadDocument(ms);
    }
     
     
    //The PDF generator
    public static void GeneratePDFdata(string id)
    {
                MemoryStream ms = new MemoryStream();
     
                string sTemplate = string.Concat(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), "\\template.pdf");
     
                PdfReader pdfReader = new PdfReader(sTemplate);
     
                FileStream fs = new FileStream(@"c:\temp\testfile.pdf", FileMode.Create, FileAccess.Write, FileShare.None);
                PdfStamper pdfStamper = new PdfStamper(pdfReader, fs);
     
                PdfContentByte cb = pdfStamper.GetOverContent(1);
     
                BaseFont baseFont = BaseFont.CreateFont(BaseFont.HELVETICA, BaseFont.CP1250, BaseFont.EMBEDDED);
                BaseFont baseFontBold = BaseFont.CreateFont(BaseFont.HELVETICA_BOLD, BaseFont.CP1250, BaseFont.EMBEDDED);
                cb.SetColorFill(iTextSharp.text.Color.BLACK);
                cb.SetFontAndSize(baseFontBold, 14);
     
                cb.BeginText();
                cb.ShowTextAligned(PdfContentByte.ALIGN_LEFT, "TEST!!", 385, 750, 0);
                cb.EndText();
     
                cb.SetColorStroke(new CMYKColor(0f, 0f, 0f, 1f));
                cb.SetColorFill(new CMYKColor(0f, 0f, 0f, 1f));
     
                cb.MoveTo(139, 398);
                cb.LineTo(146, 398);
                cb.LineTo(146, 391);
                cb.LineTo(139, 391);
                cb.ClosePathEoFillStroke();
     
                pdfStamper.Close();
                pdfReader.Close();
    }

    But why? I'd rather keep it all in memory and let the user save the resulting PDF if he/she so wishes than having to write it to disk and then displaying it.
    Am I missing some crucial step here?


  2. Answer
    Johannes
    Johannes avatar
    16 posts
    Member since:
    Nov 2012

    Posted 21 Aug 2014 in reply to Johannes Link to this post

    I managed to solve it using pdfStamper.CloseStream = false;

    Now it works like a charm. :)
  3. UI for WinForms is Visual Studio 2017 Ready
Back to Top