Java 如何在pdf框中使用书签选择pdf页面?
对不起,我是PDF box的新手,正在寻找如何使用书签名称获取特定PDF页面的解决方案?就像下面的代码片段一样,我试图循环所有页面,但仍然坚持将book mark与我需要的页面链接。有人能帮忙吗Java 如何在pdf框中使用书签选择pdf页面?,java,pdf,pdfbox,Java,Pdf,Pdfbox,对不起,我是PDF box的新手,正在寻找如何使用书签名称获取特定PDF页面的解决方案?就像下面的代码片段一样,我试图循环所有页面,但仍然坚持将book mark与我需要的页面链接。有人能帮忙吗 import java.awt.print.PrinterException; import java.io.File; import java.io.IOException; import org.apache.pdfbox.cos.COSObject; import org.apache.pdfbo
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)
事实证明,在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();
}
}
事实证明,在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();
}
}
可能的副本也谢谢你给我指出了正确的方向。我已经更新了上面的代码,并尝试使用书签获取页面。但是,我收到destination.getPage()的nullpointer异常。如果我缺少任何链接,请您提供帮助或建议。请链接到您正在使用的PDF(或任何PDF),并添加足够的代码,以便我可以看到您从哪里获得它。还可以用PDPageDestination替换PDPageFitWidthDestination以避免ClassCastException。我已经更新了代码部分并发布了我正在尝试运行的完整类。我相信我正在将PDDocumentOutline对象传递给getBookMark(outline,“”)方法来链接我的pdf,所以不确定这是否正确,或者我是否遗漏了什么?请建议。可能的副本也谢谢你给我指出了正确的方向。我已经更新了上面的代码,并尝试使用书签获取页面。但是,我收到destination.getPage()的nullpointer异常。如果我缺少任何链接,请您提供帮助或建议。请链接到您正在使用的PDF(或任何PDF),并添加足够的代码,以便我可以看到您从哪里获得它。还可以用PDPageDestination替换PDPageFitWidthDestination以避免ClassCastException。我已经更新了代码部分并发布了我正在尝试运行的完整类。我相信我正在将PDDocumentOutline对象传递给getBookMark(outline,“”)方法来链接我的pdf,所以不确定这是否正确,或者我是否遗漏了什么?请提出建议。@Tim Hausherr谢谢你的建议,很抱歉没有用。我已经为上面的getBookMark方法更新了代码,我尝试了这个方法,但是得到了与null指针相同的结果:(这是因为您的代码具有
current.getDestination()
。将其替换为gta.getDestination())
。顺便说一句,您当前的代码只适用于该文件,而不适用于我的。我的代码可以同时适用于这两个文件。是的,现在效果很好。我已经勾选了您上面的答案。非常感谢您!@Tim Hausherr感谢您的建议,抱歉它不起作用。我已经为getBookMark方法更新了上面的代码,我尝试了,但没有成功结果与空指针相同:(这是因为您的代码具有current.getDestination()
。将其替换为gta.getDestination())
。顺便说一句,您当前的代码只适用于该文件,而不适用于我的。我拥有的代码可以同时适用于这两个文件。是的,现在效果很好。我已经勾选了您上面的答案。非常感谢!