如何才能批量将 pdf 文档的所有书签设置更改为“适合页面”,而不是逐个更改?
我在 Windows 7 上使用 Adobe Acrobat Pro DC。
答案1
我为此任务编写了一个 Acrobat Pro 插件:https://github.com/binghe/acrobat-actions/tree/master/Plug-ins
我递归地走进所有书签,并修复每个书签对象,我有以下代码:
// Fixing actions
PDAction action = PDBookmarkGetAction(b);
if (PDActionIsValid(action)) {
PDViewDestination dest = PDActionGetDest(action);
if (PDViewDestIsValid(dest)) {
ASInt32 pageNum;
ASAtom fitType, targetFitType = ASAtomFromString("XYZ");
ASFixedRect destRect;
ASFixed zoom;
PDViewDestGetAttr(dest, &pageNum, &fitType, &destRect, &zoom);
if (fitType != targetFitType || zoom != PDViewDestNULL) {
PDPage page = PDDocAcquirePage(doc, pageNum);
newDest =
PDViewDestCreate(doc,
page, /* := pageNum */
targetFitType, /* XYZ */
&destRect,
PDViewDestNULL, /* when FitType is XYZ */
0); /* unused */
newAction = PDActionNewFromDest(doc, newDest, doc);
PDBookmarkSetAction(b, newAction);
PDViewDestDestroy(dest);
PDActionDestroy(action);
acc++;
}
}
}
答案2
我已经很久(超过 8 年)没有编写过特定于 PDF 的 Javascript 了,但我似乎记得在 JS 中可以编写。
https://www.adobe.com/content/dam/acom/en/devnet/acrobat/pdfs/js_api_reference.pdf
如今,运行 JS 的新方法是使用“操作向导”工具(靠近底部的“更多工具”工具之一)将其附加到“操作”上。使用“新建操作”->选择要添加的工具:->更多工具->执行 JavaScript”。
首先,您需要获取“doc”对象。为此,您可以设置文档或页面级事件(例如,在页面打开时,在第 1 页)。 event.target
将是 doc 对象。
然后您需要遍历所有书签。为此,您需要递归遍历所有书签.children
,因为书签没有嵌套深度限制。
因此类似于:
var doc = event.target;
iterateKids(doc.bookmarkRoot);
function iterateKids(bookmark) {
for (var kid : bookmark.kids) {
...
iterateKids(kid);
}
}
现在,对于...
,我有点困惑。您可以使用 设置书签的操作bookmark.setAction("your javascript here");
,但您实际上无法检查现有的转到操作或更改其缩放设置。
无论如何,在已发布的参考文献中没有。或者... 尤里卡!也许吧。
您可以触发书签的操作。 bookmark.execute()
您还可以检查doc.pageNum
以获取当前页面。然后您可以在注入的脚本中设置文档的 pageNum 和 zoomType。
bookMark.setAction("this.pageNum = " + doc.pageNum + "; this.zoomType = zoomType.fitP;");
我还没有真正尝试过这些,而且我真是生疏了。尽管如此,我预见到了一些问题。
- 您可能会遇到一个问题,即当您 时
bookmark.execute();
,文档的 pageNum 和 zoomType 可能不会更新,直到当前事件结束,此时情况会变得相当复杂。您必须做一些事情,app.setInterval("your JS here", timeBetweenExecutionsInMilliseconds);
您需要设置一些文档级变量,以便您可以在“执行书签操作”和“好的,视图已更改,让我们更新存储在文档级变量中的书签”之间传递信息。您可以随意命名并在 JS 中的任何对象上为它们分配相等的任意值,所以doc.currentBookmark = kid;
。然后,您将清除该“currentBookmark”变量,并设置一个“oldBookmark”变量,以便您的“浏览所有书签”代码可以从中断的地方继续,而不是从头开始并查找one past where you were
。就像我说的。很复杂。 - 你可能对 JS 一点经验都没有。我试图把这篇文章写给初学者看,但这仍然像是跳进深水区学习游泳。
- 惊讶、恐惧、以及对教皇近乎狂热的奉献!
答案3
这是我测试过的 Acrobat Javascript。我找不到向书签添加其他操作的方法,例如在现有操作完成后将视图更改为“适合页面”。
此脚本针对每个书签执行的操作如下:
- 执行书签操作。
- 记住新的页码和
zoomType
。 如果
zoomType
不等于“FitPage”,则用跳转到该页面(上面记住)的 Javascript 替换书签操作并将其更改zoomType
为“FitPage”。function ChangeAllBookmarksToFitPage(Bm, nLevel, nLevelMax) { // nLevelMax ———> 更改已处理书签的最大级别,从 0 开始
if (nLevel > nLevelMax) { return; } Bm.execute // execute the bookmark to jump to the target page if( !(this.zoomType == "FitPage") ) { // The bookmark was not set to "FitPage". // Replace the existing bookmark action. // Get the current page number (page that the last bookmark linked to). var bmPage = parseInt(this.pageNum); // bookmark target page is active; get the page number Bm.setAction("this.pageNum = " + bmPage + "; this.zoomType = zoomtype.fitP;"); } // process children if (Bm.children != null) { for (var i = 0; i < Bm.children.length; i++) { ChangeAllBookmarksToFitPage(Bm.children[i], nLevel + 1); } }
}
像这样调用它:
var root = this.bookmarkRoot; // starting bookmark object
ChangeAllBookmarksToFitPage(root, 0, 10);
请注意以下 3 个参数:
- 骨髓 - 书签对象
- n 级 - 起始级别(零是根级别,因此是所有书签)
- 最大等级- 要深入的层数(如果有子书签)