【问题标题】:Itext change bookmarks zoom level to inherit zoom in existing pdfItext更改书签缩放级别以继承现有pdf的缩放
【发布时间】:2014-03-31 06:21:37
【问题描述】:

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

我附上了截图。

这是我用来更改书签缩放级别的代码(根据@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"));
                }
            }
        }
    }

书签树结构:

【问题讨论】:

    标签: java itext


    【解决方案1】:

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

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

    这些页面条目包含一个目标,例如FitFitHXYZ、... 您需要将所有这些引用更改为您将缩放系数设置为 0 的 XYZ 引用。A缩放系数 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"));
                }
            }
        }
    }
    

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

    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 指左下角;ur 指右上角) .左上角是 llx,ury 或者在你的情况下是 x = -3 和 y = 627。简而言之:在这种情况下,你需要“XYZ -3 627 0”。

    【讨论】:

    • 某些书签的缩放级别是自定义的,我怎样才能让它继承缩放?
    • 如果我在 notpad++ 编辑器中打开我的 pdf 文件,我发现 **FitR**(在更改书签级别之前)
    • 根据您的建议,我已经尝试了代码(有问题添加)-但无法在某些文件中工作(特别是在自定义缩放级别时)。
    • 我想看看那个 PDF,这样我可以证明我的答案是正确的,或者 PDF 不是你假装的那样。
    • 请注意,FitR 指的是“适合矩形”,这意味着您没有将z 值定义为缩放因子,而是要放大的矩形。如果要“继承缩放”,则需要XYZ 后跟 3 个参数:x 值、y 值和缩放值 0。如果你明白这一点,你就不会在任何地方告诉我。你没有告诉我你更改书签后发现了什么。
    【解决方案2】:

    很遗憾,如果您必须使用 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);
            }
        }
    }
    

    【讨论】:

    • 是的,两者都是(工具和库)。查看org.bitbucket.beatngu13.pdfbookmarkwizard.core.Wizard 了解如何将各种缩放级别应用于您的书签。
    • 实际上我的项目是用 java 1.5 构建的,在我的项目中可以吗?因为库使用 java 6 编译...
    • 我尝试使用旧版本的库,但没有设置缩放级别的方法
    • 放大率到底是什么意思?据我所知,您可以为链接或书签目标设置此属性。您可以查看API 了解详细信息(查看 org.pdfclown.documents.interaction.actions.GoToDestinationorg.pdfclown.documents.interaction.navigation。文档.目的地)。
    • 应该可以的。再次检查API 并研究org.pdfclown.documents.interaction.annotations.Link
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-01-30
    • 2011-10-26
    • 1970-01-01
    • 2012-04-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多