#!/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