blob: e275bfbdc0f878ab6bed158079381da86b3308a0 [file] [log] [blame]
/*
* 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;
}
}