You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python使用Tabula转PDF为CSV列内容错位问题修复指导

修复Tabula转换PDF到CSV的列错位问题

问题背景

此前用Python结合Tabula库将PDF转CSV运行正常,近期转换后CSV出现列内容互换的情况,需处理PDF第一页且移除表格首行,现有代码如下:

#!/usr/bin/env python3
import tabula
import pandas as pd
import csv

pdf_file='/pdf2xls/Input.pdf'
column_names=['Product','Batch No','Machin No','Time','Date','Drum/Bag No','Tare Wt.kg','Gross Wt.kg',
              'Net Wt.kg','Blender','Remarks','Operator']

# Page 1 processing
df1 = tabula.read_pdf(pdf_file, pages=1,area=(95,20, 800, 840),columns=[93,180,220,252,310,315,333,367,
                                                                      410,450,480,520]
                     ,pandas_options={'header': None}) #(top,left,bottom,right)

df1[0]=df1[0].drop(columns=5)
df1[0].columns=column_names
#df1[0].head(2)

#df1[0].to_csv('result.csv')

result = pd.DataFrame(df1[0]) # concate both the pages and then write to CSV
result.to_csv("/pdf2xls/Input.csv")

修复方案

1. 重新校准列分割坐标

列错位核心原因是columns参数的垂直分割线x坐标与当前PDF的实际列布局不匹配(可能PDF排版有微调):

  • 用Tabula可视化工具校准:运行命令tabula --gui,加载目标PDF后手动拖动分割线到列与列的间隙,导出对应的坐标替换到代码的columns列表中。
  • 手动测量:打开PDF查看每列的起始/结束x坐标,确保分割线精准落在列边界。

2. 添加上移除首行的逻辑

原代码未实现移除表格首行的需求,需添加行删除操作。

3. 优化代码冗余操作

移除不必要的DataFrame转换,直接用读取后的DataFrame导出CSV。

修改后的完整代码

#!/usr/bin/env python3
import tabula
import pandas as pd

pdf_file='/pdf2xls/Input.pdf'
column_names=['Product','Batch No','Machin No','Time','Date','Drum/Bag No','Tare Wt.kg','Gross Wt.kg',
              'Net Wt.kg','Blender','Remarks','Operator']

# Page 1 processing - 注意:这里的columns坐标需要替换为你校准后的数值
df1 = tabula.read_pdf(
    pdf_file,
    pages=1,
    area=(95,20, 800, 840),
    # 示例替换坐标,实际需根据你的PDF调整
    columns=[90, 175, 215, 250, 305, 320, 340, 370, 415, 455, 485, 525],
    pandas_options={'header': None}
)

# 移除多余列(确认当前列索引5确实是冗余列,若PDF布局变化需调整)
df1[0] = df1[0].drop(columns=5)
# 移除表格首行
df1[0] = df1[0].drop(index=0)
# 设置列名
df1[0].columns = column_names

# 直接导出CSV,无需额外转换DataFrame
df1[0].to_csv("/pdf2xls/Input.csv", index=False)

关键改动说明

  • 替换columns列表为校准后的坐标,确保列分割准确
  • 添加df1[0].drop(index=0)实现移除首行
  • 移除冗余的pd.DataFrame(df1[0])转换,直接导出
  • 导出CSV时添加index=False避免生成多余的索引列

内容的提问来源于stack exchange,提问作者linux01

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.07 04:45:24