Index: tika-parsers/src/test/java/org/apache/tika/parser/pdf/PDFParserTest.java
===================================================================
--- tika-parsers/src/test/java/org/apache/tika/parser/pdf/PDFParserTest.java	(revision 1414138)
+++ tika-parsers/src/test/java/org/apache/tika/parser/pdf/PDFParserTest.java	(working copy)
@@ -451,4 +451,10 @@
         // Column text is now interleaved:
         assertContains("Left column line 1 Right column line 1 Left colu mn line 2 Right column line 2", content);
     }
+
+    // TIKA-1035
+    public void testBookmarks() throws Exception {
+        String xml = getXML("testPDF_bookmarks.pdf").xml;
+        assertContains("Denmark bookmark is here", xml);
+    }
 }
Index: tika-parsers/src/test/resources/test-documents/testPDF_bookmarks.pdf
===================================================================
Cannot display: file marked as a binary type.
svn:mime-type = application/pdf
Index: tika-parsers/src/test/resources/test-documents/testPDF_bookmarks.pdf
===================================================================
--- tika-parsers/src/test/resources/test-documents/testPDF_bookmarks.pdf	(revision 1414138)
+++ tika-parsers/src/test/resources/test-documents/testPDF_bookmarks.pdf	(working copy)

Property changes on: tika-parsers/src/test/resources/test-documents/testPDF_bookmarks.pdf
___________________________________________________________________
Added: svn:executable
## -0,0 +1 ##
+*
\ No newline at end of property
Added: svn:mime-type
## -0,0 +1 ##
+application/pdf
\ No newline at end of property
Index: tika-parsers/src/main/java/org/apache/tika/parser/pdf/PDF2XHTML.java
===================================================================
--- tika-parsers/src/main/java/org/apache/tika/parser/pdf/PDF2XHTML.java	(revision 1414138)
+++ tika-parsers/src/main/java/org/apache/tika/parser/pdf/PDF2XHTML.java	(working copy)
@@ -21,11 +21,14 @@
 
 import org.apache.pdfbox.pdmodel.PDDocument;
 import org.apache.pdfbox.pdmodel.PDPage;
-import org.apache.pdfbox.util.PDFTextStripper;
 import org.apache.pdfbox.pdmodel.interactive.action.type.PDAction;
 import org.apache.pdfbox.pdmodel.interactive.action.type.PDActionURI;
 import org.apache.pdfbox.pdmodel.interactive.annotation.PDAnnotationLink;
 import org.apache.pdfbox.pdmodel.interactive.annotation.PDAnnotationMarkup;
+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;
+import org.apache.pdfbox.util.PDFTextStripper;
 import org.apache.pdfbox.util.TextPosition;
 import org.apache.tika.exception.TikaException;
 import org.apache.tika.io.IOExceptionWithCause;
@@ -61,10 +64,12 @@
             throws SAXException, TikaException {
         try {
             // Extract text using a dummy Writer as we override the
-            // key methods to output to the given content handler.
-            new PDF2XHTML(handler, metadata,
-                          extractAnnotationText, enableAutoSpace,
-                          suppressDuplicateOverlappingText, sortByPosition).writeText(document, new Writer() {
+            // key methods to output to the given content
+            // handler.
+            PDF2XHTML pdf2XHTML = new PDF2XHTML(handler, metadata,
+                                                extractAnnotationText, enableAutoSpace,
+                                                suppressDuplicateOverlappingText, sortByPosition);
+            pdf2XHTML.writeText(document, new Writer() {
                 @Override
                 public void write(char[] cbuf, int off, int len) {
                 }
@@ -75,6 +80,10 @@
                 public void close() {
                 }
             });
+
+            // Also extract text for any bookmarks:
+            pdf2XHTML.extractBookmarkText();
+
         } catch (IOException e) {
             if (e.getCause() instanceof SAXException) {
                 throw (SAXException) e.getCause();
@@ -106,6 +115,26 @@
         setSuppressDuplicateOverlappingText(suppressDuplicateOverlappingText);
     }
 
+    void extractBookmarkText() throws SAXException {
+        PDDocumentOutline outline = document.getDocumentCatalog().getDocumentOutline();
+        if (outline != null) {
+            handler.newline();
+            extractBookmarkText(outline, "");
+        }
+    }
+
+    void extractBookmarkText(PDOutlineNode bookmark, String indent) throws SAXException {
+        PDOutlineItem current = bookmark.getFirstChild();
+        while (current != null) {
+          handler.characters(indent);
+          handler.characters(current.getTitle());
+          handler.newline();
+          // Recurse:
+          extractBookmarkText(current, indent + "    ");
+          current = current.getNextSibling();
+        }
+    }
+
     @Override
     protected void startDocument(PDDocument pdf) throws IOException {
         try {
@@ -261,7 +290,7 @@
     @Override
     protected void writeLineSeparator() throws IOException {
         try {
-            handler.characters("\n");
+            handler.newline();
         } catch (SAXException e) {
             throw new IOExceptionWithCause(
                     "Unable to write a newline character", e);
Index: CHANGES.txt
===================================================================
--- CHANGES.txt	(revision 1414138)
+++ CHANGES.txt	(working copy)
@@ -7,7 +7,8 @@
     (TIKA-956, TIKA-1019).  Embedded Wordpad/RTF documents are now
     recognized (TIKA-982).
 
-  * PDF: Text from pop-up annotations is now extracted (TIKA-981)
+  * PDF: Text from pop-up annotations is now extracted (TIKA-981).
+    Text from bookmarks is now extracted (TIKA-1035).
 
   * PKCS7: Detached signatures no longer through NullPointerException
     (TIKA-986).
