camelot工具进行pdf表格解析重建
camelot内置生成html文件的方法,但表格数据转化成pandas.dataframe的过程中,丢失了跨行跨列的结构信息,故生成html的表格无跨行跨列结构。
于是我在输出部分选择直接手写html表格..
import camelot
import numpy as np
import matplotlib.pyplot as plt
import os
import pandas as pd # def listdir(path, list_name): # 传入存储的list
# for file in os.listdir(path):
# file_path = os.path.join(path, file)
# if os.path.isdir(file_path):
# listdir(file_path, list_name)
# else:
# list_name.append(file_path)
#批量文件
# filenames=[r'E:\pdf_download']
# listdir('E:\pdf_download',filenames)
# for onefile in filenames:
# filename=onefile.split(".", )[0] #单个文件
onefile=r'1202007288.pdf'
print("loading...", onefile)
tables = camelot.read_pdf(onefile,pages='',strip_text=' .\n',line_scale=80,split_text=True) for onetable in tables:
mask = np.zeros((len(onetable.rows)+1, len(onetable.cols)+1))
colspan = np.ones((len(onetable.rows)+1, len(onetable.cols)+1))
rowspan = np.ones((len(onetable.rows)+1, len(onetable.cols)+1))
for onerow in onetable.cells:
for onecell in onerow:
thisrow = onetable.cells.index(onerow)
thiscol = onerow.index(onecell)
if mask[thisrow][thiscol] == 0:
if not onecell.right:
for i in range(thiscol,len(onerow)-1):
if not onerow[i].right:
mask[thisrow][i + 1] = 1
colspan[thisrow][thiscol] += 1
else:
break
if not onecell.bottom:
for i in range(thisrow,len(onetable.cells)-1):
if not onetable.cells[i][thiscol].bottom:
mask[i + 1][thiscol] = 1
rowspan[thisrow][thiscol] += 1
else:
break
head='''<table border="1" class="dataframe">
<tbody>'''
f = open(onefile + '-page'+str(onetable.page) + '-table-'+str(onetable.order)+'.html', 'w')
f.write(head)
for onerow in onetable.cells:
writerow = '''
<tr>'''
f.write(writerow)
for onecell in onerow:
thisrow = onetable.cells.index(onerow)
thiscol = onerow.index(onecell)
if mask[thisrow][thiscol] == 0:
if int(colspan[thisrow][thiscol]) > 1:
Colspan = 'colspan=' + str(int(colspan[thisrow][thiscol]))
else:
Colspan=''
if int(rowspan[thisrow][thiscol]) > 1:
Rowspan = 'rowspan=' + str(int(rowspan[thisrow][thiscol]))
else:
Rowspan = ''
writecell = '''
<td %s %s>%s</td>'''%(Colspan,Rowspan,onecell.text)
f.write(writecell)
writerow = '''
</tr>'''
f.write(writerow)
f.close()
camelot工具进行pdf表格解析重建的更多相关文章
- java(itext) 一个很简单的PDF表格生成工具
先上个效果图 因为做的项目涉及到数据预测,其中有大量打印业务来支撑实体店的运营,因为注重的是数据,要求简洁,清晰,所以写了个很简单也很实用的工具类. 如果需要编写样式或者插入背景,都可以查阅itex官 ...
- Java iText5.5.1 绘制PDF表格
iText下载链接:http://sourceforge.net/projects/itext/files/ 会有两个文件夹:extrajars中的extrajars-2.3.jar文件用于解决中文不 ...
- Java添加条形码到PDF表格
条码的应用已深入生活和工作的方方面面.在处理条码时,常需要和各种文档格式相结合.当需要在文档中插入.编辑或者删除条码时,可借助于一些专业的类库工具来实现.本文,以操作PDF文件为例,介绍如何在编辑表格 ...
- ITextSharp导出PDF表格和图片(C#)
文章主要介绍使用ITextSharp导出PDF表格和图片的简单操作说明,以下为ITextSharp.dll下载链接 分享链接:http://pan.baidu.com/s/1nuc6glj 密码:3g ...
- itextSharp 附pdf文件解析
一.PdfObject: pdf对象 ,有9种,对象是按照对象内涵来分的,如果按照对象的使用规则来说,对象又分为间接对象和直接对象.间接对象是PDF中最常用的对象,如前面对象集合里面的,所有对象都是间 ...
- MVC 生成PDf表格并插入图片
最近做的项目中有一个功能,将最终的个人信息生成PDF表格,并插入图片.对于没接触过的程序员来说回一片茫然,网上有多种生成PDf的方法,我给大家介绍一下我认为比较简单,好操作的一种. iTextShar ...
- Python使用Tabula提取PDF表格数据
今天遇到一个批量读取pdf文件中表格数据的需求,样式大体是以下这样: python读取PDF无非就是三种方式(我所了解的),pdfminer.pdf2htmlEX 和 Tabula.综合考虑后,选择了 ...
- spring boot:用itextpdf处理pdf表格文件(spring boot 2.3.2)
一,什么是itextpdf? 1,itextpdf的用途 itextpdf是用来生成PDF文档的一个java类库, 通过iText可以生成PDF文档, 还可以把XML/Html文件转化为PDF文件 2 ...
- Java 生成pdf表格文档
最近在工作做一个泰国的项目,应供应商要求,需要将每天的交易生成pdf格式的报表上传到供应商的服务器,特此记录实现方法.废话不多说,直接上代码: THSarabunNew.ttf该文件是泰国字体自行网上 ...
随机推荐
- c++编写递归函数char *itostr (int n,char *string),该函数将整数n转换为十进制表示的字符串。
#include<iostream> #include<stdio.h> using namespace std; ; char *itostr (int n,char *St ...
- hihoCoder hiho一下 第一周 #1032 : 最长回文子串 (Manacher)
题意:给一个字符串,求最长回文子串的长度. 思路: (1)暴力穷举.O(n^3) -----绝对不行. 穷举所有可能的出现子串O(n^2),再判断是否回文O(n).就是O(n*n*n)了. (2)记录 ...
- 如何处理CloudFoundry应用部署时遇到的254错误
使用SAP云平台的CloudFoundry部署应用: 在cockpit遇到错误信息:instance: a0abe2b5-7623-4cf1-4c65-0c79, index: 0, exit_des ...
- a low memory warning should only destroy the layer’s bitmap
https://stablekernel.com/view-controller-in-ios-6/ Some of you may have noticed that your view contr ...
- Tarjan在图论中的应用(二)——用Tarjan来求割点与割边
前言:\(Tarjan\) 求割点和割边建立在 \(Tarjan\)算法的基础之上,因此建议在看这篇博客之前先去学一学\(Tarjan\). 回顾\(Tarjan\)中各个数组的定义 首先,我们来回顾 ...
- Problem C: 动态规划基础题目之数字三角形
Problem C: 动态规划基础题目之数字三角形 Time Limit: 1 Sec Memory Limit: 64 MBSubmit: 208 Solved: 139[Submit][Sta ...
- 输出流缓冲的意义 何时缓冲 Stdout Buffering
From : https://eklitzke.org/stdout-buffering 译者:李秋豪 大多数编程语言默认提供了i/o缓冲特性,因为这会使得输出更加有效率.这些缓冲功能大都是默默工作& ...
- Python中的集合set
>>> help(set) Help on class set in module __builtin__: class set(object) | set(iterable) -- ...
- 解决MySQL安装到最后一步未响应的三种方法
这种情况一般是你以前安装过MySQL数据库服务项被占用了.解决方法: 方法一:安装MySQL的时候在这一步时它默认的服务名是“MySQL” 只需要把这个名字改了就可以了.可以把默认的服务器的名称手动改 ...
- C++ 限定名称查找
限定名称查找规则实际归纳下来很简单,先对::左边的名称进行查找(遵循,限定,无限定),然后在左边查找到的(此时只查找类型名称)名字的作用域内(含内联名称空间件)查找右边出现的名字,查找到即存在(故可以 ...