Henric
Henric

Reputation: 1410

Convert in-memory pdf to byte[]

I'm writing a websercive in C# that will generate pdf-files and send back to the caller as a byte[]. The pdf file is generated using a third party component, but I'm struggling with the conversion. The pdf is just an in-memory object in the web service, and I can't find any good way of converting the generated pdf to a byte[] before returning it to the caller. Any advice on this?

Edited for clarification:

I'm working with a pdf in-memory object (Aspose.pdf Pdf-object to be precise) which is constructed in the webservice using the data sent in to the web service. It is never saved by the webservice, the caller should convert the byte[] back to a pdf-file and save it on their end.

Upvotes: 1

Views: 5834

Answers (3)

Lee Smith
Lee Smith

Reputation: 6737

I remember doing something similar with Aspose.pdf a while back. Here's some POC code I wrote that opens a PDF page and steams it back. Hope it helps..

   public ActionResult Index(int pageNumber)
    {


        ActionResult result = null;
        var path = Server.MapPath("~/Content/BigPdf.pdf");

        if (pageNumber == 0)
        {

            result = new FilePathResult(path, "application/pdf");
        }

        else
        {
            string inFile = path;

            string outFile = ".\\ExtractStream.pdf";



            //Creating stream objects holding the PDF files in Open Mode

            var inStream = new FileStream(inFile, FileMode.Open);


            //Creating output stream object that will store the extracted pages as a PDF file

            var outputStream = new MemoryStream();



            //Instantiating PdfFileEditor object

            var editor = new PdfFileEditor();



            //Creating an array of integers having numbers of the pages to be extracted from PDF file

            var pages = new int[] { pageNumber };



            //Calling Extract method

            editor.Extract(inStream, pages, outputStream);
            inStream.Close();


            //Closing output stream
            outputStream.Seek(0, SeekOrigin.Begin);//rewind stream


            var converter = new PdfConverter();

            converter.BindPdf(outputStream);

            converter.DoConvert();


            var imageStream = new MemoryStream();

            while (converter.HasNextImage())
            {

                converter.GetNextImage(imageStream, ImageFormat.Jpeg );



            }



            imageStream.Seek(0, SeekOrigin.Begin);//rewind stream

            result = new FileStreamResult(imageStream, "image/Jpeg");


        }

        return result;

    }

Upvotes: 1

C.Evenhuis
C.Evenhuis

Reputation: 26446

You can apparently Save() the document to a stream object:

http://www.aspose.com/documentation/.net-components/aspose.pdf-for-.net/aspose.pdf.pdf.save_overload_3.html

You could probably create a MemoryStream object and send that to the Save() method to fetch the binary data.

Upvotes: 2

Oded
Oded

Reputation: 498972

If the PDF library allows to save to a stream, you can stream it to a MemoryStream - from this you can get your byte[] by calling GetBuffer.

Upvotes: 6

Related Questions