帮我看看又是错那?
#pip install PyPDF2 python-docximport 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 看起来你在使用 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就是因为你尝试调用了一个列表对象,而这个对象并不是一个函数。这个修改应该能够解决你的问题。如果还有其他问题,请随时提问。 根据错误信息和代码分析,出现错误的原因是在第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 你的错误发生在尝试调用`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]