Java 无法使用PDFBOX获取书签在页面中的特定位置

Java 无法使用PDFBOX获取书签在页面中的特定位置,java,pdfbox,Java,Pdfbox,我正在使用PDFBOX2.0.2JAR在一个已有的标题书签PDF文件中添加多个PDF。为了同样的目的,我将其拆分并合并其他PDF Splitter splitter = new Splitter(); splitter.setStartPage(1); splitter.setEndPage(noOfPagesInHeadingBkmrkedPDF); 在拆分和合并之前,我将保留HashMap中的所有书签,键作为页

我正在使用PDFBOX2.0.2JAR在一个已有的标题书签PDF文件中添加多个PDF。为了同样的目的,我将其拆分并合并其他PDF

Splitter splitter = new Splitter();
                    splitter.setStartPage(1);
                    splitter.setEndPage(noOfPagesInHeadingBkmrkedPDF);
在拆分和合并之前,我将保留HashMap中的所有书签,键作为页码,值作为书签名称。合并后,我将书签设置回w.r.t。我的问题是-如何获得页面上书签的特定坐标(位置),以便合并后,我应该能够将其设置回页面的特定位置

用于在拆分之前创建HashMap的代码段:

public void getAllBookmarks(PDOutlineNode bookmarksInOriginalFile, String emptyString, Map<Integer, String> bookmarkMap) throws IOException {
PDOutlineItem current = null;
if (null != bookmarksInOriginalFile)
    current = bookmarksInOriginalFile.getFirstChild();
while (current != null) {
    Integer pageNumber = 0;
    PDPageDestination pd = null;
    if (current.getDestination() instanceof PDPageDestination) {
        pd = (PDPageDestination) current.getDestination();
        pageNumber = (pd.retrievePageNumber() + 1);  // Do we have any method available to get the location on the specific page ??      
    }
    if (current.getAction() instanceof PDActionGoTo) {
        PDActionGoTo gta = (PDActionGoTo) current.getAction();
        if (gta.getDestination() instanceof PDPageDestination) {
            pd = (PDPageDestination) gta.getDestination();               
            pageNumber = (pd.retrievePageNumber() + 1);
        }
    }
    String bookmarkName = emptyString + current.getTitle();
    if(null!=bookmarkName && !EMPTY_STRING.equalsIgnoreCase(bookmarkName)){               
          bookmarkMap.put(pageNumber-1,bookmarkName);
    }

    getAllBookmarks(current, emptyString,bookmarkMap);
    current = current.getNextSibling();
    }
}
public void getAllBookmarks(pOutlineNode bookmarksInOriginalFile、String emptyString、Map bookmarkMap)引发IOException{
PDOutlineItem当前值=null;
if(null!=书签原始文件)
current=bookmarksInOriginalFile.getFirstChild();
while(当前!=null){
整数页码=0;
PDPageDestination pd=null;
if(PDPageDestination的当前.getDestination()实例){
pd=(PDPageDestination)current.getDestination();
pageNumber=(pd.retrievePageNumber()+1);//我们是否有任何方法可以获取特定页面上的位置??
}
if(当前.getAction()实例为PDActionGoTo){
PDActionGoTo gta=(PDActionGoTo)current.getAction();
if(gta.getDestination()实例为PDPageDestination){
pd=(PDPageDestination)gta.getDestination();
pageNumber=(pd.retrievePageNumber()+1);
}
}
字符串bookmarkName=emptyString+current.getTitle();
if(null!=bookmarkName&!EMPTY_STRING.equalsIgnoreCase(bookmarkName)){
bookmarkMap.put(页码-1,书签名称);
}
getAllBookmarks(当前、清空、书签映射);
current=current.getNextSibling();
}
}
任何帮助都将不胜感激


谢谢…

因为我可以使用@tilmahausherr建议解决我的解决方案。我在回答我的问题。我更改了以下代码:

public void getAllBookmarks(PDOutlineNode bookmarksInOriginalFile, String emptyString, Map<Integer,BookmarkMetaDataBO> bookmarkMap) throws IOException {
            PDOutlineItem current = null;
            if (null != bookmarksInOriginalFile)
                current = bookmarksInOriginalFile.getFirstChild();
            while (current != null) {
                Integer pageNumber = 0;
                PDPageDestination pd = null;
                PDPageXYZDestination pdx =  null;
              // These value will give the specific location
                 **int left = 0;
                 int top = 0;**
                if (current.getDestination() instanceof PDPageXYZDestination) {
                    pdx = (PDPageXYZDestination) current.getDestination();
                    pageNumber = (pdx.retrievePageNumber() + 1); 
                    **left = pdx.getLeft();
                    top = pdx.getTop();**
                }
                if (current.getAction() instanceof PDActionGoTo) {
                    PDActionGoTo gta = (PDActionGoTo) current.getAction();
                    if (gta.getDestination() instanceof PDPageDestination) {
                        pd = (PDPageDestination) gta.getDestination();               
                        pageNumber = (pd.retrievePageNumber() + 1);
                    }
                }
                String bookmarkName = emptyString + current.getTitle();
                if(null!=bookmarkName && !EMPTY_STRING.equalsIgnoreCase(bookmarkName)){
                      BookmarkMetaDataBO bkmrkBo =  new BookmarkMetaDataBO();
                      **bkmrkBo.setTop(left);
                      bkmrkBo.setLeft(top);**
                      bookmarkMap.put(pageNumber-1,bkmrkBo);
                }

                getAllBookmarks(current, emptyString,bookmarkMap);
                current = current.getNextSibling();
                }
            }
public void getAllBookmarks(pOutlineNode bookmarksInOriginalFile、String emptyString、Map bookmarkMap)引发IOException{
PDOutlineItem当前值=null;
if(null!=书签原始文件)
current=bookmarksInOriginalFile.getFirstChild();
while(当前!=null){
整数页码=0;
PDPageDestination pd=null;
PDPageXYZDestination pdx=null;
//这些值将给出具体位置
**int左=0;
int-top=0**
if(PDPageXYZDestination的当前.getDestination()实例){
pdx=(PDPageXYZDestination)current.getDestination();
pageNumber=(pdx.retrievePageNumber()+1);
**left=pdx.getLeft();
top=pdx.getTop()**
}
if(当前.getAction()实例为PDActionGoTo){
PDActionGoTo gta=(PDActionGoTo)current.getAction();
if(gta.getDestination()实例为PDPageDestination){
pd=(PDPageDestination)gta.getDestination();
pageNumber=(pd.retrievePageNumber()+1);
}
}
字符串bookmarkName=emptyString+current.getTitle();
if(null!=bookmarkName&!EMPTY_STRING.equalsIgnoreCase(bookmarkName)){
bookmarkmetadabo bkmrkBo=新bookmarkmetadabo();
**bkmrkBo.setTop(左);
bkmrkBo.setLeft(顶部)**
bookmarkMap.put(第1页,bkmrkBo);
}
getAllBookmarks(当前、清空、书签映射);
current=current.getNextSibling();
}
}

谢谢…

IIRC的诀窍是查看PDPageDestination对象。它包含更多内容,具体取决于类型。顺便说一句,PDFBox是2.0.17。谢谢@Tilmahausherr。实际位置在PDPageXYZDestination对象(PDPageDestination对象的子类)中。然后调用
getLeft()
getTop()
。您可能还需要将目标处理添加到带有“PDActionGoto”的段中。(您可以直接拥有目的地,也可以作为GoToAction的一部分)并且永远不要忘记还有其他类型的页面目的地,因此您的代码可能只适用于选定的PDF,而不适用于其他PDF。是的,我同意您的看法!!