使用 pdftk 等工具重新排列 PDF 文件的页面时如何保留书签?

使用 pdftk 等工具重新排列 PDF 文件的页面时如何保留书签?

我正在使用pdftk书签/大纲重新排列 pdf 文件的页面,但之后,输出文件丢失了原始文件的书签。

我的命令是pdftk in.pdf cat 1-22 43 23-42 44-end output out.pdf

我想知道如何在重新排列页面时保留书签?

答案1

这是一个可行的解决方案。但是,您需要对其进行调整以满足您的需求。

在我的示例中,我删除了 PDF 的第一页,然后我需要更新书签以指向正确的位置。

  1. 从 in.pdf 中删除第 1 页:

    pdftk A=in.pdf cat A2-end output temp.pdf
    
  2. 从 in.pdf 创建一个 in.info 文件:

    pdftk in.pdf dump_data > in.info
    
  3. in.info 需要在我的情况下进行更正,因为我将删除一个页面。

    因此,我需要将 BookmarkPageNumber 减一以使书签指向正确的页面。

    php代码:

    $file = "in.info";
    $data = file_get_contents($file);
    
    foreach (explode("\n", $data) as $row) {
        $tmp = explode(": ", $row);
    
        if ($tmp[0] == "BookmarkPageNumber") {
            if ($tmp[1] != "1") $tmp[1]--;
            echo $tmp[0].": ".$tmp[1]."\n";
        } else {
            echo $row."\n";
        }
    }
    
  4. 创建最终的 out.pdf:

    pdftk temp.pdf update_info in2.info output out.pdf
    

使用 pdftk 2.01 在 debian 上进行测试

答案2

正在阅读手册页小心地说,它update_info会以生成的任何格式获取数据dump_data。这大概必须根据页面改组进行调整。听起来没有不可能的,但它不是自动的。

PDFtk站点仅给出上述点击和创建/编辑书签作为结果。 Google 对 PDF 中的书签和重组问题的全部了解,都是对上述操作的点击和对它们提供的奇迹的抒情阐述,以及这个线程;-)。

所以看来是做不到了。这些评论提出了一些可能性,但在尝试时并没有奏效。

答案3

你需要这样做pdftk in.pdf dump_data > in.info,然后update_info在生成的时候添加参数out.pdf。引用自man pdftk

update_info <info data filename | - | PROMPT>

更改存储在单个 PDF 信息字典中的元数据以匹配输入数据文件。输入数据文件使用与 dump_data 的输出相同的语法。非 ASCII 字符应编码为 XML 数字实体。这不会更改 PDF 的 XMP 流中存储的元数据(如果有)。例如:

             pdftk in.pdf update_info in.info output out.pdf

  update_info_utf8 <info data filename | - | PROMPT>

与 update_info 相同,只是输入编码为 UTF-8。

答案4

qpdf 至少在 cygwin 下很有魅力。只要您不使用以下--empty选项,它就会保留链接:

qpdf input.pdf --pages input.pdf 1,4,5,7-r8,2,3,r7-z -- output.qpdf.pdf

(rN是选择从end开始索引的一页,z是最后一页)

相关内容