/* * 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.render.pdf.extensions; import org.xml.sax.ContentHandler; import org.xml.sax.SAXException; import org.xml.sax.helpers.AttributesImpl; import org.apache.fop.render.intermediate.IFContext; import org.apache.fop.util.GenerationHelperContentHandler; // CSOFF: LineLengthCheck public class PDFDictionaryAttachment extends PDFExtensionAttachment { private static final long serialVersionUID = -5576832955238384505L; private PDFDictionaryExtension extension; public PDFDictionaryAttachment(PDFDictionaryExtension extension) { this.extension = extension; } public PDFDictionaryExtension getExtension() { return extension; } public void toSAX(ContentHandler handler) throws SAXException { int pageNumber = 0; if (extension instanceof PDFPageExtension) { if (handler instanceof GenerationHelperContentHandler) { Object context = ((GenerationHelperContentHandler) handler).getContentHandlerContext(); if (context instanceof IFContext) { int pageIndex = ((IFContext) context).getPageIndex(); if ((pageIndex >= 0) && ((PDFPageExtension) extension).matchesPageNumber(pageIndex + 1)) { pageNumber = pageIndex + 1; } else { pageNumber = -1; } } } } if (pageNumber >= 0) { toSAX(handler, extension); } } private void toSAX(ContentHandler handler, PDFDictionaryExtension dictionary) throws SAXException { AttributesImpl attributes = new AttributesImpl(); String ln = dictionary.getElementName(); String qn = PREFIX + ":" + ln; attributes = extractIFAttributes(attributes, dictionary); handler.startElement(CATEGORY, ln, qn, attributes); for (PDFCollectionEntryExtension entry : dictionary.getEntries()) { toSAX(handler, entry); } handler.endElement(CATEGORY, ln, qn); } private void toSAX(ContentHandler handler, PDFArrayExtension array) throws SAXException { AttributesImpl attributes = new AttributesImpl(); String ln = array.getElementName(); String qn = PREFIX + ":" + ln; attributes = extractIFAttributes(attributes, array); handler.startElement(CATEGORY, ln, qn, attributes); for (PDFCollectionEntryExtension entry : array.getEntries()) { toSAX(handler, entry); } handler.endElement(CATEGORY, ln, qn); } private void toSAX(ContentHandler handler, PDFCollectionEntryExtension entry) throws SAXException { if (entry instanceof PDFDictionaryExtension) { toSAX(handler, (PDFDictionaryExtension) entry); } else if (entry instanceof PDFArrayExtension) { toSAX(handler, (PDFArrayExtension) entry); } else { AttributesImpl attributes = new AttributesImpl(); String ln = entry.getElementName(); String qn = PREFIX + ":" + ln; attributes = extractIFAttributes(attributes, entry); handler.startElement(CATEGORY, ln, qn, attributes); if (!(entry instanceof PDFReferenceExtension)) { char[] characters = entry.getValueAsXMLEscapedString().toCharArray(); if (characters.length > 0) { handler.characters(characters, 0, characters.length); } } handler.endElement(CATEGORY, ln, qn); } } private static AttributesImpl extractIFAttributes(AttributesImpl attributes, PDFDictionaryExtension dictionary) { PDFDictionaryType type = dictionary.getDictionaryType(); if (dictionary.usesIDAttribute()) { String idName = PDFDictionaryElement.ATT_ID; String id = dictionary.getProperty(PDFDictionaryExtension.PROPERTY_ID); if (id != null) { attributes.addAttribute("", idName, idName, "ID", id); } } if (type == PDFDictionaryType.Action) { String actionTypeName = PDFActionElement.ATT_TYPE; String actionType = dictionary.getProperty(PDFActionExtension.PROPERTY_TYPE); if (actionType != null) { attributes.addAttribute("", actionTypeName, actionTypeName, "CDATA", actionType); } } else if (type == PDFDictionaryType.Page) { String pageNumbersName = PDFPageExtension.PROPERTY_PAGE_NUMBERS; String pageNumbers = dictionary.getProperty(pageNumbersName); if (pageNumbers != null) { attributes.addAttribute("", pageNumbersName, pageNumbersName, "CDATA", pageNumbers); } } else if (type == PDFDictionaryType.Dictionary) { String keyName = PDFCollectionEntryElement.ATT_KEY; String key = dictionary.getKey(); if (key != null) { attributes.addAttribute("", keyName, keyName, "CDATA", key); } } return attributes; } private static AttributesImpl extractIFAttributes(AttributesImpl attributes, PDFArrayExtension array) { String keyName = PDFCollectionEntryExtension.PROPERTY_KEY; String key = array.getKey(); if (key != null) { attributes.addAttribute("", keyName, keyName, "CDATA", key); } return attributes; } private static AttributesImpl extractIFAttributes(AttributesImpl attributes, PDFCollectionEntryExtension entry) { String keyName = PDFCollectionEntryElement.ATT_KEY; String key = entry.getKey(); if (key != null) { attributes.addAttribute("", keyName, keyName, "CDATA", key); } if (entry instanceof PDFReferenceExtension) { String refid = ((PDFReferenceExtension) entry).getReferenceId(); if (refid != null) { String refidName = PDFReferenceElement.ATT_REFID; attributes.addAttribute("", refidName, refidName, "IDREF", refid); } } return attributes; } }