FOP-2689: PDF rotated at 90 degrees not visible
git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop-pdf-images/trunk@1782135 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/src/java/org/apache/fop/render/pdf/pdfbox/PDFBoxAdapterUtil.java b/src/java/org/apache/fop/render/pdf/pdfbox/PDFBoxAdapterUtil.java
index 6b9929e..3e8d5dd 100644
--- a/src/java/org/apache/fop/render/pdf/pdfbox/PDFBoxAdapterUtil.java
+++ b/src/java/org/apache/fop/render/pdf/pdfbox/PDFBoxAdapterUtil.java
@@ -110,24 +110,22 @@
}
protected static void rotate(int rotation, PDRectangle viewBox, AffineTransform atdoc) {
- float x = viewBox.getWidth() + viewBox.getLowerLeftX();
- float y = viewBox.getHeight() + viewBox.getLowerLeftY();
+ float w = viewBox.getWidth();
+ float h = viewBox.getHeight();
+ float x = viewBox.getLowerLeftX();
+ float y = viewBox.getLowerLeftY();
switch (rotation) {
case 90:
- atdoc.scale(viewBox.getWidth() / viewBox.getHeight(), viewBox.getHeight() / viewBox.getWidth());
- atdoc.translate(0, viewBox.getWidth());
- atdoc.rotate(-Math.PI / 2.0);
- atdoc.scale(viewBox.getWidth() / viewBox.getHeight(), viewBox.getHeight() / viewBox.getWidth());
+ atdoc.rotate(Math.toRadians(rotation + 180), x, y);
+ atdoc.translate(-h, 0);
break;
case 180:
- atdoc.translate(x, y);
- atdoc.rotate(-Math.PI);
- atdoc.translate(-viewBox.getLowerLeftX(), -viewBox.getLowerLeftY());
+ atdoc.translate(w, h);
+ atdoc.rotate(Math.toRadians(rotation), x, y);
break;
case 270:
- atdoc.translate(viewBox.getLowerLeftX(), y);
- atdoc.rotate(Math.toRadians(270 + 180));
- atdoc.translate(-x, -y);
+ atdoc.rotate(Math.toRadians(rotation + 180), x, h + y);
+ atdoc.translate(-w, 0);
break;
default:
//no additional transformations necessary
diff --git a/test/java/org/apache/fop/render/pdf/PDFBoxAdapterTestCase.java b/test/java/org/apache/fop/render/pdf/PDFBoxAdapterTestCase.java
index 54c460d..eda1af7 100644
--- a/test/java/org/apache/fop/render/pdf/PDFBoxAdapterTestCase.java
+++ b/test/java/org/apache/fop/render/pdf/PDFBoxAdapterTestCase.java
@@ -84,7 +84,6 @@
import junit.framework.Assert;
public class PDFBoxAdapterTestCase {
- private Rectangle2D r = new Rectangle2D.Double();
protected static final String CFF1 = "test/resources/2fonts.pdf";
protected static final String CFF2 = "test/resources/2fonts2.pdf";
protected static final String CFF3 = "test/resources/simpleh.pdf";
@@ -109,9 +108,14 @@
private static final String XFORM = "test/resources/xform.pdf";
private static final String LOOP = "test/resources/loop.pdf";
- private PDFBoxAdapter getPDFBoxAdapter(boolean mergeFonts) {
+ private static PDFPage getPDFPage(PDFDocument doc) {
+ final Rectangle2D r = new Rectangle2D.Double();
+ return new PDFPage(new PDFResources(doc), 0, r, r, r, r);
+ }
+
+ protected static PDFBoxAdapter getPDFBoxAdapter(boolean mergeFonts) {
PDFDocument doc = new PDFDocument("");
- PDFPage pdfpage = new PDFPage(new PDFResources(doc), 0, r, r, r, r);
+ PDFPage pdfpage = getPDFPage(doc);
doc.setMergeFontsEnabled(mergeFonts);
pdfpage.setDocument(doc);
pdfpage.setObjectNumber(1);
@@ -187,27 +191,9 @@
}
@Test
- public void testStream() throws Exception {
- PDFDocument pdfdoc = new PDFDocument("");
- PDFPage pdfpage = new PDFPage(new PDFResources(pdfdoc), 0, r, r, r, r);
- pdfpage.setDocument(pdfdoc);
- PDFBoxAdapter adapter = new PDFBoxAdapter(pdfpage, new HashMap(), new HashMap<Integer, PDFArray>());
- PDDocument doc = PDDocument.load(new File(ROTATE));
- PDPage page = doc.getDocumentCatalog().getPages().get(0);
- AffineTransform at = new AffineTransform();
- Rectangle r = new Rectangle(0, 1650, 842000, 595000);
- String stream = adapter.createStreamFromPDFBoxPage(doc, page, "key", at, null, r);
- Assert.assertEquals(at, new AffineTransform(-0.0, 1.0000000554888686, 1.0000000554888686, 0.0, 0.0,
- -2.0742416381835938E-5));
- Assert.assertTrue(stream.contains("/GS0106079 gs"));
- Assert.assertTrue(stream.contains("/TT0106079 1 Tf"));
- doc.close();
- }
-
- @Test
public void testTaggedPDFWriter() throws IOException {
PDFDocument pdfdoc = new PDFDocument("");
- PDFPage pdfpage = new PDFPage(new PDFResources(pdfdoc), 0, r, r, r, r);
+ PDFPage pdfpage = getPDFPage(pdfdoc);
pdfpage.setDocument(pdfdoc);
PDFBoxAdapter adapter = new PDFBoxAdapter(pdfpage, new HashMap(), new HashMap<Integer, PDFArray>());
adapter.setCurrentMCID(5);
@@ -223,7 +209,7 @@
@Test
public void testAnnot() throws Exception {
PDFDocument pdfdoc = new PDFDocument("");
- PDFPage pdfpage = new PDFPage(new PDFResources(pdfdoc), 0, r, r, r, r);
+ PDFPage pdfpage = getPDFPage(pdfdoc);
pdfpage.setDocument(pdfdoc);
pdfpage.setObjectNumber(1);
PDFBoxAdapter adapter = new PDFBoxAdapter(pdfpage, new HashMap(), new HashMap<Integer, PDFArray>());
@@ -258,7 +244,7 @@
@Test
public void testLink() throws Exception {
PDFDocument pdfdoc = new PDFDocument("");
- PDFPage pdfpage = new PDFPage(new PDFResources(pdfdoc), 0, r, r, r, r);
+ PDFPage pdfpage = getPDFPage(pdfdoc);
pdfpage.setDocument(pdfdoc);
pdfpage.setObjectNumber(1);
Map<Integer, PDFArray> pageNumbers = new HashMap<Integer, PDFArray>();
@@ -280,7 +266,7 @@
PDFDocument pdfdoc = new PDFDocument("");
pdfdoc.getFilterMap().put(PDFFilterList.DEFAULT_FILTER, Collections.singletonList("null"));
pdfdoc.setMergeFontsEnabled(true);
- PDFPage pdfpage = new PDFPage(new PDFResources(pdfdoc), 0, r, r, r, r);
+ PDFPage pdfpage = getPDFPage(pdfdoc);
pdfpage.setDocument(pdfdoc);
pdfpage.setObjectNumber(1);
Map<Integer, PDFArray> pageNumbers = new HashMap<Integer, PDFArray>();
@@ -396,7 +382,7 @@
PDDocument doc = PDDocument.load(new File(SHADING));
ImagePDF img = new ImagePDF(imgi, doc);
PDFDocument pdfdoc = new PDFDocument("");
- PDFPage pdfpage = new PDFPage(new PDFResources(pdfdoc), 0, r, r, r, r);
+ PDFPage pdfpage = getPDFPage(pdfdoc);
pdfpage.setDocument(pdfdoc);
PDFGState g = new PDFGState();
pdfdoc.assignObjectNumber(g);
@@ -417,7 +403,7 @@
@Test
public void testPDFCache() throws IOException {
PDFDocument pdfdoc = new PDFDocument("");
- PDFPage pdfpage = new PDFPage(new PDFResources(pdfdoc), 0, r, r, r, r);
+ PDFPage pdfpage = getPDFPage(pdfdoc);
pdfdoc.assignObjectNumber(pdfpage);
pdfpage.setDocument(pdfdoc);
Map<Object, Object> pdfCache = new HashMap<Object, Object>();
diff --git a/test/java/org/apache/fop/render/pdf/PDFRotateTestCase.java b/test/java/org/apache/fop/render/pdf/PDFRotateTestCase.java
index 700d1fc..874b705 100644
--- a/test/java/org/apache/fop/render/pdf/PDFRotateTestCase.java
+++ b/test/java/org/apache/fop/render/pdf/PDFRotateTestCase.java
@@ -19,7 +19,11 @@
package org.apache.fop.render.pdf;
+import java.awt.Rectangle;
+import java.awt.geom.AffineTransform;
import java.awt.geom.Rectangle2D;
+import java.io.File;
+import java.io.IOException;
import org.junit.Test;
@@ -34,6 +38,7 @@
import org.apache.fop.render.pdf.pdfbox.ImageConverterPDF2G2D;
import org.apache.fop.render.pdf.pdfbox.ImagePDF;
+import org.apache.fop.render.pdf.pdfbox.PDFBoxAdapter;
import org.apache.fop.render.pdf.pdfbox.PSPDFGraphics2D;
import junit.framework.Assert;
@@ -58,4 +63,27 @@
ig.getGraphics2DImagePainter().paint(g2d, rect);
Assert.assertEquals(g2d.getTransform().getShearX(), 0.16339869281045735);
}
+
+ @Test
+ public void testAngle() throws IOException {
+ Assert.assertEquals(getTransform(90), new AffineTransform(0, 1, 1, 0, 0, 0));
+ Assert.assertEquals(getTransform(270), new AffineTransform(0, -1, -1, 0, 842, 595));
+ AffineTransform at = getTransform(180);
+ Assert.assertEquals((int)at.getTranslateX(), 842);
+ Assert.assertEquals(at.getTranslateY(), 0.0);
+ }
+
+ private AffineTransform getTransform(int angle) throws IOException {
+ PDFBoxAdapter adapter = PDFBoxAdapterTestCase.getPDFBoxAdapter(false);
+ PDDocument doc = PDDocument.load(new File(PDFBoxAdapterTestCase.ROTATE));
+ PDPage page = doc.getDocumentCatalog().getPages().get(0);
+ page.setRotation(angle);
+ AffineTransform at = new AffineTransform();
+ Rectangle r = new Rectangle(0, 1650, 842000, 595000);
+ String stream = adapter.createStreamFromPDFBoxPage(doc, page, "key", at, null, r);
+ Assert.assertTrue(stream.contains("/GS0106079 gs"));
+ Assert.assertTrue(stream.contains("/TT0106079 1 Tf"));
+ doc.close();
+ return at;
+ }
}