blob: cd8e3df240824d2b637a3ae59cbed72e46e0780a [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.
*/
package org.apache.fop.render.pdf.pdfbox;
import java.io.IOException;
import org.apache.pdfbox.cos.COSArray;
import org.apache.pdfbox.cos.COSDictionary;
import org.apache.pdfbox.cos.COSName;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.documentinterchange.logicalstructure.PDMarkInfo;
import org.apache.fop.pdf.PDFDocument;
import org.apache.fop.pdf.PDFName;
import org.apache.fop.pdf.PDFPage;
import org.apache.fop.pdf.PDFStructElem;
import org.apache.fop.render.pdf.PDFLogicalStructureHandler;
public class TaggedPDFConductor {
private PDPage srcPage;
private PDFPage targetPage;
private DocumentRootModifier rootMod;
private StructureTreeMerger merger;
public TaggedPDFConductor(PDFStructElem currentSessionElem,
PDFLogicalStructureHandler logicalStructHandler, PDPage srcPage,
PDFBoxAdapter adapter) {
this.srcPage = srcPage;
this.targetPage = adapter.getTargetPage();
PDFDocument pdfDoc = targetPage.getDocument();
this.rootMod = new DocumentRootModifier(adapter, pdfDoc);
merger = new StructureTreeMerger(currentSessionElem, logicalStructHandler, adapter, srcPage);
}
public void handleLogicalStructure(PDDocument srcDoc) throws IOException {
if (isInputPDFTagged(srcDoc) && isStructureTreeRootNull(srcDoc)) {
merger.setCurrentSessionElem();
COSDictionary strucRootDict = srcDoc.getDocumentCatalog().getStructureTreeRoot()
.getCOSObject();
rootMod.structTreeRootEntriesToCopy(strucRootDict);
if (!isParentTreeIsPresent(strucRootDict)) {
merger.createDirectDescendants(strucRootDict, merger.currentSessionElem);
} else {
PageParentTreeFinder markedContentsParentFinder = new PageParentTreeFinder(srcPage);
COSArray markedContentsParents = markedContentsParentFinder.getPageParentTreeArray(srcDoc);
COSDictionary roleMap = (COSDictionary)strucRootDict.getDictionaryObject(COSName.ROLE_MAP);
if (roleMap != null) {
merger.setRoleMap(roleMap);
}
merger.copyStructure(markedContentsParents);
}
}
configureCurrentSessionElem(srcDoc);
}
private void configureCurrentSessionElem(PDDocument srcDoc) {
if (!(isInputPDFTagged(srcDoc) && isStructureTreeRootNull(srcDoc))) {
merger.setCurrentSessionElemKid();
merger.currentSessionElem.put(COSName.PG.getName(), targetPage.makeReference());
} else {
merger.currentSessionElem.put("S", new PDFName("Div"));
merger.currentSessionElem.remove("Alt");
}
}
private boolean isInputPDFTagged(PDDocument srcDoc) {
PDMarkInfo mark = srcDoc.getDocumentCatalog().getMarkInfo();
return mark != null && mark.isMarked();
}
private boolean isStructureTreeRootNull(PDDocument srcDoc) {
return srcDoc.getDocumentCatalog().getStructureTreeRoot() != null;
}
private boolean isParentTreeIsPresent(COSDictionary strucRootDict) {
return strucRootDict.keySet().contains(COSName.PARENT_TREE);
}
}