【问题标题】:How to select pdf page using bookmark in pdf box?如何使用 pdf 框中的书签选择 pdf 页面?
【发布时间】:2017-07-08 04:28:47
【问题描述】:

抱歉,我是 PDF 框的新手,正在寻找有关如何使用书签名称获取特定 pdf 页面的解决方案?就像下面的代码 sn-p 我试图循环所有页面但坚持将书签与我需要的页面链接。有谁能帮忙吗?

import java.awt.print.PrinterException;
import java.io.File;
import java.io.IOException;
import org.apache.pdfbox.cos.COSObject;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.encryption.InvalidPasswordException;
import org.apache.pdfbox.pdmodel.interactive.documentnavigation.destination.PDPageFitWidthDestination;
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 PDFLoader {

    public static void main(String[] args) throws InvalidPasswordException, IOException, PrinterException {


          File file = new File("d:\\pdf\\sample.pdf"); 
          PDDocument document = PDDocument.load(file); 
          PDPage page01 = document.getDocumentCatalog().getPages().get(0);
          PDPage page02 = document.getDocumentCatalog().getPages().get(1);

          PDDocumentOutline outline =  document.getDocumentCatalog().getDocumentOutline();
          printBookmark(outline, "");
          PDDocument doc = new PDDocument();
          doc.addPage(page01);
          doc.addPage(page02);
          doc.save("d:\\pdf\\newSample.pdf");
          doc.close();

    }



public static PDPage getBookmark(PDOutlineNode bookmark, String indentation) throws IOException
    {
        PDOutlineItem current = bookmark.getFirstChild();
        while (current != null)

        {
            System.out.println(indentation + current.getTitle());



            if (current.getAction() instanceof PDActionGoTo)
            {
                PDActionGoTo gta = (PDActionGoTo) current.getAction();
                if (gta.getDestination() instanceof PDPageDestination)
                {

                    if(current.getTitle().equals("MyBookMark")){


                        PDPageDestination pd = (PDPageDestination) current.getDestination();
                        System.out.println("Destination page: " + pd.retrievePageNumber());
                        return pd.getPage();

                        }
                }
            }

            getBookmark(current, indentation + "    ");
            current = current.getNextSibling();

            }


        return null;
    }







//Stack Trace
    Exception in thread "main" java.lang.NullPointerException
    at com.mypackage.PDFLoader.getBookmark(PDFLoader.java:67)
    at com.mypackage.PDFLoader.main(PDFLoader.java:40)

【问题讨论】:

  • 感谢您为我指明正确的方向。我已经更新了上面的代码并尝试使用书签获取页面。但是我得到了destination.getPage()的空指针异常; .如果我缺少任何链接,您能否提供帮助或建议?
  • 请链接到您正在使用的 PDF(或任何 PDF),并添加足够的代码,以便我可以看到您从哪里获得它。还要将 PDPageFitWidthDestination 替换为 PDPageDestination 以避免类转换异常。
  • 我已经更新了代码部分并发布了我正在尝试运行的完整类。我相信正在将 PDDocumentOutline 对象传递给 getBookMark(outline, "") 方法来链接我的 pdf,所以不确定这是正确的还是我遗漏了什么?请提出建议。

标签: java pdf pdfbox


【解决方案1】:

事实证明,在您的 PDF 中,页面目标不在书签的目标条目中,而是在书签的操作条目中(是的,PDF 可以有两种方法来做同样的事情)。将此添加到您的代码中:

if (current.getDestination() instanceof PDPageDestination)
{
    PDPageDestination pd = (PDPageDestination) current.getDestination();
    System.out.println("Destination page: " + (pd.retrievePageNumber() + 1));
    return pd.getPage();
}
if (current.getAction() instanceof PDActionGoTo)
{
    PDActionGoTo gta = (PDActionGoTo) current.getAction();
    if (gta.getDestination() instanceof PDPageDestination)
    {
        PDPageDestination pd = (PDPageDestination) gta.getDestination();
        System.out.println("Destination page: " + (pd.retrievePageNumber() + 1));
        return pd.getPage();
    }
}

【讨论】:

  • @Tim Hausherr 感谢您的建议,抱歉没有奏效。我已经为我尝试过的 getBookMark 方法更新了上面的代码,但得到的结果与空指针相同:(
  • 那是因为你的代码有current.getDestination()。将其替换为 gta.getDestination()。顺便说一句,您当前的代码仅适用于该文件,而不适用于我的。我的代码可以同时使用。
  • 是的,它现在很好用。我已经检查了你上面的答案。非常感谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-01-21
  • 1970-01-01
  • 2016-05-13
  • 1970-01-01
  • 1970-01-01
  • 2018-03-24
  • 1970-01-01
相关资源
最近更新 更多