以下是第一次翻译的骨子福利姬系,若是要看到最新的请看我的github: hbh112233abc/pdfplumber
pdfplumber融会PDF文献,获得关系的文本字符、矩形和线条的详备信息。 罕见功能:表格提真金不怕火和可视化调试。
用于电脑生成的PDF上后果最好,不复旧扫描的PDF,基于pdfminer.six收场.
刻下版块 测试用例 仍是在 Python 3.6, 3.7, 3.8 考据通过.
目次 安设号召行Python包可视化调试提真金不怕火表格提真金不怕火表单域值用例演示与其他库比拟 安设pip install pdfplumber号召行 基础示例
curl "https://raw.githubusercontent.com/jsvine/pdfplumber/stable/examples/pdfs/background-checks.pdf" > background-checks.pdf pdfplumber < background-checks.pdf > background-checks.csv
输出将是一个CSV,包含PDF中每个字符、行和矩形的信息。
配置项 参数讲解--format [输出形式]csv 或 json. json 复返信息包括PDF文献级和页面级元数据,以及字典嵌套属性。--pages [页码]1-页面索引或页面限度. 例如: 1, 11-15, 指定的页面限度: 1, 11, 12, 13, 14, 15.--types [提真金不怕火对象类型列表]可选值: char, rect, line, curve, image, annot等,默许全部提真金不怕火--laparamsjson形式字符串 (例: '{"detect_vertical": true}') PDF灵通的传参 pdfplumber.open(..., laparams=...).--precision [整数]浮点数四舍五入的少许位数。默许为无舍入。 Python库 基础示例import pdfplumber with pdfplumber.open("path/to/file.pdf") as pdf: first_page = pdf.pages[0] print(first_page.chars[0])加载PDF
调用pdfplumber.open(x)加载PDF, 其中x不错有以下几种形式:
PDF文献旅途文献对象, 以字节流时势加载类文献对象, 以字节流时势加载open形式加载文献后复返一个 pdfplumber.PDF 实例.
传入 password 参数用于加载已加密的PDF文献, 例: pdfplumber.open("file.pdf", password = "test").
传入 laparams 参数不错使用pdfminer.six的布局引擎用于布局分析, 例: pdfplumber.open("file.pdf", laparams = { "line_overlap": 0.7 }).
Invalid metadata values are treated as a warning by default. If that is not intended, pass strict_metadata=True to the open method and pdfplumber.open will raise an exception if it is unable to parse the metadata.
默许情况下,无效元数据值仅仅被视为劝诫。若是配置strict_metadata=True。当加载PDF后无法分析元数据,将抛出尽头。
pdfplumber.PDF 类pdfplumber.PDF 类代表一个PDF文献,主要有以下两个属性:
属性讲解.metadata元数据键/值对字典,摘自PDF的“信息”。时时包括“CreationDate”(创建日历)、“ModDate”(修异日历)、“Producer”(创建者)等。.pages包含pdfplumber.Page(页实例)的列表。 pdfplumber.Page 类pdfplumber.Page是pdfplumber中枢. 大部分的操作都是围绕此类进行.主要包含以下属性:
属性讲解.page_number页码, 1第一页, 2第二页, 依此类推..width页面宽..height页面高..objects / .chars / .lines / .rects / .curves / .images这些属性中的每一个都是一个列表,每个列表都为镶嵌在页面上的每个此类对象包含一个字典。关联详备信息,请参见 “Objects”.… pdfplumber.Page的主要形式:
形式讲解.crop(bounding_box, relative=False)复返剪辑界限框中的页面骨子,界限框应默示为4元组,值为 (x0, top, x1, bottom)。剪辑的页面保留至少部分位于界限框内的对象。若是对象仅部分落在长方体中,则将剖切其被界限框包含的部分。若是relative=True,则界限框筹算为距页面左上角的偏移量,而不是齐全位置。 (参考 Issue #245 给出的直不雅示例和讲解.).within_bbox(bounding_box, relative=False)类似.crop,但仅保留完全落在界限框内的对象。.filter(test_function)过滤对象.objects,仅提真金不怕火当过滤函数test_function(obj)复返True的对象..dedupe_chars(tolerance=1)删除重复的字符-与其他字符分享疏导的文本、字体称号、大小和位置(在“公役”x/y限度内)-已删除. (参考 Issue #71了解该机制).extract_text(x_tolerance=3, y_tolerance=3, layout=False, x_density=7.25, y_density=13, **kwargs)将页面的悉数字符对象整理为单个字符串.layout=False: 当字符x1(右x坐标)下一个字符x0(左x坐标)的公役大于x_tolerance时添加空格. 当字符doctop(上y坐标)与下一个字符doctop(上y坐标) 公役大于 y_tolerance时添加换行.
国产视频在线看385配置 layout=True (施行特点): 尝试模拟页面上的文本结构布局, 使用 x_density 和 y_density 确定每个“点”的最小字符/换行数,即PDF度量单元.其他传参**kwargs 参考.extract_words(...)传参.
.extract_words(x_tolerance=3, y_tolerance=3, keep_blank_chars=False, use_text_flow=False, horizontal_ltr=True, vertical_ttb=True, extra_attrs=[])复返词块的骨子及边框. 若是(“垂直”字符)一个字符的x1与下一个字符的x0之间的差值小于或便是x_tolerance 何况 一个字符的 doctop与下一个字符的 doctop小于或便是 y_tolerance,则单词被视为字符序列.关于非垂直字符,也承袭类似的形式,但测量它们之间的垂直距离,而不是水平距离。参数 horizontal_ltr 和 vertical_ttb 默示阅读端正为水平由左至右的端正及垂直由上而下的端正. 配置 keep_blank_chars为 True将空格行动单词的一部分而不是分隔符. 配置 use_text_flow 为 True将使用PDF的基本字符流行动单词排序和分段的指南,而不是按x/y位置对字符进行预排序。 (这效法了拖动光标如何隆起知晓PDF中的文本;因此,端正并不老是相宜逻辑的。) 配置extra_attrs罕见属性列表 (例: ["fontname", "size"] 将每个单词死心为每个单词分享完全疏导值的字符 字符属性, 检察单词属性字典.search(pattern, regex=True, case=True, **kwargs)施行特点 它允许您搜索页面的文本,复返与查询匹配的悉数实例的列表。关于每个实例,复返对象都包含匹配的文本、任何正则抒发式组匹配项、界限框坐标以及char对象本人 pattern不错是已编译的正则抒发式、未编译的正则抒发式或非正则抒发式字符串。若是regex为 False,则该模式将被视为非regex字符串。若是 case为False,则以不区分大小写的样式引申搜索。 其他参数 **kwargs 参考 .extract_text(layout=True, ...)..extract_tables(table_settings)提真金不怕火页面表格数据. 笃定参考 “Extracting tables”..to_image(**conversion_kwargs)复返 PageImage 实例. 笃定参见 “可视化调试” . 调节参数参见 here..close()默许Page 对象会缓存其布局和对象信息,以幸免重新处分。关联词,在融会大型PDF时,这些缓存属性可能需要大量内存。不错使用此形式刷新缓存并开释内存 (旧版块 <= 0.5.25, 请使用 .flush_cache().) 对象pdfplumber.PDF 和 pdfplumber.Page实例均提供多样类型的对象, 对象来自 pdfminer.sixPDF融会。以下属性分别复返匹配对象的Python列表:
.chars, 代表单个文本字符..lines, 代表一条一维线..rects, 代表单个二维矩形..curves, 代表一序列pdfminer.six无法识别成线或矩形的联接点,..images, 代表图像..annots, 代表一个PDF批注 (详见第8.4节 官方PDF轨范).hyperlinks, 代表聚积瞩目 Link包含URI属性以上每个对象都是字典时势,其包含以下属性:
char 属性 属性讲解page_number找到此字符的页码。text文本骨子 例: “z”, 或 “Z” 或 " ".fontname字体size字号adv便是文本宽度字体大小比例因子。upright是否垂直height文本高度width文本高度x0其左侧与页面左侧的距离。x1其右侧与页面左侧的距离。y0其下侧与页面底部的距离。y1其上侧与页面底部的距离。top其上侧与页面顶部的距离。bottom其下侧与页面顶部的距离。doctop其顶部与文档顶部的距离。matrix其“变换矩阵”。(详见下文)stroking_color笔划的心境,默示为元组或整数,具体取决于使用的“心境空间”。non_stroking_color字体填充心境object_type对象类型:“char”备注: 文本变换矩阵(matrix)讲解请参见章节4.2.2PDF参考 (第6版). 矩阵限度脚色的缩放、歪斜和位置平移。旋转是缩放和歪斜的组合,但在大多数情况下不错以为便是x轴歪斜。 pdfplumber.ctm子模块界说了一个类 CTM,该类不错匡助进行这些筹算。例如:
from pdfplumber.ctm import CTM my_char = pdf.pages[0].chars[3] my_char_ctm = CTM(*my_char["matrix"]) my_char_rotation = my_char_ctm.skew_xline 属性 属性讲解page_number其地点的页码height高度width宽度x0其左侧与页面左侧的距离。x1其右侧与页面左侧的距离。y0其下侧与页面底部的距离。y1其上侧与页面底部的距离。top其上侧与页面顶部的距离。bottom其下侧与页面顶部的距离。doctop其顶部与文档顶部的距离。linewidth线粗stroking_color线条心境,默示为元组或整数,具体取决于使用的“心境空间”non_stroking_color线条填充心境。object_type对象类型:“line” rect 属性 属性讲解page_number其地点的页码height高度width宽度x0其左侧与页面左侧的距离。x1其右侧与页面左侧的距离。y0其下侧与页面底部的距离。y1其上侧与页面底部的距离。top其上侧与页面顶部的距离。bottom其下侧与页面顶部的距离。doctop其顶部与文档顶部的距离。linewidth线粗stroking_color线条心境,默示为元组或整数,具体取决于使用的“心境空间”non_stroking_color线条填充心境。object_type对象类型:“rect” curve 属性 属性讲解page_number其地点的页码pointsPoints — 描述弧线的点列表包含 (x, top) 元组height弧线界限框的高度。width弧线界限框的宽度。x0弧线最左侧点与页面左侧的距离。x1弧线最右侧点与页面左侧的距离。y0弧线最低点到页面底部的距离。y1弧线最高点到页面底部的距离。top弧线最高点到页面顶部的距离。bottom弧线最低点到页面底部的距离。doctop弧线最高点到文档顶部的距离。linewidth线粗fill是否填充弧表现径界说的时势.stroking_color弧线概述的心境,默示为元组或整数,具体取决于使用的“心境空间”。non_stroking_color弧线填充心境object_type对象类型:“curve”
此外, pdfplumber.PDF 和 pdfplumber.Page还提供以下两个对象: .rect_edges (将每个矩形意见为四条线) .edges(将 .rect_edges与 .lines组合在一齐)。
image 属性[待完善.]
获得pdfminer.six高档布局对象加载PDF( pdfplumber.open(...))时通过传参laparams灵通PDF后,每个页面临象将包含 pdfminer.six高档布局对象, 例如: "textboxhorizontal".
可视化调试备注: 使用pdfplumber的可视化调试器用, 需要先安设以下两个软件:
ImageMagick. Installation instructions here.ghostscript. Installation instructions here,八成 apt install ghostscript (Ubuntu) / brew install ghostscript (Mac). 输出页面图像对象 PageImage使用 my_page.to_image()获得页面(包括剪辑页面)的图像对象 PageImage .配置分辨率resolution={integer}, 默许分辨率:72 例:
im = my_pdf.pages[0].to_image(resolution=150)
PageImage 对象不错很好地与IPython/Jupyter条记本电脑相助使用;它们会自动渲染为单元格输出。例如:
[外链图片转存失败,源站可能有防盗链机制,冷落将图片保存下来径直上传(img-cyHzvImi-1656484509420)(examples/screenshots/visual-debugging-in-jupyter.png “Visual debugging in Jupyter”)]
PageImage 基础形式 形式讲解im.reset()重置,拔除已绘制的悉数骨子。im.copy()将图像复制到新的“PageImage”对象。im.save(path_or_fileobject, format="PNG")保存已符号的图片 绘制形式你不错传递坐标或pdfplumberPDF对象 (例: char, line, rect)进行绘制.
单对象绘制批量绘制讲解im.draw_line(line, stroke={color}, stroke_width=1)im.draw_lines(list_of_lines, **kwargs)绘制线条笔据line, curve, 或起止点坐标元组(例: ((x, y), (x, y))).im.draw_vline(location, stroke={color}, stroke_width=1)im.draw_vlines(list_of_locations, **kwargs)在location处x坐标处绘制一条垂直线im.draw_hline(location, stroke={color}, stroke_width=1)im.draw_hlines(list_of_locations, **kwargs)在location处y坐标处绘制一条水平线im.draw_rect(bbox_or_obj, fill={color}, stroke={color}, stroke_width=1)im.draw_rects(list_of_rects, **kwargs)绘制矩形rect, char, 等, 或4坐标元组界限框.im.draw_circle(center_or_obj, radius=5, fill={color}, stroke={color})im.draw_circles(list_of_circles, **kwargs)以(x, y)为圆心画圆 char, rect, 等.备注:以上绘制形式是基于Pillow收场的 ImageDraw methods, 可是为了与SVG的一致性,诊疗了fill/stroke/stroke_width参数定名.
Debian系统树立ImageMagick问题若是你在Debian系统使用pdfplumber遭逢了PolicyError盘曲,你需要修改 /etc/ImageMagick-6/policy.xml:
<policy domain="coder" rights="none" pattern="PDF" />
修改为:
<policy domain="coder" rights="read|write" pattern="PDF" />
(policy.xml详备讲解.)
提真金不怕火表格pdfplumber提真金不怕火表格大部分鉴戒 Anssi Nurminen的硕士论文, 灵感开头于 Tabula. 责任经过如下:
针对PDF页面, 查找(a)明确界说的行和/或(b)页面上单词对皆所隐含的行。合并访佛或接近访佛的线条.找出这些线条的交点.找到使用这些交点行动极点的最细粒度的矩形集(即单元格)。将一语气单元格分组到表中。 表格提真金不怕火形式pdfplumber.Page页面临象复旧以下形式:
形式讲解.find_tables(table_settings={})复返表格 Table 对象列表. Table包含.cells, .rows,.bbox 属性, 以及形式.extract(x_tolerance=3, y_tolerance=3).extract_tables(table_settings={})复返从页面上找到的悉数表中提真金不怕火的文本,默示为列表列表列表,其结构为“表->行->单元格”。.extract_table(table_settings={})复返从页面上最大表中提真金不怕火的文本,该表默示为列表列表,其结构为“行->单元格”。(若是多个表的大小疏导(以单元格数算计),则此形式将复返最围聚页面顶部的表。).debug_tablefinder(table_settings={})复返TableFinder类的实例,该类不错探询.edges(边), .intersections(交点), .cells(单元格)和.tables(表格)属性.例如:
pdf = pdfplumber.open("path/to/my.pdf") page = pdf.pages[0] page.extract_table()
检察更多示例
表格提真金不怕火配置默许情况下, extract_tables使用页面的垂直线和水平线(或矩形边)行动单元格分隔符。但该形式不错通过 table_settings参数进行高度自界说。以下是配置参数及默许值:
{ "vertical_strategy": "lines", "horizontal_strategy": "lines", "explicit_vertical_lines": [], "explicit_horizontal_lines": [], "snap_tolerance": 3, "snap_x_tolerance": 3, "snap_y_tolerance": 3, "join_tolerance": 3, "join_x_tolerance": 3, "join_y_tolerance": 3, "edge_min_length": 3, "min_words_vertical": 3, "min_words_horizontal": 1, "keep_blank_chars": False, "text_tolerance": 3, "text_x_tolerance": 3, "text_y_tolerance": 3, "intersection_tolerance": 3, "intersection_x_tolerance": 3, "intersection_y_tolerance": 3, }配置项讲解"vertical_strategy"垂直战略,可选值 "lines", "lines_strict", "text", "explicit".见后续讲解"horizontal_strategy"水平战略,可选值 "lines", "lines_strict", "text", "explicit". 见后续讲解"explicit_vertical_lines"明确鉴别表中单元格的垂直线列表。可与上述任何战略结合使用。列表中的款式应该是数字(默示一条直线的x坐标,即页面的全高)或 line/rect/curve对象。"explicit_horizontal_lines"明确鉴别表中单元格的水平线列表。可与上述任何战略结合使用。列表中的款式应该是数字(默示一条直线的y坐标即页面的全高)或 line/rect/curve对象。"snap_tolerance", "snap_x_tolerance", "snap_y_tolerance"snap_tolerance像素内的平行线将“捕捉”到疏导的水平或垂直位置。"join_tolerance", "join_x_tolerance", "join_y_tolerance"归并条无尽线上的线段,其端点在彼此的join_tolerance限度内,将“联接”为一条线段"edge_min_length"在尝试重建表之前,将丢弃小于edge_min_length的边"min_words_vertical"使用 "horizontal_strategy": "text"时,至少 min_words_horizontal单词必须分享疏导的对皆样式。"min_words_horizontal"使用 "horizontal_strategy": "text"时,至少min_words_horizontal单词必须分享疏导的对皆样式。"keep_blank_chars"使用 text 战略时, 空格符" "将视为单词的一部分而不是单词分隔符"text_tolerance", "text_x_tolerance", "text_y_tolerance"当 text 战略搜索单词时,生机每个单词中的单个字母之间的距离不跳跃text_tolerance像素。"intersection_tolerance", "intersection_x_tolerance", "intersection_y_tolerance"将边组合到单元格中时,正交边必须在intersection_tolerance 像素限度内武艺视为相交。 表格提真金不怕火战略图片
vertical_strategy(垂直战略) 及 horizontal_strategy(水平战略)均包含以下选项:
战略讲解"lines"使用页面的图形线(包括矩形对象的边)行动潜在表格单元格的边框。"lines_strict"使用页面的图形线(而不是矩形对象的边)行动潜在表格单元格的边框。"text"关于vertical_strategy(垂直战略):推导联接页面上单词的左、右或中心的(假念念的)行,并将这些行用作潜在表格单元格的边框。关于horizontal_strategy,疏导操作,但使用单词的顶部。"explicit"仅使用explicit_vertical_lines / explicit_horizontal_lines中明确界说的线。 备注 在尝试提真金不怕火表之前剪辑页面时时很有匡助 — Page.crop(bounding_box)v0.5.0版块的pdfplumber针对表格提真金不怕火功能进行了绝对的重新假想,并引入了冲突性的改变。 提真金不怕火表单值巧合PDF文献不错包含表单,包含了东说念主们不错填写和保存的输入。固然表单字段中的值与PDF文献中的其他文本类似,但表单数据的处分样式不同。若是您念念绝对了解详备信息,请参阅本手册第671页 specification.
pdfplumber莫得效于处分表单数据的接口,但您不错使用pdfplumber对pdfminer的封装组件来探询。
例如,此代码段将检索表单字段名和值,并将它们存储在字典中。您可能需要修改此剧本以处分嵌套字段之类的情况(请参见轨范第676页)。
pdf = pdfplumber.open("document_with_form.pdf") fields = pdf.doc.catalog["AcroForm"].resolve()["Fields"] form_data = {} for field in fields: field_name = field.resolve()["T"] field_value = field.resolve()["V"] form_data[field_name] = field_value用例演示 提真金不怕火加利福尼亚工东说念主诊疗和再培训告知(WARN)请教中的表格. 演示基本的可视化调试和表提真金不怕火。提真金不怕火FBI的国度即时刑事布风景察系统PDF文献中的表格. 演示如何使用可视化调试查找最好的表提真金不怕火配置。还演示了 Page.crop(...)(页面剪辑) 及 Page.extract_text(...).(文本导出)查抄和可视化“curve”弧线对象.从圣何塞考察局枪支搜索请教中提真金不怕火等宽数据, Page.extract_text(...)示例. 与其他库的比拟
其他几个Python库匡助用户从PDF中提真金不怕火信息。要而论之,pdfplumber通过结合以下功能而区别于其他PDF处分库:
不错磨蹭探询每个PDF对象的详备信息领有效于提真金不怕火文本和表格的更高档、可自界说的形式集成了可视化调试其他有效的实勤苦能,例如通过剪辑框过滤对象了解pdfplumber无法提供的功能也很有匡助:
创建PDF修改PDF笔墨识别(OCR)完全复旧从OCR识别过的PDF提真金不怕火表格 特点比拟pdfminer.six pdfplumber是基于该库收场的。它主要眷注融会PDF、分析PDF布局和对象定位,以及提真金不怕火文本。但它不提供用于表提真金不怕火或可视化调试的器用。
pymupdf 初始速率比pdfminer快。不错生成和修改PDF,但该库需要安设非Python软件(MuPDF)。它无法磨蹭探询时势对象(矩形、直线等),何况不提供表提真金不怕火或可视化调试器用。
camelot, tabula-py, and pdftables 这些库主要眷注表格提真金不怕火。在某些情况下,它们可能更适当提真金不怕火特定的表格。
PyPDF2 该库似乎不再惊羡福利姬系。
本站仅提供存储就业,悉数骨子均由用户发布,如发现存害或侵权骨子,请点击举报。