kohdai created PDFBOX-3594:
------------------------------
Summary: Use PDOutlineItem#findDestinationPage() cannot get
PDPage, return was null
Key: PDFBOX-3594
URL: https://issues.apache.org/jira/browse/PDFBOX-3594
Project: PDFBox
Issue Type: Bug
Components: PDModel
Affects Versions: 2.0.3
Environment: Java 8
Reporter: kohdai
h3. Overview
I try to extract Bookmarks of a PDF, but I could not get a destination page.
h3. PDF
http://www.line6.jp/products/pod-hd-x/img-pod-hd-x-resource/pod-hd-500x-advanced-guide.pdf
h3. Code
{code:title=main.PDFBookmarkExtractor.java|borderStyle=solid}
package main;
import java.io.File;
import java.io.IOException;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import
org.apache.pdfbox.pdmodel.interactive.documentnavigation.outline.PDDocumentOutline;
import
org.apache.pdfbox.pdmodel.interactive.documentnavigation.outline.PDOutlineItem;
import
org.apache.pdfbox.pdmodel.interactive.documentnavigation.outline.PDOutlineNode;
public class PDFBookmarkExtractor {
public static void main(String args[]) throws Exception {
PDFBookmarkExtractor extractor = new PDFBookmarkExtractor();
extractor.extract();
}
public void extract() {
File pdf = new File("pod-hd-500x-advanced-guide.pdf");
try (PDDocument document = PDDocument.load(pdf)) {
PDDocumentOutline outline =
document.getDocumentCatalog().getDocumentOutline();
this.getBookmarks(document, outline);
} catch(IOException e) {
e.printStackTrace();
}
}
private void getBookmarks(PDDocument document, PDOutlineNode
outlineNode) throws IOException {
PDOutlineItem current = outlineNode.getFirstChild();
while(current != null) {
this.getBookmark(document, current, 0);
current = current.getNextSibling();
}
}
private int getBookmark(PDDocument document, PDOutlineItem current, int
indentCount) throws IOException {
PDPage page = current.findDestinationPage(document);
StringBuilder sb = new StringBuilder();
for(int i=0; i<indentCount; i++) {
sb.append("\t");
}
sb.append(current.getTitle());
sb.append("[").append(page).append("]");
System.out.println(sb);
if(current.hasChildren()) {
for(PDOutlineItem child : current.children()) {
this.getBookmark(document, child, indentCount +
1);
}
}
return indentCount;
}
}
{code}
h3. Result
{noformat}
POD® HD500 アドバンスド・ガイド[org.apache.pdfbox.pdmodel.PDPage@5910e440]
1 - 概要[null]
ホーム・ビュー[null]
チューナー・モード[null]
タップ・テンポ[null]
接続[null]
POD HD500エディット・ソフトウエア[null]
2 - システム・セットアップ[org.apache.pdfbox.pdmodel.PDPage@26a1ab54]
システム・セットアップへアクセスする[org.apache.pdfbox.pdmodel.PDPage@26a1ab54]
ページ 1、Setup:Utilities[org.apache.pdfbox.pdmodel.PDPage@3d646c37]
ページ 2、Setup:Utilities[org.apache.pdfbox.pdmodel.PDPage@41cf53f9]
[...snip...]
{noformat}
h3. Problem
I think PDNameTreeNode#getValue has problems.
{code:title=org.apache.pdfbox.pdmodel.common.PDNameTreeNode.java|borderStyle=solid}
/**
* The name to retrieve.
*
* @param name The name in the tree.
* @return The value of the name in the tree.
* @throws IOException If an there is a problem creating the destinations.
*/
public T getValue( String name ) throws IOException
{
T retval = null;
Map<String, T> names = getNames();
if( names != null )
{
retval = names.get( name );
}
else
{
List<PDNameTreeNode<T>> kids = getKids();
if (kids != null)
{
for( int i=0; i<kids.size() && retval == null; i++ )
{
PDNameTreeNode<T> childNode = kids.get( i );
// [Problem] Cannot get retval.
// Because "kids" were not sorted by name
if( childNode.getLowerLimit().compareTo( name ) <= 0 &&
childNode.getUpperLimit().compareTo( name ) >= 0 )
{
retval = childNode.getValue( name );
}
}
}
else
{
LOG.warn("NameTreeNode does not have \"names\" nor \"kids\"
objects.");
}
}
return retval;
}
{code}
--
This message was sent by Atlassian JIRA
(v6.3.4#6332)
---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]