Python - 打开 pdf 文件到特定页面标签

问题描述 投票:0回答:2

我已经阅读了很多解释如何打开 PDF 文件到特定页面的答案;从this answer,解决方案是这样的:

import subprocess
import os

path_to_pdf = os.path.abspath('C:\test_file.pdf')
# I am testing this on my Windows Install machine
path_to_acrobat = os.path.abspath('C:\Program Files (x86)\Adobe\Reader 10.0\Reader\AcroRd32.exe') 

# this will open your document on page 12
process = subprocess.Popen([path_to_acrobat, '/A', 'page=12', path_to_pdf], shell=False, stdout=subprocess.PIPE)
process.wait()

但是,我找不到如何打开 PDF 到特定的 页面标签(如果页码与页面标签不匹配,那就是个问题)。
我该怎么做?



附言: 如果不清楚,in this image 您会看到页码 (274) 和页码 (208) 之间的区别。

python pdf acrobat
2个回答
0
投票

pypdf
可以阅读页面标签:

from typing import Dict

from pypdf import PdfReader

reader = PdfReader("example.pdf")
labels = reader.page_labels

index2label: Dict[int, str] = {
    index: label for index, label in enumerate(labels)
}

这样你就可以找到你感兴趣的索引。之后,你就可以使用索引了。


0
投票

PDF 中的页码以 zer0 为基数,因此通常通过将计数器设置为 i=[0] 然后 page[1] = Page 2 等以编程方式提取第一个页码,因此我们在页面 [X of N] 中看到的数字是本身就是人类约定俗成的标签。

然而,对于期刊或书籍,我们可能不想计算封面 [0],而是包括“自定义标签范围”,如

cover, iv, iii, ii, i, 1, 2
或 A、B、C 或什至 i、ii、iii 等,或者再次提取
1
=
1406
来自更大的年度收藏。

数字通常遵循人类逻辑标记序列,这与构建 PDF 的方式不同,因此我们简单地将自定义标记显示为 [A] 5/9,其中

A
实际上是第 [4] 页,共 9 页。

或者在这种情况下是 1/1(实际上是 [0]/[0])

所以如何提取该序列是寻找像这样的目录条目

/PageLabels<</Nums[0<</S/A>>]>>/Pages 5 0 R/Type/Catalog

所以我们可以看到标签是“/Numerics”,其中唯一的页面[0....]可以/应该被替换为<tring Word of /A>>

因此,如果您知道

/Nums
的存储位置,那么很容易编写 # 输出。

返回您的查询您可以添加 NamedDestinations 并且对于该页面 1(标记为 A),我们可以搜索像这样的条目

%Prepare Named Destinations
3 0 obj
<</Names [(Page1) [6 0 R /XYZ 0 792 null] (QRCode) [6 0 R /XYZ 25.0 317.0 1]]>>

所以在这种情况下打开页面 A 我们可以说

#NamedDest=Page1
#NamedDest=QRcode
因为外部标签都重定向到 6 0 R 并且不必等于任何内部标签 object 6 即 Page [ 0](在本例中标记为 A)

注意那些 Named Destinations 是没有空格的单个 ID 字符串(URL 不应该有空格)并且与您在目录或大纲中看到的内部 /D estinations 完全不同,其中页面标签可以是页面 A 或介绍或任何其他导航标签/关键字。

很多用户在看到这样的/D(Destination)时,不明白为什么在外部调用一个Name不起作用

9 0 obj <</A<</D [6 0 R /FitR 90 90 300 300]/S/GoTo>>/C[0 0 1]/F 3/Parent 4 0 R/Prev 7 0 R/Title(Hello World\041)>> endobj
这里的目的地是 QRCode 目的地,但对于导航器中的人类消费而言,它被列为页面

Hello World

,一些读者可以通过使用不同的外部-或-- 或 / 或 # 开关前缀
© www.soinside.com 2019 - 2024. All rights reserved.