|
|
@@ -1,5 +1,5 @@ |
|
|
|
/* |
|
|
|
* Copyright 1999-2004 The Apache Software Foundation. |
|
|
|
* Copyright 1999-2005 The Apache Software Foundation. |
|
|
|
* |
|
|
|
* Licensed under the Apache License, Version 2.0 (the "License"); |
|
|
|
* you may not use this file except in compliance with the License. |
|
|
@@ -34,8 +34,6 @@ import org.apache.avalon.framework.activity.Initializable; |
|
|
|
import org.apache.avalon.framework.configuration.Configurable; |
|
|
|
import org.apache.avalon.framework.configuration.Configuration; |
|
|
|
import org.apache.avalon.framework.configuration.ConfigurationException; |
|
|
|
import org.apache.commons.logging.impl.SimpleLog; |
|
|
|
import org.apache.commons.logging.Log; |
|
|
|
|
|
|
|
import java.awt.Graphics; |
|
|
|
import java.awt.Font; |
|
|
@@ -47,7 +45,6 @@ import java.awt.geom.AffineTransform; |
|
|
|
import java.io.OutputStream; |
|
|
|
import java.io.IOException; |
|
|
|
import java.io.StringWriter; |
|
|
|
import java.util.List; |
|
|
|
|
|
|
|
/** |
|
|
|
* This class is a wrapper for the <tt>PDFGraphics2D</tt> that |
|
|
@@ -55,13 +52,13 @@ import java.util.List; |
|
|
|
* <tt>PDFGraphics2D</tt>. |
|
|
|
* |
|
|
|
* @author <a href="mailto:keiron@aftexsw.com">Keiron Liddle</a> |
|
|
|
* @version $Id: PDFDocumentGraphics2D.java,v 1.27 2003/03/07 09:51:26 jeremias Exp $ |
|
|
|
* @version $Id$ |
|
|
|
* @see org.apache.fop.svg.PDFGraphics2D |
|
|
|
*/ |
|
|
|
public class PDFDocumentGraphics2D extends PDFGraphics2D |
|
|
|
implements Configurable, Initializable { |
|
|
|
|
|
|
|
private PDFPage currentPage; |
|
|
|
private PDFContext pdfContext; |
|
|
|
|
|
|
|
private int width; |
|
|
|
private int height; |
|
|
@@ -70,13 +67,6 @@ public class PDFDocumentGraphics2D extends PDFGraphics2D |
|
|
|
private float svgWidth; |
|
|
|
private float svgHeight; |
|
|
|
|
|
|
|
private List fontList; |
|
|
|
|
|
|
|
/** number of pages generated */ |
|
|
|
protected int pagecount; |
|
|
|
/** indicates whether a page is currently being generated */ |
|
|
|
protected boolean pagePending; |
|
|
|
|
|
|
|
/** Initial clipping area, used to restore to original setting when a new page is started. */ |
|
|
|
protected Shape initialClip; |
|
|
|
/** |
|
|
@@ -85,8 +75,6 @@ public class PDFDocumentGraphics2D extends PDFGraphics2D |
|
|
|
*/ |
|
|
|
protected AffineTransform initialTransform; |
|
|
|
|
|
|
|
private Log logger; |
|
|
|
|
|
|
|
//Avalon component |
|
|
|
private Configuration cfg; |
|
|
|
|
|
|
@@ -104,6 +92,7 @@ public class PDFDocumentGraphics2D extends PDFGraphics2D |
|
|
|
public PDFDocumentGraphics2D(boolean textAsShapes) { |
|
|
|
super(textAsShapes); |
|
|
|
|
|
|
|
this.pdfContext = new PDFContext(); |
|
|
|
if (!textAsShapes) { |
|
|
|
fontInfo = new FontInfo(); |
|
|
|
FontSetup.setup(fontInfo, null); |
|
|
@@ -147,23 +136,7 @@ public class PDFDocumentGraphics2D extends PDFGraphics2D |
|
|
|
* This constructor is Avalon-style. |
|
|
|
*/ |
|
|
|
public PDFDocumentGraphics2D() { |
|
|
|
super(false); |
|
|
|
} |
|
|
|
|
|
|
|
public void setLogger(Log logger) { |
|
|
|
this.logger = logger; |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* Returns the logger. |
|
|
|
* @return Logger the logger |
|
|
|
*/ |
|
|
|
protected final Log getLogger() { |
|
|
|
if (this.logger == null) { |
|
|
|
this.logger = new SimpleLog("FOP/PDF"); |
|
|
|
((SimpleLog) logger).setLevel(SimpleLog.LOG_LEVEL_INFO); |
|
|
|
} |
|
|
|
return this.logger; |
|
|
|
this(false); |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
@@ -171,7 +144,7 @@ public class PDFDocumentGraphics2D extends PDFGraphics2D |
|
|
|
*/ |
|
|
|
public void configure(Configuration cfg) throws ConfigurationException { |
|
|
|
this.cfg = cfg; |
|
|
|
this.fontList = FontSetup.buildFontListFromConfiguration(cfg); |
|
|
|
this.pdfContext.setFontList(FontSetup.buildFontListFromConfiguration(cfg)); |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
@@ -180,7 +153,7 @@ public class PDFDocumentGraphics2D extends PDFGraphics2D |
|
|
|
public void initialize() throws Exception { |
|
|
|
if (this.fontInfo == null) { |
|
|
|
fontInfo = new FontInfo(); |
|
|
|
FontSetup.setup(fontInfo, this.fontList); |
|
|
|
FontSetup.setup(fontInfo, this.pdfContext.getFontList()); |
|
|
|
//FontState fontState = new FontState("Helvetica", "normal", |
|
|
|
// FontInfo.NORMAL, 12, 0); |
|
|
|
} |
|
|
@@ -257,34 +230,39 @@ public class PDFDocumentGraphics2D extends PDFGraphics2D |
|
|
|
currentStream.write("Q\n"); |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* Is called to prepare the PDFDocumentGraphics2D for the next page to be painted. Basically, |
|
|
|
* this closes the current page. A new page is prepared as soon as painting starts. |
|
|
|
*/ |
|
|
|
public void nextPage() { |
|
|
|
closePage(); |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/** |
|
|
|
* Closes the current page and adds it to the PDF file. |
|
|
|
*/ |
|
|
|
protected void closePage() { |
|
|
|
if (!this.pagePending) { |
|
|
|
if (!pdfContext.isPagePending()) { |
|
|
|
return; //ignore |
|
|
|
} |
|
|
|
//Finish page |
|
|
|
PDFStream pdfStream = this.pdfDoc.getFactory().makeStream(PDFFilterList.CONTENT_FILTER, false); |
|
|
|
PDFStream pdfStream = this.pdfDoc.getFactory().makeStream( |
|
|
|
PDFFilterList.CONTENT_FILTER, false); |
|
|
|
pdfStream.add(getString()); |
|
|
|
currentStream = null; |
|
|
|
this.pdfDoc.registerObject(pdfStream); |
|
|
|
currentPage.setContents(pdfStream); |
|
|
|
PDFAnnotList annots = currentPage.getAnnotations(); |
|
|
|
pdfContext.getCurrentPage().setContents(pdfStream); |
|
|
|
PDFAnnotList annots = pdfContext.getCurrentPage().getAnnotations(); |
|
|
|
if (annots != null) { |
|
|
|
this.pdfDoc.addObject(annots); |
|
|
|
} |
|
|
|
this.pdfDoc.addObject(currentPage); |
|
|
|
this.currentPage = null; |
|
|
|
|
|
|
|
this.pagePending = false; |
|
|
|
this.pdfDoc.addObject(pdfContext.getCurrentPage()); |
|
|
|
pdfContext.clearCurrentPage(); |
|
|
|
} |
|
|
|
|
|
|
|
/** {@inheritDoc} */ |
|
|
|
protected void preparePainting() { |
|
|
|
if (this.pagePending) { |
|
|
|
if (pdfContext.isPagePending()) { |
|
|
|
return; |
|
|
|
} |
|
|
|
try { |
|
|
@@ -294,8 +272,12 @@ public class PDFDocumentGraphics2D extends PDFGraphics2D |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
/** |
|
|
|
* Called to prepare a new page |
|
|
|
* @throws IOException if starting the new page fails due to I/O errors. |
|
|
|
*/ |
|
|
|
protected void startPage() throws IOException { |
|
|
|
if (this.pagePending) { |
|
|
|
if (pdfContext.isPagePending()) { |
|
|
|
throw new IllegalStateException("Close page first before starting another"); |
|
|
|
} |
|
|
|
//Start page |
|
|
@@ -318,10 +300,11 @@ public class PDFDocumentGraphics2D extends PDFGraphics2D |
|
|
|
} |
|
|
|
|
|
|
|
PDFResources pdfResources = this.pdfDoc.getResources(); |
|
|
|
currentPage = this.pdfDoc.getFactory().makePage(pdfResources, |
|
|
|
width, height); |
|
|
|
resourceContext = currentPage; |
|
|
|
pageRef = currentPage.referencePDF(); |
|
|
|
PDFPage page = this.pdfDoc.getFactory().makePage(pdfResources, |
|
|
|
width, height); |
|
|
|
resourceContext = page; |
|
|
|
pdfContext.setCurrentPage(page); |
|
|
|
pageRef = page.referencePDF(); |
|
|
|
graphicsState.setTransform(new AffineTransform(1.0, 0.0, 0.0, -1.0, 0.0, (double)height)); |
|
|
|
currentStream.write("1 0 0 -1 0 " + height + " cm\n"); |
|
|
|
if (svgWidth != 0) { |
|
|
@@ -329,8 +312,7 @@ public class PDFDocumentGraphics2D extends PDFGraphics2D |
|
|
|
+ PDFNumber.doubleOut(height / svgHeight) + " 0 0 cm\n"); |
|
|
|
} |
|
|
|
|
|
|
|
this.pagecount++; |
|
|
|
this.pagePending = true; |
|
|
|
pdfContext.increasePageCount(); |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
@@ -361,6 +343,12 @@ public class PDFDocumentGraphics2D extends PDFGraphics2D |
|
|
|
*/ |
|
|
|
public PDFDocumentGraphics2D(PDFDocumentGraphics2D g) { |
|
|
|
super(g); |
|
|
|
this.pdfContext = g.pdfContext; |
|
|
|
this.cfg = g.cfg; |
|
|
|
this.width = g.width; |
|
|
|
this.height = g.height; |
|
|
|
this.svgWidth = g.svgWidth; |
|
|
|
this.svgHeight = g.svgHeight; |
|
|
|
} |
|
|
|
|
|
|
|
/** |