使用 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"));
}
}
}
}
书签树结构:
答案 0 :(得分:3)
请查看我对以下问题的回答:Set inherit Zoom(action property) to bookmark in the pdf file
在该答案中,我使用SimpleBookmark
对象阅读书签。这可能与您阅读书签的方式相同。结果是表示大纲树的List
个HashMap
个对象。我使用递归方法来查找所有"Page"
条目。
这些页面条目包含目标,例如Fit
,FitH
,XYZ
,...您需要将所有这些引用更改为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);
}
}
}