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
相关产品推荐
相关产品推荐

