Python: TypeError: ожидаемый объект str, bytes или os.PathLike, а не PdfFileReader - PullRequest
0 голосов
/ 29 мая 2018

У меня есть следующий код.Это только отправная точка.Позже я хотел бы заменить статический текст «Hello Word» на элементы из файла CSV, которые я читаю и перебираю для каждого элемента в CSV.Мне нужен водяной знак на каждой странице.

# importing the required modules
import PyPDF2
import io
from reportlab.pdfgen import canvas
from reportlab.lib.pagesizes import letter

def add_watermark(wmFile, pageObj):
    # opening watermark pdf file
    wmFileObj = open(wmFile, 'rb')

    # creating pdf reader object of watermark pdf file
    pdfReader = PyPDF2.PdfFileReader(wmFileObj)

    # merging watermark pdf's first page with passed page object.
    pageObj.mergePage(pdfReader.getPage(0))

    # closing the watermark pdf file object
    wmFileObj.close()

    # returning watermarked page object
    return pageObj


def main():
    import PyPDF2
    import io
    from reportlab.pdfgen import canvas
    from reportlab.lib.pagesizes import letter
    # watermark pdf file name
    packet = io.BytesIO()
    # Create a new PDF with Reportlab
    can = canvas.Canvas(packet, pagesize=letter)
    can.setFont('Helvetica-Bold',18)
    can.drawString(10, 100, "Hello world")
    can.showPage()
    can.save()

    # Move to the beginning of the StringIO buffer
    packet.seek(0)
    mywatermark = PyPDF2.PdfFileReader(packet)

    # original pdf file name
    origFileName = 'Module1.pdf'

    # new pdf file name
    newFileName = 'watermarked_example.pdf'

    # creating pdf File object of original pdf
    pdfFileObj = open(origFileName, 'rb')

    # creating a pdf Reader object
    pdfReader = PyPDF2.PdfFileReader(pdfFileObj)

    # creating a pdf writer object for new pdf
    pdfWriter = PyPDF2.PdfFileWriter()

    # adding watermark to each page
    for page in range(pdfReader.numPages):
        # creating watermarked page object
        wmpageObj = add_watermark(mywatermark, pdfReader.getPage(page))

        # adding watermarked page object to pdf writer
        pdfWriter.addPage(wmpageObj)

    # new pdf file object
    newFile = open(newFileName, 'wb')

    # writing watermarked pages to new file
    pdfWriter.write(newFile)

    # closing the original pdf file object
    pdfFileObj.close()
    # closing the new pdf file object
    newFile.close()


if __name__ == "__main__":
    main()

Я получаю ошибку:

Traceback (most recent call last):
  File "watermark.py", line 101, in <module>
    main()
  File "watermark.py", line 83, in main
    wmpageObj = add_watermark(mywatermark, pdfReader.getPage(page))
  File "watermark.py", line 32, in add_watermark
    wmFileObj = open(wmFile, 'rb')
TypeError: expected str, bytes or os.PathLike object, not PdfFileReader

Мне кажется, я понимаю, что она ожидает строку, байты или файл, которыйЯ не пишу, это просто «объект».

Я пробовал пару вещей, но что бы я ни пытался, это на самом деле еще хуже: - (

Может кто-нибудь помочь? Я 'Я уверен, что это просто мелочь, потому что я хорошо контролирую очевидное.

любая помощь приветствуется.

спасибо

1 Ответ

0 голосов
/ 29 мая 2018

Я оставлю направляющие и недостатки до конца, вот как вы исправите этот кусок кода:

1) Установите переменную 'packet' в существующее имя файла PDF-файла в том же каталоге, что исценарий находится в:

packet = 'my_watermark.pdf'

2) Удалите перемещение в начало буфера 'stringIO' (как это нам когда-нибудь понадобится):

packet.seek(0)     # delete this
mywatermark = PyPDF2.PdfFileReader(packet) #delete this too

3) Give«пакет» в качестве аргумента вместо «mywatermark» в блоке цикла for:

wmpageObj = add_watermark(packet, pdfReader.getPage(page))

4) Из функции add_watermark удаляйте открытия и закрытия файлов, оставьте только конструирование экземпляра PdfFileReader, но спараметр 'wmFile':

wmFileObj = open(wmFile, 'rb')                # delete this
pdfReader = PyPDF2.PdfFileReader(wmFile)      # let this be, but change wmFileObj to wmFile
pageObj.mergePage(pdfReader.getPage(0))       # let this be
wmFileObj.close()                             # delete this
return pageObj                                # let this be  

Кроме того, в вашем коде есть функции импорта в вашей основной функции, переместите их в начало файла и прочитайте некоторую документацию. PyPDF2 * Документация 1016 * показывает, как объединять страницы (это особенность модуля tbh), и, хотя это немного лаконично, с другой стороны, Reportlab Руководство пользователя очень подробное,но просто.Всегда старайтесь увидеть значение, стоящее за вашим кодом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...