Browse Source

FOP-2773: Images inside a PDF not shown when goca=print-file

git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/trunk@1825861 13f79535-47bb-0310-9956-ffa450edef68
pull/6/head
Simon Steiner 6 years ago
parent
commit
a0e65365c3

+ 9
- 1
fop-core/src/main/java/org/apache/fop/afp/AFPGraphics2D.java View File

@@ -58,6 +58,7 @@ import org.apache.xmlgraphics.util.UnitConv;

import org.apache.fop.afp.goca.GraphicsSetLineType;
import org.apache.fop.afp.modca.GraphicsObject;
import org.apache.fop.afp.modca.ResourceObject;
import org.apache.fop.afp.util.CubicBezierApproximator;
import org.apache.fop.fonts.FontInfo;
import org.apache.fop.render.afp.AFPImageHandlerRenderedImage;
@@ -626,7 +627,12 @@ public class AFPGraphics2D extends AbstractGraphics2D implements NativeImageHand
double h = toMillipointFactor * imgHeight * -gat.getScaleY();

AFPImageHandlerRenderedImage handler = new AFPImageHandlerRenderedImage();
ImageInfo imageInfo = new ImageInfo(null, null);
String uri = null;
if (resourceManager.getResourceLevelDefaults()
.getDefaultResourceLevel(ResourceObject.TYPE_GRAPHIC).isPrintFile()) {
uri = resourceInfo.getUri();
}
ImageInfo imageInfo = new ImageInfo(uri, null);
imageInfo.setSize(new ImageSize(
img.getWidth(), img.getHeight(), paintingState.getResolution()));
imageInfo.getSize().calcSizeFromPixels();
@@ -638,11 +644,13 @@ public class AFPGraphics2D extends AbstractGraphics2D implements NativeImageHand
(int)Math.round(h));
AFPRenderingContext context = new AFPRenderingContext(null,
resourceManager, paintingState, fontInfo, null);
resourceManager.includeCached = false;
try {
handler.handleImage(context, red, targetPos);
} catch (IOException ioe) {
handleIOException(ioe);
}
resourceManager.includeCached = true;
}

/**

+ 32
- 20
fop-core/src/main/java/org/apache/fop/afp/AFPResourceManager.java View File

@@ -25,6 +25,9 @@ import java.io.InputStream;
import java.io.OutputStream;
import java.net.URI;
import java.net.URISyntaxException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.commons.io.IOUtils;
@@ -74,10 +77,13 @@ public class AFPResourceManager {
private int instreamObjectCount;

/** Mapping of resourceInfo to AbstractCachedObject */
private final Map<AFPResourceInfo, AbstractCachedObject> includeObjectCache
= new java.util.HashMap<AFPResourceInfo, AbstractCachedObject>();
private final Map<AFPResourceInfo, List<AbstractCachedObject>> includeObjectCache =
new HashMap<AFPResourceInfo, List<AbstractCachedObject>>();

private AFPResourceLevelDefaults resourceLevelDefaults = new AFPResourceLevelDefaults();

protected boolean includeCached = true;

/**
* Main constructor
*
@@ -262,7 +268,7 @@ public class AFPResourceManager {

cachedObject.includeObject();

includeObjectCache.put(dataObjectInfo.getResourceInfo(), cachedObject);
addToCache(dataObjectInfo.getResourceInfo(), cachedObject);

//The data field of dataObjectInfo is not further required
// therefore we are safe to null the reference, saving memory
@@ -270,6 +276,15 @@ public class AFPResourceManager {

}

private void addToCache(AFPResourceInfo resourceInfo, AbstractCachedObject cachedObject) {
List<AbstractCachedObject> objs = includeObjectCache.get(resourceInfo);
if (objs == null) {
objs = new ArrayList<AbstractCachedObject>();
includeObjectCache.put(resourceInfo, objs);
}
objs.add(cachedObject);
}

/**
* Returns {@code true} if the passed {@link AFPResourceInfo} instance is already cached.
*
@@ -287,17 +302,14 @@ public class AFPResourceManager {
* @return {@code true} if ...
*/
public boolean includeCachedObject(AFPResourceInfo resourceInfo, AFPObjectAreaInfo areaInfo) {

String objectName;

AbstractCachedObject cachedObject = includeObjectCache.get(resourceInfo);

if (cachedObject != null) {
if (areaInfo != null) {
cachedObject.dataObjectInfo.setObjectAreaInfo(areaInfo);
List<AbstractCachedObject> cachedObjectList = includeObjectCache.get(resourceInfo);
if (cachedObjectList != null && includeCached) {
for (AbstractCachedObject cachedObject : cachedObjectList) {
if (areaInfo != null && cachedObjectList.size() == 1) {
cachedObject.dataObjectInfo.setObjectAreaInfo(areaInfo);
}
cachedObject.includeObject();
}
cachedObject.includeObject();

return true;
} else {
return false;
@@ -399,7 +411,7 @@ public class AFPResourceManager {
resourceInfo.setName(resourceName);
resourceInfo.setUri(uri.toASCIIString());

AbstractCachedObject cachedObject = includeObjectCache.get(resourceInfo);
List<AbstractCachedObject> cachedObject = includeObjectCache.get(resourceInfo);
if (cachedObject == null) {
if (log.isDebugEnabled()) {
log.debug("Adding included resource: " + resourceName);
@@ -441,10 +453,10 @@ public class AFPResourceManager {
}

//TODO what is the data object?
cachedObject = new CachedObject(resourceName, null);
CachedObject newcachedObject = new CachedObject(resourceName, null);

// record mapping of resource info to data object resource name
includeObjectCache.put(resourceInfo, cachedObject);
addToCache(resourceInfo, newcachedObject);
} else {
//skip, already created
}
@@ -484,8 +496,8 @@ public class AFPResourceManager {
resourceInfo.setName(resourceName);
resourceInfo.setUri(uri.toASCIIString());

AbstractCachedObject cachedObject = includeObjectCache.get(resourceInfo);
if (cachedObject == null) {
List<AbstractCachedObject> resource = includeObjectCache.get(resourceInfo);
if (resource == null) {
ResourceGroup resourceGroup = streamer.getResourceGroup(resourceLevel);

//resourceObject delegates write commands to copyNamedResource()
@@ -512,8 +524,8 @@ public class AFPResourceManager {
protected void writeEnd(OutputStream os) throws IOException { }
};
resourceGroup.addObject(resourceObject);
cachedObject = new CachedObject(resourceName, null);
includeObjectCache.put(resourceInfo, cachedObject);
CachedObject newresource = new CachedObject(resourceName, null);
addToCache(resourceInfo, newresource);
}
}


+ 52
- 0
fop-core/src/test/java/org/apache/fop/afp/AFPResourceManagerTestCase.java View File

@@ -19,6 +19,10 @@

package org.apache.fop.afp;

import java.awt.Dimension;
import java.awt.Graphics2D;
import java.awt.geom.Rectangle2D;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.IOException;
@@ -26,12 +30,16 @@ import java.io.IOException;
import org.junit.Before;
import org.junit.Test;

import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;

import org.apache.xmlgraphics.java2d.GraphicContext;
import org.apache.xmlgraphics.java2d.Graphics2DImagePainter;
import org.apache.xmlgraphics.util.MimeConstants;

import org.apache.fop.apps.io.ResourceResolverFactory;
import org.apache.fop.render.afp.AFPParser;

/**
* Test case for {@link AFPResourceManager}.
@@ -90,4 +98,48 @@ public class AFPResourceManagerTestCase {
dataInfo.setObjectAreaInfo(objectAreaInfo);
return dataInfo;
}

@Test
public void testIncludeObject() throws IOException {
sut.createObject(createAFPGraphicsObjectInfo());
sut.createObject(createAFPGraphicsObjectInfo());
StringBuilder sb = new StringBuilder();
ByteArrayOutputStream bos = new ByteArrayOutputStream();
sut.getDataStream().getCurrentPage().writeToStream(bos);
new AFPParser(true).read(new ByteArrayInputStream(bos.toByteArray()), sb);
assertEquals(sb.toString(), "BEGIN PAGE PGN00001\n"
+ "BEGIN ACTIVE_ENVIRONMENT_GROUP AEG00001\n"
+ "DESCRIPTOR PAGE\n"
+ "MIGRATION PRESENTATION_TEXT\n"
+ "END ACTIVE_ENVIRONMENT_GROUP AEG00001\n"
+ "INCLUDE DATA_RESOURCE\n"
+ "INCLUDE DATA_RESOURCE\n"
+ "INCLUDE DATA_RESOURCE\n"
+ "INCLUDE DATA_RESOURCE\n");
}

private AFPGraphicsObjectInfo createAFPGraphicsObjectInfo() {
final AFPGraphicsObjectInfo dataInfo = new AFPGraphicsObjectInfo();
final String uri = "test";
dataInfo.setUri(uri);
AFPGraphics2D graphics2D = new AFPGraphics2D(false, new AFPPaintingState(), null, null, null);
graphics2D.setGraphicContext(new GraphicContext());
dataInfo.setGraphics2D(graphics2D);
dataInfo.setPainter(new Graphics2DImagePainter() {
public void paint(Graphics2D g2d, Rectangle2D area) {
try {
AFPDataObjectInfo dataObjectInfo = createAFPDataObjectInfo();
dataObjectInfo.setUri(uri);
sut.createObject(dataObjectInfo);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
public Dimension getImageSize() {
return null;
}
});
dataInfo.setObjectAreaInfo(new AFPObjectAreaInfo(0, 0, 0, 0, 0, 0));
return dataInfo;
}
}

Loading…
Cancel
Save