Thank you very much Carlos. Much appreciated. 

Regards


Carlos Villegas wrote:
> 
> Hi, here's a patch against svn trunk revision 1153319.
> It contains 3 things, you may want to edit the patch if you don't want 
> all of them:
> 
> 1. omit table last header/footer patch
> 
> 2. fix for hyphenation when interletter values in hyphenation patterns 
> are higher than 7. This is a long standing bug, I had submitted this 
> patch before but it hasn't been incorporated it.
> 
> 3. a patch to make all links into PDF named destinations rather than 
> direct page references. If the link resolves, the page reference is 
> defined otherwise the link is left with only the named destination. This 
> allows to generate PDF in pieces and then use some concatenation tool 
> like iText and the links will work even if in individual files the links 
> do not resolve. I'm not sure if this is needed anymore in current code, 
> but we needed this to generate big PDFs out of pieces some time ago.
> 
> 
> Regards,
> Carlos
> 
> On 8/19/11 10:49 AM, champagne_chary wrote:
>> Hello, a long time has passed since you posted this.. I would be
>> interested
>> in a patch for this.
>>
>> Thanks
>>
>>
>>
>> Carlos Villegas wrote:
>>> I implemented this extension. I added fox:table-omit-last-footer and
>>> fox:table-omit-first-header attributes to fo:table. It seems to work
>>> well in my use case.
>>> If anyone is interested I can submit a patch.
>>>
>>> Cheers,
>>> Carlos
>>>
>>> Carlos Villegas wrote:
>>>> Thanks for the pointers. I agree that implementing
>>>> retrieve-table-marker
>>>> is not only a more generic solution but also what the spec requires.
>>>> However, I'm short on time and this seems easier so I'll give it a try
>>>> first.
>>>>
>>>> Regards,
>>>> Carlos
>>>>
>>>> Vincent Hennebert wrote:
>>>>> Hi Carlos,
>>>>>
>>>>> Carlos Villegas wrote:
>>>>>> Hi,
>>>>>>
>>>>>> I searched the mailing lists and it seems that although some people
>>>>>> had
>>>>>> worked at several times at trying to implement retrieve-table-marker,
>>>>>> it's not yet done. Is somebody working on this? What's the status?
>>>>> It’s not being worked on at the moment. This is still a missing
>>>>> feature.
>>>>>
>>>>>
>>>>>> In many use cases omitting the first table header and the last table
>>>>>> footer will do the trick.
>>>>>>
>>>>>> How easy is this to implement?
>>>>>> What will be the steps to add such an extension to FOP?
>>>>>> I just started looking at the code so I'm exploring whether this is
>>>>>> viable solution.
>>>>> That might work. You would need to change the
>>>>> o.a.f.layoutmgr.table.TableContentLayoutManager.getNextKnuthElements
>>>>> method. There is a “if (getTableLM().getTable().omitHeaderAtBreak())”
>>>>> test that you could augment with a “&&  !(omitFirstHeader)” clause.
>>>>> Likewise for the footer.
>>>>>
>>>>> The easiest is to directly modify that class and re-build FOP. A bit
>>>>> less easy would be to add a variable in the configuration file, so
>>>>> that
>>>>> you can enable it only for certain FO files. Even less easy would be
>>>>> to
>>>>> add an extension property to fo:table so that you can enable it only
>>>>> for
>>>>> some tables of an FO document. Please ask if you need more details.
>>>>>
>>>>> All that said, such a change would be very hacky and, unless there is
>>>>> overwhelming demand from the user community, I would oppose to
>>>>> integrate
>>>>> it in the code base. This is a patch that you would have to maintain
>>>>> on
>>>>> your side. Better would be of course to actually implement
>>>>> retrieve-table-marker. Although this would be more involving than
>>>>> implementing this little trick...
>>>>>
>>>>>
>>>>> HTH,
>>>>> Vincent
>>>>>
>>>>
>>>
> 
> 
> Index:
> src/java/org/apache/fop/render/intermediate/extensions/GoToIDAction.java
> ===================================================================
> ---
> src/java/org/apache/fop/render/intermediate/extensions/GoToIDAction.java
> (revision 0)
> +++
> src/java/org/apache/fop/render/intermediate/extensions/GoToIDAction.java
> (revision 0)
> @@ -0,0 +1,81 @@
> +/*
> + * 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: GoToXYAction.java 815301 2009-09-15 12:50:47Z maxberger $ */
> +
> +package org.apache.fop.render.intermediate.extensions;
> +
> +import java.awt.Point;
> +
> +import org.xml.sax.ContentHandler;
> +import org.xml.sax.SAXException;
> +import org.xml.sax.helpers.AttributesImpl;
> +
> +import org.apache.fop.util.XMLUtil;
> +
> +/**
> + * Action class which represents a "go-to" action to an unknown ID.
> + */
> +public class GoToIDAction extends AbstractAction implements
> DocumentNavigationExtensionConstants {
> +
> +
> +    /**
> +     * Creates a new instance with yet unknown location.
> +     * @param id the identifier for this action
> +     */
> +    public GoToIDAction(String id) {
> +        setID(id);
> +    }
> +
> +    
> +    /** {@inheritDoc} */
> +    public boolean isComplete() {
> +        return true;
> +    }
> +
> +    /** {@inheritDoc} */
> +    public boolean isSame(AbstractAction other) {
> +        if (other == null) {
> +            throw new NullPointerException("other must not be null");
> +        }
> +        if (!(other instanceof GoToIDAction)) {
> +            return false;
> +        }
> +        GoToIDAction otherAction = (GoToIDAction)other;
> +        if ( !getID().equals(otherAction.getID())) {
> +            return false;
> +        }
> +        return true;
> +    }
> +
> +    /** {@inheritDoc} */
> +    public void toSAX(ContentHandler handler) throws SAXException {
> +        AttributesImpl atts = new AttributesImpl();
> +        atts.addAttribute(null, "idref", "idref", XMLUtil.CDATA,
> getID());
> +        handler.startElement(GOTO_XY.getNamespaceURI(),
> +                GOTO_XY.getLocalName(), GOTO_XY.getQName(), atts);
> +        handler.endElement(GOTO_XY.getNamespaceURI(),
> +                GOTO_XY.getLocalName(), GOTO_XY.getQName());
> +    }
> +
> +    /** {@inheritDoc} */
> +    public String toString() {
> +        return "GoToID: ID=" + getID() + ", "
> +            + (isComplete() ? "complete" : "INCOMPLETE");
> +    }
> +
> +}
> Index: src/java/org/apache/fop/render/intermediate/IFRenderer.java
> ===================================================================
> --- src/java/org/apache/fop/render/intermediate/IFRenderer.java       
> (revision
> 1152996)
> +++ src/java/org/apache/fop/render/intermediate/IFRenderer.java       (working
> copy)
> @@ -89,6 +89,7 @@
>  import org.apache.fop.render.intermediate.extensions.ActionSet;
>  import org.apache.fop.render.intermediate.extensions.Bookmark;
>  import org.apache.fop.render.intermediate.extensions.BookmarkTree;
> +import org.apache.fop.render.intermediate.extensions.GoToIDAction;
>  import org.apache.fop.render.intermediate.extensions.GoToXYAction;
>  import org.apache.fop.render.intermediate.extensions.Link;
>  import org.apache.fop.render.intermediate.extensions.NamedDestination;
> @@ -358,14 +359,15 @@
>          if (targetID == null || targetID.length() == 0) {
>              throw new IllegalArgumentException("DestinationData must
> contain a ID reference");
>          }
> -        GoToXYAction action = null;
> +        AbstractAction action = null;
>          PageViewport pv = bookmarkItem.getPageViewport();
>  
>          if (pv != null) {
>              action = getGoToActionForID(targetID, pv.getPageIndex());
>          } else {
>              //Warning already issued by AreaTreeHandler (debug level is
> sufficient)
> -            log.debug("Bookmark with IDRef \"" + targetID + "\" has a
> null PageViewport.");
> +            log.debug("Bookmark with IDRef \"" + targetID + "\" has a
> null PageViewport. Generating unresolved bookmark.");
> +            action = new GoToIDAction(targetID);
>          }
>  
>          Bookmark b = new Bookmark(
> @@ -928,7 +930,17 @@
>                  action = getGoToActionForID(idRef, (pageIndex != null ?
> pageIndex.intValue() : -1));
>              } else {
>                  //Warnings already issued by AreaTreeHandler
> +                // But generate a link to a named destination even if it
> doesn't exist
> +                action = new GoToIDAction(idRef);
> +                log.debug("Generating unresolved link to named
> destination: " + idRef);
>              }
> +        } else {
> +            String idRef = (String)ip.getTrait(Trait.NAMED_LINK);
> +            if ( idRef != null ) {
> +                linkTraitFound = true;
> +                action = new GoToIDAction(idRef);
> +                log.debug("Generating unresolved link to named
> destination: " + idRef);
> +            }
>          }
>  
>          // no INTERNAL_LINK, look for EXTERNAL_LINK
> Index:
> src/java/org/apache/fop/render/pdf/PDFDocumentNavigationHandler.java
> ===================================================================
> --- src/java/org/apache/fop/render/pdf/PDFDocumentNavigationHandler.java
> (revision 1152996)
> +++ src/java/org/apache/fop/render/pdf/PDFDocumentNavigationHandler.java
> (working copy)
> @@ -29,6 +29,7 @@
>  import org.apache.fop.pdf.PDFDocument;
>  import org.apache.fop.pdf.PDFFactory;
>  import org.apache.fop.pdf.PDFGoTo;
> +import org.apache.fop.pdf.PDFGoToNamed;
>  import org.apache.fop.pdf.PDFLink;
>  import org.apache.fop.pdf.PDFOutline;
>  import org.apache.fop.render.intermediate.IFDocumentNavigationHandler;
> @@ -36,6 +37,7 @@
>  import org.apache.fop.render.intermediate.extensions.AbstractAction;
>  import org.apache.fop.render.intermediate.extensions.Bookmark;
>  import org.apache.fop.render.intermediate.extensions.BookmarkTree;
> +import org.apache.fop.render.intermediate.extensions.GoToIDAction;
>  import org.apache.fop.render.intermediate.extensions.GoToXYAction;
>  import org.apache.fop.render.intermediate.extensions.Link;
>  import org.apache.fop.render.intermediate.extensions.NamedDestination;
> @@ -51,6 +53,7 @@
>  
>      private final Map incompleteActions = new java.util.HashMap();
>      private final Map completeActions = new java.util.HashMap();
> +    private final Map namedActions = new java.util.HashMap();
>  
>      /**
>       * Default constructor.
> @@ -85,7 +88,10 @@
>          if (parent == null) {
>              parent = getPDFDoc().getOutlineRoot();
>          }
> -        PDFAction action = getAction(bookmark.getAction());
> +        PDFAction action = getNamedAction(bookmark.getAction());
> +        if ( action == null ) {
> +            System.out.println("UNKNOWN BOOKMARK: " +
> bookmark.getTitle());
> +        }
>          String actionRef = (action != null ?
> action.makeReference().toString() : null);
>          PDFOutline pdfOutline =
> getPDFDoc().getFactory().makeOutline(parent,
>              bookmark.getTitle(), actionRef, bookmark.isShown());
> @@ -105,7 +111,7 @@
>                  (pageHeight - targetRect.getMinY() -
> targetRect.getHeight()) / 1000.0,
>                  targetRect.getWidth() / 1000.0,
>                  targetRect.getHeight() / 1000.0);
> -        PDFAction pdfAction = getAction(link.getAction());
> +        PDFAction pdfAction = getNamedAction(link.getAction());
>          //makeLink() currently needs a PDFAction and not a reference
>          //TODO Revisit when PDFLink is converted to a PDFDictionary
>          PDFLink pdfLink = getPDFDoc().getFactory().makeLink(
> @@ -141,6 +147,36 @@
>          }
>      }
>  
> +    private PDFAction getNamedAction(String id) {
> +        PDFAction namedAction = (PDFAction)namedActions.get(id);
> +        if ( namedAction != null ) {
> +            return namedAction;
> +        }
> +        PDFGoToNamed namedGoTo = new PDFGoToNamed(id);
> +        getPDFDoc().assignObjectNumber(namedGoTo);
> +        getPDFDoc().addObject(namedGoTo);
> +        namedActions.put(id, namedGoTo);
> +        return namedGoTo;
> +    }
> +
> +    private PDFAction getNamedAction(AbstractAction action) {
> +        if ( action == null )
> +            return null;
> +        PDFAction pdfAction = getAction(action);
> +        PDFAction namedAction =
> (PDFAction)namedActions.get(action.getID());
> +        if ( namedAction != null ) {
> +            return namedAction;
> +        } else if ( (action instanceof GoToXYAction) || (action
> instanceof GoToIDAction) ) {
> +            PDFGoToNamed namedGoTo = new PDFGoToNamed(action.getID());
> +            getPDFDoc().assignObjectNumber(namedGoTo);
> +            getPDFDoc().addObject(namedGoTo);
> +            namedActions.put(action.getID(), namedGoTo);
> +            return namedGoTo;
> +        } else {
> +            return pdfAction;
> +        }
> +    }
> +
>      private PDFAction getAction(AbstractAction action) {
>          if (action == null) {
>              return null;
> @@ -175,6 +211,8 @@
>              }
>              this.completeActions.put(action.getID(), pdfAction);
>              return pdfAction;
> +        } else if ( action instanceof GoToIDAction ) {
> +            return null;
>          } else {
>              throw new UnsupportedOperationException("Unsupported action
> type: "
>                      + action + " (" + action.getClass().getName() + ")");
> Index: src/java/org/apache/fop/layoutmgr/ElementListUtils.java
> ===================================================================
> --- src/java/org/apache/fop/layoutmgr/ElementListUtils.java   (revision
> 1152996)
> +++ src/java/org/apache/fop/layoutmgr/ElementListUtils.java   (working copy)
> @@ -119,6 +119,10 @@
>                      UnresolvedListElementWithLength uel =
> (UnresolvedListElementWithLength)el;
>                      len += uel.getLength().getOpt();
>                  }
> +            } else if ( el instanceof SpaceElement ) {
> +                SpaceElement spaceEl = (SpaceElement)el;
> +                MinOptMax l = spaceEl.getLength();
> +                len += l.getMin();
>              } else {
>                  KnuthElement kel = (KnuthElement)el;
>                  len += kel.getWidth();
> Index:
> src/java/org/apache/fop/layoutmgr/table/TableContentLayoutManager.java
> ===================================================================
> --- src/java/org/apache/fop/layoutmgr/table/TableContentLayoutManager.java
> (revision 1152996)
> +++ src/java/org/apache/fop/layoutmgr/table/TableContentLayoutManager.java
> (working copy)
> @@ -155,7 +155,7 @@
>              TableHeaderFooterPosition pos = new
> TableHeaderFooterPosition(
>                      getTableLM(), true, this.headerList);
>              KnuthBox box = new KnuthBox(headerNetHeight, pos, false);
> -            if (getTableLM().getTable().omitHeaderAtBreak()) {
> +            if (getTableLM().getTable().omitHeaderAtBreak() &&
> !getTableLM().getTable().omitFirstHeader()) {
>                  //We can simply add the table header at the start
>                  //of the whole list
>                  headerAsFirst = box;
> @@ -198,7 +198,8 @@
>              if (returnList.size() > 0 &&
> ((ListElement)returnList.getLast()).isForcedBreak()) {
>                  insertionPoint--;
>              }
> -            returnList.add(insertionPoint, footerAsLast);
> +            if (!getTableLM().getTable().omitLastFooter() )
> +                returnList.add(insertionPoint, footerAsLast);
>          }
>          return returnList;
>      }
> @@ -366,7 +367,8 @@
>                  //these positions need to be unpacked
>                  if (thfpos.header) {
>                      //Positions for header will be added first
> -                    headerElements = thfpos.nestedElements;
> +                    if ( !(getTableLM().isFirst(pos) &&
> getTableLM().getTable().omitFirstHeader()) )
> +                        headerElements = thfpos.nestedElements;
>                  } else {
>                      //Positions for footers are simply added at the end
>                      footerElements = thfpos.nestedElements;
> @@ -388,7 +390,8 @@
>              if (penaltyPos.headerElements != null) {
>                  //Header positions for the penalty position are in the
> last element and need to
>                  //be handled first before all other TableContentPositions
> -                headerElements = penaltyPos.headerElements;
> +                if ( !(getTableLM().isFirst(lastPos) &&
> getTableLM().getTable().omitFirstHeader()) )
> +                    headerElements = penaltyPos.headerElements;
>              }
>              if (penaltyPos.footerElements != null) {
>                  footerElements = penaltyPos.footerElements;
> Index: src/java/org/apache/fop/hyphenation/HyphenationTree.java
> ===================================================================
> --- src/java/org/apache/fop/hyphenation/HyphenationTree.java  (revision
> 1152996)
> +++ src/java/org/apache/fop/hyphenation/HyphenationTree.java  (working
> copy)
> @@ -110,13 +110,13 @@
>          StringBuffer buf = new StringBuffer();
>          byte v = vspace.get(k++);
>          while (v != 0) {
> -            char c = (char)((v >>> 4) - 1 + '0');
> +           char c = (char)(((v >>> 4) & 0x0f) - 1 + '0');
>              buf.append(c);
>              c = (char)(v & 0x0f);
>              if (c == 0) {
>                  break;
>              }
> -            c = (char)(c - 1 + '0');
> +            c = (char)((c & 0x0f) - 1 + '0');
>              buf.append(c);
>              v = vspace.get(k++);
>          }
> @@ -203,13 +203,13 @@
>          StringBuffer buf = new StringBuffer();
>          byte v = vspace.get(k++);
>          while (v != 0) {
> -            char c = (char)((v >>> 4) - 1);
> +           char c = (char)(((v >>> 4) & 0x0f) - 1);
>              buf.append(c);
>              c = (char)(v & 0x0f);
>              if (c == 0) {
>                  break;
>              }
> -            c = (char)(c - 1);
> +            c = (char)((c & 0x0f) - 1);
>              buf.append(c);
>              v = vspace.get(k++);
>          }
> Index: src/java/org/apache/fop/fo/Constants.java
> ===================================================================
> --- src/java/org/apache/fop/fo/Constants.java (revision 1152996)
> +++ src/java/org/apache/fop/fo/Constants.java (working copy)
> @@ -781,8 +781,15 @@
>      /** Property constant - FOP proprietary prototype (in XSL-FO 2.0
> Requirements) */
>      int PR_X_XML_BASE = 276;
>  
> +
> +    /** Property constant - FOP proprietary: omit first header extension
> */
> +    int PR_X_TABLE_OMIT_FIRST_HEADER = 277;
> +    /** Property constant - FOP proprietary: omit last footer extension
> */
> +    int PR_X_TABLE_OMIT_LAST_FOOTER = 278;
> +
> +
>      /** Number of property constants defined */
> -    int PROPERTY_COUNT = 276;
> +    int PROPERTY_COUNT = 278;
>  
>      // compound property constants
>  
> Index: src/java/org/apache/fop/fo/extensions/ExtensionElementMapping.java
> ===================================================================
> --- src/java/org/apache/fop/fo/extensions/ExtensionElementMapping.java
> (revision 1152996)
> +++ src/java/org/apache/fop/fo/extensions/ExtensionElementMapping.java
> (working copy)
> @@ -49,6 +49,8 @@
>          PROPERTY_ATTRIBUTES.add("disable-column-balancing");
>          //These are FOP's extension properties for accessibility
>          PROPERTY_ATTRIBUTES.add("alt-text");
> +        PROPERTY_ATTRIBUTES.add("table-omit-first-header");
> +        PROPERTY_ATTRIBUTES.add("table-omit-last-footer");
>      }
>  
>      /**
> Index: src/java/org/apache/fop/fo/flow/table/Table.java
> ===================================================================
> --- src/java/org/apache/fop/fo/flow/table/Table.java  (revision 1152996)
> +++ src/java/org/apache/fop/fo/flow/table/Table.java  (working copy)
> @@ -71,6 +71,10 @@
>      private Length widowContentLimit;
>      private Length orphanContentLimit;
>  
> +    /** cav extension properties */
> +    private int tableOmitFirstHeader;
> +    private int tableOmitLastFooter;
> +
>      /** collection of columns in this table */
>      private List columns = new ArrayList();
>  
> @@ -131,6 +135,9 @@
>          widowContentLimit =
> pList.get(PR_X_WIDOW_CONTENT_LIMIT).getLength();
>          orphanContentLimit =
> pList.get(PR_X_ORPHAN_CONTENT_LIMIT).getLength();
>  
> +        tableOmitFirstHeader =
> pList.get(PR_X_TABLE_OMIT_FIRST_HEADER).getEnum();
> +        tableOmitLastFooter =
> pList.get(PR_X_TABLE_OMIT_LAST_FOOTER).getEnum();
> +        
>          if (!blockProgressionDimension.getOptimum(null).isAuto()) {
>              TableEventProducer eventProducer =
> TableEventProducer.Provider.get(
>                      getUserAgent().getEventBroadcaster());
> @@ -423,6 +430,16 @@
>          return (this.tableOmitFooterAtBreak == EN_TRUE);
>      }
>  
> +    /** @return true if the first table-header should be omitted */
> +    public boolean omitFirstHeader() {
> +        return (this.tableOmitFirstHeader == EN_TRUE);
> +    }
> +
> +    /** @return true if the last table-footer should be omitted */
> +    public boolean omitLastFooter() {
> +        return (this.tableOmitLastFooter == EN_TRUE);
> +    }
> +
>      /**
>       * @return the "inline-progression-dimension" property.
>       */
> Index: src/java/org/apache/fop/fo/FOPropertyMapping.java
> ===================================================================
> --- src/java/org/apache/fop/fo/FOPropertyMapping.java (revision 1152996)
> +++ src/java/org/apache/fop/fo/FOPropertyMapping.java (working copy)
> @@ -2455,6 +2455,20 @@
>          m.setInherited(false);
>          m.setDefault("false");
>          addPropertyMaker("table-omit-header-at-break", m);
> +
> +        // fox:table-omit-first-header
> +        m  = new EnumProperty.Maker(PR_X_TABLE_OMIT_FIRST_HEADER);
> +        m.useGeneric(genericBoolean);
> +        m.setInherited(false);
> +        m.setDefault("false");
> +        addPropertyMaker("fox:table-omit-first-header", m);
> +
> +        // fox:table-omit-last-footer
> +        m  = new EnumProperty.Maker(PR_X_TABLE_OMIT_LAST_FOOTER);
> +        m.useGeneric(genericBoolean);
> +        m.setInherited(false);
> +        m.setDefault("false");
> +        addPropertyMaker("fox:table-omit-last-footer", m);
>      }
>  
>      private void createWritingModeProperties() {
> Index: src/java/org/apache/fop/area/LinkResolver.java
> ===================================================================
> --- src/java/org/apache/fop/area/LinkResolver.java    (revision 1152996)
> +++ src/java/org/apache/fop/area/LinkResolver.java    (working copy)
> @@ -43,6 +43,8 @@
>      public LinkResolver(String id, Area a) {
>          idRef = id;
>          area = a;
> +        // add the id to the area so we can create a named link
> +        area.addTrait(Trait.NAMED_LINK, id);
>      }
>  
>      /**
> @@ -81,6 +83,7 @@
>              resolved = true;
>              Trait.InternalLink iLink = new
> Trait.InternalLink(pv.getKey(), idRef);
>              area.addTrait(Trait.INTERNAL_LINK, iLink);
> +            area.addTrait(Trait.NAMED_LINK, null);
>          }
>      }
>  }
> Index: src/java/org/apache/fop/area/Trait.java
> ===================================================================
> --- src/java/org/apache/fop/area/Trait.java   (revision 1152996)
> +++ src/java/org/apache/fop/area/Trait.java   (working copy)
> @@ -156,8 +156,11 @@
>      /** The ptr trait. Used for accessibility   */
>      public static final Integer PTR = 37;
>  
> +    /** Trait used to create unresolved links to named destinations */
> +    public static final Integer NAMED_LINK = new Integer(38);
> +
>      /** Maximum value used by trait keys */
> -    public static final int MAX_TRAIT_KEY = 37;
> +    public static final int MAX_TRAIT_KEY = 38;
>  
>      private static final TraitInfo[] TRAIT_INFO = new
> TraitInfo[MAX_TRAIT_KEY + 1];
>  
> @@ -221,6 +224,7 @@
>          put(SPACE_AFTER,    new TraitInfo("space-after", Integer.class));
>          put(IS_REFERENCE_AREA,  new TraitInfo("is-reference-area",
> Boolean.class));
>          put(IS_VIEWPORT_AREA,   new TraitInfo("is-viewport-area",
> Boolean.class));
> +        put(NAMED_LINK, new TraitInfo("named-link", String.class));
>  
>      }
>  
> Index: src/java/org/apache/fop/pdf/PDFGoToNamed.java
> ===================================================================
> --- src/java/org/apache/fop/pdf/PDFGoToNamed.java     (revision 0)
> +++ src/java/org/apache/fop/pdf/PDFGoToNamed.java     (revision 0)
> @@ -0,0 +1,117 @@
> +/*
> + * 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: PDFGoTo.java 815358 2009-09-15 15:07:51Z maxberger $ */
> +
> +package org.apache.fop.pdf;
> +
> +/**
> + * class representing a /GoTo object.
> + * This can either have a Goto to a page reference and location
> + * or to a specified PDF reference string.
> + */
> +public class PDFGoToNamed extends PDFAction {
> +
> +    /**
> +     * the pageReference
> +     */
> +    private String destination = null;
> +
> +    /**
> +     * create a /GoTo object.
> +     *
> +     * @param pageReference the pageReference represented by this object
> +     */
> +    public PDFGoToNamed(String destination) {
> +        /* generic creation of object */
> +        super();
> +
> +        this.destination = destination;
> +    }
> +
> +
> +    /**
> +     * Set the destination string for this Goto.
> +     *
> +     * @param dest the PDF destination string
> +     */
> +    public void setDestination(String dest) {
> +        destination = dest;
> +    }
> +
> +    /**
> +     * Get the PDF reference for the GoTo action.
> +     *
> +     * @return the PDF reference for the action
> +     */
> +    public String getAction() {
> +        return referencePDF();
> +    }
> +
> +    /**
> +     * {@inheritDoc}
> +     */
> +    public String toPDFString() {
> +        String dest;
> +        if (destination == null) {
> +            dest = "/D (UNKNOWN)\n";
> +        } else {
> +            dest = "/D (" +  destination + ")\n";
> +        }
> +        return getObjectID()
> +                    + "<< /Type /Action\n/S /GoTo\n" + dest
> +                    + ">>\nendobj\n";
> +    }
> +
> +    /*
> +     * example
> +     * 29 0 obj
> +     * <<
> +     * /S /GoTo
> +     * /D (N123232)
> +     * >>
> +     * endobj
> +     */
> +
> +    /** {@inheritDoc} */
> +    protected boolean contentEquals(PDFObject obj) {
> +        if (this == obj) {
> +            return true;
> +        }
> +
> +        if (obj == null || !(obj instanceof PDFGoToNamed)) {
> +            return false;
> +        }
> +
> +        PDFGoToNamed gt = (PDFGoToNamed)obj;
> +
> +        
> +
> +        if (destination == null) {
> +            if (gt.destination != null) {
> +                return false;
> +            }
> +        } else {
> +            if (!destination.equals(gt.destination)) {
> +                return false;
> +            }
> +        }
> +
> +        return true;
> +    }
> +}
> +
> 
> 

-- 
View this message in context: 
http://old.nabble.com/omit-first-table-header-last-footer-tp25640345p32292141.html
Sent from the FOP - Dev mailing list archive at Nabble.com.

Reply via email to