Запись pdf с pypdf2 дает ошибку

Я пытаюсь написать простой скрипт для объединения двух PDF-файлов, но столкнулся с проблемой при попытке сохранить вывод на диск. Мой код

from PyPDF2 import PdfFileWriter, PdfFileReader
import tkinter as tk
from tkinter import filedialog    

### Prompt the user for the 2 files to use via GUI ###
root = tk.Tk()
root.update()
file_path1 = tk.filedialog.askopenfilename(
            filetypes=[("PDF files", "*.pdf")],
            )

file_path2 = tk.filedialog.askopenfilename(
            filetypes=[("PDF files", "*.pdf")],
            )

###Function to combine PDFs###
output = PdfFileWriter()

def append_pdf_2_output(file_handler):
    for page in range(file_handler.numPages):
        output.addPage(file_handler.getPage(page))

#Actually combine the 2 PDFs###
append_pdf_2_output(PdfFileReader(open(file_path1, "rb")))
append_pdf_2_output(PdfFileReader(open(file_path2, "rb")))

###Prompt the user for the file save###
output_name = tk.filedialog.asksaveasfile(
            defaultextension='pdf')

###Write the output to disk###
output.write(output_name)
output.close

Проблема в том, что я получаю сообщение об ошибке

UserWarning: файл для записи не в двоичном режиме. Может не правильно написано. [pdf.py:453] Трассировка (последний последний вызов): файл «Combine2Pdfs.py», строка 44, в файле output.write(output_name) «/Library/Frameworks/Python.framework/Versions/3.5/lib/pytho‌ ​n3.5/site-packages/P‌​yPDF2/pdf.py", строка 487, поток записи.write(self.header + b("\n")) TypeError: write( ) аргумент должен быть str, а не bytes

Где я ошибся?


person pgcudahy    schedule 02.12.2016    source источник
comment
Вы можете опубликовать полную трассировку стека, а не только сообщение?   -  person Jean-François Fabre    schedule 02.12.2016
comment
пожалуйста, не публикуйте трассировку стека в комментарии. В вашем вопросе есть ссылка для редактирования, которая позволяет вам редактировать вопрос.   -  person Bryan Oakley    schedule 02.12.2016


Ответы (2)


Я получил его, добавив mode = 'wb' в tk.filedialog.asksaveasfile. Теперь это

output_name = tk.filedialog.asksaveasfile(
        mode = 'wb',
        defaultextension='pdf')
output.write(output_name)
person pgcudahy    schedule 05.12.2016

Попробуйте использовать tk.filedialog.asksaveasfilename вместо tk.filedialog.asksaveasfile. Вам просто нужно имя файла, а не сам обработчик файла.

###Prompt the user for the file save###
output_name = tk.filedialog.asksaveasfilename(defaultextension='pdf')
person Marvo    schedule 02.12.2016
comment
При этом я получил ошибку AttributeError: объект «str» не имеет атрибута «запись». Затем я добавил with open("output_name", 'wb') as save: output.write(save), который не дает никаких ошибок, но и не записывает PDF. - person pgcudahy; 05.12.2016