You are viewing a plain text version of this content. The canonical link for it is here.
Posted to batik-users@xmlgraphics.apache.org by Dylan Browne <db...@mango-solutions.com> on 2006/06/19 13:25:57 UTC

Streaming SVG Document without creating temporary file

Hi,

 

I was looking for way to improve my code where I stream an SVG Document
(created using Batik DOM) to a browser. So basically I need to get from SVG
Document to a byte[] which can be passed via Servlet which sets the Mime
type, and so displayed. 

 

Currently I use my method below, but as part of this method I am creating a
file object and retrieving my byte[] from that. Ideally (it may actually
become a requirement) I'd like to avoid this step and be able to retrieve a
byte[] without creating a file object.

 

Thanks in advance for any help,

 

Regards,

Dylan

 

 

 

    public static void streamSVGIntoImageFormat(HttpSession session,
Document doc, String mimeType) {

        try {

            ImageTranscoder t = null;

            if (mimeType.equals(Config.JPEG)) {

                t = new JPEGTranscoder();

                t.addTranscodingHint(JPEGTranscoder.KEY_QUALITY, new
Float(.8));

            } else if (mimeType.equals(Config.PNG)) {

                t = new PNGTranscoder();

            } else if (mimeType.equals(Config.TIFF)) {

                t = new TIFFTranscoder();

            } else {

                System.out.println("ERROR: A request to stream an image was
recieved with an unsupported mime type: " + mimeType);

                return;

            }

            TranscoderInput input = new TranscoderInput(doc);

            OutputStream ostream = new FileOutputStream("c:\\out." +
mimeType);

            TranscoderOutput output = new TranscoderOutput(ostream);

            t.transcode(input, output);

            ostream.flush();

            ostream.close();

            byte[] bytes = getBytesFromFile(new File("c:\\out." +
mimeType));

            session.setAttribute("jpegbytes", bytes);

            session.setAttribute("mimeType", mimeType);

        } catch (Exception e) {

            e.printStackTrace();

            System.out.println("Error in streaming SVG because " +
e.getMessage());

        }

    }

 

 

 


RE: Streaming SVG Document without creating temporary file

Posted by Dylan Browne <db...@mango-solutions.com>.
Thanks Javid and Thomas for the replies,

 

Have got it working now after reading your suggestions.... just to close the
thread in case anyone else is looking for similar in the future, required
code looks something like this (of course adding the flushing/closing of
streams).....

 

            TranscoderInput input = new TranscoderInput(doc);

            OutputStream ostream = new ByteArrayOutputStream();

            TranscoderOutput output = new TranscoderOutput(ostream);

            t.transcode(input, output);

            ByteArrayOutputStream result =
(ByteArrayOutputStream)output.getOutputStream();

byte[] bytes = result.toByteArray();

 

Thanks as ever for the help,

 

Cheers,

Dylan.

 

 

-----Original Message-----
From: thomas.deweese@kodak.com [mailto:thomas.deweese@kodak.com] 
Sent: 19 June 2006 21:07
To: batik-users@xmlgraphics.apache.org
Cc: batik-users@xmlgraphics.apache.org
Subject: Re: Streaming SVG Document without creating temporary file

 

Hi Dylan,

 

"Dylan Browne" <db...@mango-solutions.com> wrote on 06/19/2006 07:25:57 

AM:

 

> I was looking for way to improve my code where I stream an SVG Document 

> (created using Batik DOM) to a browser. So basically I need to get from 

SVG 

> Document to a byte[] which can be passed via Servlet which sets the Mime 

type,

> and so displayed. 

 

   Well the transcoder can take _any_ OutputStream.  Usually the

servlet provides an output stream that could be passed directly to

the Transcoder.  Alternately you can use java.io.ByteArrayOutputStream

which simply stores all the content in memory which you can retrieve

as a byte[].

 

> Currently I use my method below, but as part of this method I am 

creating a 

> file object and retrieving my byte[] from that. Ideally (it may actually 

 

> become a requirement) I?d like to avoid this step and be able to 

retrieve a 

> byte[] without creating a file object.

 

>             OutputStream ostream = new FileOutputStream("c:\\out." + 

mimeType);

>             TranscoderOutput output = new TranscoderOutput(ostream);

 

 

---------------------------------------------------------------------

To unsubscribe, e-mail: batik-users-unsubscribe@xmlgraphics.apache.org

For additional commands, e-mail: batik-users-help@xmlgraphics.apache.org


Re: Streaming SVG Document without creating temporary file

Posted by th...@kodak.com.
Hi Dylan,

"Dylan Browne" <db...@mango-solutions.com> wrote on 06/19/2006 07:25:57 
AM:

> I was looking for way to improve my code where I stream an SVG Document 
> (created using Batik DOM) to a browser. So basically I need to get from 
SVG 
> Document to a byte[] which can be passed via Servlet which sets the Mime 
type,
> and so displayed. 

   Well the transcoder can take _any_ OutputStream.  Usually the
servlet provides an output stream that could be passed directly to
the Transcoder.  Alternately you can use java.io.ByteArrayOutputStream
which simply stores all the content in memory which you can retrieve
as a byte[].

> Currently I use my method below, but as part of this method I am 
creating a 
> file object and retrieving my byte[] from that. Ideally (it may actually 

> become a requirement) I?d like to avoid this step and be able to 
retrieve a 
> byte[] without creating a file object.

>             OutputStream ostream = new FileOutputStream("c:\\out." + 
mimeType);
>             TranscoderOutput output = new TranscoderOutput(ostream);


---------------------------------------------------------------------
To unsubscribe, e-mail: batik-users-unsubscribe@xmlgraphics.apache.org
For additional commands, e-mail: batik-users-help@xmlgraphics.apache.org


RE: Streaming SVG Document without creating temporary file

Posted by Javid Alimohideen <ja...@gmail.com>.
Hi Dylan,
When you say streaming, do you mean something like streaming animation, or
its just a dynamic document that is rendered on the server side.. The way I
do it in my application I render the SVG on the server side and just stream
the pixels to the client side (application, or a browser window). You could
acheive the same with servlet too. If you would like to do offscreen server
side rendering, take a look at the Batik wiki pages.

Thanks,
Javid
  -----Original Message-----
  From: Dylan Browne [mailto:dbrowne@mango-solutions.com]
  Sent: Monday, June 19, 2006 6:26 AM
  To: batik-users@xmlgraphics.apache.org
  Subject: Streaming SVG Document without creating temporary file


  Hi,



  I was looking for way to improve my code where I stream an SVG Document
(created using Batik DOM) to a browser. So basically I need to get from SVG
Document to a byte[] which can be passed via Servlet which sets the Mime
type, and so displayed.



  Currently I use my method below, but as part of this method I am creating
a file object and retrieving my byte[] from that. Ideally (it may actually
become a requirement) I'd like to avoid this step and be able to retrieve a
byte[] without creating a file object.



  Thanks in advance for any help,



  Regards,

  Dylan







      public static void streamSVGIntoImageFormat(HttpSession session,
Document doc, String mimeType) {

          try {

              ImageTranscoder t = null;

              if (mimeType.equals(Config.JPEG)) {

                  t = new JPEGTranscoder();

                  t.addTranscodingHint(JPEGTranscoder.KEY_QUALITY, new
Float(.8));

              } else if (mimeType.equals(Config.PNG)) {

                  t = new PNGTranscoder();

              } else if (mimeType.equals(Config.TIFF)) {

                  t = new TIFFTranscoder();

              } else {

                  System.out.println("ERROR: A request to stream an image
was recieved with an unsupported mime type: " + mimeType);

                  return;

              }

              TranscoderInput input = new TranscoderInput(doc);

              OutputStream ostream = new FileOutputStream("c:\\out." +
mimeType);

              TranscoderOutput output = new TranscoderOutput(ostream);

              t.transcode(input, output);

              ostream.flush();

              ostream.close();

              byte[] bytes = getBytesFromFile(new File("c:\\out." +
mimeType));

              session.setAttribute("jpegbytes", bytes);

              session.setAttribute("mimeType", mimeType);

          } catch (Exception e) {

              e.printStackTrace();

              System.out.println("Error in streaming SVG because " +
e.getMessage());

          }

      }