RtfWriter2: OutOfMemory, with patch
- From: Dirk Möbius <Dirk.Moebius (at) eplus.de>
- Date: Wed, 23 Aug 2006 13:58:32 +0200
Hi,
RtfWriter2 reads the whole document in memory, even if dataCacheStyle is
set to CACHE_DISK. When generating large documents, this could lead to
OutOfMemory exceptions. This happened to be the case in our reporting
system.
The problem is in RtfDocument.writeDocument(), which reads the whole disk
cache into memory before writing it into the final output stream.
The following simple patch fixes this problem. The patch is for the latest
stable release itext-1.4.3, but can -- with small modifications --- easily
be applied to the latest CVS revision. We would be glad to see it in the
next official release.
Thanks for your great and valuable project!
Dirk Moebius
diff -u -x compile.xml -r ../src.orig/com/lowagie/text/rtf/RtfWriter2.java
./com/lowagie/text/rtf/RtfWriter2.java
--- ../src.orig/com/lowagie/text/rtf/RtfWriter2.java 2005-09-11
21:09:58.000000000 +0200
+++ ./com/lowagie/text/rtf/RtfWriter2.java 2006-08-22
18:14:51.335937500 +0200
(at) (at) -167,7 +167,7 (at) (at)
*/
public void close() {
try {
- os.write(rtfDoc.writeDocument());
+ rtfDoc.writeDocument(os);
if(this.closeStream) {
os.close();
}
diff -u -x compile.xml -r
../src.orig/com/lowagie/text/rtf/document/RtfDocument.java
./com/lowagie/text/rtf/document/RtfDocument.java
--- ../src.orig/com/lowagie/text/rtf/document/RtfDocument.java
2005-12-24 13:15:00.000000000 +0100
+++ ./com/lowagie/text/rtf/document/RtfDocument.java 2006-08-22
18:14:22.382812500 +0200
(at) (at) -60,6 +60,7 (at) (at)
import com.lowagie.text.rtf.graphic.RtfImage;
import java.io.ByteArrayOutputStream;
+import java.io.OutputStream;
import java.io.IOException;
import java.util.ArrayList;
(at) (at) -131,11 +132,7 (at) (at)
public byte[] writeDocument() {
ByteArrayOutputStream docStream = new ByteArrayOutputStream();
try {
- docStream.write(OPEN_GROUP);
- docStream.write(RtfDocument.RTF_DOCUMENT);
- docStream.write(documentHeader.write());
- data.writeTo(docStream);
- docStream.write(CLOSE_GROUP);
+ writeDocument(docStream);
} catch(IOException ioe) {
ioe.printStackTrace();
}
(at) (at) -143,6 +140,19 (at) (at)
}
/**
+ * Writes the document to the specified output stream
+ *
+ * (at) param os The OutputStream to write to
+ */
+ public void writeDocument(OutputStream os) throws IOException {
+ os.write(OPEN_GROUP);
+ os.write(RtfDocument.RTF_DOCUMENT);
+ os.write(documentHeader.write());
+ data.writeTo(os);
+ os.write(CLOSE_GROUP);
+ }
+
+ /**
* Adds an element to the rtf document
*
* (at) param element The element to add
--
Dirk Moebius
Developer, Planning Support Systems
E-Plus, Germany.
-------------------------------------------------------------------------
Using Tomcat but need to do more? Need to support web services, security?
Get stuff done quickly with pre-integrated technology to make your job easier
Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo
http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642
_______________________________________________
iText-questions mailing list
iText-questions (at) lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/itext-questions