You are viewing a plain text version of this content. The canonical link for it is here.
Posted to fop-commits@xmlgraphics.apache.org by ke...@apache.org on 2002/05/27 12:59:08 UTC
cvs commit: xml-fop/src/org/apache/fop/util StreamUtilities.java
keiron 02/05/27 03:59:08
Modified: src/org/apache/fop/pdf ASCII85Filter.java
ASCIIHexFilter.java DCTFilter.java FlateFilter.java
PDFFilter.java PDFICCStream.java PDFStream.java
PDFT1Stream.java PDFTTFStream.java
src/org/apache/fop/tools AreaTreeBuilder.java
Added: src/org/apache/fop/pdf InMemoryStreamCache.java
StreamCache.java TempFileStreamCache.java
src/org/apache/fop/util StreamUtilities.java
Log:
changed pdf streams to use io streams so that they
can be cached
Submitted by: Paul Reavis <pr...@partnersoft.com>
Revision Changes Path
1.4 +15 -19 xml-fop/src/org/apache/fop/pdf/ASCII85Filter.java
Index: ASCII85Filter.java
===================================================================
RCS file: /home/cvs/xml-fop/src/org/apache/fop/pdf/ASCII85Filter.java,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- ASCII85Filter.java 30 Jul 2001 20:29:29 -0000 1.3
+++ ASCII85Filter.java 27 May 2002 10:59:07 -0000 1.4
@@ -1,5 +1,5 @@
/*
- * $Id: ASCII85Filter.java,v 1.3 2001/07/30 20:29:29 tore Exp $
+ * $Id: ASCII85Filter.java,v 1.4 2002/05/27 10:59:07 keiron Exp $
* Copyright (C) 2001 The Apache Software Foundation. All rights reserved.
* For details on use and redistribution please refer to the
* LICENSE file included with these sources.
@@ -9,6 +9,7 @@
import java.io.ByteArrayOutputStream;
import java.io.IOException;
+import java.io.*;
public class ASCII85Filter extends PDFFilter {
private static final char ASCII85_ZERO = 'z';
@@ -30,9 +31,7 @@
return null;
}
- public byte[] encode(byte[] data) {
-
- ByteArrayOutputStream buffer = new ByteArrayOutputStream();
+ public void encode(InputStream in, OutputStream out, int length) throws IOException {
int i;
int total = 0;
@@ -40,16 +39,16 @@
// first encode the majority of the data
// each 4 byte group becomes a 5 byte group
- for (i = 0; i + 3 < data.length; i += 4) {
+ for (i = 0; i + 3 < length; i += 4) {
- long val = ((data[i] << 24)
+ long val = ((in.read() << 24)
& 0xff000000L) // note: must have the L at the
- + ((data[i + 1] << 16) & 0xff0000L) // end, otherwise you get into
- + ((data[i + 2] << 8) & 0xff00L) // weird signed value problems
- + (data[i + 3] & 0xffL); // cause we're using a full 32 bits
+ + ((in.read() << 16) & 0xff0000L) // end, otherwise you get into
+ + ((in.read() << 8) & 0xff00L) // weird signed value problems
+ + (in.read() & 0xffL); // cause we're using a full 32 bits
byte[] conv = convertWord(val);
- buffer.write(conv, 0, conv.length);
+ out.write(conv, 0, conv.length);
}
@@ -57,12 +56,12 @@
// with n leftover bytes, we append 0 bytes to make a full group of 4
// then convert like normal (except not applying the special zero rule)
// and write out the first n+1 bytes from the result
- if (i < data.length) {
- int n = data.length - i;
+ if (i < length) {
+ int n = length - i;
byte[] lastdata = new byte[4];
for (int j = 0; j < 4; j++) {
if (j < n) {
- lastdata[j] = data[i++];
+ lastdata[j] = (byte)in.read();
} else {
lastdata[j] = 0;
}
@@ -82,18 +81,15 @@
}
}
// assert n+1 <= 5
- buffer.write(conv, 0, n + 1);
+ out.write(conv, 0, n + 1);
// System.out.println("ASCII85 end of data was "+n+" bytes long");
}
// finally write the two character end of data marker
- buffer.write(ASCII85_EOD.getBytes(), 0,
+ out.write(ASCII85_EOD.getBytes(), 0,
ASCII85_EOD.getBytes().length);
- byte[] result = buffer.toByteArray();
-
-
// assert that we have the correct outgoing length
/*
* int in = (data.length % 4);
@@ -103,8 +99,8 @@
* System.out.println(" inlength = "+data.length+" inlength % 4 = "+(data.length % 4)+" outlength = "+(result.length-ASCII85_EOD.getBytes().length)+" outlength % 5 = "+((result.length-ASCII85_EOD.getBytes().length) % 5));
* }
*/
- return result;
+ out.close();
}
/**
1.3 +10 -12 xml-fop/src/org/apache/fop/pdf/ASCIIHexFilter.java
Index: ASCIIHexFilter.java
===================================================================
RCS file: /home/cvs/xml-fop/src/org/apache/fop/pdf/ASCIIHexFilter.java,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- ASCIIHexFilter.java 30 Jul 2001 20:29:29 -0000 1.2
+++ ASCIIHexFilter.java 27 May 2002 10:59:07 -0000 1.3
@@ -1,5 +1,5 @@
/*
- * $Id: ASCIIHexFilter.java,v 1.2 2001/07/30 20:29:29 tore Exp $
+ * $Id: ASCIIHexFilter.java,v 1.3 2002/05/27 10:59:07 keiron Exp $
* Copyright (C) 2001 The Apache Software Foundation. All rights reserved.
* For details on use and redistribution please refer to the
* LICENSE file included with these sources.
@@ -8,6 +8,7 @@
import java.io.ByteArrayOutputStream;
import java.io.IOException;
+import java.io.*;
public class ASCIIHexFilter extends PDFFilter {
private static final String ASCIIHEX_EOD = ">";
@@ -21,19 +22,16 @@
return null;
}
- public byte[] encode(byte[] data) {
-
- StringBuffer buffer = new StringBuffer();
- for (int i = 0; i < data.length; i++) {
- int val = (int)(data[i] & 0xFF);
+ public void encode(InputStream in, OutputStream out, int length) throws IOException {
+ Writer writer = new OutputStreamWriter(out);
+ for (int i = 0; i < length; i++) {
+ int val = (int)(in.read() & 0xFF);
if (val < 16)
- buffer.append("0");
- buffer.append(Integer.toHexString(val));
+ writer.write("0");
+ writer.write(Integer.toHexString(val));
}
- buffer.append(ASCIIHEX_EOD);
-
- return buffer.toString().getBytes();
-
+ writer.write(ASCIIHEX_EOD);
+ writer.close();
}
}
1.2 +8 -4 xml-fop/src/org/apache/fop/pdf/DCTFilter.java
Index: DCTFilter.java
===================================================================
RCS file: /home/cvs/xml-fop/src/org/apache/fop/pdf/DCTFilter.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- DCTFilter.java 18 Sep 2001 08:17:08 -0000 1.1
+++ DCTFilter.java 27 May 2002 10:59:07 -0000 1.2
@@ -1,5 +1,5 @@
/*
- * $Id: DCTFilter.java,v 1.1 2001/09/18 08:17:08 keiron Exp $
+ * $Id: DCTFilter.java,v 1.2 2002/05/27 10:59:07 keiron Exp $
* Copyright (C) 2001 The Apache Software Foundation. All rights reserved.
* For details on use and redistribution please refer to the
* LICENSE file included with these sources.
@@ -7,9 +7,11 @@
package org.apache.fop.pdf;
+import org.apache.fop.util.StreamUtilities;
+
import java.io.ByteArrayOutputStream;
import java.io.IOException;
-
+import java.io.*;
/**
* DCT Filter class. Right now it is just used as a dummy filter flag so
@@ -28,8 +30,10 @@
return null;
}
- public byte[] encode(byte[] data) {
- return data;
+ public void encode(InputStream in, OutputStream out, int length) throws IOException {
+ StreamUtilities.streamCopy(in, out, length);
+ out.close();
}
+
}
1.4 +7 -6 xml-fop/src/org/apache/fop/pdf/FlateFilter.java
Index: FlateFilter.java
===================================================================
RCS file: /home/cvs/xml-fop/src/org/apache/fop/pdf/FlateFilter.java,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- FlateFilter.java 22 Nov 2001 07:11:40 -0000 1.3
+++ FlateFilter.java 27 May 2002 10:59:07 -0000 1.4
@@ -1,5 +1,5 @@
/*
- * $Id: FlateFilter.java,v 1.3 2001/11/22 07:11:40 keiron Exp $
+ * $Id: FlateFilter.java,v 1.4 2002/05/27 10:59:07 keiron Exp $
* Copyright (C) 2001 The Apache Software Foundation. All rights reserved.
* For details on use and redistribution please refer to the
* LICENSE file included with these sources.
@@ -7,9 +7,12 @@
package org.apache.fop.pdf;
+import org.apache.fop.util.StreamUtilities;
+
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.zip.DeflaterOutputStream;
+import java.io.*;
/**
* A filter to deflate a stream. Note that the attributes for
@@ -66,13 +69,12 @@
* because these attributes are not supported. So the DecodeParms
* should be retrieved after calling this method.
*/
- public byte[] encode(byte[] data) {
- ByteArrayOutputStream outArrayStream = new ByteArrayOutputStream();
+ public void encode(InputStream in, OutputStream out, int length) throws IOException {
_predictor = PREDICTION_NONE;
try {
DeflaterOutputStream compressedStream =
- new DeflaterOutputStream(outArrayStream);
- compressedStream.write(data, 0, data.length);
+ new DeflaterOutputStream(out);
+ StreamUtilities.streamCopy(in, compressedStream, length);
compressedStream.flush();
compressedStream.close();
} catch (IOException e) {
@@ -80,7 +82,6 @@
// + e.getMessage(), e);
}
- return outArrayStream.toByteArray();
}
public void setPredictor(int predictor) throws PDFFilterException {
1.4 +4 -4 xml-fop/src/org/apache/fop/pdf/PDFFilter.java
Index: PDFFilter.java
===================================================================
RCS file: /home/cvs/xml-fop/src/org/apache/fop/pdf/PDFFilter.java,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
--- PDFFilter.java 30 Jul 2001 20:29:29 -0000 1.3
+++ PDFFilter.java 27 May 2002 10:59:07 -0000 1.4
@@ -1,5 +1,5 @@
/*
- * $Id: PDFFilter.java,v 1.3 2001/07/30 20:29:29 tore Exp $
+ * $Id: PDFFilter.java,v 1.4 2002/05/27 10:59:07 keiron Exp $
* Copyright (C) 2001 The Apache Software Foundation. All rights reserved.
* For details on use and redistribution please refer to the
* LICENSE file included with these sources.
@@ -11,6 +11,8 @@
package org.apache.fop.pdf;
+import java.io.*;
+
public abstract class PDFFilter {
/*
* These are no longer needed, but are here as a reminder about what
@@ -60,8 +62,6 @@
/**
* encode the given data with the filter
*/
- public abstract byte[] encode(byte[] data);
-
-
+ public abstract void encode(InputStream in, OutputStream out, int length) throws IOException;
}
1.2 +2 -3 xml-fop/src/org/apache/fop/pdf/PDFICCStream.java
Index: PDFICCStream.java
===================================================================
RCS file: /home/cvs/xml-fop/src/org/apache/fop/pdf/PDFICCStream.java,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- PDFICCStream.java 16 Nov 2001 19:36:40 -0000 1.1
+++ PDFICCStream.java 27 May 2002 10:59:07 -0000 1.2
@@ -1,5 +1,5 @@
/*
- * $Id: PDFICCStream.java,v 1.1 2001/11/16 19:36:40 tore Exp $
+ * $Id: PDFICCStream.java,v 1.2 2002/05/27 10:59:07 keiron Exp $
* Copyright (C) 2001 The Apache Software Foundation. All rights reserved.
* For details on use and redistribution please refer to the
* LICENSE file included with these sources.
@@ -11,7 +11,6 @@
public class PDFICCStream extends PDFStream {
private int origLength;
private int len1, len3;
- private byte[] originalData = null;
private ColorSpace cs;
@@ -43,7 +42,7 @@
if (cs.getColorSpace() > 0)
pb.append("/Alternate /").append(cs.getColorSpacePDFString()).append(" ");
- pb.append("/Length ").append((_data.size() + 1)).append(" ").append(filterEntry);
+ pb.append("/Length ").append((_data.getSize() + 1)).append(" ").append(filterEntry);
pb.append(" >>\n");
byte[] p = pb.toString().getBytes();
stream.write(p);
1.13 +30 -21 xml-fop/src/org/apache/fop/pdf/PDFStream.java
Index: PDFStream.java
===================================================================
RCS file: /home/cvs/xml-fop/src/org/apache/fop/pdf/PDFStream.java,v
retrieving revision 1.12
retrieving revision 1.13
diff -u -r1.12 -r1.13
--- PDFStream.java 22 Nov 2001 07:11:40 -0000 1.12
+++ PDFStream.java 27 May 2002 10:59:07 -0000 1.13
@@ -1,5 +1,5 @@
/*
- * $Id: PDFStream.java,v 1.12 2001/11/22 07:11:40 keiron Exp $
+ * $Id: PDFStream.java,v 1.13 2002/05/27 10:59:07 keiron Exp $
* Copyright (C) 2001 The Apache Software Foundation. All rights reserved.
* For details on use and redistribution please refer to the
* LICENSE file included with these sources.
@@ -27,7 +27,7 @@
/**
* the stream of PDF commands
*/
- protected ByteArrayOutputStream _data;
+ protected StreamCache _data;
/**
* the filters that should be applied
@@ -41,7 +41,11 @@
*/
public PDFStream(int number) {
super(number);
- _data = new ByteArrayOutputStream();
+ try {
+ _data = StreamCache.createStreamCache();
+ } catch (IOException ex) {
+ ex.printStackTrace();
+ }
_filters = new ArrayList();
}
@@ -52,7 +56,7 @@
*/
public void add(String s) {
try {
- _data.write(s.getBytes());
+ _data.getOutputStream().write(s.getBytes());
} catch (IOException ex) {
ex.printStackTrace();
}
@@ -130,21 +134,21 @@
int g = (p >> 8) & 0xFF;
int b = (p) & 0xFF;
if (r < 16) {
- _data.write('0');
+ _data.getOutputStream().write('0');
}
- _data.write(Integer.toHexString(r).getBytes());
+ _data.getOutputStream().write(Integer.toHexString(r).getBytes());
if (g < 16) {
- _data.write('0');
+ _data.getOutputStream().write('0');
}
- _data.write(Integer.toHexString(g).getBytes());
+ _data.getOutputStream().write(Integer.toHexString(g).getBytes());
if (b < 16) {
- _data.write('0');
+ _data.getOutputStream().write('0');
}
- _data.write(Integer.toHexString(b).getBytes());
- _data.write(' ');
+ _data.getOutputStream().write(Integer.toHexString(b).getBytes());
+ _data.getOutputStream().write(' ');
}
}
- _data.write(">\n".getBytes());
+ _data.getOutputStream().write(">\n".getBytes());
} catch (IOException ex) {
ex.printStackTrace();
}
@@ -153,15 +157,22 @@
public void setData(byte[] data) throws IOException {
_data.reset();
- _data.write(data);
+ _data.getOutputStream().write(data);
}
+ /*
public byte[] getData() {
return _data.toByteArray();
}
+ */
public int getDataLength() {
- return _data.size();
+ try {
+ return _data.getSize();
+ } catch (Exception e) {
+ e.printStackTrace();
+ return 0;
+ }
}
@@ -188,14 +199,13 @@
throw new RuntimeException();
}
-
// overload the base object method so we don't have to copy
// byte arrays around so much
protected int output(OutputStream stream) throws IOException {
int length = 0;
String filterEntry = applyFilters();
byte[] p = (this.number + " " + this.generation + " obj\n<< /Length "
- + (_data.size() + 1) + " " + filterEntry
+ + (_data.getSize() + 1) + " " + filterEntry
+ " >>\n").getBytes();
stream.write(p);
@@ -216,8 +226,9 @@
byte[] p = "stream\n".getBytes();
stream.write(p);
length += p.length;
- _data.writeTo(stream);
- length += _data.size();
+ _data.outputStreamData(stream);
+ _data.close();
+ length += _data.getSize();
p = "\nendstream\n".getBytes();
stream.write(p);
length += p.length;
@@ -243,9 +254,7 @@
PDFFilter filter = (PDFFilter)_filters.get(count);
// apply the filter encoding if neccessary
if (!filter.isApplied()) {
- byte[] tmp = filter.encode(_data.toByteArray());
- _data.reset();
- _data.write(tmp);
+ _data.applyFilter(filter);
filter.setApplied(true);
}
// place the names in our local vector in reverse order
1.3 +3 -3 xml-fop/src/org/apache/fop/pdf/PDFT1Stream.java
Index: PDFT1Stream.java
===================================================================
RCS file: /home/cvs/xml-fop/src/org/apache/fop/pdf/PDFT1Stream.java,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- PDFT1Stream.java 30 Jul 2001 20:29:30 -0000 1.2
+++ PDFT1Stream.java 27 May 2002 10:59:07 -0000 1.3
@@ -1,5 +1,5 @@
/*
- * $Id: PDFT1Stream.java,v 1.2 2001/07/30 20:29:30 tore Exp $
+ * $Id: PDFT1Stream.java,v 1.3 2002/05/27 10:59:07 keiron Exp $
* Copyright (C) 2001 The Apache Software Foundation. All rights reserved.
* For details on use and redistribution please refer to the
* LICENSE file included with these sources.
@@ -80,7 +80,7 @@
String filterEntry = applyFilters();
String preData = new String(this.number + " " + this.generation
+ " obj\n<< /Length "
- + (_data.size() + 1) + " " + filterEntry
+ + (_data.getSize() + 1) + " " + filterEntry
+ " " + "/Length1 " + len1 + " /Length2 "
+ (origLength - len3 - len1)
+ " /Length3 " + len3 + " >>\n");
@@ -101,7 +101,7 @@
calcLengths(data);
_data.reset();
// System.out.println("Writing " + size + " bytes of font data");
- _data.write(data, 0, size);
+ _data.getOutputStream().write(data, 0, size);
}
}
1.3 +3 -3 xml-fop/src/org/apache/fop/pdf/PDFTTFStream.java
Index: PDFTTFStream.java
===================================================================
RCS file: /home/cvs/xml-fop/src/org/apache/fop/pdf/PDFTTFStream.java,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
--- PDFTTFStream.java 30 Jul 2001 20:29:30 -0000 1.2
+++ PDFTTFStream.java 27 May 2002 10:59:07 -0000 1.3
@@ -1,5 +1,5 @@
/*
- * $Id: PDFTTFStream.java,v 1.2 2001/07/30 20:29:30 tore Exp $
+ * $Id: PDFTTFStream.java,v 1.3 2002/05/27 10:59:07 keiron Exp $
* Copyright (C) 2001 The Apache Software Foundation. All rights reserved.
* For details on use and redistribution please refer to the
* LICENSE file included with these sources.
@@ -23,7 +23,7 @@
String filterEntry = applyFilters();
String preData = new String(this.number + " " + this.generation
+ " obj\n<< /Length "
- + (_data.size() + 1) + " " + filterEntry
+ + (_data.getSize() + 1) + " " + filterEntry
+ " " + "/Length1 " + origLength
+ " >>\n");
@@ -41,7 +41,7 @@
public void setData(byte[] data, int size) throws java.io.IOException {
_data.reset();
System.out.println("Writing " + size + " bytes of font data");
- _data.write(data, 0, size);
+ _data.getOutputStream().write(data, 0, size);
}
}
1.1 xml-fop/src/org/apache/fop/pdf/InMemoryStreamCache.java
Index: InMemoryStreamCache.java
===================================================================
/*
* $Id: InMemoryStreamCache.java,v 1.1 2002/05/27 10:59:07 keiron Exp $
* Copyright (C) 2002 The Apache Software Foundation. All rights reserved.
* For details on use and redistribution please refer to the
* LICENSE file included with these sources.
*/
package org.apache.fop.pdf;
import java.io.ByteArrayOutputStream;
import java.io.ByteArrayInputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.IOException;
/**
* StreamCache implementation that uses temporary files rather than heap.
*/
public class InMemoryStreamCache extends StreamCache {
/**
* The current output stream.
*/
private ByteArrayOutputStream output;
/**
* Creates a new InMemoryStreamCache.
*/
public InMemoryStreamCache() {
}
/**
* Get the current OutputStream. Do not store it - it may change
* from call to call.
*/
public OutputStream getOutputStream() throws IOException {
if (output == null)
output = new ByteArrayOutputStream();
return output;
}
/**
* Filter the cache with the supplied PDFFilter.
*/
public void applyFilter(PDFFilter filter) throws IOException {
if (output == null)
return;
output.close();
// make inputstream from copy of outputted bytes
int size = getSize();
ByteArrayInputStream input =
new ByteArrayInputStream(output.toByteArray());
// reset output
output.reset();
// run filter
filter.encode(input, output, size);
input.close();
output.close();
}
/**
* Outputs the cached bytes to the given stream.
*/
public void outputStreamData(OutputStream stream) throws IOException {
if (output == null)
return;
output.writeTo(stream);
}
/**
* Returns the current size of the stream.
*/
public int getSize() throws IOException {
if (output == null)
return 0;
else
return output.size();
}
/**
* Closes the cache and frees resources.
*/
public void close() throws IOException {
if (output != null) {
output.close();
output = null;
}
}
/**
* Clears and resets the cache.
*/
public void reset() throws IOException {
if (output != null) {
output.close();
output = null;
}
}
}
1.1 xml-fop/src/org/apache/fop/pdf/StreamCache.java
Index: StreamCache.java
===================================================================
/*
* $Id: StreamCache.java,v 1.1 2002/05/27 10:59:07 keiron Exp $
* Copyright (C) 2001 The Apache Software Foundation. All rights reserved.
* For details on use and redistribution please refer to the
* LICENSE file included with these sources.
*/
package org.apache.fop.pdf;
import java.io.ByteArrayOutputStream;
import java.io.OutputStream;
import java.io.IOException;
import java.util.ArrayList;
/**
* class used to store the bytes for a PDFStream. It's actually a generic
* cached byte array, along with a factory that returns either an
* in-memory or tempfile based implementation based on the global
* cacheToFile setting.
*/
public abstract class StreamCache {
/**
* Global setting; controls whether to use tempfiles or not.
*/
private static boolean cacheToFile = false;
/**
* Change the global cacheToFile flag.
*/
public static void setCacheToFile(boolean tizit) {
cacheToFile = tizit;
}
/**
* Get the value of the global cacheToFile flag.
*/
public static boolean getCacheToFile() {
return cacheToFile;
}
/**
* Get the correct implementation (based on cacheToFile) of
* StreamCache.
*/
public static StreamCache createStreamCache() throws IOException {
if (cacheToFile)
return new TempFileStreamCache();
else
return new InMemoryStreamCache();
}
/**
* Get the current OutputStream. Do not store it - it may change
* from call to call.
*/
public abstract OutputStream getOutputStream() throws IOException;
/**
* Filter the cache with the supplied PDFFilter.
*/
public abstract void applyFilter(PDFFilter filter) throws IOException;
/**
* Outputs the cached bytes to the given stream.
*/
public abstract void outputStreamData(OutputStream stream) throws IOException;
/**
* Returns the current size of the stream.
*/
public abstract int getSize() throws IOException;
/**
* Closes the cache and frees resources.
*/
public abstract void close() throws IOException;
/**
* Clears and resets the cache.
*/
public abstract void reset() throws IOException;
}
1.1 xml-fop/src/org/apache/fop/pdf/TempFileStreamCache.java
Index: TempFileStreamCache.java
===================================================================
/*
* $Id: TempFileStreamCache.java,v 1.1 2002/05/27 10:59:07 keiron Exp $
* Copyright (C) 2002 The Apache Software Foundation. All rights reserved.
* For details on use and redistribution please refer to the
* LICENSE file included with these sources.
*/
package org.apache.fop.pdf;
import org.apache.fop.util.StreamUtilities;
import java.io.BufferedInputStream;
import java.io.BufferedOutputStream;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.IOException;
import java.io.File;
/**
* StreamCache implementation that uses temporary files rather than heap.
*/
public class TempFileStreamCache extends StreamCache {
/**
* The current output stream.
*/
private BufferedOutputStream output;
/**
* The temp file.
*/
private File tempFile;
/**
* Creates a new TempFileStreamCache.
*/
public TempFileStreamCache() throws IOException {
tempFile = File.createTempFile("org.apache.fop.pdf.StreamCache-",
".temp");
tempFile.deleteOnExit();
}
/**
* Get the current OutputStream. Do not store it - it may change
* from call to call.
*/
public OutputStream getOutputStream() throws IOException {
if (output == null)
output = new BufferedOutputStream(
new FileOutputStream(tempFile));
return output;
}
/**
* Filter the cache with the supplied PDFFilter.
*/
public void applyFilter(PDFFilter filter) throws IOException {
if (output == null)
return;
output.close();
output = null;
// need a place to put results
File newTempFile =
File.createTempFile("org.apache.fop.pdf.StreamCache-",
".temp");
newTempFile.deleteOnExit();
// filter may not be buffered
BufferedInputStream input =
new BufferedInputStream(new FileInputStream(tempFile));
BufferedOutputStream output = new BufferedOutputStream(
new FileOutputStream(newTempFile));
filter.encode(input, output, (int) tempFile.length());
input.close();
output.close();
tempFile.delete();
tempFile = newTempFile;
}
/**
* Outputs the cached bytes to the given stream.
*/
public void outputStreamData(OutputStream stream) throws IOException {
if (output == null)
return;
output.close();
output = null;
// don't need a buffer because streamCopy is buffered
FileInputStream input = new FileInputStream(tempFile);
StreamUtilities.streamCopy(input, output);
input.close();
}
/**
* Returns the current size of the stream.
*/
public int getSize() throws IOException {
if (output != null)
output.flush();
return (int) tempFile.length();
}
/**
* Closes the cache and frees resources.
*/
public void close() throws IOException {
if (output != null) {
output.close();
output = null;
}
if (tempFile.exists())
tempFile.delete();
}
/**
* Clears and resets the cache.
*/
public void reset() throws IOException {
if (output != null) {
output.close();
output = null;
}
if (tempFile.exists())
tempFile.delete();
}
}
1.9 +4 -3 xml-fop/src/org/apache/fop/tools/AreaTreeBuilder.java
Index: AreaTreeBuilder.java
===================================================================
RCS file: /home/cvs/xml-fop/src/org/apache/fop/tools/AreaTreeBuilder.java,v
retrieving revision 1.8
retrieving revision 1.9
diff -u -r1.8 -r1.9
--- AreaTreeBuilder.java 26 May 2002 15:02:44 -0000 1.8
+++ AreaTreeBuilder.java 27 May 2002 10:59:08 -0000 1.9
@@ -1,5 +1,5 @@
/*
- * $Id: AreaTreeBuilder.java,v 1.8 2002/05/26 15:02:44 klease Exp $
+ * $Id: AreaTreeBuilder.java,v 1.9 2002/05/27 10:59:08 keiron Exp $
* Copyright (C) 2001 The Apache Software Foundation. All rights reserved.
* For details on use and redistribution please refer to the
* LICENSE file included with these sources.
@@ -117,7 +117,7 @@
PageViewport page = sm.getPage(count, c);
c++;
// save the page to a stream for testing
- ObjectOutputStream tempstream = new ObjectOutputStream(
+ /*ObjectOutputStream tempstream = new ObjectOutputStream(
new BufferedOutputStream(
new FileOutputStream("temp.ser")));
page.savePage(tempstream);
@@ -129,7 +129,7 @@
new BufferedInputStream(
new FileInputStream("temp.ser")));
page.loadPage(in);
- in.close();
+ in.close();*/
rend.renderPage(page);
}
@@ -331,6 +331,7 @@
reg.addBlock(obj);
}
}
+ reg.setCTM(new CTM());
return reg;
}
1.1 xml-fop/src/org/apache/fop/util/StreamUtilities.java
Index: StreamUtilities.java
===================================================================
/*
* $Id: StreamUtilities.java,v 1.1 2002/05/27 10:59:08 keiron Exp $
* Copyright (C) 2002 The Apache Software Foundation. All rights reserved.
* For details on use and redistribution please refer to the
* LICENSE file included with these sources.
*/
package org.apache.fop.util;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.IOException;
import java.io.EOFException;
import java.io.DataInput;
import java.io.DataOutput;
import java.util.zip.CRC32;
/**
* General handy stream i/o methods.
*/
public class StreamUtilities {
/**
* Size of buffers. Duh.
*/
public static final int BUFFER_SIZE = 4096; // cuz I like big buffers...
/**
* Binary copies bytes from an input stream to an output stream.
* The process is buffered, so you shouldn't need
* BufferedInput/OutputStreams. Flushes when it's finished, but does
* not close either stream. Returns the number of bytes copied.
*/
public static long streamCopy(InputStream source,
OutputStream sink) throws IOException {
// set table
byte[] buffer = new byte[BUFFER_SIZE];
long total = 0;
// trough
int scoop;
while ((scoop = source.read(buffer)) >= 0) {
if (scoop == 0)
System.out.println("zero scoop!");
sink.write(buffer, 0, scoop);
total += scoop;
}
// do dishes
sink.flush();
return total;
}
/**
* Binary copies up to the given number of bytes from an input
* stream to an output stream. The process is buffered, so you
* shouldn't need BufferedInput/OutputStreams.
* Flushes when it's finished, but does not close either stream.
* Throws an EOFExeption if there aren't enough bytes available to
* transfer the requested amount.
* Returns the total number of bytes copied.
*/
public static long streamCopy(InputStream source,
OutputStream sink, int howMany) throws IOException {
// set table
byte[] buffer = new byte[BUFFER_SIZE];
int left = howMany;
// trough
int scoop;
while (left > 0) {
scoop = source.read(buffer, 0, Math.min(BUFFER_SIZE, left));
if (scoop < 0)
throw new EOFException(
"Not enough bytes to feed you in IOLib.streamCopy(source, sink, howMany); you asked for " +
howMany + " and I only have " + (howMany - left));
sink.write(buffer, 0, scoop);
left -= scoop;
}
// do dishes
sink.flush();
return howMany;
}
/**
* Binary copies up to the given number of bytes from an input
* stream to an output stream. The process is buffered, so you
* shouldn't need BufferedInput/OutputStreams.
* Flushes when it's finished, but does not close either stream.
* Throws an EOFExeption if there aren't enough bytes available
* to transfer the requested amount.
* Returns the checksum of the bytes copied.
*/
public static long streamCopyWithChecksum(InputStream source,
OutputStream sink, int howMany) throws IOException {
// set table
byte[] buffer = new byte[BUFFER_SIZE];
int left = howMany;
CRC32 checksummer = new CRC32();
// trough
int scoop;
while (left > 0) {
scoop = source.read(buffer, 0, Math.min(BUFFER_SIZE, left));
if (scoop < 0)
throw new EOFException("Not enough bytes to feed you in IOLib.streamCopy(source, sink, howMany)");
checksummer.update(buffer, 0, scoop);
sink.write(buffer, 0, scoop);
left -= scoop;
}
// do dishes
sink.flush();
return checksummer.getValue();
}
/**
* Binary copies up to the given number of bytes from a DataInput
* object to an DataOutput object. The process is buffered. Since
* DataOutput doesn't support closing or flushing, it does neither.
* Returns the total number of bytes copied.
*/
public static long dataCopy(DataInput source, DataOutput sink,
int howMany) throws IOException {
// set table
byte[] buffer = new byte[BUFFER_SIZE];
int left = howMany;
// trough
int scoop;
while (left > 0) {
scoop = Math.min(BUFFER_SIZE, left);
source.readFully(buffer, 0, scoop);
sink.write(buffer, 0, scoop);
left -= scoop;
}
// do dishes
return howMany;
}
}
---------------------------------------------------------------------
To unsubscribe, e-mail: fop-cvs-unsubscribe@xml.apache.org
For additional commands, e-mail: fop-cvs-help@xml.apache.org