使用 python-o365 将 Microsoft Graph 导出为 pdf 给出无效文件

问题描述

我正在尝试使用 python-o365 库下载以 pdf 格式保存在一个驱动器中的 Word 文档,但无法使用 adobe 打开下载的文件。我收到错误 Adobe Acrobat Could not open 'Output.pdf' because it is either not a supported format... 等。我的一些代码如下所示:

my_drive = storage.get_default_drive()
attachments_folder = my_drive.get_special_folder('attachments')
items = attachments_folder.get_items()
target_file = "Example.docx"
file = list(filter(lambda x: target_file == x.name,items))[0]
file.download(to_path = r"C:\Users\UserX\OneDrive WordToPdf",name="Output.pdf",convert_to_pdf=True)

下载的文件似乎只有一个 pdf 扩展名,但实际上仍然是一个 Word 文件,因为它在 word 中打开。

当我删除 name 中的扩展时

file.download(to_path = r"C:\Users\UserX\OneDrive WordToPdf",name="Output",convert_to_pdf=True)

生成文件具有 docx 扩展名,但在 Adob​​e 中打开而不是在 Word 中打开

我怎样才能让它正常工作?目前正在通过在下载文件后更改扩展名来解决

解决方法

我能够重现这个问题。我在下面的链接中更深入地研究了源代码。

https://github.com/O365/python-o365/blob/master/O365/drive.py

让我们关注下面的代码片段 - 因为它负责转换和下载 pdf 文件。

enter image description here

据我所知:

  • 如果目标文件名后缀在列表中(定义在 同一个文件)

enter image description here

  • 如果 convert_to_pdf 为 True

然后它会下载 PDF 格式的文件。

发生了什么?

所以在我们的例子中 - 当你给出一个目标文件名,例如“ABC.pdf” - 它选择目标文件扩展名(PDF) - 因为 pdf 不在 allowed_pdf_extensions 列表中 - 文件被正常下载docx(因为没有执行下面的行)

params['format'] = 'pdf'

这也是为什么如果您不提供扩展名的原因 - 它采用目标文件的源扩展名 - docx - docx 在列表 allowed_pdf_extensions 中,并且 convert_to_pdf 设置为 true - 它以 pdf 格式下载文件格式。 (但文件以 docx 扩展名命名)。

可能的工作环境:

我能够暂时绕过该行为 - 通过将“.pdf”添加到机器本地的 drive.py 中的列表中。

enter image description here

enter image description here

现在,您可以编写一段代码 - 手动更新文件以反映文件名。

或者可以就同一问题联系作者。

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...