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表格解析重建的更多相关文章

  1. java(itext) 一个很简单的PDF表格生成工具

    先上个效果图 因为做的项目涉及到数据预测,其中有大量打印业务来支撑实体店的运营,因为注重的是数据,要求简洁,清晰,所以写了个很简单也很实用的工具类. 如果需要编写样式或者插入背景,都可以查阅itex官 ...

  2. Java iText5.5.1 绘制PDF表格

    iText下载链接:http://sourceforge.net/projects/itext/files/ 会有两个文件夹:extrajars中的extrajars-2.3.jar文件用于解决中文不 ...

  3. Java添加条形码到PDF表格

    条码的应用已深入生活和工作的方方面面.在处理条码时,常需要和各种文档格式相结合.当需要在文档中插入.编辑或者删除条码时,可借助于一些专业的类库工具来实现.本文,以操作PDF文件为例,介绍如何在编辑表格 ...

  4. ITextSharp导出PDF表格和图片(C#)

    文章主要介绍使用ITextSharp导出PDF表格和图片的简单操作说明,以下为ITextSharp.dll下载链接 分享链接:http://pan.baidu.com/s/1nuc6glj 密码:3g ...

  5. itextSharp 附pdf文件解析

    一.PdfObject: pdf对象 ,有9种,对象是按照对象内涵来分的,如果按照对象的使用规则来说,对象又分为间接对象和直接对象.间接对象是PDF中最常用的对象,如前面对象集合里面的,所有对象都是间 ...

  6. MVC 生成PDf表格并插入图片

    最近做的项目中有一个功能,将最终的个人信息生成PDF表格,并插入图片.对于没接触过的程序员来说回一片茫然,网上有多种生成PDf的方法,我给大家介绍一下我认为比较简单,好操作的一种. iTextShar ...

  7. Python使用Tabula提取PDF表格数据

    今天遇到一个批量读取pdf文件中表格数据的需求,样式大体是以下这样: python读取PDF无非就是三种方式(我所了解的),pdfminer.pdf2htmlEX 和 Tabula.综合考虑后,选择了 ...

  8. spring boot:用itextpdf处理pdf表格文件(spring boot 2.3.2)

    一,什么是itextpdf? 1,itextpdf的用途 itextpdf是用来生成PDF文档的一个java类库, 通过iText可以生成PDF文档, 还可以把XML/Html文件转化为PDF文件 2 ...

  9. Java 生成pdf表格文档

    最近在工作做一个泰国的项目,应供应商要求,需要将每天的交易生成pdf格式的报表上传到供应商的服务器,特此记录实现方法.废话不多说,直接上代码: THSarabunNew.ttf该文件是泰国字体自行网上 ...

随机推荐

  1. IOS UIActivityIndicatorView动画

    ● 是一个旋转进度轮,可以用来告知用户有一个操作正在进行中,一般 用initWithActivityIndicatorStyle初始化 ● 方法解析: ● - (void)startAnimating ...

  2. 后台调用前台js

    WEB后台代码调用前台JS(两种方式). 1   这种方式只能调用简单的JS代码.不能调用自定义的函数. string jss = "<script language='javascr ...

  3. Javascript的数据类型和转换

    JavaScript 数据类型 在 JavaScript 中有 5 种不同的数据类型: string number boolean object function 3 种对象类型: Object Da ...

  4. runtime运行时,类、对象、isa指针

    先查看一段OC源码,关于类的定义: /// An opaque type that represents an Objective-C class. typedef struct objc_class ...

  5. C#冒泡排序程序

    考虑到很多面试可能会考察冒泡排序的用法,所以特地花时间厘清了一下思路.下面说一下我的思路:冒泡排序核心就是比较方法,冒泡排序的比较方法顾名思义就是像气泡一样,最大(或者最小)的数往上冒.普通比较几个数 ...

  6. 关于HTML(含HTML5)的块级元素和行级(内联)元素总结

    1.首先我们要知道什么是块级元素和行级(内联)元素? 块级(block)元素的特点: ①总是在新行上开始: ②高度,行高以及外边距和内边距都可控制: ③宽度缺省是它的容器的100%,除非设定一个宽度: ...

  7. GNU Parallel Tutorial

    GNU Parallel Tutorial Prerequisites Input sources A single input source Multiple input sources Linki ...

  8. Java 获取Web项目相对webapp地址

    例如, import java.io.File; import java.io.FileInputStream; import javax.servlet.http.HttpServletReques ...

  9. Fakeapp 入门教程(3):参数篇

    参数可以让软件自由度更高.Fakeapp的参数并不算多,但是也非常使用.本文就讲解下几个重要的参数.参数设置界面可以通过点击SETTINGS打开. 参数修改无需点击保存,一旦修改直接生效. Proce ...

  10. 用python给图片添加半透明水印

    # coding:utf-8 from PIL import Image, ImageDraw, ImageFont def add_text_to_image(image, text): font ...