Itext更改书签缩放级别以inheritance现有pdf的缩放

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

我附上了截图。 在此处输入图像描述

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

 public void changeList(List<HashMap> list) { for (HashMap entry : list) { for (String key : entry.keySet()) { System.out.println(key); if ("Kids".equals(key)) { Object o = entry.get(key); changeList((List<HashMap>) o); } else if ("Page".equals(key)) { String dest = (String) entry.get(key); entry.put("Page", dest.replaceAll("Fit", "XYZ 30 100 0")); } } } } 

书签树结构: 在此处输入图像描述

请查看我对以下问题的回答: 将pdf文件中的inheritance缩放(动作属性)设置为书签

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

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

在我对pdf文件中将inheritance缩放(动作属性)设置为书签的答案中,我有以下代码:

 public void changeList(List> list) { for (HashMap entry : list) { for (String key : entry.keySet()) { if ("Kids".equals(key)) { Object o = entry.get(key); changeList((List>)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"); 

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

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

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

看看我写的这个小型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); } } }