批量将 PDF 的所有书签设置更改为“适合页面”

批量将 PDF 的所有书签设置更改为“适合页面”

如何才能批量将 pdf 文档的所有书签设置更改为“适合页面”,而不是逐个更改?

我在 Windows 7 上使用 Adob​​e 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。我找不到向书签添加其他操作的方法,例如在现有操作完成后将视图更改为“适合页面”。

此脚本针对每个书签执行的操作如下:

  1. 执行书签操作。
  2. 记住新的页码和zoomType
  3. 如果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 级 - 起始级别(零是根级别,因此是所有书签)
  • 最大等级- 要深入的层数(如果有子书签)

相关内容