Itext更改书签缩放级别以继承放大现有pdf

时间:2014-03-31 06:21:38

标签: java itext

使用 iText5 PDF库,我能够在PDF中读取书签。现在我想使用iText更改现有PDF中的zoom level of bookmarks(继承缩放)。 是否可以使用iText PDF库,以及如何使用?

我附上了截图。 enter image description here

这是我用来更改书签缩放级别的代码(根据@lowagie评论):

public void changeList(List<HashMap<String, Object>> list) {
        for (HashMap<String, Object> entry : list) {
            for (String key : entry.keySet()) {
                System.out.println(key);

                if ("Kids".equals(key)) {
                    Object o = entry.get(key);
                    changeList((List<HashMap<String, Object>>) o);
                } else if ("Page".equals(key)) {
                    String dest = (String) entry.get(key);
                    entry.put("Page", dest.replaceAll("Fit", "XYZ 30 100 0"));
                }
            }
        }
    }

书签树结构: enter image description here

2 个答案:

答案 0 :(得分:3)

请查看我对以下问题的回答:Set inherit Zoom(action property) to bookmark in the pdf file

在该答案中,我使用SimpleBookmark对象阅读书签。这可能与您阅读书签的方式相同。结果是表示大纲树的ListHashMap个对象。我使用递归方法来查找所有"Page"条目。

这些页面条目包含目标,例如FitFitHXYZ,...您需要将所有这些引用更改为XYZ引用将缩放系数设置为0.缩放系数0相当于“继承缩放”。

在我对Set inherit Zoom(action property) to bookmark in the pdf file的回答中,我有这段代码:

public void changeList(List<HashMap<String, Object>> list) {
    for (HashMap<String, Object> entry : list) {
        for (String key : entry.keySet()) {
            if ("Kids".equals(key)) {
                Object o = entry.get(key);
                changeList((List<HashMap<String, Object>>)o);
            }
            else if ("Page".equals(key)) {
                String dest = (String)entry.get(key);
                entry.put("Page", dest.replaceAll("Fit", "FitV 60"));
            }
        }
    }
}

很明显,您可以通过全新的操作替换任何现有的“Page”操作。例如:

entry.put("Page", "XYZ 30 100 0");

现在,您将使用继承的缩放系数跳转到页面上的坐标30 100。如果要放大其他部分,例如与原始位置或多或少对应的位置,则需要检查原始PDF中FitR之后的坐标。有4:左下x,左下y,右上x和右上y坐标。您可以使用这些值的原始目标解析字符串,并将这些坐标中的两个重用为XYZ目标中的X和Y值。

与XYZ目标一起传递的X Y坐标是左上角的坐标。例如,如果你有FitR -3 234 486 627,那么你放大一个坐标为llx = -3,lly = 234,urx = 486和ury = 627的矩形(ll指的是左下角;你指的是上面的 - 对)。左上角是llx,或者在你的情况下x = -3和y = 627.简而言之:在这种情况下,你需要“XYZ -3 627 0”。

答案 1 :(得分:1)

不幸的是,如果您必须使用iText,我无法帮助您。但是,如果您只是想更改书签的缩放级别,您还可以使用我个人非常喜欢的PDF Clown库(特别是在API设计与iText相比时)。

查看我编写的this小型Java应用程序,它完全符合您的要求。 Wizard类为您提供有关如何更改缩放级别的概述。基本上你可以通过以下方式实现这一目标:

private void modifyBookmarks(Bookmarks bookmarks) {
    for (Bookmark bm : bookmarks) {
        if (!bm.getBookmarks().isEmpty()) {
            modifyBookmarks(bm.getBookmarks());
        }

        if (bm.getTarget() instanceof GoToDestination<?>) {
            Destination dest = ((GoToDestination<?>) 
                    bm.getTarget()).getDestination();
            dest.setMode(ModeEnum.XYZ);
            dest.setZoom(0.0);
        }
    }
}