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-ffa450edef68tags/fop-1_0
@@ -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); |
@@ -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)); | |||
@@ -223,6 +223,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); | |||
} | |||
@@ -656,6 +664,15 @@ public class PDFDocument { | |||
return (PDFGoTo)findPDFObject(gotos, compare); | |||
} | |||
/** | |||
* 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 | |||
@@ -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 |
@@ -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); | |||
@@ -1104,6 +1108,37 @@ public class PDFFactory { | |||
return remote; | |||
} | |||
/** | |||
* 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 | |||
* |
@@ -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; | |||
} | |||
} |
@@ -53,6 +53,15 @@ | |||
<changes> | |||
<release version="FOP Trunk" date="TBD"> | |||
<action context="Renderers" dev="AD" type="add" fixes-bug="45113" due-to="Alexander Stamenov"> | |||
Added PDF /Launch action: references to URIs using the file:// protocol will now generate | |||
a /Launch action as opposed to a more general /URI (which doesn't yield the expected result | |||
for this protocol). | |||
</action> | |||
<action context="Layout" dev="JM" type="fix"> | |||
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). | |||
</action> | |||
<action context="Layout" dev="AD" type="fix" fixes-bug="40798"> | |||
Bugzilla 40798: A conditional-page-master-reference with page-position="last" qualifies | |||
for a first page, if it is also the last. Additionally: also added support for |
@@ -0,0 +1,59 @@ | |||
<?xml version="1.0" encoding="UTF-8"?> | |||
<!-- | |||
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$ --> | |||
<testcase> | |||
<info> | |||
<p> | |||
This test checks bpd values on block-containers. | |||
</p> | |||
</info> | |||
<fo> | |||
<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format"> | |||
<fo:layout-master-set> | |||
<fo:simple-page-master master-name="normal" page-width="5in" page-height="5in"> | |||
<fo:region-body/> | |||
</fo:simple-page-master> | |||
</fo:layout-master-set> | |||
<fo:page-sequence master-reference="normal"> | |||
<fo:flow flow-name="xsl-region-body"> | |||
<fo:block>Testing area BPDs...</fo:block> | |||
<fo:block-container id="bc1" absolute-position="absolute" top="0.15cm" left="0.25cm"> | |||
<fo:block> | |||
<fo:inline background-color="grey">bc1</fo:inline> | |||
</fo:block> | |||
</fo:block-container> | |||
<fo:block background-color="orange"> | |||
<fo:block color="red" background-color="yellow">Below | |||
<fo:block-container id="bc2" absolute-position="absolute" top="0.35cm" left="0.25cm"> | |||
<fo:block> | |||
<fo:inline background-color="grey">Above</fo:inline> | |||
</fo:block> | |||
</fo:block-container> | |||
</fo:block> | |||
</fo:block> | |||
</fo:flow> | |||
</fo:page-sequence> | |||
</fo:root> | |||
</fo> | |||
<checks> | |||
<eval expected="28800" xpath="//flow/@bpd"/> | |||
<eval expected="14400" xpath="//block[@prod-id='bc1']/@bpd"/> | |||
<eval expected="14400" xpath="//block[@prod-id='bc2']/@bpd"/> | |||
<eval expected="14400" xpath="//block[@prod-id='bc2']/../@bpd"/> | |||
</checks> | |||
</testcase> |