ssqchina 发表于 2023-7-21 22:37:57

帮我看看又是错那?

#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

isdkz 发表于 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就是因为你尝试调用了一个列表对象,而这个对象并不是一个函数。这个修改应该能够解决你的问题。如果还有其他问题,请随时提问。

歌者文明清理员 发表于 2023-7-21 22:43:58

根据错误信息和代码分析,出现错误的原因是在第14行尝试调用pdf_reader.pages(page_num),但是pages应该是属性而不是方法。所以需要将该行代码修改为page = pdf_reader.pages。
修改后的代码如下:
#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
      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_file和output_file的定义。
希望对你有帮助!如有其他问题,请随时提问。


为什么不给我设置一个最佳答案呢?点它 -> https://i.imgtg.com/2023/06/18/OTpTnF.png

sfqxx 发表于 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文件。
页: [1]
查看完整版本: 帮我看看又是错那?