You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pdfbox.apache.org by ja...@apache.org on 2014/10/28 23:35:32 UTC
svn commit: r1634999 - in
/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox:
contentstream/PDFStreamEngine.java pdmodel/PDPage.java
pdmodel/graphics/state/PDGraphicsState.java rendering/PDFRenderer.java
rendering/PageDrawer.java
Author: jahewson
Date: Tue Oct 28 22:35:31 2014
New Revision: 1634999
URL: http://svn.apache.org/r1634999
Log:
PDFBOX-2423: Fix for transparency groups and pages with non-origin crop boxes
Modified:
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/contentstream/PDFStreamEngine.java
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/PDPage.java
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/state/PDGraphicsState.java
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/rendering/PDFRenderer.java
pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/rendering/PageDrawer.java
Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/contentstream/PDFStreamEngine.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/contentstream/PDFStreamEngine.java?rev=1634999&r1=1634998&r2=1634999&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/contentstream/PDFStreamEngine.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/contentstream/PDFStreamEngine.java Tue Oct 28 22:35:31 2014
@@ -17,7 +17,6 @@
package org.apache.pdfbox.contentstream;
import java.awt.geom.Area;
-import java.awt.geom.GeneralPath;
import java.awt.geom.Point2D;
import java.io.ByteArrayInputStream;
import java.io.IOException;
@@ -307,9 +306,8 @@ public class PDFStreamEngine
}
if (bbox != null)
{
- Area clip = new Area(new GeneralPath(bbox.toRectangle2D()));
- clip.transform(getGraphicsState().getCurrentTransformationMatrix().createAffineTransform());
- getGraphicsState().intersectClippingPath(clip);
+ PDRectangle clip = bbox.transform(getGraphicsState().getCurrentTransformationMatrix());
+ getGraphicsState().intersectClippingPath(new Area(clip.toRectangle2D()));
}
// fixme: stream matrix
@@ -700,31 +698,6 @@ public class PDFStreamEngine
.transform(position, 0, position, 0, 1);
return new Point2D.Double(position[0], position[1]);
}
-
- /**
- * use the current transformation matrix to transformPoint a PDRectangle.
- *
- * @param rect the PDRectangle to transformPoint
- * @return the transformed coordinates as a GeneralPath
- */
- public GeneralPath transformedPDRectanglePath(PDRectangle rect)
- {
- float x1 = rect.getLowerLeftX();
- float y1 = rect.getLowerLeftY();
- float x2 = rect.getUpperRightX();
- float y2 = rect.getUpperRightY();
- Point2D p0 = transformedPoint(x1, y1);
- Point2D p1 = transformedPoint(x2, y1);
- Point2D p2 = transformedPoint(x2, y2);
- Point2D p3 = transformedPoint(x1, y2);
- GeneralPath path = new GeneralPath();
- path.moveTo((float) p0.getX(), (float) p0.getY());
- path.lineTo((float) p1.getX(), (float) p1.getY());
- path.lineTo((float) p2.getX(), (float) p2.getY());
- path.lineTo((float) p3.getX(), (float) p3.getY());
- path.closePath();
- return path;
- }
// transforms a width using the CTM
protected float transformWidth(float width)
Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/PDPage.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/PDPage.java?rev=1634999&r1=1634998&r2=1634999&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/PDPage.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/PDPage.java Tue Oct 28 22:35:31 2014
@@ -175,7 +175,7 @@ public class PDPage implements COSObject
@Override
public Matrix getMatrix()
{
- // todo: take into account user-space unit redefinition?
+ // todo: take into account user-space unit redefinition as scale?
return new Matrix();
}
Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/state/PDGraphicsState.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/state/PDGraphicsState.java?rev=1634999&r1=1634998&r2=1634999&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/state/PDGraphicsState.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/graphics/state/PDGraphicsState.java Tue Oct 28 22:35:31 2014
@@ -70,18 +70,12 @@ public class PDGraphicsState implements
private double smoothness = 0;
/**
- * Constructor with a given pagesize to initialize the clipping path.
+ * Constructor with a given page size to initialize the clipping path.
* @param page the size of the page
*/
public PDGraphicsState(PDRectangle page)
{
clippingPath = new Area(new GeneralPath(page.toRectangle2D()));
- if (page.getLowerLeftX() != 0 || page.getLowerLeftY() != 0)
- {
- //Compensate for offset
- this.currentTransformationMatrix = this.currentTransformationMatrix.multiply(
- Matrix.getTranslatingInstance(-page.getLowerLeftX(), -page.getLowerLeftY()));
- }
}
/**
Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/rendering/PDFRenderer.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/rendering/PDFRenderer.java?rev=1634999&r1=1634998&r2=1634999&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/rendering/PDFRenderer.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/rendering/PDFRenderer.java Tue Oct 28 22:35:31 2014
@@ -178,7 +178,6 @@ public class PDFRenderer
}
// renders a page to the given graphics
- // TODO need to be able to override this
private void renderPage(PDPage page, Graphics2D graphics, int width, int height, float scaleX,
float scaleY) throws IOException
{
@@ -187,7 +186,7 @@ public class PDFRenderer
graphics.scale(scaleX, scaleY);
// TODO should we be passing the scale to PageDrawer rather than messing with Graphics?
- PDRectangle adjustedCropBox = page.getCropBox();
+ PDRectangle cropBox = page.getCropBox();
int rotationAngle = page.getRotation();
if (rotationAngle != 0)
{
@@ -196,22 +195,21 @@ public class PDFRenderer
switch (rotationAngle)
{
case 90:
- translateX = adjustedCropBox.getHeight();
+ translateX = cropBox.getHeight();
break;
case 270:
- translateY = adjustedCropBox.getWidth();
+ translateY = cropBox.getWidth();
break;
case 180:
- translateX = adjustedCropBox.getWidth();
- translateY = adjustedCropBox.getHeight();
+ translateX = cropBox.getWidth();
+ translateY = cropBox.getHeight();
break;
}
graphics.translate(translateX, translateY);
graphics.rotate((float) Math.toRadians(rotationAngle));
}
- // TODO: need to make it easy to use a custom PageDrawer and TilingPatternDrawer
PageDrawer drawer = new PageDrawer(this, page);
- drawer.drawPage(graphics, adjustedCropBox);
+ drawer.drawPage(graphics, cropBox);
}
}
Modified: pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/rendering/PageDrawer.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/rendering/PageDrawer.java?rev=1634999&r1=1634998&r2=1634999&view=diff
==============================================================================
--- pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/rendering/PageDrawer.java (original)
+++ pdfbox/trunk/pdfbox/src/main/java/org/apache/pdfbox/rendering/PageDrawer.java Tue Oct 28 22:35:31 2014
@@ -153,6 +153,9 @@ public class PageDrawer extends PDFGraph
// TODO use getStroke() to set the initial stroke
graphics.setStroke(new BasicStroke(1.0f, BasicStroke.CAP_BUTT, BasicStroke.JOIN_MITER));
+ // adjust for non-(0,0) crop box
+ graphics.translate(-pageSize.getLowerLeftX(), -pageSize.getLowerLeftY());
+
processPage(getPage());
for (PDAnnotation annotation : getPage().getAnnotations())
@@ -765,7 +768,7 @@ public class PageDrawer extends PDFGraph
super.showAnnotation(annotation);
}
- @Override
+ //@Override
public void showTransparencyGroup(PDFormXObject form) throws IOException
{
TransparencyGroup group = createTransparencyGroup(form);
@@ -774,25 +777,7 @@ public class PageDrawer extends PDFGraph
private TransparencyGroup createTransparencyGroup(PDFormXObject form) throws IOException
{
- saveGraphicsState();
- try
- {
- // if there is an optional form matrix, we have to map the form space to the user space
- Matrix matrix = form.getMatrix();
- if(matrix != null)
- {
- Matrix xCTM = matrix.multiply(getGraphicsState().getCurrentTransformationMatrix());
- getGraphicsState().setCurrentTransformationMatrix(xCTM);
- }
-
- PDRectangle bBox = form.getBBox();
- GeneralPath path = transformedPDRectanglePath(bBox);
- return new TransparencyGroup(path, form);
- }
- finally
- {
- restoreGraphicsState();
- }
+ return new TransparencyGroup(form);
}
/**
@@ -810,10 +795,8 @@ public class PageDrawer extends PDFGraph
/**
* Creates a buffered image for a transparency group result.
- *
- * @param clippingPath clipping path (in current graphics2D coordinates)
*/
- private TransparencyGroup(GeneralPath clippingPath, PDFormXObject form) throws IOException
+ private TransparencyGroup(PDFormXObject form) throws IOException
{
Graphics2D g2dOriginal = graphics;
Area lastClipOriginal = lastClip;
@@ -821,11 +804,9 @@ public class PageDrawer extends PDFGraph
// check underlying g2d
Area groupClip = new Area(getGraphicsState().getCurrentClippingPath());
- if (clippingPath != null)
- {
- Area newArea = new Area(clippingPath);
- groupClip.intersect(newArea);
- }
+ Area clippingPath = new Area(new GeneralPath(form.getBBox().toRectangle2D()));
+ Area newArea = new Area(clippingPath);
+ groupClip.intersect(newArea);
AffineTransform at = g2dOriginal.getTransform();
Shape clippingPathInPixels = at.createTransformedShape(groupClip);
@@ -892,9 +873,7 @@ public class PageDrawer extends PDFGraph
{
if (matrix != null)
{
- saveGraphicsState();
drawBufferedImage(image, matrix.createAffineTransform());
- restoreGraphicsState();
}
}