python 九 文件操作 读写.pdf

在 Python 中,处理 PDF 文件可以使用以下库:

  • PyPDF2:支持 PDF 的读取、合并、拆分和加解密,但对 PDF 的编辑和写入支持有限。
  • PyMuPDF (fitz):支持读取、写入、编辑 PDF,功能强大。
  • pdfplumber:专注于从 PDF 提取结构化数据(如表格)。
  • reportlab:用于生成 PDF 文件。
  • pdfminer.six:适合从 PDF 中提取文本内容。

以下是使用这些库处理 PDF 文件的教程。


1. 安装必要的库

安装常用的 PDF 库:

pip install PyPDF2 pymupdf pdfplumber reportlab pdfminer.six

2. 使用 PyPDF2 处理 PDF 文件

读取 PDF 文件

from PyPDF2 import PdfReader

# 打开 PDF 文件
reader = PdfReader("example.pdf")

# 获取总页数
print(f"总页数: {len(reader.pages)}")

# 读取某一页的内容
page = reader.pages[0]  # 第一页
print(page.extract_text())

写入(合并/拆分)PDF 文件

from PyPDF2 import PdfWriter

# 创建一个 PDF Writer
writer = PdfWriter()

# 添加页面
writer.add_page(reader.pages[0])

# 保存到新文件
with open("output.pdf", "wb") as f:
    writer.write(f)

3. 使用 PyMuPDF (fitz) 处理 PDF

读取 PDF 文件

PyMuPDF 支持高效读取 PDF,并支持访问图像和表格。

import fitz  # PyMuPDF

# 打开 PDF 文件
doc = fitz.open("example.pdf")

# 获取总页数
print(f"总页数: {doc.page_count}")

# 读取某一页的内容
page = doc[0]  # 第一页
print(page.get_text())

从 PDF 提取图像

# 提取 PDF 中的图像
for page_num in range(len(doc)):
    page = doc[page_num]
    images = page.get_images(full=True)
    for img_index, img in enumerate(images):
        xref = img[0]
        base_image = doc.extract_image(xref)
        image_bytes = base_image["image"]
        image_ext = base_image["ext"]
        with open(f"page{page_num+1}_img{img_index+1}.{image_ext}", "wb") as img_file:
            img_file.write(image_bytes)

创建和编辑 PDF

# 创建 PDF
doc = fitz.open()
page = doc.new_page()
page.insert_text((72, 72), "Hello, PDF!", fontsize=20)
doc.save("new_file.pdf")

4. 使用 pdfplumber 提取表格和文本

提取结构化数据

import pdfplumber

# 打开 PDF 文件
with pdfplumber.open("example.pdf") as pdf:
    for page in pdf.pages:
        # 提取文本
        print(page.extract_text())
        
        # 提取表格
        tables = page.extract_tables()
        for table in tables:
            for row in table:
                print(row)

5. 使用 reportlab 生成 PDF

生成简单 PDF 文件

from reportlab.pdfgen import canvas

# 创建 PDF 文件
c = canvas.Canvas("generated.pdf")

# 添加内容
c.drawString(100, 750, "Hello, PDF!")
c.drawString(100, 720, "这是一个用 ReportLab 生成的 PDF。")

# 保存 PDF 文件
c.save()

生成包含图表的 PDF

from reportlab.lib.pagesizes import letter
from reportlab.platypus import SimpleDocTemplate, Table, TableStyle
from reportlab.lib import colors

# 创建 PDF 文件
doc = SimpleDocTemplate("table_example.pdf", pagesize=letter)

# 创建表格
data = [
    ["Name", "Age", "City"],
    ["Alice", "30", "New York"],
    ["Bob", "25", "San Francisco"],
    ["Charlie", "35", "Boston"],
]

table = Table(data)
table.setStyle(
    TableStyle(
        [
            ("BACKGROUND", (0, 0), (-1, 0), colors.grey),
            ("TEXTCOLOR", (0, 0), (-1, 0), colors.whitesmoke),
            ("ALIGN", (0, 0), (-1, -1), "CENTER"),
            ("FONTNAME", (0, 0), (-1, 0), "Helvetica-Bold"),
            ("BOTTOMPADDING", (0, 0), (-1, 0), 12),
            ("GRID", (0, 0), (-1, -1), 1, colors.black),
        ]
    )
)

# 写入 PDF
doc.build([table])

6. 使用 pdfminer.six 提取文本

pdfminer.six 是一个强大的库,支持复杂 PDF 文件的文本提取。

提取文本

from pdfminer.high_level import extract_text

# 提取 PDF 的文本
text = extract_text("example.pdf")
print(text)

7. 小结

  • PyPDF2:用于基本的 PDF 操作(读取、拆分、合并)。
  • PyMuPDF (fitz):功能全面,支持提取文本、图像,甚至编辑 PDF。
  • pdfplumber:专注于结构化数据的提取(如表格)。
  • reportlab:生成 PDF 文件的最佳选择。
  • pdfminer.six:适合复杂文本提取。
<think>好的,我现在需要解决用户在Jupyter Notebook中使用plt.plot时无法输出图片,只显示类似[<matplotlib.lines.Line2D at 0x17d78fa2ff0>]的问题。首先,我应该回忆一下常见的原因和解决方法。 首先,可能用户没有正确导入matplotlib或者没有使用正确的魔术命令。在Jupyter中,通常需要%matplotlib inline来让图像内嵌显示。用户可能忘记了这个命令,或者没有在正确的位置调用它。需要检查用户的代码中是否有这一行。 其次,matplotlib的后端设置可能有问题。Jupyter Notebook默认使用inline后端,但有时候配置可能被修改,导致无法显示图像。这时候需要确认后端设置是否正确,或者尝试重启内核。 另外,用户可能没有调用plt.show()。不过在Jupyter中,如果使用了%matplotlib inline,通常不需要plt.show(),但如果没有使用这个魔术命令,可能需要。也有可能用户同时使用了其他IDE的设置,导致冲突。 还有可能是代码执行顺序的问题。比如,先画图再执行魔术命令,这时候需要确保%matplotlib inline在导入matplotlib之后,但在绘图之前执行。或者用户可能在同一个单元格中没有按顺序执行命令,导致设置未生效。 另外,检查是否有其他库或代码干扰了matplotlib的配置。例如,某些时候用户的matplotlib配置文件可能有自定义设置,导致图像无法显示。可以建议用户尝试重置配置,或者创建一个新的环境测试。 可能用户安装的matplotlib版本有问题,或者与Jupyter Notebook不兼容。这时候建议升级或重新安装matplotlib和notebook。 还可以检查是否有错误提示,有时候输出中会有异常信息,帮助定位问题。例如,缺少依赖库,或者后端无法加载。 总结一下,可能的解决步骤包括: 1. 确保正确使用%matplotlib inline魔术命令。 2. 检查导入顺序,先导入matplotlib,再设置魔术命令,再绘图。 3. 确认plt.show()是否需要调用。 4. 检查后端设置,尝试切换不同的后端。 5. 重启内核,重新运行所有单元格。 6. 检查版本兼容性,更新相关库。 7. 查看错误信息,排除其他依赖问题。 8. 重置matplotlib配置或使用新环境测试。 需要将这些步骤整理成用户容易理解的指导,分点说明,并提供示例代码。同时,注意使用中文,结构清晰,帮助用户一步步排查问题。</think>在Jupyter Notebook中使用 `plt.plot` 无法显示图片,通常由以下原因及解决方法导致: --- ### **1. 缺少魔术命令 `%matplotlib inline`** - **现象**:输出代码对象而非图像,例如:`[<matplotlib.lines.Line2D at 0x17d78fa2ff0>]` - **原因**:未启用Matplotlib的内嵌显示模式。 - **解决**: ```python # 在导入matplotlib后,绘图前添加以下命令 %matplotlib inline import matplotlib.pyplot as plt # 绘制图像 plt.plot([1, 2, 3], [4, 5, 6]) ``` --- ### **2. 代码执行顺序问题** - **现象**:即使添加了魔术命令仍不显示图像。 - **原因**:魔术命令 `%matplotlib inline` 需在导入库后执行,且需与绘图代码在同一单元格或提前运行。 - **解决**: ```python # 正确顺序示例 %matplotlib inline # 先启用内嵌模式 import matplotlib.pyplot as plt # 再绘图 plt.plot([1, 2, 3], [4, 5, 6]) plt.show() # 在非inline模式下可能需要此命令 ``` --- ### **3. 未调用 `plt.show()`** - **现象**:未使用 `%matplotlib inline` 时,需手动调用 `plt.show()`。 - **解决**: ```python import matplotlib.pyplot as plt plt.plot([1, 2, 3], [4, 5, 6]) plt.show() # 显示图像 ``` --- ### **4. 后端配置冲突** - **现象**:环境变量或配置文件指定了非交互式后端。 - **解决**: - 临时指定后端: ```python %matplotlib inline import matplotlib matplotlib.use('module://ipykernel.pylab.backend_inline') # 强制使用Jupyter后端 ``` - 重置配置文件:删除 `~/.matplotlib/matplotlibrc` 或使用默认配置。 --- ### **5. 内核未重启** - **现象**:修改配置后未生效。 - **解决**:重启Jupyter Notebook内核,重新运行代码。 --- ### **6. 依赖库缺失** - **现象**:提示缺少 `ipykernel` 或 `tkinter`。 - **解决**: ```bash # 安装必要依赖 pip install ipykernel sudo apt-get install python3-tk # Linux系统 ``` --- ### **完整示例代码** ```python # 步骤1:启用内嵌模式 %matplotlib inline # 步骤2:导入库 import matplotlib.pyplot as plt # 步骤3:绘制图像 plt.plot([1, 2, 3], [4, 5, 6]) plt.xlabel("X轴") plt.ylabel("Y轴") plt.title("示例图像") # 步骤4:显示图像(inline模式下可省略plt.show()) plt.show() ``` --- 通过以上步骤排查,通常可解决图像无法显示的问题。若问题依旧,可尝试更新库版本: ```bash pip install --upgrade matplotlib jupyter ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

十方来财

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值