Python 3.x Python/PyPDF4:如何在创建的PDF中指定/PageLabels?
我正在使用PyPDF4创建一个“自然”杂志的主题 我使用PyPDF4 PdfileReader阅读单独的文章PDFs和PdfileWriter来创建一个合并的输出 我试图解决的问题是,某些问题的页码不是从1开始的,例如,从563页开始 如何在文档目录中指定所需的Python 3.x Python/PyPDF4:如何在创建的PDF中指定/PageLabels?,python-3.x,pdf-generation,pypdf2,Python 3.x,Pdf Generation,Pypdf2,我正在使用PyPDF4创建一个“自然”杂志的主题 我使用PyPDF4 PdfileReader阅读单独的文章PDFs和PdfileWriter来创建一个合并的输出 我试图解决的问题是,某些问题的页码不是从1开始的,例如,从563页开始 如何在文档目录中指定所需的/PageLabels 对于pdf\u文件中的pdf\u文件: input_pdf=PdfileReader(打开(pdf_文件'rb')) 页面索引=文件页面字典[pdf文件] 对于页面索引中的页面索引: page=input\u pd
/PageLabels
对于pdf\u文件中的pdf\u文件:
input_pdf=PdfileReader(打开(pdf_文件'rb'))
页面索引=文件页面字典[pdf文件]
对于页面索引中的页面索引:
page=input\u pdf.getPage(page\u索引)
#在此处指定实际页码:
#page.setPageNumber(实际页码[页码索引])
output.addPage(第页)
将open(pdf_输出_名称,'wb')作为f:
输出写入(f)
在研究了PDF标准和一些黑客攻击之后,我发现下面的函数将添加一个PageLabels
条目,该条目创建从偏移开始的页面标签(即,第一页将标记为偏移,第二页标记为偏移+1,等等)
#output#pdf是PdfFileWriter()的一个实例。
#偏移量是所需的页面偏移量。
def添加页面标签(输出pdf,偏移量):
number_type=PDF.DictionaryObject()
编号\u type.update({PDF.NameObject(“/S”):PDF.NameObject(“/D”)})
编号\u type.update({PDF.NameObject(“/St”):PDF.NumberObject(offset)})
nums_array=PDF.ArrayObject()
nums_array.append(PDF.NumberObject(0))#物理页面索引
nums\u数组.append(数字\u类型)
页码=PDF.DictionaryObject()
页码.更新({PDF.NameObject(“/Nums”):Nums\u数组})
page_labels=PDF.DictionaryObject()
page_labels.update({PDF.NameObject(“/PageLabels”):page_numbers})
root\u obj=输出\u pdf.\u root\u对象
根目录对象更新(页面标签)
可以创建其他页面标签条目(即具有不同偏移或不同编号样式)
请注意,第一个PDF页面的索引为0
#使用PyPDF操作页面
从PyPDF4导入PdfileWriter、PdfileReader
#操作PDF字典的步骤
将PyPDF4.pdf导入为pdf
def pdf_pagelabels_roman():
number_type=PDF.DictionaryObject()
编号\u type.update({PDF.NameObject(“/S”):PDF.NameObject(“/r”)})
返回编号\u类型
def pdf_页面标签_decimal():
number_type=PDF.DictionaryObject()
编号\u type.update({PDF.NameObject(“/S”):PDF.NameObject(“/D”)})
返回编号\u类型
def pdf页面标签带偏移量(偏移量)的十进制标签:
数字\u类型=pdf\u页面标签\u十进制()
编号\u type.update({PDF.NameObject(“/St”):PDF.NumberObject(offset)})
返回编号\u类型
...
nums_array=PDF.ArrayObject()
#每个条目由一个索引和一个页面标签组成。。。
nums_array.append(PDF.NumberObject(0))#第0页:
nums_array.append(pdf_pagelabels_roman())#罗马数字
#每个条目由一个索引和一个页面标签组成。。。
nums_array.append(PDF.NumberObject(1))#第1-10页:
nums_数组。追加(pdf_页面标签_十进制带_偏移量(第一个_偏移量))#十进制数,带偏移量
#每个条目由一个索引和一个页面标签组成。。。
nums_array.append(PDF.NumberObject(10))#第11页-->:
nums\u array.append(pdf\u页面标签\u带\u偏移量的十进制\u(第二个\u偏移量))
页码=PDF.DictionaryObject()
页码.更新({PDF.NameObject(“/Nums”):Nums\u数组})
page_labels=PDF.DictionaryObject()
page_labels.update({PDF.NameObject(“/PageLabels”):page_numbers})
根对象=输出
根目录对象更新(页面标签)
我一直在找这样的东西。但是,当我使用你的代码时,我无法在最后一步中编写pdf。您实际编写文件时使用的代码是什么?我得到一个错误AttributeError:'int'对象没有属性'writeToStream'
我试图解决的问题是不同的:在组合多个文档时保留书签和页面标签。这里的查询:看起来您使用的是一个裸体号码。PageLabels结构中的所有数字都必须用PDF.NumberObject(xxx)
包装。我在