鱼C论坛

 找回密码
 立即注册
查看: 1722|回复: 3

[已解决]帮我看看又是错那?

[复制链接]
发表于 2023-7-21 22:37:57 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#pip install PyPDF2 python-docx
import os
import PyPDF2
from docx import Document


def pdf_to_docx(input_path, output_path):
    pdf_file = open(input_path, 'rb')
    pdf_reader = PyPDF2.PdfReader(pdf_file)

    document = Document()

    for page_num, page in enumerate(pdf_reader.pages, start=1):
        page = pdf_reader.pages(page_num)
        text = page.extract_text()
        paragraph = document.add_paragraph()
        paragraph.add_run(text)

    document.save(output_path)
    pdf_file.close()


# 示例用法
input_file = 'f:\\'+input('请输入要转换的文件名')+'.pdf'
output_file = 'f:\\'+input('请输入要保存的文件名')+'.docx'
pdf_to_docx(input_file, output_file)

错误信息
请输入要转换的文件名123
请输入要保存的文件名456
Traceback (most recent call last):
  File "D:\Python\pdf转docx.py", line 26, in <module>
    pdf_to_docx(input_file, output_file)
  File "D:\Python\pdf转docx.py", line 14, in pdf_to_docx
    page = pdf_reader.pages(page_num)
TypeError: '_VirtualList' object is not callable

进程已结束,退出代码1
最佳答案
2023-7-21 22:39:10
看起来你在使用 PyPDF2 库提取 PDF 页面的时候遇到了问题。问题在这一行代码:
page = pdf_reader.pages(page_num)

pdf_reader.pages  是一个列表,而不是一个函数。你尝试通过调用它来获取页面,这是不正确的。你已经在 for 循环中遍历了这个列表并获取了每个页面,所以你应该直接使用  page  变量,而不是尝试再次从  pdf_reader.pages  中获取页面。以下是你应该怎么做:
for page_num, page in enumerate(pdf_reader.pages, start=1):
    text = page.extract_text()
    paragraph = document.add_paragraph()
    paragraph.add_run(text)

此外,注意到你在创建 Document 对象后,使用了  add_paragraph()  来添加段落,但在之后使用  add_run()  向这个新段落中添加文本。 add_run()  是用来向一个已经存在的段落中添加文本的。如果你想在一个新的段落中添加文本,你可以直接在  add_paragraph()  方法中添加,例如:
for page_num, page in enumerate(pdf_reader.pages, start=1):
    text = page.extract_text()
    document.add_paragraph(text)

你的错误信息  '_VirtualList' object is not callable  就是因为你尝试调用了一个列表对象,而这个对象并不是一个函数。这个修改应该能够解决你的问题。如果还有其他问题,请随时提问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-7-21 22:39:10 | 显示全部楼层    本楼为最佳答案   
看起来你在使用 PyPDF2 库提取 PDF 页面的时候遇到了问题。问题在这一行代码:
page = pdf_reader.pages(page_num)

pdf_reader.pages  是一个列表,而不是一个函数。你尝试通过调用它来获取页面,这是不正确的。你已经在 for 循环中遍历了这个列表并获取了每个页面,所以你应该直接使用  page  变量,而不是尝试再次从  pdf_reader.pages  中获取页面。以下是你应该怎么做:
for page_num, page in enumerate(pdf_reader.pages, start=1):
    text = page.extract_text()
    paragraph = document.add_paragraph()
    paragraph.add_run(text)

此外,注意到你在创建 Document 对象后,使用了  add_paragraph()  来添加段落,但在之后使用  add_run()  向这个新段落中添加文本。 add_run()  是用来向一个已经存在的段落中添加文本的。如果你想在一个新的段落中添加文本,你可以直接在  add_paragraph()  方法中添加,例如:
for page_num, page in enumerate(pdf_reader.pages, start=1):
    text = page.extract_text()
    document.add_paragraph(text)

你的错误信息  '_VirtualList' object is not callable  就是因为你尝试调用了一个列表对象,而这个对象并不是一个函数。这个修改应该能够解决你的问题。如果还有其他问题,请随时提问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-21 22:43:58 | 显示全部楼层
根据错误信息和代码分析,出现错误的原因是在第14行尝试调用pdf_reader.pages(page_num),但是pages应该是属性而不是方法。所以需要将该行代码修改为page = pdf_reader.pages[page_num]
修改后的代码如下:
#pip install PyPDF2 python-docx
import os
import PyPDF2
from docx import Document


def pdf_to_docx(input_path, output_path):
    pdf_file = open(input_path, 'rb')
    pdf_reader = PyPDF2.PdfReader(pdf_file)

    document = Document()

    for page_num, page in enumerate(pdf_reader.pages, start=1):
        page = pdf_reader.pages[page_num]
        text = page.extract_text()
        paragraph = document.add_paragraph()
        paragraph.add_run(text)

    document.save(output_path)
    pdf_file.close()


# 示例用法
input_file = 'f:\\'+input('请输入要转换的文件名')+'.pdf'
output_file = 'f:\\'+input('请输入要保存的文件名')+'.docx'
pdf_to_docx(input_file, output_file)
请注意,还有一处问题是输入文件名和输出文件名时的路径拼接方式。根据你的代码,会将文件保存在f:\\根目录下。如果你希望保存到其他目录,请修改input_fileoutput_file的定义。
希望对你有帮助!如有其他问题,请随时提问。


为什么不给我设置一个最佳答案呢?点它 ->

                               
登录/注册后可看大图
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-7-21 23:16:22 | 显示全部楼层
你的错误发生在尝试调用`pdf_reader.pages(page_num)`这一行,这是不正确的。在`PdfReader`对象中,`pages`属性是一个类似列表的对象,而不是一个可调用的函数。因此,你不能使用圆括号`()`来调用它。

同时,当你使用`enumerate`时,它已经直接给出了每一页,所以你不需要再从`pdf_reader.pages`中获取它。你可以直接使用`page`变量。

这是你函数的修正版本:

```python
def pdf_to_docx(input_path, output_path):
    pdf_file = open(input_path, 'rb')
    pdf_reader = PyPDF2.PdfReader(pdf_file)

    document = Document()

    for page in pdf_reader.pages:
        text = page.extract_text()
        paragraph = document.add_paragraph()
        paragraph.add_run(text)

    document.save(output_path)
    pdf_file.close()

# 示例用法
input_file = 'f:\\'+input('请输入要转换的文件名')+'.pdf'
output_file = 'f:\\'+input('请输入要保存的文件名')+'.docx'
pdf_to_docx(input_file, output_file)
```

请注意,`PyPDF2`的文本提取功能有时可能会导致文本格式混乱,因为它并不总是能很好地处理不同的文本编码或布局。如果你遇到问题,你可能需要考虑使用一个更强大的PDF处理库,例如`PDFMiner`或`pdftotext`,它们可以处理更复杂的PDF文件。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-9-22 09:53

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表