mirror of
https://github.com/jsvine/pdfplumber.git
synced 2026-08-29 08:34:23 +08:00
9af84e2b5e
This reverts commit c2564653e8.
142 lines
3.6 KiB
Python
142 lines
3.6 KiB
Python
#!/usr/bin/env python
|
|
import logging
|
|
import os
|
|
import unittest
|
|
|
|
import pdfplumber
|
|
from pdfplumber import table, utils
|
|
|
|
logging.disable(logging.ERROR)
|
|
|
|
HERE = os.path.abspath(os.path.dirname(__file__))
|
|
|
|
|
|
def fix_row_spaces(row):
|
|
return [(x or "").replace(" ", "") for x in row[:3]] + row[3:]
|
|
|
|
|
|
class Test(unittest.TestCase):
|
|
@classmethod
|
|
def setup_class(self):
|
|
self.path = os.path.join(
|
|
HERE, "pdfs/WARN-Report-for-7-1-2015-to-03-25-2016.pdf"
|
|
)
|
|
self.pdf = pdfplumber.open(self.path)
|
|
self.PDF_WIDTH = self.pdf.pages[0].width
|
|
|
|
@classmethod
|
|
def teardown_class(self):
|
|
self.pdf.close()
|
|
|
|
def test_page_limiting(self):
|
|
with pdfplumber.open(self.path, pages=[1, 3]) as pdf:
|
|
assert len(pdf.pages) == 2
|
|
assert pdf.pages[1].page_number == 3
|
|
|
|
def test_objects(self):
|
|
p = self.pdf.pages[0]
|
|
assert len(p.chars)
|
|
assert len(p.rects)
|
|
assert len(p.images)
|
|
|
|
def test_parse(self):
|
|
|
|
rect_x0_clusters = utils.cluster_list(
|
|
[r["x0"] for r in self.pdf.pages[1].rects], tolerance=3
|
|
)
|
|
|
|
v_lines = [x[0] for x in rect_x0_clusters]
|
|
|
|
def parse_page(page):
|
|
data = page.extract_table(
|
|
{"vertical_strategy": "explicit", "explicit_vertical_lines": v_lines}
|
|
)
|
|
without_spaces = [fix_row_spaces(row) for row in data]
|
|
return without_spaces
|
|
|
|
parsed = parse_page(self.pdf.pages[0])
|
|
|
|
assert parsed[0] == [
|
|
"NoticeDate",
|
|
"Effective",
|
|
"Received",
|
|
"Company",
|
|
"City",
|
|
"No. Of",
|
|
"Layoff/Closure",
|
|
]
|
|
|
|
assert parsed[1] == [
|
|
"06/22/2015",
|
|
"03/25/2016",
|
|
"07/01/2015",
|
|
"Maxim Integrated Product",
|
|
"San Jose",
|
|
"150",
|
|
"Closure Permanent",
|
|
]
|
|
|
|
def test_edge_merging(self):
|
|
p0 = self.pdf.pages[0]
|
|
assert len(p0.edges) == 364
|
|
assert (
|
|
len(
|
|
table.merge_edges(
|
|
p0.edges,
|
|
snap_x_tolerance=3,
|
|
snap_y_tolerance=3,
|
|
join_x_tolerance=3,
|
|
join_y_tolerance=3,
|
|
)
|
|
)
|
|
== 46
|
|
)
|
|
assert (
|
|
len(
|
|
table.merge_edges(
|
|
p0.edges,
|
|
snap_x_tolerance=3,
|
|
snap_y_tolerance=3,
|
|
join_x_tolerance=3,
|
|
join_y_tolerance=0,
|
|
)
|
|
)
|
|
== 52
|
|
)
|
|
assert (
|
|
len(
|
|
table.merge_edges(
|
|
p0.edges,
|
|
snap_x_tolerance=0,
|
|
snap_y_tolerance=3,
|
|
join_x_tolerance=3,
|
|
join_y_tolerance=3,
|
|
)
|
|
)
|
|
== 94
|
|
)
|
|
assert (
|
|
len(
|
|
table.merge_edges(
|
|
p0.edges,
|
|
snap_x_tolerance=3,
|
|
snap_y_tolerance=0,
|
|
join_x_tolerance=3,
|
|
join_y_tolerance=3,
|
|
)
|
|
)
|
|
== 174
|
|
)
|
|
|
|
def test_vertices(self):
|
|
p0 = self.pdf.pages[0]
|
|
edges = table.merge_edges(
|
|
p0.edges,
|
|
snap_x_tolerance=3,
|
|
snap_y_tolerance=3,
|
|
join_x_tolerance=3,
|
|
join_y_tolerance=3,
|
|
)
|
|
ixs = table.edges_to_intersections(edges)
|
|
assert len(ixs.keys()) == 304 # 38x8
|