diff options
author | Adrian Cumiskey <acumiskey@apache.org> | 2008-10-27 12:00:08 +0000 |
---|---|---|
committer | Adrian Cumiskey <acumiskey@apache.org> | 2008-10-27 12:00:08 +0000 |
commit | 55b2038293339e8d7bcd18e334e987564661f4fa (patch) | |
tree | af4f5f01ebd2ba837b860efca08a575fd5c25859 /src | |
parent | c7d3eb2e5b0748353aca6248d1e9586f3866b85d (diff) | |
download | xmlgraphics-fop-55b2038293339e8d7bcd18e334e987564661f4fa.tar.gz xmlgraphics-fop-55b2038293339e8d7bcd18e334e987564661f4fa.zip |
Merged revisions 707631,708012 via svnmerge from
https://svn.apache.org/repos/asf/xmlgraphics/fop/trunk
........
r707631 | jeremias | 2008-10-24 14:42:59 +0100 (Fri, 24 Oct 2008) | 2 lines
Fixed a problem where the BPD or a block area could be wrong if there is a nested, absolutely positioned area (for example a block-container).
This was most probably introduced by rev 618992.
........
r708012 | adelmelle | 2008-10-26 16:32:16 +0000 (Sun, 26 Oct 2008) | 5 lines
Bugzilla 45113:
Added PDF /Launch action, which is used in case of references to URIs using the file:// protocol.
Thanks to Alexander Stamenov (astamenov.AT.gmail.com) for the input!
........
git-svn-id: https://svn.apache.org/repos/asf/xmlgraphics/fop/branches/Temp_AFPGOCAResources@708153 13f79535-47bb-0310-9956-ffa450edef68
Diffstat (limited to 'src')
-rw-r--r-- | src/java/org/apache/fop/area/Block.java | 2 | ||||
-rw-r--r-- | src/java/org/apache/fop/layoutmgr/list/ListItemLayoutManager.java | 17 | ||||
-rw-r--r-- | src/java/org/apache/fop/pdf/PDFDocument.java | 35 | ||||
-rw-r--r-- | src/java/org/apache/fop/pdf/PDFFactory.java | 35 | ||||
-rw-r--r-- | src/java/org/apache/fop/pdf/PDFLaunch.java | 68 |
5 files changed, 135 insertions, 22 deletions
diff --git a/src/java/org/apache/fop/area/Block.java b/src/java/org/apache/fop/area/Block.java index 7a2465859..5faec9f7a 100644 --- a/src/java/org/apache/fop/area/Block.java +++ b/src/java/org/apache/fop/area/Block.java @@ -79,7 +79,7 @@ public class Block extends BlockParent { * @param autoHeight increase the height of the block. */ public void addBlock(Block block, boolean autoHeight) { - if (autoHeight && allowBPDUpdate) { + if (autoHeight && allowBPDUpdate && block.isStacked()) { bpd += block.getAllocBPD(); } addChildArea(block); diff --git a/src/java/org/apache/fop/layoutmgr/list/ListItemLayoutManager.java b/src/java/org/apache/fop/layoutmgr/list/ListItemLayoutManager.java index d83cca642..a4e8982f7 100644 --- a/src/java/org/apache/fop/layoutmgr/list/ListItemLayoutManager.java +++ b/src/java/org/apache/fop/layoutmgr/list/ListItemLayoutManager.java @@ -26,6 +26,7 @@ import java.util.ListIterator; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; + import org.apache.fop.area.Area; import org.apache.fop.area.Block; import org.apache.fop.fo.flow.ListItem; @@ -537,14 +538,6 @@ public class ListItemLayoutManager extends BlockStackingLayoutManager label.addAreas(labelIter, lc); } - // reset the area bpd after adding the label areas and before adding the body areas - int savedBPD = 0; - if (labelFirstIndex <= labelLastIndex - && bodyFirstIndex <= bodyLastIndex) { - savedBPD = curBlockArea.getBPD(); - curBlockArea.setBPD(0); - } - // add body areas if (bodyFirstIndex <= bodyLastIndex) { KnuthPossPosIter bodyIter = new KnuthPossPosIter(bodyList, @@ -559,9 +552,13 @@ public class ListItemLayoutManager extends BlockStackingLayoutManager } // after adding body areas, set the maximum area bpd - if (curBlockArea.getBPD() < savedBPD) { - curBlockArea.setBPD(savedBPD); + int childCount = curBlockArea.getChildAreas().size(); + assert childCount >= 1 && childCount <= 2; + int itemBPD = ((Block)curBlockArea.getChildAreas().get(0)).getAllocBPD(); + if (childCount == 2) { + itemBPD = Math.max(itemBPD, ((Block)curBlockArea.getChildAreas().get(1)).getAllocBPD()); } + curBlockArea.setBPD(itemBPD); addMarkersToPage(false, isFirst(firstPos), isLast(lastPos)); diff --git a/src/java/org/apache/fop/pdf/PDFDocument.java b/src/java/org/apache/fop/pdf/PDFDocument.java index 16ec81049..598fd433e 100644 --- a/src/java/org/apache/fop/pdf/PDFDocument.java +++ b/src/java/org/apache/fop/pdf/PDFDocument.java @@ -224,6 +224,11 @@ public class PDFDocument { protected List gotos = new java.util.ArrayList(); /** + * List of PDFLaunch objects. + */ + protected List launches = new java.util.ArrayList(); + + /** * The PDFDests object for the name dictionary. * Note: This object is not a list. */ @@ -486,6 +491,9 @@ public class PDFDocument { if (obj instanceof PDFPage) { this.pages.notifyKidRegistered((PDFPage)obj); } + if (obj instanceof PDFLaunch) { + this.launches.add(obj); + } if (obj instanceof PDFLink) { this.links.add(obj); } @@ -657,6 +665,15 @@ public class PDFDocument { } /** + * Finds a launch. + * @param compare reference object to use as search template + * @return the launch if found, null otherwise + */ + protected PDFLaunch findLaunch(PDFLaunch compare) { + return (PDFLaunch) findPDFObject(launches, compare); + } + + /** * Looks for an existing GState to use * @param wanted requested features * @param current currently active features @@ -703,7 +720,6 @@ public class PDFDocument { */ public void setColorSpace(int theColorspace) { this.colorspace.setColorSpace(theColorspace); - return; } /** @@ -1019,12 +1035,6 @@ public class PDFDocument { by the table's length */ this.position += outputXref(stream); - // Determine existance of encryption dictionary - String encryptEntry = ""; - if (this.encryption != null) { - encryptEntry = this.encryption.getTrailerEntry(); - } - /* construct the trailer */ String pdf = "trailer\n" @@ -1037,10 +1047,13 @@ public class PDFDocument { + "\n" + "/Info " + this.info.referencePDF() - + "\n" - + getIDEntry() - + "\n" - + encryptEntry + + "\n"; + if (this.encryption != null) { + pdf += this.encryption.getTrailerEntry(); + } else { + pdf += getIDEntry(); + } + pdf += "\n" + ">>\n" + "startxref\n" + this.xref diff --git a/src/java/org/apache/fop/pdf/PDFFactory.java b/src/java/org/apache/fop/pdf/PDFFactory.java index fc6e6b9fa..a5beb4ec7 100644 --- a/src/java/org/apache/fop/pdf/PDFFactory.java +++ b/src/java/org/apache/fop/pdf/PDFFactory.java @@ -1011,6 +1011,10 @@ public class PDFFactory { // HTTP URL? if (targetLo.startsWith("http://")) { return new PDFUri(target); + // Non PDF files. Try to /Launch them. + } else if (targetLo.startsWith("file://")) { + target = target.substring("file://".length()); + return getLaunchAction(target); // Bare PDF file name? } else if (targetLo.endsWith(".pdf")) { return getGoToPDFAction(target, null, -1, newWindow); @@ -1105,6 +1109,37 @@ public class PDFFactory { } /** + * Creates and returns a launch pdf document action using + * <code>file</code> to create a file spcifiaciton for + * the document/file to be opened with an external application. + * + * @param file the pdf file name + * @return the pdf launch object + */ + private PDFLaunch getLaunchAction(String file) { + getDocument().getProfile().verifyActionAllowed(); + + PDFFileSpec fileSpec = new PDFFileSpec(file); + PDFFileSpec oldSpec = getDocument().findFileSpec(fileSpec); + + if (oldSpec == null) { + getDocument().registerObject(fileSpec); + } else { + fileSpec = oldSpec; + } + PDFLaunch launch = new PDFLaunch(fileSpec); + PDFLaunch oldLaunch = getDocument().findLaunch(launch); + + if (oldLaunch == null) { + getDocument().registerObject(launch); + } else { + launch = oldLaunch; + } + + return launch; + } + + /** * Make an outline object and add it to the given parent * * @param parent the parent PDFOutline object (may be null) diff --git a/src/java/org/apache/fop/pdf/PDFLaunch.java b/src/java/org/apache/fop/pdf/PDFLaunch.java new file mode 100644 index 000000000..d87fa2523 --- /dev/null +++ b/src/java/org/apache/fop/pdf/PDFLaunch.java @@ -0,0 +1,68 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +/* $Id$ */ +package org.apache.fop.pdf; + +/** + * This class represents the /Launch action. + */ +public class PDFLaunch extends PDFAction { + + private PDFFileSpec externalFileSpec; + + public PDFLaunch(PDFFileSpec fileSpec) { + this.externalFileSpec = fileSpec; + } + + public String getAction() { + return this.referencePDF(); + } + + public String toPDFString() { + StringBuffer sb = new StringBuffer(64); + sb.append(getObjectID()); + sb.append("<<\n/S /Launch\n/F "); + sb.append(externalFileSpec.referencePDF()); + sb.append(" \n>>\nendobj\n"); + + return sb.toString(); + } + + /** + * Check if this equals another object. + * + * @param obj the object to compare + * @return true if this equals other object + */ + public boolean equals(Object obj) { + if (this == obj) { + return true; + } + + if (obj == null || !(obj instanceof PDFLaunch)) { + return false; + } + + PDFLaunch launch = (PDFLaunch) obj; + + if (!launch.externalFileSpec.referencePDF().equals(externalFileSpec.referencePDF())) { + return false; + } + + return true; + } +} |