Как добавить относительный путь к файлу внутри pdf с помощью pypdf

#python #pdf #relative-path #pypdf2 #file-uri

#python #PDF #относительный путь #pypdf2 #file-uri

Вопрос:

Контекст

  1. У меня есть pdf-файл со ссылками.
  2. Я хочу заменить все внешние ссылки локальными файлами в той же папке.
  3. Есть ли способ сделать это в pypdf или python

например

 outputStream = open("destination.pdf", "wb")
key = '/Annots'
uri = '/URI'
ank = '/A'
import os
dir_path = os.path.dirname(os.path.realpath(__file__))
cwd = os.getcwd()
for x in range(existing_pdf.getNumPages()):
    page = existing_pdf.getPage(x)
    page_object = page.getObject()

    if key in page_object:
        ann = page_object[key]
        for a in ann:
            u = a.getObject()
            if uri in u[ank]:
                test = u[ank][uri]
                test1 = u[ank].keys()
                u[TextStringObject(ank)][TextStringObject(uri)] = TextStringObject(f"file:./foo1.pdf")
    output.addPage(page)
    # finally, write "output" to a real file
    output.write(outputStream)
outputStream.close()
 

Вышеуказанное не работает, т.Е. файл foo1.pdf не связан должным образом.
Если я добавлю «file:///{CWD}/foo1.pdf», это сработает.
Есть ли способ использовать только относительный путь?

Ответ №1:

После прочтения структуры и документации pdf я смог написать следующее, и оно работает так, как ожидалось.

    for x in range(existing_pdf.getNumPages()):
    page = existing_pdf.getPage(x)
    page_object = page.getObject()
    if key in page_object:
        ann = page_object[key]
        for a in ann:
            u = a.getObject()
            if uri in u[ank]:
                del u[TextStringObject(ank)][TextStringObject(uri)]
                u[TextStringObject(ank)][NameObject('/F')] = TextStringObject(f"./sheets/sheet1.pdf")
                u[TextStringObject(ank)][TextStringObject('/S')] = NameObject("/Launch")
                u[TextStringObject(ank)][NameObject('/NewWindow')] = BooleanObject(f"true")
    output.addPage(page)
    # finally, write "output" to a real file
    output.write(outputStream)
outputStream.close()