Python / PyPDF4:如何在创建的PDF中指定/ PageLabels?

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

我正在使用PyPDF4创建日记帐“自然”的offline-readable version

[我使用PyPDF4 PdfFileReader读取单个文章PDF,并使用PdfFileWriter创建单个合并的输出。

[我要解决的问题是某些问题的页码不是从1开始,例如,issue 7805从563页开始。

如何在文档目录中指定所需的/PageLabels

    for pdf_file in pdf_files:
        input_pdf = PdfFileReader(open(pdf_file, 'rb'))
        page_indices = file_page_dictionary[pdf_file]
        for page_index in page_indices:
            page = input_pdf.getPage(page_index)

            # Specify actual page number here:
            # page.setPageNumber(actual_page_numbers[page_index])

            output.addPage(page)

    with open(pdf_output_name, 'wb') as f:
        output.write(f)
python-3.x pdf-generation pypdf2
1个回答
0
投票

[探索了PDF标准并进行了一些修改之后,我发现以下函数将添加一个PageLabels条目,该条目创建从offset开始的页面标签(即,第一页将被标记为offset,第二页将被标记为offset +1等)。

# output_pdf is an instance of PdfFileWriter().
# offset is the desired page offset.
def add_pagelabels(output_pdf, offset):
    number_type = PDF.DictionaryObject()
    number_type.update({PDF.NameObject("/S"):PDF.NameObject("/D")})
    number_type.update({PDF.NameObject("/St"):PDF.NumberObject(offset)})

    nums_array = PDF.ArrayObject()
    nums_array.append(PDF.NumberObject(0)) # physical page index
    nums_array.append(number_type)

    page_numbers = PDF.DictionaryObject()
    page_numbers.update({PDF.NameObject("/Nums"):nums_array})

    page_labels = PDF.DictionaryObject()
    page_labels.update({PDF.NameObject("/PageLabels"): page_numbers})

    root_obj = output_pdf._root_object
    root_obj.update(page_labels)

可以创建其他页面标签条目(即具有不同的偏移量或不同的编号样式)。

请注意,第一个PDF页面的索引为0。

# Use PyPDF to manipulate pages
from PyPDF4 import PdfFileWriter, PdfFileReader 

# To manipulate the PDF dictionary
import PyPDF4.pdf as PDF

def pdf_pagelabels_roman():
    number_type = PDF.DictionaryObject()
    number_type.update({PDF.NameObject("/S"):PDF.NameObject("/r")})
    return number_type

def pdf_pagelabels_decimal():
    number_type = PDF.DictionaryObject()
    number_type.update({PDF.NameObject("/S"):PDF.NameObject("/D")})
    return number_type

def pdf_pagelabels_decimal_with_offset(offset):
    number_type = pdf_pagelabels_decimal()
    number_type.update({PDF.NameObject("/St"):PDF.NumberObject(offset)})
    return number_type

...
    nums_array = PDF.ArrayObject()
    # Each entry consists of an index followed by a page label...
    nums_array.append(PDF.NumberObject(0))  # Page 0:
    nums_array.append(pdf_pagelabels_roman()) # Roman numerals

    # Each entry consists of an index followed by a page label...
    nums_array.append(PDF.NumberObject(1)) # Page 1 -- 10:
    nums_array.append(pdf_pagelabels_decimal_with_offset(first_offset)) # Decimal numbers, with Offset

    # Each entry consists of an index followed by a page label...
    nums_array.append(PDF.NumberObject(10)) # Page 11 --> :
    nums_array.append(pdf_pagelabels_decimal_with_offset(second_offset))


    page_numbers = PDF.DictionaryObject()
    page_numbers.update({PDF.NameObject("/Nums"):nums_array})

    page_labels = PDF.DictionaryObject()
    page_labels.update({PDF.NameObject("/PageLabels"): page_numbers})

    root_obj = output._root_object
    root_obj.update(page_labels)
© www.soinside.com 2019 - 2024. All rights reserved.