keiron 2002/07/01 07:42:43
Modified: src/org/apache/fop/pdf PDFDocument.java
src/org/apache/fop/render/pdf PDFRenderer.java
PDFXMLHandler.java
src/org/apache/fop/svg PDFDocumentGraphics2D.java
PDFGraphics2D.java PDFTranscoder.java
Log:
progressively output pdf objects to reduce memory usage
Revision Changes Path
1.44 +11 -41 xml-fop/src/org/apache/fop/pdf/PDFDocument.java
Index: PDFDocument.java
===================================================================
RCS file: /home/cvs/xml-fop/src/org/apache/fop/pdf/PDFDocument.java,v
retrieving revision 1.43
retrieving revision 1.44
diff -u -r1.43 -r1.44
--- PDFDocument.java 1 Jul 2002 10:39:29 -0000 1.43
+++ PDFDocument.java 1 Jul 2002 14:42:42 -0000 1.44
@@ -140,11 +140,6 @@
*/
protected HashMap fontMap = new HashMap();
- /**
- * the objects themselves
- */
- protected ArrayList pendingLinks = null;
-
protected HashMap filterMap = new HashMap();
/**
@@ -1015,20 +1010,6 @@
public void addPage(PDFPage page) {
/* add it to the list of objects */
this.objects.add(page);
-
- if(pendingLinks != null) {
- for(Iterator iter = pendingLinks.iterator(); iter.hasNext(); ) {
- PendingLink pl = (PendingLink)iter.next();
- PDFGoTo gt = new PDFGoTo(++this.objectcount,
- page.referencePDF());
- gt.setDestination(pl.dest);
- addTrailerObject(gt);
- PDFInternalLink internalLink =
- new PDFInternalLink(gt.referencePDF());
- pl.link.setAction(internalLink);
- }
- pendingLinks = null;
- }
}
/**
@@ -1096,25 +1077,6 @@
this.trailerObjects.add(object);
}
- class PendingLink {
- PDFLink link;
- String dest;
- }
-
- public PDFLink makeLinkCurrentPage(Rectangle rect, String dest) {
- PDFLink link = new PDFLink(++this.objectcount, rect);
- this.objects.add(link);
- PendingLink pl = new PendingLink();
- pl.link = link;
- pl.dest = dest;
- if(pendingLinks == null) {
- pendingLinks = new ArrayList();
- }
- pendingLinks.add(pl);
-
- return link;
- }
-
public PDFLink makeLink(Rectangle rect, String page, String dest) {
PDFLink link = new PDFLink(++this.objectcount, rect);
this.objects.add(link);
@@ -1142,7 +1104,7 @@
*
* @return the stream object created
*/
- public PDFStream makeStream(String type) {
+ public PDFStream makeStream(String type, boolean add) {
/*
* create a PDFStream with the next object number and add it
@@ -1152,10 +1114,18 @@
PDFStream obj = new PDFStream(++this.objectcount);
obj.addDefaultFilters(filterMap, type);
- this.objects.add(obj);
+ if(add) {
+ this.objects.add(obj);
+ }
return obj;
}
+ /**
+ * add a stream object
+ */
+ public void addStream(PDFStream obj) {
+ this.objects.add(obj);
+ }
/**
* make an annotation list object
1.107 +10 -2 xml-fop/src/org/apache/fop/render/pdf/PDFRenderer.java
Index: PDFRenderer.java
===================================================================
RCS file: /home/cvs/xml-fop/src/org/apache/fop/render/pdf/PDFRenderer.java,v
retrieving revision 1.106
retrieving revision 1.107
diff -u -r1.106 -r1.107
--- PDFRenderer.java 28 Jun 2002 10:09:06 -0000 1.106
+++ PDFRenderer.java 1 Jul 2002 14:42:42 -0000 1.107
@@ -217,7 +217,7 @@
(int) Math.round(w / 1000), (int)
Math.round(h / 1000));
pageReferences.put(page, currentPage.referencePDF());
}
- currentStream = this.pdfDoc.makeStream(PDFStream.CONTENT_FILTER);
+ currentStream = this.pdfDoc.makeStream(PDFStream.CONTENT_FILTER, false);
currentState = new PDFState();
currentState.setTransform(new AffineTransform(1, 0, 0, -1, 0, (int)
Math.round(pageHeight / 1000)));
@@ -231,6 +231,7 @@
//currentStream.add("ET\n");
+ this.pdfDoc.addStream(currentStream);
currentPage.setContents(currentStream);
this.pdfDoc.addPage(currentPage);
this.pdfDoc.output(ostream);
@@ -526,6 +527,12 @@
+ xobj + " Do\nQ\nBT\n");
}
+ // output new data
+ try {
+ this.pdfDoc.output(ostream);
+ } catch(IOException ioe) {
+
+ }
}
public void renderForeignObject(ForeignObject fo) {
@@ -540,6 +547,7 @@
context.setUserAgent(userAgent);
context.setProperty(PDFXMLHandler.PDF_DOCUMENT, pdfDoc);
+ context.setProperty(PDFXMLHandler.OUTPUT_STREAM, ostream);
context.setProperty(PDFXMLHandler.PDF_STATE, currentState);
context.setProperty(PDFXMLHandler.PDF_PAGE, currentPage);
context.setProperty(PDFXMLHandler.PDF_STREAM, currentStream);
1.6 +7 -3 xml-fop/src/org/apache/fop/render/pdf/PDFXMLHandler.java
Index: PDFXMLHandler.java
===================================================================
RCS file: /home/cvs/xml-fop/src/org/apache/fop/render/pdf/PDFXMLHandler.java,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -r1.5 -r1.6
--- PDFXMLHandler.java 18 Jun 2002 13:42:56 -0000 1.5
+++ PDFXMLHandler.java 1 Jul 2002 14:42:43 -0000 1.6
@@ -22,8 +22,8 @@
import org.w3c.dom.NamedNodeMap;
import org.w3c.dom.Attr;
-import java.io.Writer;
import java.io.IOException;
+import java.io.OutputStream;
import org.apache.batik.bridge.*;
import org.apache.batik.swing.svg.*;
@@ -44,6 +44,7 @@
*/
public class PDFXMLHandler implements XMLHandler {
public static final String PDF_DOCUMENT = "pdfDoc";
+public static final String OUTPUT_STREAM = "outputStream";
public static final String PDF_STATE = "pdfState";
public static final String PDF_PAGE = "pdfPage";
public static final String PDF_STREAM = "pdfStream";
@@ -73,6 +74,7 @@
public static PDFInfo getPDFInfo(RendererContext context) {
PDFInfo pdfi = new PDFInfo();
pdfi.pdfDoc = (PDFDocument)context.getProperty(PDF_DOCUMENT);
+ pdfi.outputStream = (OutputStream)context.getProperty(OUTPUT_STREAM);
pdfi.pdfState = (PDFState)context.getProperty(PDF_STATE);
pdfi.pdfPage = (PDFPage)context.getProperty(PDF_PAGE);
pdfi.currentStream = (PDFStream)context.getProperty(PDF_STREAM);
@@ -88,6 +90,7 @@
public static class PDFInfo {
PDFDocument pdfDoc;
+ OutputStream outputStream;
PDFState pdfState;
PDFPage pdfPage;
public PDFStream currentStream;
@@ -164,7 +167,7 @@
}
PDFGraphics2D graphics = new PDFGraphics2D(true, pdfInfo.fs,
pdfInfo.pdfDoc,
- pdfInfo.pdfPage, pdfInfo.currentFontName,
+ pdfInfo.pdfPage,
pdfInfo.pdfPage.referencePDF(), pdfInfo.currentFontName,
pdfInfo.currentFontSize,
pdfInfo.currentXPosition,
pdfInfo.currentYPosition);
@@ -175,6 +178,7 @@
transform.translate(xOffset / 1000f, yOffset / 1000f);
pdfInfo.pdfState.setTransform(transform);
graphics.setPDFState(pdfInfo.pdfState);
+ graphics.setOutputStream(pdfInfo.outputStream);
try {
root.paint(graphics);
pdfInfo.currentStream.add(graphics.getString());
1.18 +17 -12 xml-fop/src/org/apache/fop/svg/PDFDocumentGraphics2D.java
Index: PDFDocumentGraphics2D.java
===================================================================
RCS file: /home/cvs/xml-fop/src/org/apache/fop/svg/PDFDocumentGraphics2D.java,v
retrieving revision 1.17
retrieving revision 1.18
diff -u -r1.17 -r1.18
--- PDFDocumentGraphics2D.java 28 Jun 2002 10:09:07 -0000 1.17
+++ PDFDocumentGraphics2D.java 1 Jul 2002 14:42:43 -0000 1.18
@@ -25,6 +25,9 @@
import org.apache.batik.ext.awt.g2d.GraphicContext;
+import org.apache.fop.image.JpegImage;
+import java.awt.image.ImageObserver;
+
/**
* This class is a wrapper for the <tt>PDFGraphics2D</tt> that
* is used to create a full document around the pdf rendering from
@@ -35,8 +38,6 @@
* @see org.apache.fop.svg.PDFGraphics2D
*/
public class PDFDocumentGraphics2D extends PDFGraphics2D {
- OutputStream stream;
-
PDFPage currentPage;
PDFStream pdfStream;
int width;
@@ -70,7 +71,6 @@
standalone = true;
this.pdfDoc = new PDFDocument();
this.pdfDoc.setProducer("FOP SVG Renderer");
- pdfStream = this.pdfDoc.makeStream(PDFStream.CONTENT_FILTER);
graphicsState = new PDFState();
@@ -78,18 +78,24 @@
currentFontSize = 0;
currentYPosition = 0;
currentXPosition = 0;
+
+ pdfStream = this.pdfDoc.makeStream(PDFStream.CONTENT_FILTER, false);
}
- void setupDocument(OutputStream stream, int width, int height) {
+ void setupDocument(OutputStream stream, int width, int height) throws
IOException {
this.width = width;
this.height = height;
- this.stream = stream;
PDFResources pdfResources = this.pdfDoc.getResources();
currentPage = this.pdfDoc.makePage(pdfResources,
width, height);
resourceContext = currentPage;
+ pageRef = currentPage.referencePDF();
currentStream.write("1 0 0 -1 0 " + height + " cm\n");
+
+ pdfDoc.outputHeader(stream);
+
+ setOutputStream(stream);
}
/**
@@ -105,7 +111,7 @@
* @param height the height of the document
*/
public PDFDocumentGraphics2D(boolean textAsShapes, OutputStream stream,
- int width, int height) {
+ int width, int height) throws IOException {
this(textAsShapes);
setupDocument(stream, width, height);
}
@@ -154,15 +160,14 @@
*/
public void finish() throws IOException {
pdfStream.add(getString());
- PDFResources pdfResources = this.pdfDoc.getResources();
+ this.pdfDoc.addStream(pdfStream);
currentPage.setContents(pdfStream);
this.pdfDoc.addPage(currentPage);
if (fontInfo != null) {
FontSetup.addToResources(pdfDoc, pdfDoc.getResources(), fontInfo);
}
- pdfDoc.outputHeader(stream);
- this.pdfDoc.output(stream);
- pdfDoc.outputTrailer(stream);
+ this.pdfDoc.output(outputStream);
+ pdfDoc.outputTrailer(outputStream);
}
/**
1.34 +48 -6 xml-fop/src/org/apache/fop/svg/PDFGraphics2D.java
Index: PDFGraphics2D.java
===================================================================
RCS file: /home/cvs/xml-fop/src/org/apache/fop/svg/PDFGraphics2D.java,v
retrieving revision 1.33
retrieving revision 1.34
diff -u -r1.33 -r1.34
--- PDFGraphics2D.java 1 Jul 2002 10:33:30 -0000 1.33
+++ PDFGraphics2D.java 1 Jul 2002 14:42:43 -0000 1.34
@@ -59,6 +59,7 @@
*/
protected PDFDocument pdfDoc;
protected PDFResourceContext resourceContext;
+ protected String pageRef;
/**
* the current state of the pdf graphics
@@ -94,6 +95,14 @@
protected int currentXPosition = 0;
/**
+ * The output stream for the pdf document.
+ * If this is set then it can progressively output
+ * the pdf document objects to reduce memory.
+ * Especially with images.
+ */
+ protected OutputStream outputStream = null;
+
+ /**
* A registry of images that have already been drawn. They are mapped to
* a structure with the PDF xObjectNum, width and height. This
* prevents multiple copies from being stored, which can greatly
@@ -113,7 +122,7 @@
* existing document.
*/
public PDFGraphics2D(boolean textAsShapes, FontState fs, PDFDocument doc,
- PDFResourceContext page, String font, float size, int
xpos, int ypos) {
+ PDFResourceContext page, String pref, String font, float
size, int xpos, int ypos) {
super(textAsShapes);
pdfDoc = doc;
resourceContext = page;
@@ -122,6 +131,7 @@
currentYPosition = ypos;
currentXPosition = xpos;
fontState = fs;
+ pageRef = pref;
graphicsState = new PDFState();
}
@@ -133,6 +143,10 @@
graphicsState = state;
}
+ public void setOutputStream(OutputStream os) {
+ outputStream = os;
+ }
+
public String getString() {
return currentStream.toString();
}
@@ -175,8 +189,7 @@
if(linkType != PDFLink.EXTERNAL) {
String pdfdest = "/FitR " + dest;
- // TODO use page ref instead
- resourceContext.addAnnotation(pdfDoc.makeLinkCurrentPage(rect,
pdfdest));
+ resourceContext.addAnnotation(pdfDoc.makeLink(rect, pageRef, pdfdest));
} else {
resourceContext.addAnnotation(pdfDoc.makeLink(rect,
dest, linkType));
@@ -202,6 +215,13 @@
+ x + " "
+ (y + height) + " cm\n" + "/Im"
+ xObjectNum + " Do\nQ\n");
+
+ if(outputStream != null) {
+ try {
+ this.pdfDoc.output(outputStream);
+ } catch(IOException ioe) {
+ }
+ }
}
/**
@@ -319,6 +339,13 @@
fopimg.setColorSpace(new PDFColorSpace(PDFColorSpace.DEVICE_GRAY));
PDFXObject xobj = pdfDoc.addImage(resourceContext, fopimg);
ref = xobj.referencePDF();
+
+ if(outputStream != null) {
+ try {
+ this.pdfDoc.output(outputStream);
+ } catch(IOException ioe) {
+ }
+ }
} else {
mask = null;
}
@@ -327,6 +354,13 @@
fopimg.setTransparent(new PDFColor(255, 255, 255));
imageInfo.xObjectNum = pdfDoc.addImage(resourceContext,
fopimg).getXNumber();
imageInfos.put(img, imageInfo);
+
+ if(outputStream != null) {
+ try {
+ this.pdfDoc.output(outputStream);
+ } catch(IOException ioe) {
+ }
+ }
}
// now do any transformation required and add the actual image
@@ -712,11 +746,12 @@
PDFResources res = pdfDoc.makeResources();
PDFResourceContext context = new PDFResourceContext(0, pdfDoc, res);
PDFGraphics2D pattGraphic = new PDFGraphics2D(textAsShapes, fs,
- pdfDoc, context,
+ pdfDoc, context, pageRef,
currentFontName, currentFontSize,
currentYPosition, currentXPosition);
pattGraphic.gc = (GraphicContext)this.gc.clone();
pattGraphic.gc.validateTransformStack();
+ pattGraphic.setOutputStream(outputStream);
GraphicsNode gn = pp.getGraphicsNode();
gn.paint(pattGraphic);
@@ -753,6 +788,13 @@
translate, null, pattStream.getBuffer());
currentStream.write(myPat.getColorSpaceOut(fill));
+
+ if(outputStream != null) {
+ try {
+ this.pdfDoc.output(outputStream);
+ } catch(IOException ioe) {
+ }
+ }
}
}
1.19 +10 -5 xml-fop/src/org/apache/fop/svg/PDFTranscoder.java
Index: PDFTranscoder.java
===================================================================
RCS file: /home/cvs/xml-fop/src/org/apache/fop/svg/PDFTranscoder.java,v
retrieving revision 1.18
retrieving revision 1.19
diff -u -r1.18 -r1.19
--- PDFTranscoder.java 18 Jun 2002 13:42:56 -0000 1.18
+++ PDFTranscoder.java 1 Jul 2002 14:42:43 -0000 1.19
@@ -32,6 +32,8 @@
import java.util.HashSet;
import java.util.Set;
+import java.io.IOException;
+
import org.apache.batik.transcoder.*;
import org.apache.batik.bridge.BridgeContext;
@@ -266,7 +268,11 @@
int w = (int)width;
int h = (int)height;
- graphics.setupDocument(output.getOutputStream(), w, h);
+ try {
+ graphics.setupDocument(output.getOutputStream(), w, h);
+ } catch (IOException ex) {
+ throw new TranscoderException(ex);
+ }
graphics.setSVGDimension(docWidth, docHeight);
currentTransform.setTransform(1, 0, 0, -1, 0, height);
/*if (!stroke) {
@@ -283,8 +289,7 @@
try {
graphics.finish();
- } catch (Exception ex) {
- ex.printStackTrace();
+ } catch (IOException ex) {
throw new TranscoderException(ex);
}
}
---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]