Compare commits
48 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| ea5747c5c4 | |||
| 0b85c77425 | |||
| 62ed4753cd | |||
| c78957ae5a | |||
| 2b3461deab | |||
| 0198f5527c | |||
| 175ba32d38 | |||
| be1f0a2884 | |||
| 50b4468aff | |||
| f6aa21c31f | |||
| a38d52c7b2 | |||
| 3f5af18738 | |||
| e0090fbb0a | |||
| e89e147b5c | |||
| e0cb935130 | |||
| 17d48be46e | |||
| 48b2dce633 | |||
| 6301fee523 | |||
| 01dab12fbc | |||
| ca6cefa362 | |||
| d918293fea | |||
| eb7be9c8e6 | |||
| 3ef50f6f8d | |||
| 2dc48f43d6 | |||
| d662819755 | |||
| 153869fda2 | |||
| f8eaec4ce4 | |||
| d83d5fae42 | |||
| 69136431b6 | |||
| ff4d8ce228 | |||
| 5e71f0b0e6 | |||
| 33cea45346 | |||
| 40217bea46 | |||
| 591cfd5291 | |||
| de0079a711 | |||
| e50f9c8847 | |||
| 50780e24f8 | |||
| 92e02fa03d | |||
| 656c4e09bc | |||
| b56d2246ad | |||
| 87a2f4fdc9 | |||
| 451fac9e53 | |||
| 649fd67c44 | |||
| e45e7478bf | |||
| d6ffe0f1a9 | |||
| 423e5f8aad | |||
| 619ce2e2a4 | |||
| 8d8ca6e435 |
@@ -4,6 +4,38 @@ Release History
|
||||
master
|
||||
------
|
||||
|
||||
0.6.0 (2018-12-24)
|
||||
------------------
|
||||
|
||||
**Improvements**
|
||||
|
||||
* [#91](https://github.com/socialcopsdev/camelot/issues/91) Add support to read from url. [#236](https://github.com/socialcopsdev/camelot/pull/236) by Vinayak Mehta.
|
||||
* [#229](https://github.com/socialcopsdev/camelot/issues/229), [#230](https://github.com/socialcopsdev/camelot/issues/230) and [#233](https://github.com/socialcopsdev/camelot/issues/233) New configuration parameters. [#234](https://github.com/socialcopsdev/camelot/pull/234) by Vinayak Mehta.
|
||||
* `strip_text`: To define characters that should be stripped from each string.
|
||||
* `edge_tol`: Tolerance parameter for extending textedges vertically.
|
||||
* `resolution`: Resolution used for PDF to PNG conversion.
|
||||
* Check out the [advanced docs](https://camelot-py.readthedocs.io/en/master/user/advanced.html#strip-characters-from-text) for usage details.
|
||||
* [#170](https://github.com/socialcopsdev/camelot/issues/170) Add option to pass pdfminer layout kwargs. [#232](https://github.com/socialcopsdev/camelot/pull/232) by Vinayak Mehta.
|
||||
* Keyword arguments for [pdfminer.layout.LAParams](https://github.com/euske/pdfminer/blob/master/pdfminer/layout.py#L33) can now be passed using `layout_kwargs` in `read_pdf()`.
|
||||
* The `margins` keyword argument in `read_pdf()` is now deprecated.
|
||||
|
||||
0.5.0 (2018-12-13)
|
||||
------------------
|
||||
|
||||
**Improvements**
|
||||
|
||||
* [#207](https://github.com/socialcopsdev/camelot/issues/207) Add a plot type for Stream text edges and detected table areas. [#224](https://github.com/socialcopsdev/camelot/pull/224) by Vinayak Mehta.
|
||||
* [#204](https://github.com/socialcopsdev/camelot/issues/204) `suppress_warnings` is now called `suppress_stdout`. [#225](https://github.com/socialcopsdev/camelot/pull/225) by Vinayak Mehta.
|
||||
|
||||
**Bugfixes**
|
||||
|
||||
* [#217](https://github.com/socialcopsdev/camelot/issues/217) Fix IndexError when scale is large.
|
||||
* [#105](https://github.com/socialcopsdev/camelot/issues/105), [#192](https://github.com/socialcopsdev/camelot/issues/192) and [#215](https://github.com/socialcopsdev/camelot/issues/215) in [#227](https://github.com/socialcopsdev/camelot/pull/227) by Vinayak Mehta.
|
||||
|
||||
**Documentation**
|
||||
|
||||
* Add pdfplumber comparison and update Tabula (stream) comparison. Check out the [wiki page](https://github.com/socialcopsdev/camelot/wiki/Comparison-with-other-PDF-Table-Extraction-libraries-and-tools).
|
||||
|
||||
0.4.1 (2018-12-05)
|
||||
------------------
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
|
||||
VERSION = (0, 4, 1)
|
||||
VERSION = (0, 6, 0)
|
||||
PRERELEASE = None # alpha, beta or rc
|
||||
REVISION = None
|
||||
|
||||
|
||||
@@ -30,6 +30,7 @@ pass_config = click.make_pass_decorator(Config)
|
||||
|
||||
@click.group()
|
||||
@click.version_option(version=__version__)
|
||||
@click.option('-q', '--quiet', is_flag=False, help='Suppress logs and warnings.')
|
||||
@click.option('-p', '--pages', default='1', help='Comma-separated page numbers.'
|
||||
' Example: 1,3,4 or 1,4-end.')
|
||||
@click.option('-pw', '--password', help='Password for decryption.')
|
||||
@@ -42,9 +43,10 @@ pass_config = click.make_pass_decorator(Config)
|
||||
help='Split text that spans across multiple cells.')
|
||||
@click.option('-flag', '--flag_size', is_flag=True, help='Flag text based on'
|
||||
' font size. Useful to detect super/subscripts.')
|
||||
@click.option('-strip', '--strip_text', help='Characters that should be stripped from a string before'
|
||||
' assigning it to a cell.')
|
||||
@click.option('-M', '--margins', nargs=3, default=(1.0, 0.5, 0.1),
|
||||
help='PDFMiner char_margin, line_margin and word_margin.')
|
||||
@click.option('-q', '--quiet', is_flag=True, help='Suppress warnings.')
|
||||
@click.pass_context
|
||||
def cli(ctx, *args, **kwargs):
|
||||
"""Camelot: PDF Table Extraction for Humans"""
|
||||
@@ -68,10 +70,10 @@ def cli(ctx, *args, **kwargs):
|
||||
@click.option('-shift', '--shift_text', default=['l', 't'],
|
||||
type=click.Choice(['', 'l', 'r', 't', 'b']), multiple=True,
|
||||
help='Direction in which text in a spanning cell will flow.')
|
||||
@click.option('-l', '--line_close_tol', default=2,
|
||||
@click.option('-l', '--line_tol', default=2,
|
||||
help='Tolerance parameter used to merge close vertical'
|
||||
' and horizontal lines.')
|
||||
@click.option('-j', '--joint_close_tol', default=2,
|
||||
@click.option('-j', '--joint_tol', default=2,
|
||||
help='Tolerance parameter used to decide whether'
|
||||
' the detected lines and points lie close to each other.')
|
||||
@click.option('-block', '--threshold_blocksize', default=15,
|
||||
@@ -84,6 +86,8 @@ def cli(ctx, *args, **kwargs):
|
||||
' may be zero or negative as well.')
|
||||
@click.option('-I', '--iterations', default=0,
|
||||
help='Number of times for erosion/dilation will be applied.')
|
||||
@click.option('-res', '--resolution', default=300,
|
||||
help='Resolution used for PDF to PNG conversion.')
|
||||
@click.option('-plot', '--plot_type',
|
||||
type=click.Choice(['text', 'grid', 'contour', 'joint', 'line']),
|
||||
help='Plot elements found on PDF page for visual debugging.')
|
||||
@@ -96,7 +100,7 @@ def lattice(c, *args, **kwargs):
|
||||
output = conf.pop('output')
|
||||
f = conf.pop('format')
|
||||
compress = conf.pop('zip')
|
||||
suppress_warnings = conf.pop('quiet')
|
||||
quiet = conf.pop('quiet')
|
||||
plot_type = kwargs.pop('plot_type')
|
||||
filepath = kwargs.pop('filepath')
|
||||
kwargs.update(conf)
|
||||
@@ -117,7 +121,7 @@ def lattice(c, *args, **kwargs):
|
||||
raise click.UsageError('Please specify output file format using --format')
|
||||
|
||||
tables = read_pdf(filepath, pages=pages, flavor='lattice',
|
||||
suppress_warnings=suppress_warnings, **kwargs)
|
||||
suppress_stdout=quiet, **kwargs)
|
||||
click.echo('Found {} tables'.format(tables.n))
|
||||
if plot_type is not None:
|
||||
for table in tables:
|
||||
@@ -133,12 +137,14 @@ def lattice(c, *args, **kwargs):
|
||||
' where x1, y1 -> left-top and x2, y2 -> right-bottom.')
|
||||
@click.option('-C', '--columns', default=[], multiple=True,
|
||||
help='X coordinates of column separators.')
|
||||
@click.option('-r', '--row_close_tol', default=2, help='Tolerance parameter'
|
||||
@click.option('-e', '--edge_tol', default=50, help='Tolerance parameter'
|
||||
' for extending textedges vertically.')
|
||||
@click.option('-r', '--row_tol', default=2, help='Tolerance parameter'
|
||||
' used to combine text vertically, to generate rows.')
|
||||
@click.option('-c', '--col_close_tol', default=0, help='Tolerance parameter'
|
||||
@click.option('-c', '--column_tol', default=0, help='Tolerance parameter'
|
||||
' used to combine text horizontally, to generate columns.')
|
||||
@click.option('-plot', '--plot_type',
|
||||
type=click.Choice(['text', 'grid']),
|
||||
type=click.Choice(['text', 'grid', 'contour', 'textedge']),
|
||||
help='Plot elements found on PDF page for visual debugging.')
|
||||
@click.argument('filepath', type=click.Path(exists=True))
|
||||
@pass_config
|
||||
@@ -149,7 +155,7 @@ def stream(c, *args, **kwargs):
|
||||
output = conf.pop('output')
|
||||
f = conf.pop('format')
|
||||
compress = conf.pop('zip')
|
||||
suppress_warnings = conf.pop('quiet')
|
||||
quiet = conf.pop('quiet')
|
||||
plot_type = kwargs.pop('plot_type')
|
||||
filepath = kwargs.pop('filepath')
|
||||
kwargs.update(conf)
|
||||
@@ -169,7 +175,7 @@ def stream(c, *args, **kwargs):
|
||||
raise click.UsageError('Please specify output file format using --format')
|
||||
|
||||
tables = read_pdf(filepath, pages=pages, flavor='stream',
|
||||
suppress_warnings=suppress_warnings, **kwargs)
|
||||
suppress_stdout=quiet, **kwargs)
|
||||
click.echo('Found {} tables'.format(tables.n))
|
||||
if plot_type is not None:
|
||||
for table in tables:
|
||||
|
||||
@@ -13,8 +13,6 @@ import pandas as pd
|
||||
# minimum number of vertical textline intersections for a textedge
|
||||
# to be considered valid
|
||||
TEXTEDGE_REQUIRED_ELEMENTS = 4
|
||||
# y coordinate tolerance for extending textedge
|
||||
TEXTEDGE_EXTEND_TOLERANCE = 50
|
||||
# padding added to table area on the left, right and bottom
|
||||
TABLE_AREA_PADDING = 10
|
||||
|
||||
@@ -55,11 +53,11 @@ class TextEdge(object):
|
||||
return '<TextEdge x={} y0={} y1={} align={} valid={}>'.format(
|
||||
round(self.x, 2), round(self.y0, 2), round(self.y1, 2), self.align, self.is_valid)
|
||||
|
||||
def update_coords(self, x, y0):
|
||||
def update_coords(self, x, y0, edge_tol=50):
|
||||
"""Updates the text edge's x and bottom y coordinates and sets
|
||||
the is_valid attribute.
|
||||
"""
|
||||
if np.isclose(self.y0, y0, atol=TEXTEDGE_EXTEND_TOLERANCE):
|
||||
if np.isclose(self.y0, y0, atol=edge_tol):
|
||||
self.x = (self.intersections * self.x + x) / float(self.intersections + 1)
|
||||
self.y0 = y0
|
||||
self.intersections += 1
|
||||
@@ -74,7 +72,8 @@ class TextEdges(object):
|
||||
the PDF page. The dict has three keys based on the alignments,
|
||||
and each key's value is a list of camelot.core.TextEdge objects.
|
||||
"""
|
||||
def __init__(self):
|
||||
def __init__(self, edge_tol=50):
|
||||
self.edge_tol = edge_tol
|
||||
self._textedges = {'left': [], 'right': [], 'middle': []}
|
||||
|
||||
@staticmethod
|
||||
@@ -115,7 +114,8 @@ class TextEdges(object):
|
||||
if idx is None:
|
||||
self.add(textline, align)
|
||||
else:
|
||||
self._textedges[align][idx].update_coords(x_coord, textline.y0)
|
||||
self._textedges[align][idx].update_coords(
|
||||
x_coord, textline.y0, edge_tol=self.edge_tol)
|
||||
|
||||
def generate(self, textlines):
|
||||
"""Generates the text edges dict based on horizontal text
|
||||
@@ -359,7 +359,7 @@ class Table(object):
|
||||
cell.left = cell.right = cell.top = cell.bottom = True
|
||||
return self
|
||||
|
||||
def set_edges(self, vertical, horizontal, joint_close_tol=2):
|
||||
def set_edges(self, vertical, horizontal, joint_tol=2):
|
||||
"""Sets a cell's edges to True depending on whether the cell's
|
||||
coordinates overlap with the line's coordinates within a
|
||||
tolerance.
|
||||
@@ -376,11 +376,11 @@ class Table(object):
|
||||
# find closest x coord
|
||||
# iterate over y coords and find closest start and end points
|
||||
i = [i for i, t in enumerate(self.cols)
|
||||
if np.isclose(v[0], t[0], atol=joint_close_tol)]
|
||||
if np.isclose(v[0], t[0], atol=joint_tol)]
|
||||
j = [j for j, t in enumerate(self.rows)
|
||||
if np.isclose(v[3], t[0], atol=joint_close_tol)]
|
||||
if np.isclose(v[3], t[0], atol=joint_tol)]
|
||||
k = [k for k, t in enumerate(self.rows)
|
||||
if np.isclose(v[1], t[0], atol=joint_close_tol)]
|
||||
if np.isclose(v[1], t[0], atol=joint_tol)]
|
||||
if not j:
|
||||
continue
|
||||
J = j[0]
|
||||
@@ -427,11 +427,11 @@ class Table(object):
|
||||
# find closest y coord
|
||||
# iterate over x coords and find closest start and end points
|
||||
i = [i for i, t in enumerate(self.rows)
|
||||
if np.isclose(h[1], t[0], atol=joint_close_tol)]
|
||||
if np.isclose(h[1], t[0], atol=joint_tol)]
|
||||
j = [j for j, t in enumerate(self.cols)
|
||||
if np.isclose(h[0], t[0], atol=joint_close_tol)]
|
||||
if np.isclose(h[0], t[0], atol=joint_tol)]
|
||||
k = [k for k, t in enumerate(self.cols)
|
||||
if np.isclose(h[2], t[0], atol=joint_close_tol)]
|
||||
if np.isclose(h[2], t[0], atol=joint_tol)]
|
||||
if not j:
|
||||
continue
|
||||
J = j[0]
|
||||
@@ -448,7 +448,7 @@ class Table(object):
|
||||
self.cells[L][J].top = True
|
||||
J += 1
|
||||
elif i == []: # only bottom edge
|
||||
I = len(self.rows) - 1
|
||||
L = len(self.rows) - 1
|
||||
if k:
|
||||
K = k[0]
|
||||
while J < K:
|
||||
|
||||
@@ -8,7 +8,7 @@ from PyPDF2 import PdfFileReader, PdfFileWriter
|
||||
from .core import TableList
|
||||
from .parsers import Stream, Lattice
|
||||
from .utils import (TemporaryDirectory, get_page_layout, get_text_objects,
|
||||
get_rotation)
|
||||
get_rotation, is_url, download_url)
|
||||
|
||||
|
||||
class PDFHandler(object):
|
||||
@@ -18,8 +18,8 @@ class PDFHandler(object):
|
||||
|
||||
Parameters
|
||||
----------
|
||||
filename : str
|
||||
Path to PDF file.
|
||||
filepath : str
|
||||
Filepath or URL of the PDF file.
|
||||
pages : str, optional (default: '1')
|
||||
Comma-separated page numbers.
|
||||
Example: '1,3,4' or '1,4-end'.
|
||||
@@ -27,11 +27,13 @@ class PDFHandler(object):
|
||||
Password for decryption.
|
||||
|
||||
"""
|
||||
def __init__(self, filename, pages='1', password=None):
|
||||
self.filename = filename
|
||||
if not filename.lower().endswith('.pdf'):
|
||||
def __init__(self, filepath, pages='1', password=None):
|
||||
if is_url(filepath):
|
||||
filepath = download_url(filepath)
|
||||
self.filepath = filepath
|
||||
if not filepath.lower().endswith('.pdf'):
|
||||
raise NotImplementedError("File format not supported")
|
||||
self.pages = self._get_pages(self.filename, pages)
|
||||
self.pages = self._get_pages(self.filepath, pages)
|
||||
if password is None:
|
||||
self.password = ''
|
||||
else:
|
||||
@@ -39,13 +41,13 @@ class PDFHandler(object):
|
||||
if sys.version_info[0] < 3:
|
||||
self.password = self.password.encode('ascii')
|
||||
|
||||
def _get_pages(self, filename, pages):
|
||||
def _get_pages(self, filepath, pages):
|
||||
"""Converts pages string to list of ints.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
filename : str
|
||||
Path to PDF file.
|
||||
filepath : str
|
||||
Filepath or URL of the PDF file.
|
||||
pages : str, optional (default: '1')
|
||||
Comma-separated page numbers.
|
||||
Example: 1,3,4 or 1,4-end.
|
||||
@@ -60,7 +62,7 @@ class PDFHandler(object):
|
||||
if pages == '1':
|
||||
page_numbers.append({'start': 1, 'end': 1})
|
||||
else:
|
||||
infile = PdfFileReader(open(filename, 'rb'), strict=False)
|
||||
infile = PdfFileReader(open(filepath, 'rb'), strict=False)
|
||||
if infile.isEncrypted:
|
||||
infile.decrypt(self.password)
|
||||
if pages == 'all':
|
||||
@@ -79,20 +81,20 @@ class PDFHandler(object):
|
||||
P.extend(range(p['start'], p['end'] + 1))
|
||||
return sorted(set(P))
|
||||
|
||||
def _save_page(self, filename, page, temp):
|
||||
def _save_page(self, filepath, page, temp):
|
||||
"""Saves specified page from PDF into a temporary directory.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
filename : str
|
||||
Path to PDF file.
|
||||
filepath : str
|
||||
Filepath or URL of the PDF file.
|
||||
page : int
|
||||
Page number.
|
||||
temp : str
|
||||
Tmp directory.
|
||||
|
||||
"""
|
||||
with open(filename, 'rb') as fileobj:
|
||||
with open(filepath, 'rb') as fileobj:
|
||||
infile = PdfFileReader(fileobj, strict=False)
|
||||
if infile.isEncrypted:
|
||||
infile.decrypt(self.password)
|
||||
@@ -125,7 +127,7 @@ class PDFHandler(object):
|
||||
with open(fpath, 'wb') as f:
|
||||
outfile.write(f)
|
||||
|
||||
def parse(self, flavor='lattice', **kwargs):
|
||||
def parse(self, flavor='lattice', suppress_stdout=False, layout_kwargs={}, **kwargs):
|
||||
"""Extracts tables by calling parser.get_tables on all single
|
||||
page PDFs.
|
||||
|
||||
@@ -134,6 +136,10 @@ class PDFHandler(object):
|
||||
flavor : str (default: 'lattice')
|
||||
The parsing method to use ('lattice' or 'stream').
|
||||
Lattice is used by default.
|
||||
suppress_stdout : str (default: False)
|
||||
Suppress logs and warnings.
|
||||
layout_kwargs : dict, optional (default: {})
|
||||
A dict of `pdfminer.layout.LAParams <https://github.com/euske/pdfminer/blob/master/pdfminer/layout.py#L33>`_ kwargs.
|
||||
kwargs : dict
|
||||
See camelot.read_pdf kwargs.
|
||||
|
||||
@@ -146,11 +152,12 @@ class PDFHandler(object):
|
||||
tables = []
|
||||
with TemporaryDirectory() as tempdir:
|
||||
for p in self.pages:
|
||||
self._save_page(self.filename, p, tempdir)
|
||||
self._save_page(self.filepath, p, tempdir)
|
||||
pages = [os.path.join(tempdir, 'page-{0}.pdf'.format(p))
|
||||
for p in self.pages]
|
||||
parser = Lattice(**kwargs) if flavor == 'lattice' else Stream(**kwargs)
|
||||
for p in pages:
|
||||
t = parser.extract_tables(p)
|
||||
t = parser.extract_tables(p, suppress_stdout=suppress_stdout,
|
||||
layout_kwargs=layout_kwargs)
|
||||
tables.extend(t)
|
||||
return TableList(tables)
|
||||
|
||||
@@ -6,7 +6,7 @@ from .utils import validate_input, remove_extra
|
||||
|
||||
|
||||
def read_pdf(filepath, pages='1', password=None, flavor='lattice',
|
||||
suppress_warnings=False, **kwargs):
|
||||
suppress_stdout=False, layout_kwargs={}, **kwargs):
|
||||
"""Read PDF and return extracted tables.
|
||||
|
||||
Note: kwargs annotated with ^ can only be used with flavor='stream'
|
||||
@@ -15,7 +15,7 @@ def read_pdf(filepath, pages='1', password=None, flavor='lattice',
|
||||
Parameters
|
||||
----------
|
||||
filepath : str
|
||||
Path to PDF file.
|
||||
Filepath or URL of the PDF file.
|
||||
pages : str, optional (default: '1')
|
||||
Comma-separated page numbers.
|
||||
Example: '1,3,4' or '1,4-end'.
|
||||
@@ -24,8 +24,10 @@ def read_pdf(filepath, pages='1', password=None, flavor='lattice',
|
||||
flavor : str (default: 'lattice')
|
||||
The parsing method to use ('lattice' or 'stream').
|
||||
Lattice is used by default.
|
||||
suppress_warnings : bool, optional (default: False)
|
||||
Prevent warnings from being emitted by Camelot.
|
||||
suppress_stdout : bool, optional (default: True)
|
||||
Print all logs and warnings.
|
||||
layout_kwargs : dict, optional (default: {})
|
||||
A dict of `pdfminer.layout.LAParams <https://github.com/euske/pdfminer/blob/master/pdfminer/layout.py#L33>`_ kwargs.
|
||||
table_areas : list, optional (default: None)
|
||||
List of table area strings of the form x1,y1,x2,y2
|
||||
where (x1, y1) -> left-top and (x2, y2) -> right-bottom
|
||||
@@ -38,10 +40,13 @@ def read_pdf(filepath, pages='1', password=None, flavor='lattice',
|
||||
flag_size : bool, optional (default: False)
|
||||
Flag text based on font size. Useful to detect
|
||||
super/subscripts. Adds <s></s> around flagged text.
|
||||
row_close_tol^ : int, optional (default: 2)
|
||||
strip_text : str, optional (default: '')
|
||||
Characters that should be stripped from a string before
|
||||
assigning it to a cell.
|
||||
row_tol^ : int, optional (default: 2)
|
||||
Tolerance parameter used to combine text vertically,
|
||||
to generate rows.
|
||||
col_close_tol^ : int, optional (default: 0)
|
||||
column_tol^ : int, optional (default: 0)
|
||||
Tolerance parameter used to combine text horizontally,
|
||||
to generate columns.
|
||||
process_background* : bool, optional (default: False)
|
||||
@@ -57,10 +62,10 @@ def read_pdf(filepath, pages='1', password=None, flavor='lattice',
|
||||
shift_text* : list, optional (default: ['l', 't'])
|
||||
{'l', 'r', 't', 'b'}
|
||||
Direction in which text in a spanning cell will flow.
|
||||
line_close_tol* : int, optional (default: 2)
|
||||
line_tol* : int, optional (default: 2)
|
||||
Tolerance parameter used to merge close vertical and horizontal
|
||||
lines.
|
||||
joint_close_tol* : int, optional (default: 2)
|
||||
joint_tol* : int, optional (default: 2)
|
||||
Tolerance parameter used to decide whether the detected lines
|
||||
and points lie close to each other.
|
||||
threshold_blocksize* : int, optional (default: 15)
|
||||
@@ -77,10 +82,8 @@ def read_pdf(filepath, pages='1', password=None, flavor='lattice',
|
||||
Number of times for erosion/dilation is applied.
|
||||
|
||||
For more information, refer `OpenCV's dilate <https://docs.opencv.org/2.4/modules/imgproc/doc/filtering.html#dilate>`_.
|
||||
margins : tuple
|
||||
PDFMiner char_margin, line_margin and word_margin.
|
||||
|
||||
For more information, refer `PDFMiner docs <https://euske.github.io/pdfminer/>`_.
|
||||
resolution* : int, optional (default: 300)
|
||||
Resolution used for PDF to PNG conversion.
|
||||
|
||||
Returns
|
||||
-------
|
||||
@@ -92,11 +95,12 @@ def read_pdf(filepath, pages='1', password=None, flavor='lattice',
|
||||
" Use either 'lattice' or 'stream'")
|
||||
|
||||
with warnings.catch_warnings():
|
||||
if suppress_warnings:
|
||||
if suppress_stdout:
|
||||
warnings.simplefilter("ignore")
|
||||
|
||||
validate_input(kwargs, flavor=flavor)
|
||||
p = PDFHandler(filepath, pages=pages, password=password)
|
||||
kwargs = remove_extra(kwargs, flavor=flavor)
|
||||
tables = p.parse(flavor=flavor, **kwargs)
|
||||
tables = p.parse(flavor=flavor, suppress_stdout=suppress_stdout,
|
||||
layout_kwargs=layout_kwargs, **kwargs)
|
||||
return tables
|
||||
|
||||
@@ -8,13 +8,11 @@ from ..utils import get_page_layout, get_text_objects
|
||||
class BaseParser(object):
|
||||
"""Defines a base parser.
|
||||
"""
|
||||
def _generate_layout(self, filename):
|
||||
def _generate_layout(self, filename, layout_kwargs):
|
||||
self.filename = filename
|
||||
self.layout_kwargs = layout_kwargs
|
||||
self.layout, self.dimensions = get_page_layout(
|
||||
self.filename,
|
||||
char_margin=self.char_margin,
|
||||
line_margin=self.line_margin,
|
||||
word_margin=self.word_margin)
|
||||
filename, **layout_kwargs)
|
||||
self.horizontal_text = get_text_objects(self.layout, ltype="lh")
|
||||
self.vertical_text = get_text_objects(self.layout, ltype="lv")
|
||||
self.pdf_width, self.pdf_height = self.dimensions
|
||||
|
||||
@@ -50,10 +50,13 @@ class Lattice(BaseParser):
|
||||
flag_size : bool, optional (default: False)
|
||||
Flag text based on font size. Useful to detect
|
||||
super/subscripts. Adds <s></s> around flagged text.
|
||||
line_close_tol : int, optional (default: 2)
|
||||
strip_text : str, optional (default: '')
|
||||
Characters that should be stripped from a string before
|
||||
assigning it to a cell.
|
||||
line_tol : int, optional (default: 2)
|
||||
Tolerance parameter used to merge close vertical and horizontal
|
||||
lines.
|
||||
joint_close_tol : int, optional (default: 2)
|
||||
joint_tol : int, optional (default: 2)
|
||||
Tolerance parameter used to decide whether the detected lines
|
||||
and points lie close to each other.
|
||||
threshold_blocksize : int, optional (default: 15)
|
||||
@@ -70,17 +73,15 @@ class Lattice(BaseParser):
|
||||
Number of times for erosion/dilation is applied.
|
||||
|
||||
For more information, refer `OpenCV's dilate <https://docs.opencv.org/2.4/modules/imgproc/doc/filtering.html#dilate>`_.
|
||||
margins : tuple
|
||||
PDFMiner char_margin, line_margin and word_margin.
|
||||
|
||||
For more information, refer `PDFMiner docs <https://euske.github.io/pdfminer/>`_.
|
||||
resolution : int, optional (default: 300)
|
||||
Resolution used for PDF to PNG conversion.
|
||||
|
||||
"""
|
||||
def __init__(self, table_areas=None, process_background=False,
|
||||
line_size_scaling=15, copy_text=None, shift_text=['l', 't'],
|
||||
split_text=False, flag_size=False, line_close_tol=2,
|
||||
joint_close_tol=2, threshold_blocksize=15, threshold_constant=-2,
|
||||
iterations=0, margins=(1.0, 0.5, 0.1), **kwargs):
|
||||
split_text=False, flag_size=False, strip_text='', line_tol=2,
|
||||
joint_tol=2, threshold_blocksize=15, threshold_constant=-2,
|
||||
iterations=0, resolution=300, **kwargs):
|
||||
self.table_areas = table_areas
|
||||
self.process_background = process_background
|
||||
self.line_size_scaling = line_size_scaling
|
||||
@@ -88,12 +89,13 @@ class Lattice(BaseParser):
|
||||
self.shift_text = shift_text
|
||||
self.split_text = split_text
|
||||
self.flag_size = flag_size
|
||||
self.line_close_tol = line_close_tol
|
||||
self.joint_close_tol = joint_close_tol
|
||||
self.strip_text = strip_text
|
||||
self.line_tol = line_tol
|
||||
self.joint_tol = joint_tol
|
||||
self.threshold_blocksize = threshold_blocksize
|
||||
self.threshold_constant = threshold_constant
|
||||
self.iterations = iterations
|
||||
self.char_margin, self.line_margin, self.word_margin = margins
|
||||
self.resolution = resolution
|
||||
|
||||
@staticmethod
|
||||
def _reduce_index(t, idx, shift_text):
|
||||
@@ -214,7 +216,7 @@ class Lattice(BaseParser):
|
||||
'-sDEVICE=png16m',
|
||||
'-o',
|
||||
self.imagename,
|
||||
'-r600',
|
||||
'-r{}'.format(self.resolution),
|
||||
self.filename
|
||||
]
|
||||
gs = get_executable()
|
||||
@@ -271,10 +273,11 @@ class Lattice(BaseParser):
|
||||
tk, self.vertical_segments, self.horizontal_segments)
|
||||
t_bbox['horizontal'] = text_in_bbox(tk, self.horizontal_text)
|
||||
t_bbox['vertical'] = text_in_bbox(tk, self.vertical_text)
|
||||
self.t_bbox = t_bbox
|
||||
|
||||
for direction in t_bbox:
|
||||
t_bbox[direction].sort(key=lambda x: (-x.y0, x.x0))
|
||||
t_bbox['horizontal'].sort(key=lambda x: (-x.y0, x.x0))
|
||||
t_bbox['vertical'].sort(key=lambda x: (x.x0, -x.y0))
|
||||
|
||||
self.t_bbox = t_bbox
|
||||
|
||||
cols, rows = zip(*self.table_bbox[tk])
|
||||
cols, rows = list(cols), list(rows)
|
||||
@@ -282,9 +285,9 @@ class Lattice(BaseParser):
|
||||
rows.extend([tk[1], tk[3]])
|
||||
# sort horizontal and vertical segments
|
||||
cols = merge_close_lines(
|
||||
sorted(cols), line_close_tol=self.line_close_tol)
|
||||
sorted(cols), line_tol=self.line_tol)
|
||||
rows = merge_close_lines(
|
||||
sorted(rows, reverse=True), line_close_tol=self.line_close_tol)
|
||||
sorted(rows, reverse=True), line_tol=self.line_tol)
|
||||
# make grid using x and y coord of shortlisted rows and cols
|
||||
cols = [(cols[i], cols[i + 1])
|
||||
for i in range(0, len(cols) - 1)]
|
||||
@@ -301,18 +304,20 @@ class Lattice(BaseParser):
|
||||
|
||||
table = Table(cols, rows)
|
||||
# set table edges to True using ver+hor lines
|
||||
table = table.set_edges(v_s, h_s, joint_close_tol=self.joint_close_tol)
|
||||
table = table.set_edges(v_s, h_s, joint_tol=self.joint_tol)
|
||||
# set table border edges to True
|
||||
table = table.set_border()
|
||||
# set spanning cells to True
|
||||
table = table.set_span()
|
||||
|
||||
pos_errors = []
|
||||
for direction in self.t_bbox:
|
||||
# TODO: have a single list in place of two directional ones?
|
||||
# sorted on x-coordinate based on reading order i.e. LTR or RTL
|
||||
for direction in ['vertical', 'horizontal']:
|
||||
for t in self.t_bbox[direction]:
|
||||
indices, error = get_table_index(
|
||||
table, t, direction, split_text=self.split_text,
|
||||
flag_size=self.flag_size)
|
||||
flag_size=self.flag_size, strip_text=self.strip_text)
|
||||
if indices[:2] != (-1, -1):
|
||||
pos_errors.append(error)
|
||||
indices = Lattice._reduce_index(table, indices, shift_text=self.shift_text)
|
||||
@@ -341,12 +346,14 @@ class Lattice(BaseParser):
|
||||
table._text = _text
|
||||
table._image = (self.image, self.table_bbox_unscaled)
|
||||
table._segments = (self.vertical_segments, self.horizontal_segments)
|
||||
table._textedges = None
|
||||
|
||||
return table
|
||||
|
||||
def extract_tables(self, filename):
|
||||
self._generate_layout(filename)
|
||||
logger.info('Processing {}'.format(os.path.basename(self.rootname)))
|
||||
def extract_tables(self, filename, suppress_stdout=False, layout_kwargs={}):
|
||||
self._generate_layout(filename, layout_kwargs)
|
||||
if not suppress_stdout:
|
||||
logger.info('Processing {}'.format(os.path.basename(self.rootname)))
|
||||
|
||||
if not self.horizontal_text:
|
||||
warnings.warn("No tables found on {}".format(
|
||||
|
||||
@@ -38,29 +38,31 @@ class Stream(BaseParser):
|
||||
flag_size : bool, optional (default: False)
|
||||
Flag text based on font size. Useful to detect
|
||||
super/subscripts. Adds <s></s> around flagged text.
|
||||
row_close_tol : int, optional (default: 2)
|
||||
strip_text : str, optional (default: '')
|
||||
Characters that should be stripped from a string before
|
||||
assigning it to a cell.
|
||||
edge_tol : int, optional (default: 50)
|
||||
Tolerance parameter for extending textedges vertically.
|
||||
row_tol : int, optional (default: 2)
|
||||
Tolerance parameter used to combine text vertically,
|
||||
to generate rows.
|
||||
col_close_tol : int, optional (default: 0)
|
||||
column_tol : int, optional (default: 0)
|
||||
Tolerance parameter used to combine text horizontally,
|
||||
to generate columns.
|
||||
margins : tuple, optional (default: (1.0, 0.5, 0.1))
|
||||
PDFMiner char_margin, line_margin and word_margin.
|
||||
|
||||
For more information, refer `PDFMiner docs <https://euske.github.io/pdfminer/>`_.
|
||||
|
||||
"""
|
||||
def __init__(self, table_areas=None, columns=None, split_text=False,
|
||||
flag_size=False, row_close_tol=2, col_close_tol=0,
|
||||
margins=(1.0, 0.5, 0.1), **kwargs):
|
||||
flag_size=False, strip_text='', edge_tol=50, row_tol=2,
|
||||
column_tol=0, **kwargs):
|
||||
self.table_areas = table_areas
|
||||
self.columns = columns
|
||||
self._validate_columns()
|
||||
self.split_text = split_text
|
||||
self.flag_size = flag_size
|
||||
self.row_close_tol = row_close_tol
|
||||
self.col_close_tol = col_close_tol
|
||||
self.char_margin, self.line_margin, self.word_margin = margins
|
||||
self.strip_text = strip_text
|
||||
self.edge_tol = edge_tol
|
||||
self.row_tol = row_tol
|
||||
self.column_tol = column_tol
|
||||
|
||||
@staticmethod
|
||||
def _text_bbox(t_bbox):
|
||||
@@ -86,7 +88,7 @@ class Stream(BaseParser):
|
||||
return text_bbox
|
||||
|
||||
@staticmethod
|
||||
def _group_rows(text, row_close_tol=2):
|
||||
def _group_rows(text, row_tol=2):
|
||||
"""Groups PDFMiner text objects into rows vertically
|
||||
within a tolerance.
|
||||
|
||||
@@ -94,7 +96,7 @@ class Stream(BaseParser):
|
||||
----------
|
||||
text : list
|
||||
List of PDFMiner text objects.
|
||||
row_close_tol : int, optional (default: 2)
|
||||
row_tol : int, optional (default: 2)
|
||||
|
||||
Returns
|
||||
-------
|
||||
@@ -110,7 +112,7 @@ class Stream(BaseParser):
|
||||
# if t.get_text().strip() and all([obj.upright for obj in t._objs if
|
||||
# type(obj) is LTChar]):
|
||||
if t.get_text().strip():
|
||||
if not np.isclose(row_y, t.y0, atol=row_close_tol):
|
||||
if not np.isclose(row_y, t.y0, atol=row_tol):
|
||||
rows.append(sorted(temp, key=lambda t: t.x0))
|
||||
temp = []
|
||||
row_y = t.y0
|
||||
@@ -120,7 +122,7 @@ class Stream(BaseParser):
|
||||
return rows
|
||||
|
||||
@staticmethod
|
||||
def _merge_columns(l, col_close_tol=0):
|
||||
def _merge_columns(l, column_tol=0):
|
||||
"""Merges column boundaries horizontally if they overlap
|
||||
or lie within a tolerance.
|
||||
|
||||
@@ -128,7 +130,7 @@ class Stream(BaseParser):
|
||||
----------
|
||||
l : list
|
||||
List of column x-coordinate tuples.
|
||||
col_close_tol : int, optional (default: 0)
|
||||
column_tol : int, optional (default: 0)
|
||||
|
||||
Returns
|
||||
-------
|
||||
@@ -142,17 +144,17 @@ class Stream(BaseParser):
|
||||
merged.append(higher)
|
||||
else:
|
||||
lower = merged[-1]
|
||||
if col_close_tol >= 0:
|
||||
if column_tol >= 0:
|
||||
if (higher[0] <= lower[1] or
|
||||
np.isclose(higher[0], lower[1], atol=col_close_tol)):
|
||||
np.isclose(higher[0], lower[1], atol=column_tol)):
|
||||
upper_bound = max(lower[1], higher[1])
|
||||
lower_bound = min(lower[0], higher[0])
|
||||
merged[-1] = (lower_bound, upper_bound)
|
||||
else:
|
||||
merged.append(higher)
|
||||
elif col_close_tol < 0:
|
||||
elif column_tol < 0:
|
||||
if higher[0] <= lower[1]:
|
||||
if np.isclose(higher[0], lower[1], atol=abs(col_close_tol)):
|
||||
if np.isclose(higher[0], lower[1], atol=abs(column_tol)):
|
||||
merged.append(higher)
|
||||
else:
|
||||
upper_bound = max(lower[1], higher[1])
|
||||
@@ -189,7 +191,7 @@ class Stream(BaseParser):
|
||||
return rows
|
||||
|
||||
@staticmethod
|
||||
def _add_columns(cols, text, row_close_tol):
|
||||
def _add_columns(cols, text, row_tol):
|
||||
"""Adds columns to existing list by taking into account
|
||||
the text that lies outside the current column x-coordinates.
|
||||
|
||||
@@ -208,7 +210,7 @@ class Stream(BaseParser):
|
||||
|
||||
"""
|
||||
if text:
|
||||
text = Stream._group_rows(text, row_close_tol=row_close_tol)
|
||||
text = Stream._group_rows(text, row_tol=row_tol)
|
||||
elements = [len(r) for r in text]
|
||||
new_cols = [(t.x0, t.x1)
|
||||
for r in text if len(r) == max(elements) for t in r]
|
||||
@@ -254,15 +256,15 @@ class Stream(BaseParser):
|
||||
Assumes that tables are situated relatively far apart
|
||||
vertically.
|
||||
"""
|
||||
|
||||
# TODO: add support for arabic text #141
|
||||
# sort textlines in reading order
|
||||
textlines.sort(key=lambda x: (-x.y0, x.x0))
|
||||
textedges = TextEdges()
|
||||
textedges = TextEdges(edge_tol=self.edge_tol)
|
||||
# generate left, middle and right textedges
|
||||
textedges.generate(textlines)
|
||||
# select relevant edges
|
||||
relevant_textedges = textedges.get_relevant()
|
||||
self.textedges.extend(relevant_textedges)
|
||||
# guess table areas using textlines and relevant edges
|
||||
table_bbox = textedges.get_table_areas(textlines, relevant_textedges)
|
||||
# treat whole page as table area if no table areas found
|
||||
@@ -272,6 +274,7 @@ class Stream(BaseParser):
|
||||
return table_bbox
|
||||
|
||||
def _generate_table_bbox(self):
|
||||
self.textedges = []
|
||||
if self.table_areas is not None:
|
||||
table_bbox = {}
|
||||
for area in self.table_areas:
|
||||
@@ -291,13 +294,14 @@ class Stream(BaseParser):
|
||||
t_bbox = {}
|
||||
t_bbox['horizontal'] = text_in_bbox(tk, self.horizontal_text)
|
||||
t_bbox['vertical'] = text_in_bbox(tk, self.vertical_text)
|
||||
|
||||
t_bbox['horizontal'].sort(key=lambda x: (-x.y0, x.x0))
|
||||
t_bbox['vertical'].sort(key=lambda x: (x.x0, -x.y0))
|
||||
|
||||
self.t_bbox = t_bbox
|
||||
|
||||
for direction in self.t_bbox:
|
||||
self.t_bbox[direction].sort(key=lambda x: (-x.y0, x.x0))
|
||||
|
||||
text_x_min, text_y_min, text_x_max, text_y_max = self._text_bbox(self.t_bbox)
|
||||
rows_grouped = self._group_rows(self.t_bbox['horizontal'], row_close_tol=self.row_close_tol)
|
||||
rows_grouped = self._group_rows(self.t_bbox['horizontal'], row_tol=self.row_tol)
|
||||
rows = self._join_rows(rows_grouped, text_y_max, text_y_min)
|
||||
elements = [len(r) for r in rows_grouped]
|
||||
|
||||
@@ -328,7 +332,7 @@ class Stream(BaseParser):
|
||||
warnings.warn("No tables found in table area {}".format(
|
||||
table_idx + 1))
|
||||
cols = [(t.x0, t.x1) for r in rows_grouped if len(r) == ncols for t in r]
|
||||
cols = self._merge_columns(sorted(cols), col_close_tol=self.col_close_tol)
|
||||
cols = self._merge_columns(sorted(cols), column_tol=self.column_tol)
|
||||
inner_text = []
|
||||
for i in range(1, len(cols)):
|
||||
left = cols[i - 1][1]
|
||||
@@ -340,7 +344,7 @@ class Stream(BaseParser):
|
||||
for t in self.t_bbox[direction]
|
||||
if t.x0 > cols[-1][1] or t.x1 < cols[0][0]]
|
||||
inner_text.extend(outer_text)
|
||||
cols = self._add_columns(cols, inner_text, self.row_close_tol)
|
||||
cols = self._add_columns(cols, inner_text, self.row_tol)
|
||||
cols = self._join_columns(cols, text_x_min, text_x_max)
|
||||
|
||||
return cols, rows
|
||||
@@ -348,12 +352,15 @@ class Stream(BaseParser):
|
||||
def _generate_table(self, table_idx, cols, rows, **kwargs):
|
||||
table = Table(cols, rows)
|
||||
table = table.set_all_edges()
|
||||
|
||||
pos_errors = []
|
||||
for direction in self.t_bbox:
|
||||
# TODO: have a single list in place of two directional ones?
|
||||
# sorted on x-coordinate based on reading order i.e. LTR or RTL
|
||||
for direction in ['vertical', 'horizontal']:
|
||||
for t in self.t_bbox[direction]:
|
||||
indices, error = get_table_index(
|
||||
table, t, direction, split_text=self.split_text,
|
||||
flag_size=self.flag_size)
|
||||
flag_size=self.flag_size, strip_text=self.strip_text)
|
||||
if indices[:2] != (-1, -1):
|
||||
pos_errors.append(error)
|
||||
for r_idx, c_idx, text in indices:
|
||||
@@ -378,12 +385,14 @@ class Stream(BaseParser):
|
||||
table._text = _text
|
||||
table._image = None
|
||||
table._segments = None
|
||||
table._textedges = self.textedges
|
||||
|
||||
return table
|
||||
|
||||
def extract_tables(self, filename):
|
||||
self._generate_layout(filename)
|
||||
logger.info('Processing {}'.format(os.path.basename(self.rootname)))
|
||||
def extract_tables(self, filename, suppress_stdout=False, layout_kwargs={}):
|
||||
self._generate_layout(filename, layout_kwargs)
|
||||
if not suppress_stdout:
|
||||
logger.info('Processing {}'.format(os.path.basename(self.rootname)))
|
||||
|
||||
if not self.horizontal_text:
|
||||
warnings.warn("No tables found on {}".format(
|
||||
|
||||
@@ -33,7 +33,10 @@ class PlotMethods(object):
|
||||
if not _HAS_MPL:
|
||||
raise ImportError('matplotlib is required for plotting.')
|
||||
|
||||
if table.flavor == 'stream' and kind in ['contour', 'joint', 'line']:
|
||||
if table.flavor == 'lattice' and kind in ['textedge']:
|
||||
raise NotImplementedError("Lattice flavor does not support kind='{}'".format(
|
||||
kind))
|
||||
elif table.flavor == 'stream' and kind in ['joint', 'line']:
|
||||
raise NotImplementedError("Stream flavor does not support kind='{}'".format(
|
||||
kind))
|
||||
|
||||
@@ -114,20 +117,82 @@ class PlotMethods(object):
|
||||
fig : matplotlib.fig.Figure
|
||||
|
||||
"""
|
||||
img, table_bbox = table._image
|
||||
try:
|
||||
img, table_bbox = table._image
|
||||
_FOR_LATTICE = True
|
||||
except TypeError:
|
||||
img, table_bbox = (None, {table._bbox: None})
|
||||
_FOR_LATTICE = False
|
||||
fig = plt.figure()
|
||||
ax = fig.add_subplot(111, aspect='equal')
|
||||
|
||||
xs, ys = [], []
|
||||
if not _FOR_LATTICE:
|
||||
for t in table._text:
|
||||
xs.extend([t[0], t[2]])
|
||||
ys.extend([t[1], t[3]])
|
||||
ax.add_patch(
|
||||
patches.Rectangle(
|
||||
(t[0], t[1]),
|
||||
t[2] - t[0],
|
||||
t[3] - t[1],
|
||||
color='blue'
|
||||
)
|
||||
)
|
||||
|
||||
for t in table_bbox.keys():
|
||||
ax.add_patch(
|
||||
patches.Rectangle(
|
||||
(t[0], t[1]),
|
||||
t[2] - t[0],
|
||||
t[3] - t[1],
|
||||
fill=None,
|
||||
edgecolor='red'
|
||||
fill=False,
|
||||
color='red'
|
||||
)
|
||||
)
|
||||
ax.imshow(img)
|
||||
if not _FOR_LATTICE:
|
||||
xs.extend([t[0], t[2]])
|
||||
ys.extend([t[1], t[3]])
|
||||
ax.set_xlim(min(xs) - 10, max(xs) + 10)
|
||||
ax.set_ylim(min(ys) - 10, max(ys) + 10)
|
||||
|
||||
if _FOR_LATTICE:
|
||||
ax.imshow(img)
|
||||
return fig
|
||||
|
||||
def textedge(self, table):
|
||||
"""Generates a plot for relevant textedges.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
table : camelot.core.Table
|
||||
|
||||
Returns
|
||||
-------
|
||||
fig : matplotlib.fig.Figure
|
||||
|
||||
"""
|
||||
fig = plt.figure()
|
||||
ax = fig.add_subplot(111, aspect='equal')
|
||||
xs, ys = [], []
|
||||
for t in table._text:
|
||||
xs.extend([t[0], t[2]])
|
||||
ys.extend([t[1], t[3]])
|
||||
ax.add_patch(
|
||||
patches.Rectangle(
|
||||
(t[0], t[1]),
|
||||
t[2] - t[0],
|
||||
t[3] - t[1],
|
||||
color='blue'
|
||||
)
|
||||
)
|
||||
ax.set_xlim(min(xs) - 10, max(xs) + 10)
|
||||
ax.set_ylim(min(ys) - 10, max(ys) + 10)
|
||||
|
||||
for te in table._textedges:
|
||||
ax.plot([te.x, te.x],
|
||||
[te.y0, te.y1])
|
||||
|
||||
return fig
|
||||
|
||||
def joint(self, table):
|
||||
|
||||
@@ -1,12 +1,17 @@
|
||||
# -*- coding: utf-8 -*-
|
||||
from __future__ import division
|
||||
|
||||
import os
|
||||
import sys
|
||||
import random
|
||||
import shutil
|
||||
import string
|
||||
import tempfile
|
||||
import warnings
|
||||
from itertools import groupby
|
||||
from operator import itemgetter
|
||||
|
||||
import numpy as np
|
||||
|
||||
from pdfminer.pdfparser import PDFParser
|
||||
from pdfminer.pdfdocument import PDFDocument
|
||||
from pdfminer.pdfpage import PDFPage
|
||||
@@ -18,18 +23,89 @@ from pdfminer.layout import (LAParams, LTAnno, LTChar, LTTextLineHorizontal,
|
||||
LTTextLineVertical)
|
||||
|
||||
|
||||
PY3 = sys.version_info[0] >= 3
|
||||
if PY3:
|
||||
from urllib.request import urlopen
|
||||
from urllib.parse import urlparse as parse_url
|
||||
from urllib.parse import uses_relative, uses_netloc, uses_params
|
||||
else:
|
||||
from urllib2 import urlopen
|
||||
from urlparse import urlparse as parse_url
|
||||
from urlparse import uses_relative, uses_netloc, uses_params
|
||||
|
||||
|
||||
_VALID_URLS = set(uses_relative + uses_netloc + uses_params)
|
||||
_VALID_URLS.discard('')
|
||||
|
||||
|
||||
# https://github.com/pandas-dev/pandas/blob/master/pandas/io/common.py
|
||||
def is_url(url):
|
||||
"""Check to see if a URL has a valid protocol.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
url : str or unicode
|
||||
|
||||
Returns
|
||||
-------
|
||||
isurl : bool
|
||||
If url has a valid protocol return True otherwise False.
|
||||
|
||||
"""
|
||||
try:
|
||||
return parse_url(url).scheme in _VALID_URLS
|
||||
except Exception:
|
||||
return False
|
||||
|
||||
|
||||
def random_string(length):
|
||||
ret = ''
|
||||
while length:
|
||||
ret += random.choice(string.digits + string.ascii_lowercase + string.ascii_uppercase)
|
||||
length -= 1
|
||||
return ret
|
||||
|
||||
|
||||
def download_url(url):
|
||||
"""Download file from specified URL.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
url : str or unicode
|
||||
|
||||
Returns
|
||||
-------
|
||||
filepath : str or unicode
|
||||
Temporary filepath.
|
||||
|
||||
"""
|
||||
filename = '{}.pdf'.format(random_string(6))
|
||||
with tempfile.NamedTemporaryFile('wb', delete=False) as f:
|
||||
obj = urlopen(url)
|
||||
if PY3:
|
||||
content_type = obj.info().get_content_type()
|
||||
else:
|
||||
content_type = obj.info().getheader('Content-Type')
|
||||
if content_type != 'application/pdf':
|
||||
raise NotImplementedError("File format not supported")
|
||||
f.write(obj.read())
|
||||
filepath = os.path.join(os.path.dirname(f.name), filename)
|
||||
shutil.move(f.name, filepath)
|
||||
return filepath
|
||||
|
||||
|
||||
stream_kwargs = [
|
||||
'columns',
|
||||
'row_close_tol',
|
||||
'col_close_tol'
|
||||
'row_tol',
|
||||
'column_tol'
|
||||
]
|
||||
lattice_kwargs = [
|
||||
'process_background',
|
||||
'line_size_scaling',
|
||||
'copy_text',
|
||||
'shift_text',
|
||||
'line_close_tol',
|
||||
'joint_close_tol',
|
||||
'line_tol',
|
||||
'joint_tol',
|
||||
'threshold_blocksize',
|
||||
'threshold_constant',
|
||||
'iterations'
|
||||
@@ -281,14 +357,14 @@ def text_in_bbox(bbox, text):
|
||||
return t_bbox
|
||||
|
||||
|
||||
def merge_close_lines(ar, line_close_tol=2):
|
||||
def merge_close_lines(ar, line_tol=2):
|
||||
"""Merges lines which are within a tolerance by calculating a
|
||||
moving mean, based on their x or y axis projections.
|
||||
|
||||
Parameters
|
||||
----------
|
||||
ar : list
|
||||
line_close_tol : int, optional (default: 2)
|
||||
line_tol : int, optional (default: 2)
|
||||
|
||||
Returns
|
||||
-------
|
||||
@@ -301,7 +377,7 @@ def merge_close_lines(ar, line_close_tol=2):
|
||||
ret.append(a)
|
||||
else:
|
||||
temp = ret[-1]
|
||||
if np.isclose(temp, a, atol=line_close_tol):
|
||||
if np.isclose(temp, a, atol=line_tol):
|
||||
temp = (temp + a) / 2.0
|
||||
ret[-1] = temp
|
||||
else:
|
||||
@@ -309,7 +385,12 @@ def merge_close_lines(ar, line_close_tol=2):
|
||||
return ret
|
||||
|
||||
|
||||
def flag_font_size(textline, direction):
|
||||
# TODO: combine the following functions into a TextProcessor class which
|
||||
# applies corresponding transformations sequentially
|
||||
# (inspired from sklearn.pipeline.Pipeline)
|
||||
|
||||
|
||||
def flag_font_size(textline, direction, strip_text=''):
|
||||
"""Flags super/subscripts in text by enclosing them with <s></s>.
|
||||
May give false positives.
|
||||
|
||||
@@ -319,6 +400,9 @@ def flag_font_size(textline, direction):
|
||||
List of PDFMiner LTChar objects.
|
||||
direction : string
|
||||
Direction of the PDFMiner LTTextLine object.
|
||||
strip_text : str, optional (default: '')
|
||||
Characters that should be stripped from a string before
|
||||
assigning it to a cell.
|
||||
|
||||
Returns
|
||||
-------
|
||||
@@ -344,13 +428,13 @@ def flag_font_size(textline, direction):
|
||||
fchars = [t[0] for t in chars]
|
||||
if ''.join(fchars).strip():
|
||||
flist.append(''.join(fchars))
|
||||
fstring = ''.join(flist).strip('\n')
|
||||
fstring = ''.join(flist).strip(strip_text)
|
||||
else:
|
||||
fstring = ''.join([t.get_text() for t in textline]).strip('\n')
|
||||
fstring = ''.join([t.get_text() for t in textline]).strip(strip_text)
|
||||
return fstring
|
||||
|
||||
|
||||
def split_textline(table, textline, direction, flag_size=False):
|
||||
def split_textline(table, textline, direction, flag_size=False, strip_text=''):
|
||||
"""Splits PDFMiner LTTextLine into substrings if it spans across
|
||||
multiple rows/columns.
|
||||
|
||||
@@ -365,6 +449,9 @@ def split_textline(table, textline, direction, flag_size=False):
|
||||
Whether or not to highlight a substring using <s></s>
|
||||
if its size is different from rest of the string. (Useful for
|
||||
super and subscripts.)
|
||||
strip_text : str, optional (default: '')
|
||||
Characters that should be stripped from a string before
|
||||
assigning it to a cell.
|
||||
|
||||
Returns
|
||||
-------
|
||||
@@ -416,14 +503,15 @@ def split_textline(table, textline, direction, flag_size=False):
|
||||
grouped_chars = []
|
||||
for key, chars in groupby(cut_text, itemgetter(0, 1)):
|
||||
if flag_size:
|
||||
grouped_chars.append((key[0], key[1], flag_font_size([t[2] for t in chars], direction)))
|
||||
grouped_chars.append((key[0], key[1],
|
||||
flag_font_size([t[2] for t in chars], direction, strip_text=strip_text)))
|
||||
else:
|
||||
gchars = [t[2].get_text() for t in chars]
|
||||
grouped_chars.append((key[0], key[1], ''.join(gchars).strip('\n')))
|
||||
grouped_chars.append((key[0], key[1], ''.join(gchars).strip(strip_text)))
|
||||
return grouped_chars
|
||||
|
||||
|
||||
def get_table_index(table, t, direction, split_text=False, flag_size=False):
|
||||
def get_table_index(table, t, direction, split_text=False, flag_size=False, strip_text='',):
|
||||
"""Gets indices of the table cell where given text object lies by
|
||||
comparing their y and x-coordinates.
|
||||
|
||||
@@ -441,6 +529,9 @@ def get_table_index(table, t, direction, split_text=False, flag_size=False):
|
||||
Whether or not to highlight a substring using <s></s>
|
||||
if its size is different from rest of the string. (Useful for
|
||||
super and subscripts)
|
||||
strip_text : str, optional (default: '')
|
||||
Characters that should be stripped from a string before
|
||||
assigning it to a cell.
|
||||
|
||||
Returns
|
||||
-------
|
||||
@@ -495,12 +586,12 @@ def get_table_index(table, t, direction, split_text=False, flag_size=False):
|
||||
error = ((X * (y0_offset + y1_offset)) + (Y * (x0_offset + x1_offset))) / charea
|
||||
|
||||
if split_text:
|
||||
return split_textline(table, t, direction, flag_size=flag_size), error
|
||||
return split_textline(table, t, direction, flag_size=flag_size, strip_text=strip_text), error
|
||||
else:
|
||||
if flag_size:
|
||||
return [(r_idx, c_idx, flag_font_size(t._objs, direction))], error
|
||||
return [(r_idx, c_idx, flag_font_size(t._objs, direction, strip_text=strip_text))], error
|
||||
else:
|
||||
return [(r_idx, c_idx, t.get_text().strip('\n'))], error
|
||||
return [(r_idx, c_idx, t.get_text().strip(strip_text))], error
|
||||
|
||||
|
||||
def compute_accuracy(error_weights):
|
||||
@@ -558,7 +649,7 @@ def compute_whitespace(d):
|
||||
|
||||
|
||||
def get_page_layout(filename, char_margin=1.0, line_margin=0.5, word_margin=0.1,
|
||||
detect_vertical=True, all_texts=True):
|
||||
detect_vertical=True, all_texts=True):
|
||||
"""Returns a PDFMiner LTPage object and page dimension of a single
|
||||
page pdf. See https://euske.github.io/pdfminer/ to get definitions
|
||||
of kwargs.
|
||||
|
||||
|
After Width: | Height: | Size: 20 KiB |
|
After Width: | Height: | Size: 20 KiB |
|
After Width: | Height: | Size: 68 KiB |
@@ -0,0 +1,96 @@
|
||||
"0","1","2","3","4","5","6","7","8","9","10"
|
||||
"Sl.
|
||||
No.","District","n
|
||||
o
|
||||
i
|
||||
t
|
||||
a
|
||||
l3
|
||||
opu2-1hs)
|
||||
P1k
|
||||
d 20 la
|
||||
er n
|
||||
cto(I
|
||||
ef
|
||||
j
|
||||
o
|
||||
r
|
||||
P","%
|
||||
8
|
||||
8
|
||||
o )
|
||||
s
|
||||
ult t tkh
|
||||
dna
|
||||
Aalen l
|
||||
v(I
|
||||
i
|
||||
u
|
||||
q
|
||||
E",")
|
||||
y
|
||||
n a
|
||||
umptiomentadult/donnes)
|
||||
nsres/h t
|
||||
ouimk
|
||||
Cqga
|
||||
al re00n L
|
||||
ot 4(I
|
||||
T @
|
||||
(","menteds, age)nes)
|
||||
uireg sewastton
|
||||
qn h
|
||||
Reudis &ak
|
||||
al cld L
|
||||
tnen
|
||||
To(Ife(I","","","","",""
|
||||
"","","","","","","f
|
||||
i
|
||||
r
|
||||
a
|
||||
h
|
||||
K","i
|
||||
b
|
||||
a
|
||||
R","l
|
||||
a
|
||||
t
|
||||
o
|
||||
T","e
|
||||
c
|
||||
i
|
||||
R","y
|
||||
d
|
||||
d
|
||||
a
|
||||
P"
|
||||
"1","Balasore","23.65","20.81","3.04","3.47","2.78","0.86","3.64","0.17","0.25"
|
||||
"2","Bhadrak","15.34","13.50","1.97","2.25","3.50","0.05","3.55","1.30","1.94"
|
||||
"3","Balangir","17.01","14.97","2.19","2.50","6.23","0.10","6.33","3.83","5.72"
|
||||
"4","Subarnapur","6.70","5.90","0.86","0.98","4.48","1.13","5.61","4.63","6.91"
|
||||
"5","Cuttack","26.63","23.43","3.42","3.91","3.75","0.06","3.81","-0.10","-0.15"
|
||||
"6","Jagatsingpur","11.49","10.11","1.48","1.69","2.10","0.02","2.12","0.43","0.64"
|
||||
"7","Jajpur","18.59","16.36","2.39","2.73","2.13","0.04","2.17","-0.56","-0.84"
|
||||
"8","Kendrapara","14.62","12.87","1.88","2.15","2.60","0.07","2.67","0.52","0.78"
|
||||
"9","Dhenkanal","12.13","10.67","1.56","1.78","2.26","0.02","2.28","0.50","0.75"
|
||||
"10","Angul","12.93","11.38","1.66","1.90","1.73","0.02","1.75","-0.15","-0.22"
|
||||
"11","Ganjam","35.77","31.48","4.60","5.26","4.57","0.00","4.57","-0.69","-1.03"
|
||||
"12","Gajapati","5.85","5.15","0.75","0.86","0.68","0.01","0.69","-0.17","-0.25"
|
||||
"13","Kalahandi","16.12","14.19","2.07","2.37","5.42","1.13","6.55","4.18","6.24"
|
||||
"14","Nuapada","6.18","5.44","0.79","0.90","1.98","0.08","2.06","1.16","1.73"
|
||||
"15","Keonjhar","18.42","16.21","2.37","2.71","2.76","0.08","2.84","0.13","0.19"
|
||||
"16","Koraput","14.09","12.40","1.81","2.07","2.08","0.34","2.42","0.35","0.52"
|
||||
"17","Malkangiri","6.31","5.55","0.81","0.93","1.78","0.04","1.82","0.89","1.33"
|
||||
"18","Nabarangpur","12.50","11.00","1.61","1.84","3.26","0.02","3.28","1.44","2.15"
|
||||
"19","Rayagada","9.83","8.65","1.26","1.44","1.15","0.03","1.18","-0.26","-0.39"
|
||||
"20","Mayurbhanj","25.61","22.54","3.29","3.76","4.90","0.06","4.96","1.20","1.79"
|
||||
"21","Kandhamal","7.45","6.56","0.96","1.10","0.70","0.01","0.71","-0.39","-0.58"
|
||||
"22","Boudh","4.51","3.97","0.58","0.66","1.73","0.03","1.76","1.10","1.64"
|
||||
"23","Puri","17.29","15.22","2.22","2.54","2.45","0.99","3.44","0.90","1.34"
|
||||
"24","Khordha","23.08","20.31","2.97","3.39","2.02","0.03","2.05","-1.34","-2.00"
|
||||
"25","Nayagarh","9.78","8.61","1.26","1.44","2.10","0.00","2.10","0.66","0.99"
|
||||
"26","Sambalpur","10.62","9.35","1.37","1.57","3.45","0.71","4.16","2.59","3.87"
|
||||
"27","Bargarh","15.00","13.20","1.93","2.21","6.87","2.65","9.52","7.31","10.91"
|
||||
"28","Deogarh","3.18","2.80","0.41","0.47","1.12","0.07","1.19","0.72","1.07"
|
||||
"29","Jharsuguda","5.91","5.20","0.76","0.87","0.99","0.01","1.00","0.13","0.19"
|
||||
"30","","","18.66","2.72","3.11","4.72","0.02","4.74","1.63","2.43"
|
||||
|
@@ -0,0 +1,56 @@
|
||||
"0","1","2","3","4","5","6","7"
|
||||
"Rate of Accidental Deaths & Suicides and Population Growth During 1967 to 2013","","","","","","",""
|
||||
"Sl.
|
||||
No.","Year","Population
|
||||
(in Lakh)","Accidental Deaths","","Suicides","","Percentage
|
||||
Population
|
||||
growth"
|
||||
"","","","Incidence","Rate","Incidence","Rate",""
|
||||
"(1)","(2)","(3)","(4)","(5)","(6)","(7)","(8)"
|
||||
"1.","1967","4999","126762","25.4","38829","7.8","2.2"
|
||||
"2.","1968","5111","126232","24.7","40688","8.0","2.2"
|
||||
"3.","1969","5225","130755","25.0","43633","8.4","2.2"
|
||||
"4.","1970","5343","139752","26.2","48428","9.1","2.3"
|
||||
"5.","1971","5512","105601","19.2","43675","7.9","3.2"
|
||||
"6.","1972","5635","106184","18.8","43601","7.7","2.2"
|
||||
"7.","1973","5759","130654","22.7","40807","7.1","2.2"
|
||||
"8.","1974","5883","110624","18.8","46008","7.8","2.2"
|
||||
"9.","1975","6008","113016","18.8","42890","7.1","2.1"
|
||||
"10.","1976","6136","111611","18.2","41415","6.7","2.1"
|
||||
"11.","1977","6258","117338","18.8","39718","6.3","2.0"
|
||||
"12.","1978","6384","118594","18.6","40207","6.3","2.0"
|
||||
"13.","1979","6510","108987","16.7","38217","5.9","2.0"
|
||||
"14.","1980","6636","116912","17.6","41663","6.3","1.9"
|
||||
"15.","1981","6840","122221","17.9","40245","5.9","3.1"
|
||||
"16.","1982","7052","125993","17.9","44732","6.3","3.1"
|
||||
"17.","1983","7204","128576","17.8","46579","6.5","2.2"
|
||||
"18.","1984","7356","134628","18.3","50571","6.9","2.1"
|
||||
"19.","1985","7509","139657","18.6","52811","7.0","2.1"
|
||||
"20.","1986","7661","147023","19.2","54357","7.1","2.0"
|
||||
"21.","1987","7814","152314","19.5","58568","7.5","2.0"
|
||||
"22.","1988","7966","163522","20.5","64270","8.1","1.9"
|
||||
"23.","1989","8118","169066","20.8","68744","8.5","1.9"
|
||||
"24.","1990","8270","174401","21.1","73911","8.9","1.9"
|
||||
"25.","1991","8496","188003","22.1","78450","9.2","2.7"
|
||||
"26.","1992","8677","194910","22.5","80149","9.2","2.1"
|
||||
"27.","1993","8838","192357","21.8","84244","9.5","1.9"
|
||||
"28.","1994","8997","190435","21.2","89195","9.9","1.8"
|
||||
"29.","1995","9160","222487","24.3","89178","9.7","1.8"
|
||||
"30.","1996","9319","220094","23.6","88241","9.5","1.7"
|
||||
"31.","1997","9552","233903","24.5","95829","10.0","2.5"
|
||||
"32.","1998","9709","258409","26.6","104713","10.8","1.6"
|
||||
"33.","1999","9866","271918","27.6","110587","11.2","1.6"
|
||||
"34.","2000","10021","255883","25.5","108593","10.8","1.6"
|
||||
"35.","2001","10270","271019","26.4","108506","10.6","2.5"
|
||||
"36.","2002","10506","260122","24.8","110417","10.5","2.3"
|
||||
"37.","2003","10682","259625","24.3","110851","10.4","1.7"
|
||||
"38.","2004","10856","277263","25.5","113697","10.5","1.6"
|
||||
"39.","2005","11028","294175","26.7","113914","10.3","1.6"
|
||||
"40.","2006","11198","314704","28.1","118112","10.5","1.5"
|
||||
"41.","2007","11366","340794","30.0","122637","10.8","1.5"
|
||||
"42.","2008","11531","342309","29.7","125017","10.8","1.4"
|
||||
"43.","2009","11694","357021","30.5","127151","10.9","1.4"
|
||||
"44.","2010","11858","384649","32.4","134599","11.4","1.4"
|
||||
"45.","2011","12102","390884","32.3","135585","11.2","2.1"
|
||||
"46.","2012","12134","394982","32.6","135445","11.2","1.0"
|
||||
"47.","2013","12288","400517","32.6","134799","11.0","1.0"
|
||||
|
@@ -0,0 +1,18 @@
|
||||
"0","1","2"
|
||||
"","e
|
||||
bl
|
||||
a
|
||||
ail
|
||||
v
|
||||
a
|
||||
|
||||
t
|
||||
o
|
||||
n
|
||||
|
||||
a
|
||||
t
|
||||
a
|
||||
D
|
||||
|
||||
*",""
|
||||
|
@@ -0,0 +1,3 @@
|
||||
"0"
|
||||
"Sl."
|
||||
"No."
|
||||
|
@@ -0,0 +1,3 @@
|
||||
"0"
|
||||
"Table 6 : DISTRIBUTION (%) OF HOUSEHOLDS BY LITERACY STATUS OF"
|
||||
"MALE HEAD OF THE HOUSEHOLD"
|
||||
|
@@ -1,3 +1,7 @@
|
||||
"[In thousands (11,062.6 represents 11,062,600) For year ending December 31. Based on Uniform Crime Reporting (UCR)","","","","","","","","",""
|
||||
"Program. Represents arrests reported (not charged) by 12,910 agencies with a total population of 247,526,916 as estimated","","","","","","","","",""
|
||||
"by the FBI. Some persons may be arrested more than once during a year, therefore, the data in this table, in some cases,","","","","","","","","",""
|
||||
"could represent multiple arrests of the same person. See text, this section and source]","","","","","","","","",""
|
||||
"","","Total","","","Male","","","Female",""
|
||||
"Offense charged","","Under 18","18 years","","Under 18","18 years","","Under 18","18 years"
|
||||
"","Total","years","and over","Total","years","and over","Total","years","and over"
|
||||
@@ -36,3 +40,4 @@
|
||||
"Curfew and loitering law violations ..","91.0","91.0","(X)","63.1","63.1","(X)","28.0","28.0","(X)"
|
||||
"Runaways . . . . . . . .. .. .. .. .. ....","75.8","75.8","(X)","34.0","34.0","(X)","41.8","41.8","(X)"
|
||||
"","– Represents zero. X Not applicable. 1 Buying, receiving, possessing stolen property. 2 Except forcible rape and prostitution.","","","","","","","",""
|
||||
"","Source: U.S. Department of Justice, Federal Bureau of Investigation, Uniform Crime Reports, Arrests Master Files.","","","","","","","",""
|
||||
|
||||
|
@@ -1,3 +1,7 @@
|
||||
"","Source: U.S. Department of Justice, Federal Bureau of Investigation, Uniform Crime Reports, Arrests Master Files.","","","",""
|
||||
"Table 325. Arrests by Race: 2009","","","","",""
|
||||
"[Based on Uniform Crime Reporting (UCR) Program. Represents arrests reported (not charged) by 12,371 agencies","","","","",""
|
||||
"with a total population of 239,839,971 as estimated by the FBI. See headnote, Table 324]","","","","",""
|
||||
"","","","","American",""
|
||||
"Offense charged","","","","Indian/Alaskan","Asian Pacific"
|
||||
"","Total","White","Black","Native","Islander"
|
||||
@@ -34,3 +38,4 @@
|
||||
"Curfew and loitering law violations . .. ... .. ....","89,578","54,439","33,207","872","1,060"
|
||||
"Runaways . . . . . . . .. .. .. .. .. .. .... .. ..... .","73,616","48,343","19,670","1,653","3,950"
|
||||
"1 Except forcible rape and prostitution.","","","","",""
|
||||
"","Source: U.S. Department of Justice, Federal Bureau of Investigation, “Crime in the United States, Arrests,” September 2010,","","","",""
|
||||
|
||||
|
@@ -1,35 +1,43 @@
|
||||
"","","","","","SCN","Seed","Yield","Moisture","Lodgingg","g","Stand","","Gross"
|
||||
"Company/Brandpy","","Product/Brand†","Technol.†","Mat.","Resist.","Trmt.†","Bu/A","%","%","","(x 1000)(",")","Income"
|
||||
"KrugerKruger","","K2-1901K2 1901","RR2YRR2Y","1.91.9","RR","Ac,PVAc,PV","56.456.4","7.67.6","00","","126.3126.3","","$846$846"
|
||||
"StineStine","","19RA02 §19RA02 §","RR2YRR2Y","1 91.9","RR","CMBCMB","55.355.3","7 67.6","00","","120 0120.0","","$830$830"
|
||||
"WensmanWensman","","W 3190NR2W 3190NR2","RR2YRR2Y","1 91.9","RR","AcAc","54 554.5","7 67.6","00","","119 5119.5","","$818$818"
|
||||
"H ftHefty","","H17Y12H17Y12","RR2YRR2Y","1 71.7","MRMR","II","53 753.7","7 77.7","00","","124 4124.4","","$806$806"
|
||||
"Dyna-Gro","","S15RY53","RR2Y","1.5","R","Ac","53.6","7.7","0","","126.8","","$804"
|
||||
"LG SeedsLG Seeds","","C2050R2C2050R2","RR2YRR2Y","2.12.1","RR","AcAc","53.653.6","7.77.7","00","","123.9123.9","","$804$804"
|
||||
"Titan ProTitan Pro","","19M4219M42","RR2YRR2Y","1.91.9","RR","CMBCMB","53.653.6","7.77.7","00","","121.0121.0","","$804$804"
|
||||
"StineStine","","19RA02 (2) §19RA02 (2) §","RR2YRR2Y","1 91.9","RR","CMBCMB","53 453.4","7 77.7","00","","123 9123.9","","$801$801"
|
||||
"AsgrowAsgrow","","AG1832 §AG1832 §","RR2YRR2Y","1 81.8","MRMR","Ac PVAc,PV","52 952.9","7 77.7","00","","122 0122.0","","$794$794"
|
||||
"Prairie Brandiid","","PB-1566R2662","RR2Y2","1.5","R","CMB","52.8","7.7","0","","122.9","","$792$"
|
||||
"Channel","","1901R2","RR2Y","1.9","R","Ac,PV,","52.8","7.6","0","","123.4","","$791$"
|
||||
"Titan ProTitan Pro","","20M120M1","RR2YRR2Y","2.02.0","RR","AmAm","52.552.5","7.57.5","00","","124.4124.4","","$788$788"
|
||||
"KrugerKruger","","K2-2002K2-2002","RR2YRR2Y","2 02.0","RR","Ac PVAc,PV","52 452.4","7 97.9","00","","125 4125.4","","$786$786"
|
||||
"ChannelChannel","","1700R21700R2","RR2YRR2Y","1 71.7","RR","Ac PVAc,PV","52 352.3","7 97.9","00","","123 9123.9","","$784$784"
|
||||
"H ftHefty","","H16Y11H16Y11","RR2YRR2Y","1 61.6","MRMR","II","51 451.4","7 67.6","00","","123 9123.9","","$771$771"
|
||||
"Anderson","","162R2Y","RR2Y","1.6","R","None","51.3","7.5","0","","119.5","","$770"
|
||||
"Titan ProTitan Pro","","15M2215M22","RR2YRR2Y","1.51.5","RR","CMBCMB","51.351.3","7.87.8","00","","125.4125.4","","$769$769"
|
||||
"DairylandDairyland","","DSR-1710R2YDSR-1710R2Y","RR2YRR2Y","1 71.7","RR","CMBCMB","51 351.3","7 77.7","00","","122 0122.0","","$769$769"
|
||||
"HeftyHefty","","H20R3H20R3","RR2YRR2Y","2 02.0","MRMR","II","50 550.5","8 28.2","00","","121 0121.0","","$757$757"
|
||||
"PPrairie BrandiiBd","","PB 1743R2PB-1743R2","RR2YRR2Y","1 71.7","RR","CMBCMB","50 250.2","7 77.7","00","","125 8125.8","","$752$752"
|
||||
"Gold Country","","1741","RR2Y","1.7","R","Ac","50.1","7.8","0","","123.9","","$751"
|
||||
"Trelaye ay","","20RR4303","RR2Y","2.00","R","Ac,Exc,","49.99 9","7.66","00","","127.88","","$749$9"
|
||||
"HeftyHefty","","H14R3H14R3","RR2YRR2Y","1.41.4","MRMR","II","49.749.7","7.77.7","00","","122.9122.9","","$746$746"
|
||||
"Prairie BrandPrairie Brand","","PB-2099NRR2PB-2099NRR2","RR2YRR2Y","2 02.0","RR","CMBCMB","49 649.6","7 87.8","00","","126 3126.3","","$743$743"
|
||||
"WensmanWensman","","W 3174NR2W 3174NR2","RR2YRR2Y","1 71.7","RR","AcAc","49 349.3","7 67.6","00","","122 5122.5","","$740$740"
|
||||
"KKruger","","K2 1602K2-1602","RR2YRR2Y","1 61.6","R","Ac,PV","48.78","7.66","00","","125.412","","$731$31"
|
||||
"NK Brand","","S18-C2 §§","RR2Y","1.8","R","CMB","48.7","7.7","0","","126.8","","$731$"
|
||||
"KrugerKruger","","K2-1902K2 1902","RR2YRR2Y","1.91.9","RR","Ac,PVAc,PV","48.748.7","7.57.5","00","","124.4124.4","","$730$730"
|
||||
"Prairie BrandPrairie Brand","","PB-1823R2PB-1823R2","RR2YRR2Y","1 81.8","RR","NoneNone","48 548.5","7 67.6","00","","121 0121.0","","$727$727"
|
||||
"Gold CountryGold Country","","15411541","RR2YRR2Y","1 51.5","RR","AcAc","48 448.4","7 67.6","00","","110 4110.4","","$726$726"
|
||||
"","","","","","","Test Average =","47 647.6","7 77.7","00","","122 9122.9","","$713$713"
|
||||
"","","","","","","LSD (0.10) =","5.7","0.3","ns","","37.8","","566.4"
|
||||
"","F.I.R.S.T. Managerg","","","","","C.V. =","8.8","2.9","","","56.4","","846.2"
|
||||
"","2012 BETTER VARIETIES Harvest Report for Minnesota Central [ MNCE ]2012 BETTER VARIETIES Harvest Report for Minnesota Central [ MNCE ]","","","","","","","","","","","","ALL SEASON TESTALL SEASON TEST",""
|
||||
"","Doug Toreen, Renville County, MN 55310 [ BIRD ISLAND ]Doug Toreen, Renville County, MN 55310","","","","","[ BIRD ISLAND ]","","","","","","","1.3 - 2.0 MAT. GROUP1.3 - 2.0 MAT. GROUP",""
|
||||
"PREVPREV. CROP/HERB:","CROP/HERB","C/ S","Corn / Surpass, RoundupR","d","","","","","","","","","","S2MNCE01S2MNCE01"
|
||||
"SOIL DESCRIPTION:","","C","Canisteo clay loam, mod. well drained, non-irrigated","","","","","","","","","","",""
|
||||
"SOIL CONDITIONS:","","","High P, high K, 6.7 pH, 3.9% OM, Low SCN","","","","","","","","","","","30"" ROW SPACING"
|
||||
"TILLAGE/CULTIVATION:TILLAGE/CULTIVATION:","","","conventional w/ fall tillconventional w/ fall till","","","","","","","","","","",""
|
||||
"PEST MANAGEMENT:PEST MANAGEMENT:","","Roundup twiceRoundup twice","","","","","","","","","","","",""
|
||||
"SEEDED - RATE:","","May 15M15","140,000 /A140 000 /A","","","","","","","","TOP 30 foTOP 30 for YIELD of 63 TESTED","","YIELD of 63 TESTED",""
|
||||
"HARVESTEDHARVESTED - STAND:","STAND","O t 3Oct 3","122 921 /A122,921 /A","","","","","","","","","AVERAGE of (3) REPLICATIONSAVERAGE of (3) REPLICATIONS","",""
|
||||
"","","","","","","SCN","Seed","Yield","Moisture","Lodgingg","g","Stand","","Gross"
|
||||
"","Company/Brandpy","Product/Brand†","","Technol.†","Mat.","Resist.","Trmt.†","Bu/A","%","%","","(x 1000)(",")","Income"
|
||||
"","KrugerKruger","K2-1901K2 1901","","RR2YRR2Y","1.91.9","RR","Ac,PVAc,PV","56.456.4","7.67.6","00","","126.3126.3","","$846$846"
|
||||
"","StineStine","19RA02 §19RA02 §","","RR2YRR2Y","1 91.9","RR","CMBCMB","55.355.3","7 67.6","00","","120 0120.0","","$830$830"
|
||||
"","WensmanWensman","W 3190NR2W 3190NR2","","RR2YRR2Y","1 91.9","RR","AcAc","54 554.5","7 67.6","00","","119 5119.5","","$818$818"
|
||||
"","H ftHefty","H17Y12H17Y12","","RR2YRR2Y","1 71.7","MRMR","II","53 753.7","7 77.7","00","","124 4124.4","","$806$806"
|
||||
"","Dyna-Gro","S15RY53","","RR2Y","1.5","R","Ac","53.6","7.7","0","","126.8","","$804"
|
||||
"","LG SeedsLG Seeds","C2050R2C2050R2","","RR2YRR2Y","2.12.1","RR","AcAc","53.653.6","7.77.7","00","","123.9123.9","","$804$804"
|
||||
"","Titan ProTitan Pro","19M4219M42","","RR2YRR2Y","1.91.9","RR","CMBCMB","53.653.6","7.77.7","00","","121.0121.0","","$804$804"
|
||||
"","StineStine","19RA02 (2) §19RA02 (2) §","","RR2YRR2Y","1 91.9","RR","CMBCMB","53 453.4","7 77.7","00","","123 9123.9","","$801$801"
|
||||
"","AsgrowAsgrow","AG1832 §AG1832 §","","RR2YRR2Y","1 81.8","MRMR","Ac PVAc,PV","52 952.9","7 77.7","00","","122 0122.0","","$794$794"
|
||||
"","Prairie Brandiid","PB-1566R2662","","RR2Y2","1.5","R","CMB","52.8","7.7","0","","122.9","","$792$"
|
||||
"","Channel","1901R2","","RR2Y","1.9","R","Ac,PV,","52.8","7.6","0","","123.4","","$791$"
|
||||
"","Titan ProTitan Pro","20M120M1","","RR2YRR2Y","2.02.0","RR","AmAm","52.552.5","7.57.5","00","","124.4124.4","","$788$788"
|
||||
"","KrugerKruger","K2-2002K2-2002","","RR2YRR2Y","2 02.0","RR","Ac PVAc,PV","52 452.4","7 97.9","00","","125 4125.4","","$786$786"
|
||||
"","ChannelChannel","1700R21700R2","","RR2YRR2Y","1 71.7","RR","Ac PVAc,PV","52 352.3","7 97.9","00","","123 9123.9","","$784$784"
|
||||
"","H ftHefty","H16Y11H16Y11","","RR2YRR2Y","1 61.6","MRMR","II","51 451.4","7 67.6","00","","123 9123.9","","$771$771"
|
||||
"","Anderson","162R2Y","","RR2Y","1.6","R","None","51.3","7.5","0","","119.5","","$770"
|
||||
"","Titan ProTitan Pro","15M2215M22","","RR2YRR2Y","1.51.5","RR","CMBCMB","51.351.3","7.87.8","00","","125.4125.4","","$769$769"
|
||||
"","DairylandDairyland","DSR-1710R2YDSR-1710R2Y","","RR2YRR2Y","1 71.7","RR","CMBCMB","51 351.3","7 77.7","00","","122 0122.0","","$769$769"
|
||||
"","HeftyHefty","H20R3H20R3","","RR2YRR2Y","2 02.0","MRMR","II","50 550.5","8 28.2","00","","121 0121.0","","$757$757"
|
||||
"","PPrairie BrandiiBd","PB 1743R2PB-1743R2","","RR2YRR2Y","1 71.7","RR","CMBCMB","50 250.2","7 77.7","00","","125 8125.8","","$752$752"
|
||||
"","Gold Country","1741","","RR2Y","1.7","R","Ac","50.1","7.8","0","","123.9","","$751"
|
||||
"","Trelaye ay","20RR4303","","RR2Y","2.00","R","Ac,Exc,","49.99 9","7.66","00","","127.88","","$749$9"
|
||||
"","HeftyHefty","H14R3H14R3","","RR2YRR2Y","1.41.4","MRMR","II","49.749.7","7.77.7","00","","122.9122.9","","$746$746"
|
||||
"","Prairie BrandPrairie Brand","PB-2099NRR2PB-2099NRR2","","RR2YRR2Y","2 02.0","RR","CMBCMB","49 649.6","7 87.8","00","","126 3126.3","","$743$743"
|
||||
"","WensmanWensman","W 3174NR2W 3174NR2","","RR2YRR2Y","1 71.7","RR","AcAc","49 349.3","7 67.6","00","","122 5122.5","","$740$740"
|
||||
"","KKruger","K2 1602K2-1602","","RR2YRR2Y","1 61.6","R","Ac,PV","48.78","7.66","00","","125.412","","$731$31"
|
||||
"","NK Brand","S18-C2 §§","","RR2Y","1.8","R","CMB","48.7","7.7","0","","126.8","","$731$"
|
||||
"","KrugerKruger","K2-1902K2 1902","","RR2YRR2Y","1.91.9","RR","Ac,PVAc,PV","48.748.7","7.57.5","00","","124.4124.4","","$730$730"
|
||||
"","Prairie BrandPrairie Brand","PB-1823R2PB-1823R2","","RR2YRR2Y","1 81.8","RR","NoneNone","48 548.5","7 67.6","00","","121 0121.0","","$727$727"
|
||||
"","Gold CountryGold Country","15411541","","RR2YRR2Y","1 51.5","RR","AcAc","48 448.4","7 67.6","00","","110 4110.4","","$726$726"
|
||||
"","","","","","","","Test Average =","47 647.6","7 77.7","00","","122 9122.9","","$713$713"
|
||||
"","","","","","","","LSD (0.10) =","5.7","0.3","ns","","37.8","","566.4"
|
||||
|
||||
|
@@ -0,0 +1,39 @@
|
||||
"TILLAGE/CULTIVATION:TILLAGE/CULTIVATION:","","conventional w/ fall tillconventional w/ fall till","","","","","","","","","","",""
|
||||
"PEST MANAGEMENT:PEST MANAGEMENT:","","Roundup twiceRoundup twice","","","","","","","","","","",""
|
||||
"SEEDED - RATE:","","May 15M15","140,000 /A140 000 /A","","","","","","","TOP 30 foTOP 30 for YIELD of 63 TESTED","","YIELD of 63 TESTED",""
|
||||
"HARVESTEDHARVESTED - STAND:STAND","","O t 3Oct 3","122 921 /A122,921 /A","","","","","","","","AVERAGE of (3) REPLICATIONSAVERAGE of (3) REPLICATIONS","",""
|
||||
"","","","","","SCN","Seed","Yield","Moisture","Lodgingg","g","Stand","","Gross"
|
||||
"Company/Brandpy","","Product/Brand†","Technol.†","Mat.","Resist.","Trmt.†","Bu/A","%","%","","(x 1000)(",")","Income"
|
||||
"KrugerKruger","","K2-1901K2 1901","RR2YRR2Y","1.91.9","RR","Ac,PVAc,PV","56.456.4","7.67.6","00","","126.3126.3","","$846$846"
|
||||
"StineStine","","19RA02 §19RA02 §","RR2YRR2Y","1 91.9","RR","CMBCMB","55.355.3","7 67.6","00","","120 0120.0","","$830$830"
|
||||
"WensmanWensman","","W 3190NR2W 3190NR2","RR2YRR2Y","1 91.9","RR","AcAc","54 554.5","7 67.6","00","","119 5119.5","","$818$818"
|
||||
"H ftHefty","","H17Y12H17Y12","RR2YRR2Y","1 71.7","MRMR","II","53 753.7","7 77.7","00","","124 4124.4","","$806$806"
|
||||
"Dyna-Gro","","S15RY53","RR2Y","1.5","R","Ac","53.6","7.7","0","","126.8","","$804"
|
||||
"LG SeedsLG Seeds","","C2050R2C2050R2","RR2YRR2Y","2.12.1","RR","AcAc","53.653.6","7.77.7","00","","123.9123.9","","$804$804"
|
||||
"Titan ProTitan Pro","","19M4219M42","RR2YRR2Y","1.91.9","RR","CMBCMB","53.653.6","7.77.7","00","","121.0121.0","","$804$804"
|
||||
"StineStine","","19RA02 (2) §19RA02 (2) §","RR2YRR2Y","1 91.9","RR","CMBCMB","53 453.4","7 77.7","00","","123 9123.9","","$801$801"
|
||||
"AsgrowAsgrow","","AG1832 §AG1832 §","RR2YRR2Y","1 81.8","MRMR","Ac PVAc,PV","52 952.9","7 77.7","00","","122 0122.0","","$794$794"
|
||||
"Prairie Brandiid","","PB-1566R2662","RR2Y2","1.5","R","CMB","52.8","7.7","0","","122.9","","$792$"
|
||||
"Channel","","1901R2","RR2Y","1.9","R","Ac,PV,","52.8","7.6","0","","123.4","","$791$"
|
||||
"Titan ProTitan Pro","","20M120M1","RR2YRR2Y","2.02.0","RR","AmAm","52.552.5","7.57.5","00","","124.4124.4","","$788$788"
|
||||
"KrugerKruger","","K2-2002K2-2002","RR2YRR2Y","2 02.0","RR","Ac PVAc,PV","52 452.4","7 97.9","00","","125 4125.4","","$786$786"
|
||||
"ChannelChannel","","1700R21700R2","RR2YRR2Y","1 71.7","RR","Ac PVAc,PV","52 352.3","7 97.9","00","","123 9123.9","","$784$784"
|
||||
"H ftHefty","","H16Y11H16Y11","RR2YRR2Y","1 61.6","MRMR","II","51 451.4","7 67.6","00","","123 9123.9","","$771$771"
|
||||
"Anderson","","162R2Y","RR2Y","1.6","R","None","51.3","7.5","0","","119.5","","$770"
|
||||
"Titan ProTitan Pro","","15M2215M22","RR2YRR2Y","1.51.5","RR","CMBCMB","51.351.3","7.87.8","00","","125.4125.4","","$769$769"
|
||||
"DairylandDairyland","","DSR-1710R2YDSR-1710R2Y","RR2YRR2Y","1 71.7","RR","CMBCMB","51 351.3","7 77.7","00","","122 0122.0","","$769$769"
|
||||
"HeftyHefty","","H20R3H20R3","RR2YRR2Y","2 02.0","MRMR","II","50 550.5","8 28.2","00","","121 0121.0","","$757$757"
|
||||
"PPrairie BrandiiBd","","PB 1743R2PB-1743R2","RR2YRR2Y","1 71.7","RR","CMBCMB","50 250.2","7 77.7","00","","125 8125.8","","$752$752"
|
||||
"Gold Country","","1741","RR2Y","1.7","R","Ac","50.1","7.8","0","","123.9","","$751"
|
||||
"Trelaye ay","","20RR4303","RR2Y","2.00","R","Ac,Exc,","49.99 9","7.66","00","","127.88","","$749$9"
|
||||
"HeftyHefty","","H14R3H14R3","RR2YRR2Y","1.41.4","MRMR","II","49.749.7","7.77.7","00","","122.9122.9","","$746$746"
|
||||
"Prairie BrandPrairie Brand","","PB-2099NRR2PB-2099NRR2","RR2YRR2Y","2 02.0","RR","CMBCMB","49 649.6","7 87.8","00","","126 3126.3","","$743$743"
|
||||
"WensmanWensman","","W 3174NR2W 3174NR2","RR2YRR2Y","1 71.7","RR","AcAc","49 349.3","7 67.6","00","","122 5122.5","","$740$740"
|
||||
"KKruger","","K2 1602K2-1602","RR2YRR2Y","1 61.6","R","Ac,PV","48.78","7.66","00","","125.412","","$731$31"
|
||||
"NK Brand","","S18-C2 §§","RR2Y","1.8","R","CMB","48.7","7.7","0","","126.8","","$731$"
|
||||
"KrugerKruger","","K2-1902K2 1902","RR2YRR2Y","1.91.9","RR","Ac,PVAc,PV","48.748.7","7.57.5","00","","124.4124.4","","$730$730"
|
||||
"Prairie BrandPrairie Brand","","PB-1823R2PB-1823R2","RR2YRR2Y","1 81.8","RR","NoneNone","48 548.5","7 67.6","00","","121 0121.0","","$727$727"
|
||||
"Gold CountryGold Country","","15411541","RR2YRR2Y","1 51.5","RR","AcAc","48 448.4","7 67.6","00","","110 4110.4","","$726$726"
|
||||
"","","","","","","Test Average =","47 647.6","7 77.7","00","","122 9122.9","","$713$713"
|
||||
"","","","","","","LSD (0.10) =","5.7","0.3","ns","","37.8","","566.4"
|
||||
"","F.I.R.S.T. Managerg","","","","","C.V. =","8.8","2.9","","","56.4","","846.2"
|
||||
|
@@ -0,0 +1,66 @@
|
||||
"0","1","2","3","4"
|
||||
"","DLHS-4 (2012-13)","","DLHS-3 (2007-08)",""
|
||||
"Indicators","TOTAL","RURAL","TOTAL","RURAL"
|
||||
"Child feeding practices (based on last-born child in the reference period) (%)","","","",""
|
||||
"Children age 0-5 months exclusively breastfed9 .......................................................................... 76.9 80.0
|
||||
Children age 6-9 months receiving solid/semi-solid food and breast milk .................................... 78.6 75.0
|
||||
Children age 12-23 months receiving breast feeding along with complementary feeding ........... 31.8 24.2
|
||||
Children age 6-35 months exclusively breastfed for at least 6 months ........................................ 4.7 3.4
|
||||
Children under 3 years breastfed within one hour of birth ............................................................ 42.9 46.5","","","NA","NA"
|
||||
"","","","85.9","89.3"
|
||||
"","","","NA","NA"
|
||||
"","","","30.0","27.7"
|
||||
"","","","50.6","52.9"
|
||||
"Birth Weight (%) (age below 36 months)","","","",""
|
||||
"Percentage of Children weighed at birth ...................................................................................... 38.8 41.0 NA NA
|
||||
Percentage of Children with low birth weight (out of those who weighted) ( below 2.5 kg) ......... 12.8 14.6 NA NA","","","",""
|
||||
"Awareness about Diarrhoea (%)","","","",""
|
||||
"Women know about what to do when a child gets diarrhoea ..................................................... 96.3 96.2","","","94.4","94.2"
|
||||
"Awareness about ARI (%)","","","",""
|
||||
"Women aware about danger signs of ARI10 ................................................................................. 55.9 59.7","","","32.8","34.7"
|
||||
"Treatment of childhood diseases (based on last two surviving children born during the","","","",""
|
||||
"","","","",""
|
||||
"reference period) (%)","","","",""
|
||||
"","","","",""
|
||||
"Prevalence of diarrhoea in last 2 weeks for under 5 years old children ....................................... 1.6 1.3 6.5 7.0
|
||||
Children with diarrhoea in the last 2 weeks and received ORS11 ................................................. 100.0 100.0 54.8 53.3
|
||||
Children with diarrhoea in the last 2 weeks and sought advice/treatment ................................... 100.0 50.0 72.9 73.3
|
||||
Prevalence of ARI in last 2 weeks for under 5 years old children ............................................ 4.3 3.9 3.9 4.2
|
||||
Children with acute respiratory infection or fever in last 2 weeks and sought advice/treatment 37.5 33.3 69.8 68.0
|
||||
Children with diarrhoea in the last 2 weeks given Zinc along with ORS ...................................... 66.6 50.0 NA NA","","","6.5","7.0"
|
||||
"","","","54.8","53.3"
|
||||
"","","","72.9","73.3"
|
||||
"","","","3.9","4.2"
|
||||
"","","","69.8","68.0"
|
||||
"Awareness of RTI/STI and HIV/AIDS (%)","","","",""
|
||||
"Women who have heard of RTI/STI ............................................................................................. 55.8 57.1
|
||||
Women who have heard of HIV/AIDS .......................................................................................... 98.9 99.0
|
||||
Women who have any symptoms of RTI/STI .............................................................................. 13.9 13.5
|
||||
Women who know the place to go for testing of HIV/AIDS12 ....................................................... 59.9 57.1
|
||||
Women underwent test for detecting HIV/AIDS12 ........................................................................ 37.3 36.8","","","34.8","38.2"
|
||||
"","","","98.3","98.1"
|
||||
"","","","15.6","16.1"
|
||||
"","","","48.6","46.3"
|
||||
"","","","14.1","12.3"
|
||||
"Utilization of Government Health Services (%)","","","",""
|
||||
"Antenatal care .............................................................................................................................. 69.7 66.7 79.0 81.0
|
||||
Treatment for pregnancy complications ....................................................................................... 57.1 59.3 88.0 87.8
|
||||
Treatment for post-delivery complications ................................................................................... 33.3 33.3 68.4 68.4
|
||||
Treatment for vaginal discharge ................................................................................................... 20.0 25.0 73.9 71.4
|
||||
Treatment for children with diarrhoea13 ........................................................................................ 50.0 100.0 NA NA
|
||||
Treatment for children with ARI13 ................................................................................................. NA NA NA NA","","","79.0","81.0"
|
||||
"","","","88.0","87.8"
|
||||
"","","","68.4","68.4"
|
||||
"","","","73.9","71.4"
|
||||
"Birth Registration (%)","","","",""
|
||||
"Children below age 5 years having birth registration done .......................................................... 40.6 44.3 NA NA
|
||||
Children below age 5 years who received birth certificate (out of those registered) .................... 65.9 63.6 NA NA","","","",""
|
||||
"Personal Habits (age 15 years and above) (%)","","","",""
|
||||
"Men who use any kind of smokeless tobacco ............................................................................. 74.6 74.2 NA NA
|
||||
Women who use any kind of smokeless tobacco ........................................................................ 59.5 58.9 NA NA
|
||||
Men who smoke ........................................................................................................................... 56.0 56.4 NA NA
|
||||
Women who smoke ...................................................................................................................... 18.4 18.0 NA NA
|
||||
Men who consume alcohol ........................................................................................................... 58.4 58.2 NA NA
|
||||
Women who consume alcohol ..................................................................................................... 10.9 9.3 NA NA","","","",""
|
||||
"9 Children Who were given nothing but breast milk till the survey date 10Acute Respiratory Infections11Oral Rehydration Solutions/Salts.12Based on","","","",""
|
||||
"the women who have heard of HIV/AIDS.13 Last two weeks","","","",""
|
||||
|
@@ -0,0 +1,44 @@
|
||||
"0","1","2","3","4","5","6","7","8","9","10","11","12","13","14","15","16","17","18","19","20","21","22","23"
|
||||
"","Table: 5 Public Health Outlay 2012-13 (Budget Estimates) (Rs. in 000)","","","","","","","","","","","","","","","","","","","","","",""
|
||||
"","States-A","","","Revenue","","","","","","Capital","","","","","","Total","","","Others(1)","","","Total",""
|
||||
"","","","","","","","","","","","","","","","","Revenue &","","","","","","",""
|
||||
"","","","Medical & Family Medical & Family
|
||||
Public Welfare Public Welfare
|
||||
Health Health","","","","","","","","","","","","","","","","","","","",""
|
||||
"","","","","","","","","","","","","","","","","Capital","","","","","","",""
|
||||
"","","","","","","","","","","","","","","","","","","","","","","",""
|
||||
"","Andhra Pradesh","","","47,824,589","","","9,967,837","","","1,275,000","","","15,000","","","59,082,426","","","14,898,243","","","73,980,669",""
|
||||
"","","","","","","","","","","","","","","","","","","","","","","",""
|
||||
"Arunachal Pradesh 2,241,609 107,549 23,000 0 2,372,158 86,336 2,458,494","","","","","","","","","","","","","","","","","","","","","","",""
|
||||
"","Assam","","","14,874,821","","","2,554,197","","","161,600","","","0","","","17,590,618","","","4,408,505","","","21,999,123",""
|
||||
"","","","","","","","","","","","","","","","","","","","","","","",""
|
||||
"Bihar 21,016,708 4,332,141 5,329,000 0 30,677,849 2,251,571 32,929,420","","","","","","","","","","","","","","","","","","","","","","",""
|
||||
"","Chhattisgarh","","","11,427,311","","","1,415,660","","","2,366,592","","","0","","","15,209,563","","","311,163","","","15,520,726",""
|
||||
"","","","","","","","","","","","","","","","","","","","","","","",""
|
||||
"Delhi 28,084,780 411,700 4,550,000 0 33,046,480 5,000 33,051,480","","","","","","","","","","","","","","","","","","","","","","",""
|
||||
"","Goa","","","4,055,567","","","110,000","","","330,053","","","0","","","4,495,620","","","12,560","","","4,508,180",""
|
||||
"","","","","","","","","","","","","","","","","","","","","","","",""
|
||||
"Gujarat 26,328,400 6,922,900 12,664,000 42,000 45,957,300 455,860 46,413,160","","","","","","","","","","","","","","","","","","","","","","",""
|
||||
"","Haryana","","","15,156,681","","","1,333,527","","","40,100","","","0","","","16,530,308","","","1,222,698","","","17,753,006",""
|
||||
"","","","","","","","","","","","","","","","","","","","","","","",""
|
||||
"Himachal Pradesh 8,647,229 1,331,529 580,800 0 10,559,558 725,315 11,284,873","","","","","","","","","","","","","","","","","","","","","","",""
|
||||
"","Jammu & Kashmir","","","14,411,984","","","270,840","","","3,188,550","","","0","","","17,871,374","","","166,229","","","18,037,603",""
|
||||
"","","","","","","","","","","","","","","","","","","","","","","",""
|
||||
"Jharkhand 8,185,079 3,008,077 3,525,558 0 14,718,714 745,139 15,463,853","","","","","","","","","","","","","","","","","","","","","","",""
|
||||
"","Karnataka","","","34,939,843","","","4,317,801","","","3,669,700","","","0","","","42,927,344","","","631,088","","","43,558,432",""
|
||||
"","","","","","","","","","","","","","","","","","","","","","","",""
|
||||
"Kerala 27,923,965 3,985,473 929,503 0 32,838,941 334,640 33,173,581","","","","","","","","","","","","","","","","","","","","","","",""
|
||||
"","Madhya Pradesh","","","28,459,540","","","4,072,016","","","3,432,711","","","0","","","35,964,267","","","472,139","","","36,436,406",""
|
||||
"","","","","","","","","","","","","","","","","","","","","","","",""
|
||||
"Maharashtra 55,011,100 6,680,721 5,038,576 0 66,730,397 313,762 67,044,159","","","","","","","","","","","","","","","","","","","","","","",""
|
||||
"","Manipur","","","2,494,600","","","187,700","","","897,400","","","0","","","3,579,700","","","0","","","3,579,700",""
|
||||
"","","","","","","","","","","","","","","","","","","","","","","",""
|
||||
"Meghalaya 2,894,093 342,893 705,500 5,000 3,947,486 24,128 3,971,614","","","","","","","","","","","","","","","","","","","","","","",""
|
||||
"","Mizoram","","","1,743,501","","","84,185","","","10,250","","","0","","","1,837,936","","","17,060","","","1,854,996",""
|
||||
"","","","","","","","","","","","","","","","","","","","","","","",""
|
||||
"Nagaland 2,368,724 204,329 226,400 0 2,799,453 783,054 3,582,507","","","","","","","","","","","","","","","","","","","","","","",""
|
||||
"","Odisha","","","14,317,179","","","2,552,292","","","1,107,250","","","0","","","17,976,721","","","451,438","","","18,428,159",""
|
||||
"","","","","","","","","","","","","","","","","","","","","","","",""
|
||||
"Puducherry 4,191,757 52,249 192,400 0 4,436,406 2,173 4,438,579","","","","","","","","","","","","","","","","","","","","","","",""
|
||||
"","Punjab","","","19,775,485","","","2,208,343","","","2,470,882","","","0","","","24,454,710","","","1,436,522","","","25,891,232",""
|
||||
"","","","","","","","","","","","","","","","","","","","","","","",""
|
||||
|
@@ -0,0 +1,71 @@
|
||||
"0","1","2","3","4"
|
||||
"","DLHS-4 (2012-13)","","DLHS-3 (2007-08)",""
|
||||
"Indicators","TOTAL","RURAL","TOTAL","RURAL"
|
||||
"Reported Prevalence of Morbidity","","","",""
|
||||
"Any Injury ..................................................................................................................................... 1.9 2.1
|
||||
Acute Illness ................................................................................................................................. 4.5 5.6
|
||||
Chronic Illness .............................................................................................................................. 5.1 4.1","","","",""
|
||||
"","","","",""
|
||||
"","","","",""
|
||||
"Reported Prevalence of Chronic Illness during last one year (%)","","","",""
|
||||
"Disease of respiratory system ...................................................................................................... 11.7 15.0
|
||||
Disease of cardiovascular system ................................................................................................ 8.9 9.3
|
||||
Persons suffering from tuberculosis ............................................................................................. 2.2 1.5","","","",""
|
||||
"","","","",""
|
||||
"","","","",""
|
||||
"Anaemia Status by Haemoglobin Level14 (%)","","","",""
|
||||
"Children (6-59 months) having anaemia ...................................................................................... 68.5 71.9
|
||||
Children (6-59 months) having severe anaemia .......................................................................... 6.7 9.4
|
||||
Children (6-9 Years) having anaemia - Male ................................................................................ 67.1 71.4
|
||||
Children (6-9 Years) having severe anaemia - Male .................................................................... 4.4 2.4
|
||||
Children (6-9 Years) having anaemia - Female ........................................................................... 52.4 48.8
|
||||
Children (6-9 Years) having severe anaemia - Female ................................................................ 1.2 0.0
|
||||
Children (6-14 years) having anaemia - Male ............................................................................. 50.8 62.5
|
||||
Children (6-14 years) having severe anaemia - Male .................................................................. 3.7 3.6
|
||||
Children (6-14 years) having anaemia - Female ......................................................................... 48.3 50.0
|
||||
Children (6-14 years) having severe anaemia - Female .............................................................. 4.3 6.1
|
||||
Children (10-19 Years15) having anaemia - Male ......................................................................... 37.9 51.2
|
||||
Children (10-19 Years15) having severe anaemia - Male ............................................................. 3.5 4.0
|
||||
Children (10-19 Years15) having anaemia - Female ..................................................................... 46.6 52.1
|
||||
Children (10-19 Years15) having severe anaemia - Female ......................................................... 6.4 6.5
|
||||
Adolescents (15-19 years) having anaemia ................................................................................ 39.4 46.5
|
||||
Adolescents (15-19 years) having severe anaemia ..................................................................... 5.4 5.1
|
||||
Pregnant women (15-49 aged) having anaemia .......................................................................... 48.8 51.5
|
||||
Pregnant women (15-49 aged) having severe anaemia .............................................................. 7.1 8.8
|
||||
Women (15-49 aged) having anaemia ......................................................................................... 45.2 51.7
|
||||
Women (15-49 aged) having severe anaemia ............................................................................. 4.8 5.9
|
||||
Persons (20 years and above) having anaemia ........................................................................... 37.8 42.1
|
||||
Persons (20 years and above) having Severe anaemia .............................................................. 4.6 4.8","","","",""
|
||||
"","","","",""
|
||||
"","","","",""
|
||||
"","","","",""
|
||||
"","","","",""
|
||||
"","","","",""
|
||||
"","","","",""
|
||||
"","","","",""
|
||||
"","","","",""
|
||||
"","","","",""
|
||||
"","","","",""
|
||||
"","","","",""
|
||||
"","","","",""
|
||||
"","","","",""
|
||||
"","","","",""
|
||||
"","","","",""
|
||||
"","","","",""
|
||||
"","","","",""
|
||||
"","","","",""
|
||||
"","","","",""
|
||||
"","","","",""
|
||||
"","","","",""
|
||||
"Blood Sugar Level (age 18 years and above) (%)","","","",""
|
||||
"Blood Sugar Level >140 mg/dl (high) ........................................................................................... 12.9 11.1
|
||||
Blood Sugar Level >160 mg/dl (very high) ................................................................................... 7.0 5.1","","","",""
|
||||
"","","","",""
|
||||
"Hypertension (age 18 years and above) (%)","","","",""
|
||||
"Above Normal Range (Systolic >140 mm of Hg & Diastolic >90 mm of Hg ) .............................. 23.8 22.8
|
||||
Moderately High (Systolic >160 mm of Hg & Diastolic >100 mm of Hg ) ..................................... 8.2 7.1
|
||||
Very High (Systolic >180 mm of Hg & Diastolic >110 mm of Hg ) ............................................... 3.7 3.1","","","",""
|
||||
"","","","",""
|
||||
"","","","",""
|
||||
"14 Any anaemia below 11g/dl, severe anaemia below 7g/dl. 15 Excluding age group 19 years","","","",""
|
||||
"Chronic Illness :Any person with symptoms persisting for longer than one month is defined as suffering from chronic illness","","","",""
|
||||
|
@@ -24,6 +24,12 @@ To process background lines, you can pass ``process_background=True``.
|
||||
>>> tables = camelot.read_pdf('background_lines.pdf', process_background=True)
|
||||
>>> tables[1].df
|
||||
|
||||
.. tip::
|
||||
Here's how you can do the same with the :ref:`command-line interface <cli>`.
|
||||
::
|
||||
|
||||
$ camelot lattice -back background_lines.pdf
|
||||
|
||||
.. csv-table::
|
||||
:file: ../_static/csv/background_lines.csv
|
||||
|
||||
@@ -41,8 +47,9 @@ You can specify the type of element you want to plot using the ``kind`` keyword
|
||||
- 'contour'
|
||||
- 'line'
|
||||
- 'joint'
|
||||
- 'textedge'
|
||||
|
||||
.. note:: The last three plot types can only be used with :ref:`Lattice <lattice>`, i.e. when ``flavor='lattice'``.
|
||||
.. note:: 'line' and 'joint' can only be used with :ref:`Lattice <lattice>` and 'textedge' can only be used with :ref:`Stream <stream>`.
|
||||
|
||||
Let's generate a plot for each type using this `PDF <../_static/pdf/foo.pdf>`__ as an example. First, let's get all the tables out.
|
||||
|
||||
@@ -62,6 +69,12 @@ Let's plot all the text present on the table's PDF page.
|
||||
>>> camelot.plot(tables[0], kind='text')
|
||||
>>> plt.show()
|
||||
|
||||
.. tip::
|
||||
Here's how you can do the same with the :ref:`command-line interface <cli>`.
|
||||
::
|
||||
|
||||
$ camelot lattice -plot text foo.pdf
|
||||
|
||||
.. figure:: ../_static/png/plot_text.png
|
||||
:height: 674
|
||||
:width: 1366
|
||||
@@ -83,6 +96,12 @@ Let's plot the table (to see if it was detected correctly or not). This plot typ
|
||||
>>> camelot.plot(tables[0], kind='grid')
|
||||
>>> plt.show()
|
||||
|
||||
.. tip::
|
||||
Here's how you can do the same with the :ref:`command-line interface <cli>`.
|
||||
::
|
||||
|
||||
$ camelot lattice -plot grid foo.pdf
|
||||
|
||||
.. figure:: ../_static/png/plot_table.png
|
||||
:height: 674
|
||||
:width: 1366
|
||||
@@ -102,6 +121,12 @@ Now, let's plot all table boundaries present on the table's PDF page.
|
||||
>>> camelot.plot(tables[0], kind='contour')
|
||||
>>> plt.show()
|
||||
|
||||
.. tip::
|
||||
Here's how you can do the same with the :ref:`command-line interface <cli>`.
|
||||
::
|
||||
|
||||
$ camelot lattice -plot contour foo.pdf
|
||||
|
||||
.. figure:: ../_static/png/plot_contour.png
|
||||
:height: 674
|
||||
:width: 1366
|
||||
@@ -119,6 +144,12 @@ Cool, let's plot all line segments present on the table's PDF page.
|
||||
>>> camelot.plot(tables[0], kind='line')
|
||||
>>> plt.show()
|
||||
|
||||
.. tip::
|
||||
Here's how you can do the same with the :ref:`command-line interface <cli>`.
|
||||
::
|
||||
|
||||
$ camelot lattice -plot line foo.pdf
|
||||
|
||||
.. figure:: ../_static/png/plot_line.png
|
||||
:height: 674
|
||||
:width: 1366
|
||||
@@ -136,6 +167,12 @@ Finally, let's plot all line intersections present on the table's PDF page.
|
||||
>>> camelot.plot(tables[0], kind='joint')
|
||||
>>> plt.show()
|
||||
|
||||
.. tip::
|
||||
Here's how you can do the same with the :ref:`command-line interface <cli>`.
|
||||
::
|
||||
|
||||
$ camelot lattice -plot joint foo.pdf
|
||||
|
||||
.. figure:: ../_static/png/plot_joint.png
|
||||
:height: 674
|
||||
:width: 1366
|
||||
@@ -143,6 +180,29 @@ Finally, let's plot all line intersections present on the table's PDF page.
|
||||
:alt: A plot of all line intersections on a PDF page
|
||||
:align: left
|
||||
|
||||
textedge
|
||||
^^^^^^^^
|
||||
|
||||
You can also visualize the textedges found on a page by specifying ``kind='textedge'``. To know more about what a "textedge" is, you can see pages 20, 35 and 40 of `Anssi Nurminen's master's thesis <http://dspace.cc.tut.fi/dpub/bitstream/handle/123456789/21520/Nurminen.pdf?sequence=3>`_.
|
||||
|
||||
::
|
||||
|
||||
>>> camelot.plot(tables[0], kind='textedge')
|
||||
>>> plt.show()
|
||||
|
||||
.. tip::
|
||||
Here's how you can do the same with the :ref:`command-line interface <cli>`.
|
||||
::
|
||||
|
||||
$ camelot stream -plot textedge foo.pdf
|
||||
|
||||
.. figure:: ../_static/png/plot_textedge.png
|
||||
:height: 674
|
||||
:width: 1366
|
||||
:scale: 50%
|
||||
:alt: A plot of relevant textedges on a PDF page
|
||||
:align: left
|
||||
|
||||
Specify table areas
|
||||
-------------------
|
||||
|
||||
@@ -157,6 +217,12 @@ Table areas that you want Camelot to analyze can be passed as a list of comma-se
|
||||
>>> tables = camelot.read_pdf('table_areas.pdf', flavor='stream', table_areas=['316,499,566,337'])
|
||||
>>> tables[0].df
|
||||
|
||||
.. tip::
|
||||
Here's how you can do the same with the :ref:`command-line interface <cli>`.
|
||||
::
|
||||
|
||||
$ camelot stream -T 316,499,566,337 table_areas.pdf
|
||||
|
||||
.. csv-table::
|
||||
:file: ../_static/csv/table_areas.csv
|
||||
|
||||
@@ -178,6 +244,12 @@ Let's get back to the *x* coordinates we got from plotting the text that exists
|
||||
>>> tables = camelot.read_pdf('column_separators.pdf', flavor='stream', columns=['72,95,209,327,442,529,566,606,683'])
|
||||
>>> tables[0].df
|
||||
|
||||
.. tip::
|
||||
Here's how you can do the same with the :ref:`command-line interface <cli>`.
|
||||
::
|
||||
|
||||
$ camelot stream -C 72,95,209,327,442,529,566,606,683 column_separators.pdf
|
||||
|
||||
.. csv-table::
|
||||
|
||||
"...","...","...","...","...","...","...","...","...","..."
|
||||
@@ -197,6 +269,12 @@ To deal with cases like the output from the previous section, you can pass ``spl
|
||||
>>> tables = camelot.read_pdf('column_separators.pdf', flavor='stream', columns=['72,95,209,327,442,529,566,606,683'], split_text=True)
|
||||
>>> tables[0].df
|
||||
|
||||
.. tip::
|
||||
Here's how you can do the same with the :ref:`command-line interface <cli>`.
|
||||
::
|
||||
|
||||
$ camelot -split stream -C 72,95,209,327,442,529,566,606,683 column_separators.pdf
|
||||
|
||||
.. csv-table::
|
||||
|
||||
"...","...","...","...","...","...","...","...","...","..."
|
||||
@@ -224,6 +302,12 @@ You can solve this by passing ``flag_size=True``, which will enclose the supersc
|
||||
>>> tables = camelot.read_pdf('superscript.pdf', flavor='stream', flag_size=True)
|
||||
>>> tables[0].df
|
||||
|
||||
.. tip::
|
||||
Here's how you can do the same with the :ref:`command-line interface <cli>`.
|
||||
::
|
||||
|
||||
$ camelot -flag stream superscript.pdf
|
||||
|
||||
.. csv-table::
|
||||
|
||||
"...","...","...","...","...","...","...","...","...","...","..."
|
||||
@@ -232,10 +316,87 @@ You can solve this by passing ``flag_size=True``, which will enclose the supersc
|
||||
"Madhya Pradesh","27.13","23.57","-","-","3.56","0.38","-","1.86","-","1.28"
|
||||
"...","...","...","...","...","...","...","...","...","...","..."
|
||||
|
||||
Control how text is grouped into rows
|
||||
-------------------------------------
|
||||
Strip characters from text
|
||||
--------------------------
|
||||
|
||||
You can pass ``row_close_tol=<+int>`` to group the rows closer together, as shown below.
|
||||
You can strip unwanted characters like spaces, dots and newlines from a string using the ``strip_text`` keyword argument. Take a look at `this PDF <https://github.com/socialcopsdev/camelot/blob/master/tests/files/tabula/12s0324.pdf>`_ as an example, the text at the start of each row contains a lot of unwanted spaces, dots and newlines.
|
||||
|
||||
::
|
||||
|
||||
>>> tables = camelot.read_pdf('12s0324.pdf', flavor='stream', strip_text=' .\n')
|
||||
>>> tables[0].df
|
||||
|
||||
.. tip::
|
||||
Here's how you can do the same with the :ref:`command-line interface <cli>`.
|
||||
::
|
||||
|
||||
$ camelot -strip ' .\n' stream 12s0324.pdf
|
||||
|
||||
.. csv-table::
|
||||
|
||||
"...","...","...","...","...","...","...","...","...","..."
|
||||
"Forcible rape","17.5","2.6","14.9","17.2","2.5","14.7","–","–","–"
|
||||
"Robbery","102.1","25.5","76.6","90.0","22.9","67.1","12.1","2.5","9.5"
|
||||
"Aggravated assault","338.4","40.1","298.3","264.0","30.2","233.8","74.4","9.9","64.5"
|
||||
"Property crime","1,396 .4","338 .7","1,057 .7","875 .9","210 .8","665 .1","608 .2","127 .9","392 .6"
|
||||
"Burglary","240.9","60.3","180.6","205.0","53.4","151.7","35.9","6.9","29.0"
|
||||
"...","...","...","...","...","...","...","...","...","..."
|
||||
|
||||
Improve guessed table areas
|
||||
---------------------------
|
||||
|
||||
While using :ref:`Stream <stream>`, automatic table detection can fail for PDFs like `this one <https://github.com/socialcopsdev/camelot/blob/master/tests/files/edge_tol.pdf>`_. That's because the text is relatively far apart vertically, which can lead to shorter textedges being calculated.
|
||||
|
||||
.. note:: To know more about how textedges are calculated to guess table areas, you can see pages 20, 35 and 40 of `Anssi Nurminen's master's thesis <http://dspace.cc.tut.fi/dpub/bitstream/handle/123456789/21520/Nurminen.pdf?sequence=3>`_.
|
||||
|
||||
Let's see the table area that is detected by default.
|
||||
|
||||
::
|
||||
|
||||
>>> tables = camelot.read_pdf('edge_tol.pdf', flavor='stream')
|
||||
>>> camelot.plot(tables[0], kind='contour')
|
||||
>>> plt.show()
|
||||
|
||||
.. tip::
|
||||
Here's how you can do the same with the :ref:`command-line interface <cli>`.
|
||||
::
|
||||
|
||||
$ camelot stream -plot contour edge.pdf
|
||||
|
||||
.. figure:: ../_static/png/edge_tol_1.png
|
||||
:height: 674
|
||||
:width: 1366
|
||||
:scale: 50%
|
||||
:alt: Table area with default edge_tol
|
||||
:align: left
|
||||
|
||||
To improve the detected area, you can increase the ``edge_tol`` (default: 50) value to counter the effect of text being placed relatively far apart vertically. Larger ``edge_tol`` will lead to longer textedges being detected, leading to an improved guess of the table area. Let's use a value of 500.
|
||||
|
||||
::
|
||||
|
||||
>>> tables = camelot.read_pdf('edge_tol.pdf', flavor='stream', edge_tol=500)
|
||||
>>> camelot.plot(tables[0], kind='contour')
|
||||
>>> plt.show()
|
||||
|
||||
.. tip::
|
||||
Here's how you can do the same with the :ref:`command-line interface <cli>`.
|
||||
::
|
||||
|
||||
$ camelot stream -e 500 -plot contour edge.pdf
|
||||
|
||||
.. figure:: ../_static/png/edge_tol_2.png
|
||||
:height: 674
|
||||
:width: 1366
|
||||
:scale: 50%
|
||||
:alt: Table area with default edge_tol
|
||||
:align: left
|
||||
|
||||
As you can see, the guessed table area has improved!
|
||||
|
||||
Improve guessed table rows
|
||||
--------------------------
|
||||
|
||||
You can pass ``row_tol=<+int>`` to group the rows closer together, as shown below.
|
||||
|
||||
::
|
||||
|
||||
@@ -253,9 +414,15 @@ You can pass ``row_close_tol=<+int>`` to group the rows closer together, as show
|
||||
|
||||
::
|
||||
|
||||
>>> tables = camelot.read_pdf('group_rows.pdf', flavor='stream', row_close_tol=10)
|
||||
>>> tables = camelot.read_pdf('group_rows.pdf', flavor='stream', row_tol=10)
|
||||
>>> tables[0].df
|
||||
|
||||
.. tip::
|
||||
Here's how you can do the same with the :ref:`command-line interface <cli>`.
|
||||
::
|
||||
|
||||
$ camelot stream -r 10 group_rows.pdf
|
||||
|
||||
.. csv-table::
|
||||
|
||||
"Clave","Nombre Entidad","Clave","","Nombre Municipio","Clave","Nombre Localidad"
|
||||
@@ -299,6 +466,12 @@ Clearly, the smaller lines separating the headers, couldn't be detected. Let's t
|
||||
>>> camelot.plot(tables[0], kind='grid')
|
||||
>>> plt.show()
|
||||
|
||||
.. tip::
|
||||
Here's how you can do the same with the :ref:`command-line interface <cli>`.
|
||||
::
|
||||
|
||||
$ camelot lattice -scale 40 -plot grid short_lines.pdf
|
||||
|
||||
.. figure:: ../_static/png/short_lines_2.png
|
||||
:alt: An improved plot of the PDF table with short lines
|
||||
:align: left
|
||||
@@ -362,6 +535,12 @@ No surprises there — it did remain in place (observe the strings "2400" and "A
|
||||
>>> tables = camelot.read_pdf('short_lines.pdf', line_size_scaling=40, shift_text=['r', 'b'])
|
||||
>>> tables[0].df
|
||||
|
||||
.. tip::
|
||||
Here's how you can do the same with the :ref:`command-line interface <cli>`.
|
||||
::
|
||||
|
||||
$ camelot lattice -scale 40 -shift r -shift b short_lines.pdf
|
||||
|
||||
.. csv-table::
|
||||
|
||||
"Investigations","No. ofHHs","Age/Sex/Physiological Group","Preva-lence","C.I*","RelativePrecision","Sample sizeper State"
|
||||
@@ -407,6 +586,12 @@ We don't need anything else. Now, let's pass ``copy_text=['v']`` to copy text in
|
||||
>>> tables = camelot.read_pdf('copy_text.pdf', copy_text=['v'])
|
||||
>>> tables[0].df
|
||||
|
||||
.. tip::
|
||||
Here's how you can do the same with the :ref:`command-line interface <cli>`.
|
||||
::
|
||||
|
||||
$ camelot lattice -copy v copy_text.pdf
|
||||
|
||||
.. csv-table::
|
||||
|
||||
"Sl. No.","Name of State/UT","Name of District","Disease/ Illness","No. of Cases","No. of Deaths","Date of start of outbreak","Date of reporting","Current Status","..."
|
||||
@@ -416,3 +601,14 @@ We don't need anything else. Now, let's pass ``copy_text=['v']`` to copy text in
|
||||
"4","West Bengal","West Medinipur","iv. Acute Diarrhoeal Disease","145","0","04/01/14","05/01/14","Under control","..."
|
||||
"4","West Bengal","Birbhum","v. Food Poisoning","199","0","31/12/13","31/12/13","Under control","..."
|
||||
"4","West Bengal","Howrah","vi. Viral Hepatitis A &E","85","0","26/12/13","27/12/13","Under surveillance","..."
|
||||
|
||||
Tweak layout generation
|
||||
-----------------------
|
||||
|
||||
Camelot is built on top of PDFMiner's functionality of grouping characters on a page into words and sentences. In some cases (such as `#170 <https://github.com/socialcopsdev/camelot/issues/170>`_ and `#215 <https://github.com/socialcopsdev/camelot/issues/215>`_), PDFMiner can group characters that should belong to the same sentence into separate sentences.
|
||||
|
||||
To deal with such cases, you can tweak PDFMiner's `LAParams kwargs <https://github.com/euske/pdfminer/blob/master/pdfminer/layout.py#L33>`_ to improve layout generation, by passing the keyword arguments as a dict using ``layout_kwargs`` in :meth:`read_pdf() <camelot.read_pdf>`. To know more about the parameters you can tweak, you can check out `PDFMiner docs <https://euske.github.io/pdfminer/>`_.
|
||||
|
||||
::
|
||||
|
||||
>>> tables = camelot.read_pdf('foo.pdf', layout_kwargs={'detect_vertical': False})
|
||||
|
||||
@@ -15,6 +15,7 @@ You can print the help for the interface by typing ``camelot --help`` in your fa
|
||||
|
||||
Options:
|
||||
--version Show the version and exit.
|
||||
-q, --quiet TEXT Suppress logs and warnings.
|
||||
-p, --pages TEXT Comma-separated page numbers. Example: 1,3,4
|
||||
or 1,4-end.
|
||||
-pw, --password TEXT Password for decryption.
|
||||
@@ -28,7 +29,6 @@ You can print the help for the interface by typing ``camelot --help`` in your fa
|
||||
-M, --margins <FLOAT FLOAT FLOAT>...
|
||||
PDFMiner char_margin, line_margin and
|
||||
word_margin.
|
||||
-q, --quiet Suppress warnings.
|
||||
--help Show this message and exit.
|
||||
|
||||
Commands:
|
||||
|
||||
@@ -70,6 +70,12 @@ You can also export all tables at once, using the :class:`tables <camelot.core.T
|
||||
|
||||
>>> tables.export('foo.csv', f='csv')
|
||||
|
||||
.. tip::
|
||||
Here's how you can do the same with the :ref:`command-line interface <cli>`.
|
||||
::
|
||||
|
||||
$ camelot --format csv --output foo.csv lattice foo.pdf
|
||||
|
||||
This will export all tables as CSV files at the path specified. Alternatively, you can use ``f='json'``, ``f='excel'`` or ``f='html'``.
|
||||
|
||||
.. note:: The :meth:`export() <camelot.core.TableList.export>` method exports files with a ``page-*-table-*`` suffix. In the example above, the single table in the list will be exported to ``foo-page-1-table-1.csv``. If the list contains multiple tables, multiple CSV files will be created. To avoid filling up your path with multiple files, you can use ``compress=True``, which will create a single ZIP file at your path with all the CSV files.
|
||||
@@ -85,6 +91,12 @@ By default, Camelot only uses the first page of the PDF to extract tables. To sp
|
||||
|
||||
>>> camelot.read_pdf('your.pdf', pages='1,2,3')
|
||||
|
||||
.. tip::
|
||||
Here's how you can do the same with the :ref:`command-line interface <cli>`.
|
||||
::
|
||||
|
||||
$ camelot --pages 1,2,3 lattice your.pdf
|
||||
|
||||
The ``pages`` keyword argument accepts pages as comma-separated string of page numbers. You can also specify page ranges — for example, ``pages=1,4-10,20-30`` or ``pages=1,4-10,20-end``.
|
||||
|
||||
Reading encrypted PDFs
|
||||
@@ -98,6 +110,12 @@ To extract tables from encrypted PDF files you must provide a password when call
|
||||
>>> tables
|
||||
<TableList n=1>
|
||||
|
||||
.. tip::
|
||||
Here's how you can do the same with the :ref:`command-line interface <cli>`.
|
||||
::
|
||||
|
||||
$ camelot --password userpass lattice foo.pdf
|
||||
|
||||
Currently Camelot only supports PDFs encrypted with ASCII passwords and algorithm `code 1 or 2`_. An exception is thrown if the PDF cannot be read. This may be due to no password being provided, an incorrect password, or an unsupported encryption algorithm.
|
||||
|
||||
Further encryption support may be added in future, however in the meantime if your PDF files are using unsupported encryption algorithms you are advised to remove encryption before calling :meth:`read_pdf() <camelot.read_pdf>`. This can been successfully achieved with third-party tools such as `QPDF`_.
|
||||
|
||||
@@ -82,42 +82,40 @@ data_stream_two_tables_1 = [
|
||||
["", "", "Total", "", "", "Male", "", "", "Female", ""],
|
||||
["Offense charged", "", "Under 18", "18 years", "", "Under 18", "18 years", "", "Under 18", "18 years"],
|
||||
["", "Total", "years", "and over", "Total", "years", "and over", "Total", "years", "and over"],
|
||||
["Total . . . . . . . . . . . . . . . . . . . . . . . . .", "11,062 .6", "1,540 .0", "9,522 .6", "8,263 .3", "1,071 .6", "7,191 .7", "2,799 .2", "468 .3", "2,330 .9"],
|
||||
["Violent crime . . . . . . . . . . . . . . . . . .", "467 .9", "69 .1", "398 .8", "380 .2", "56 .5", "323 .7", "87 .7", "12 .6", "75 .2"],
|
||||
["Total .\n .\n . . . . . .\n . .\n . .\n . .\n . .\n . .\n . .\n . .\n . . .", "11,062 .6", "1,540 .0", "9,522 .6", "8,263 .3", "1,071 .6", "7,191 .7", "2,799 .2", "468 .3", "2,330 .9"],
|
||||
["Violent crime . . . . . . . .\n . .\n . .\n . .\n . .\n . .", "467 .9", "69 .1", "398 .8", "380 .2", "56 .5", "323 .7", "87 .7", "12 .6", "75 .2"],
|
||||
["Murder and nonnegligent", "", "", "", "", "", "", "", "", ""],
|
||||
["manslaughter . . . . . . . .. .. .. .. ..", "10.0", "0.9", "9.1", "9.0", "0.9", "8.1", "1.1", "–", "1.0"],
|
||||
["Forcible rape . . . . . . . .. .. .. .. .. .", "17.5", "2.6", "14.9", "17.2", "2.5", "14.7", "–", "–", "–"],
|
||||
["Robbery . . . .. .. . .. . ... . ... . ...", "102.1", "25.5", "76.6", "90.0", "22.9", "67.1", "12.1", "2.5", "9.5"],
|
||||
["Aggravated assault . . . . . . . .. .. ..", "338.4", "40.1", "298.3", "264.0", "30.2", "233.8", "74.4", "9.9", "64.5"],
|
||||
["Property crime . . . . . . . . . . . . . . . . .", "1,396 .4", "338 .7", "1,057 .7", "875 .9", "210 .8", "665 .1", "608 .2", "127 .9", "392 .6"],
|
||||
["Burglary . .. . . . . .. ... .... .... ..", "240.9", "60.3", "180.6", "205.0", "53.4", "151.7", "35.9", "6.9", "29.0"],
|
||||
["Larceny-theft . . . . . . . .. .. .. .. .. .", "1,080.1", "258.1", "822.0", "608.8", "140.5", "468.3", "471.3", "117.6", "353.6"],
|
||||
["Motor vehicle theft . . . . .. .. . .... .", "65.6", "16.0", "49.6", "53.9", "13.3", "40.7", "11.7", "2.7", "8.9"],
|
||||
["Arson .. . . . .. . ... .... .... .... .", "9.8", "4.3", "5.5", "8.1", "3.7", "4.4", "1.7", "0.6", "1.1"],
|
||||
["Other assaults .. . . . . .. . ... . ... ..", "1,061.3", "175.3", "886.1", "785.4", "115.4", "670.0", "276.0", "59.9", "216.1"],
|
||||
["Forgery and counterfeiting .. . . . . . ..", "68.9", "1.7", "67.2", "42.9", "1.2", "41.7", "26.0", "0.5", "25.5"],
|
||||
["Fraud .... .. . . .. ... .... .... ....", "173.7", "5.1", "168.5", "98.4", "3.3", "95.0", "75.3", "1.8", "73.5"],
|
||||
["Embezzlement . . .. . . . .. . ... . ....", "14.6", "–", "14.1", "7.2", "–", "6.9", "7.4", "–", "7.2"],
|
||||
["Stolen property 1 . . . . . . .. . .. .. ...", "84.3", "15.1", "69.2", "66.7", "12.2", "54.5", "17.6", "2.8", "14.7"],
|
||||
["Vandalism . . . . . . . .. .. .. .. .. ....", "217.4", "72.7", "144.7", "178.1", "62.8", "115.3", "39.3", "9.9", "29.4"],
|
||||
["manslaughter . . . . . . . .\n. .\n. .\n. .\n. .\n.", "10.0", "0.9", "9.1", "9.0", "0.9", "8.1", "1.1", "–", "1.0"],
|
||||
["Forcible rape . . . . . . . .\n. .\n. .\n. .\n. .\n. .", "17.5", "2.6", "14.9", "17.2", "2.5", "14.7", "–", "–", "–"],
|
||||
["Robbery . . . .\n. .\n. . .\n. . .\n.\n. . .\n.\n. . .\n.\n.", "102.1", "25.5", "76.6", "90.0", "22.9", "67.1", "12.1", "2.5", "9.5"],
|
||||
["Aggravated assault . . . . . . . .\n. .\n. .\n.", "338.4", "40.1", "298.3", "264.0", "30.2", "233.8", "74.4", "9.9", "64.5"],
|
||||
["Property crime . . . .\n . .\n . . .\n . . .\n .\n . . . .", "1,396 .4", "338 .7", "1,057 .7", "875 .9", "210 .8", "665 .1", "608 .2", "127 .9", "392 .6"],
|
||||
["Burglary . .\n. . . . . .\n. .\n.\n. .\n.\n.\n. .\n.\n.\n. .\n.", "240.9", "60.3", "180.6", "205.0", "53.4", "151.7", "35.9", "6.9", "29.0"],
|
||||
["Larceny-theft . . . . . . . .\n. .\n. .\n. .\n. .\n. .", "1,080.1", "258.1", "822.0", "608.8", "140.5", "468.3", "471.3", "117.6", "353.6"],
|
||||
["Motor vehicle theft . . . . .\n. .\n. . .\n.\n.\n. .", "65.6", "16.0", "49.6", "53.9", "13.3", "40.7", "11.7", "2.7", "8.9"],
|
||||
["Arson .\n. . . . .\n. . .\n.\n. .\n.\n.\n. .\n.\n.\n. .\n.\n.\n. .", "9.8", "4.3", "5.5", "8.1", "3.7", "4.4", "1.7", "0.6", "1.1"],
|
||||
["Other assaults .\n. . . . . .\n. . .\n.\n. . .\n.\n. .\n.", "1,061.3", "175.3", "886.1", "785.4", "115.4", "670.0", "276.0", "59.9", "216.1"],
|
||||
["Forgery and counterfeiting .\n. . . . . . .\n.", "68.9", "1.7", "67.2", "42.9", "1.2", "41.7", "26.0", "0.5", "25.5"],
|
||||
["Fraud .\n.\n.\n. .\n. . . .\n. .\n.\n. .\n.\n.\n. .\n.\n.\n. .\n.\n.\n.", "173.7", "5.1", "168.5", "98.4", "3.3", "95.0", "75.3", "1.8", "73.5"],
|
||||
["Embezzlement . . .\n. . . . .\n. . .\n.\n. . .\n.\n.\n.", "14.6", "–", "14.1", "7.2", "–", "6.9", "7.4", "–", "7.2"],
|
||||
["Stolen property 1 . . . . . . .\n. . .\n. .\n. .\n.\n.", "84.3", "15.1", "69.2", "66.7", "12.2", "54.5", "17.6", "2.8", "14.7"],
|
||||
["Vandalism . . . . . . . .\n. .\n. .\n. .\n. .\n. .\n.\n.\n.", "217.4", "72.7", "144.7", "178.1", "62.8", "115.3", "39.3", "9.9", "29.4"],
|
||||
["Weapons; carrying, possessing, etc. .", "132.9", "27.1", "105.8", "122.1", "24.3", "97.8", "10.8", "2.8", "8.0"],
|
||||
["Prostitution and commercialized vice",
|
||||
"56.9", "1.1", "55.8", "17.3", "–", "17.1", "39.6", "0.8", "38.7"],
|
||||
["Sex offenses 2 . . . . .. . . . .. .. .. . ..", "61.5", "10.7", "50.7", "56.1", "9.6", "46.5", "5.4", "1.1", "4.3"],
|
||||
["Drug abuse violations . . . . . . . .. ...", "1,333.0", "136.6", "1,196.4", "1,084.3", "115.2", "969.1", "248.7", "21.4", "227.3"],
|
||||
["Gambling .. . . . . .. ... . ... . ... ...", "8.2", "1.4", "6.8", "7.2", "1.4", "5.9", "0.9", "–", "0.9"],
|
||||
["Prostitution and commercialized vice", "56.9", "1.1", "55.8", "17.3", "–", "17.1", "39.6", "0.8", "38.7"],
|
||||
["Sex offenses 2 . . . . .\n. . . . .\n. .\n. .\n. . .\n.", "61.5", "10.7", "50.7", "56.1", "9.6", "46.5", "5.4", "1.1", "4.3"],
|
||||
["Drug abuse violations . . . . . . . .\n. .\n.\n.", "1,333.0", "136.6", "1,196.4", "1,084.3", "115.2", "969.1", "248.7", "21.4", "227.3"],
|
||||
["Gambling .\n. . . . . .\n. .\n.\n. . .\n.\n. . .\n.\n. .\n.\n.", "8.2", "1.4", "6.8", "7.2", "1.4", "5.9", "0.9", "–", "0.9"],
|
||||
["Offenses against the family and", "", "", "", "", "", "", "", "", ""],
|
||||
["children . . . .. . . .. .. .. .. .. .. . ..", "92.4", "3.7", "88.7", "68.9", "2.4", "66.6", "23.4", "1.3", "22.1"],
|
||||
["Driving under the influence . . . . . .. .", "1,158.5", "109.2", "1,147.5", "895.8", "8.2", "887.6", "262.7", "2.7", "260.0"],
|
||||
["Liquor laws . . . . . . . .. .. .. .. .. .. .", "48.2", "90.2", "368.0", "326.8", "55.4", "271.4",
|
||||
"131.4", "34.7", "96.6"],
|
||||
["Drunkenness . . .. . . . .. . ... . ... ..", "488.1", "11.4", "476.8", "406.8", "8.5", "398.3", "81.3", "2.9", "78.4"],
|
||||
["Disorderly conduct . .. . . . . . .. .. .. .", "529.5", "136.1", "393.3", "387.1", "90.8", "296.2", "142.4", "45.3", "97.1"],
|
||||
["Vagrancy . . . .. . . . ... .... .... ...", "26.6", "2.2", "24.4", "20.9", "1.6", "19.3", "5.7", "0.6", "5.1"],
|
||||
["All other offenses (except traffic) . . ..", "306.1", "263.4", "2,800.8", "2,337.1", "194.2", "2,142.9", "727.0", "69.2", "657.9"],
|
||||
["Suspicion . . . .. . . .. .. .. .. .. .. . ..", "1.6", "–", "1.4", "1.2", "–", "1.0", "–", "–", "–"],
|
||||
["Curfew and loitering law violations ..", "91.0", "91.0", "(X)", "63.1", "63.1", "(X)", "28.0", "28.0", "(X)"],
|
||||
["Runaways . . . . . . . .. .. .. .. .. ....", "75.8", "75.8", "(X)", "34.0", "34.0", "(X)", "41.8", "41.8", "(X)"],
|
||||
["children . . . .\n. . . .\n. .\n. .\n. .\n. .\n. .\n. . .\n.", "92.4", "3.7", "88.7", "68.9", "2.4", "66.6", "23.4", "1.3", "22.1"],
|
||||
["Driving under the influence . . . . . .\n. .", "1,158.5", "109.2", "1,147.5", "895.8", "8.2", "887.6", "262.7", "2.7", "260.0"],
|
||||
["Liquor laws . . . . . . . .\n. .\n. .\n. .\n. .\n. .\n. .", "48.2", "90.2", "368.0", "326.8", "55.4", "271.4", "131.4", "34.7", "96.6"],
|
||||
["Drunkenness . . .\n. . . . .\n. . .\n.\n. . .\n.\n. .\n.", "488.1", "11.4", "476.8", "406.8", "8.5", "398.3", "81.3", "2.9", "78.4"],
|
||||
["Disorderly conduct . .\n. . . . . . .\n. .\n. .\n. .", "529.5", "136.1", "393.3", "387.1", "90.8", "296.2", "142.4", "45.3", "97.1"],
|
||||
["Vagrancy . . . .\n. . . . .\n.\n. .\n.\n.\n. .\n.\n.\n. .\n.\n.", "26.6", "2.2", "24.4", "20.9", "1.6", "19.3", "5.7", "0.6", "5.1"],
|
||||
["All other offenses (except traffic) . . .\n.", "306.1", "263.4", "2,800.8", "2,337.1", "194.2", "2,142.9", "727.0", "69.2", "657.9"],
|
||||
["Suspicion . . . .\n. . . .\n. .\n. .\n. .\n. .\n. .\n. . .\n.", "1.6", "–", "1.4", "1.2", "–", "1.0", "–", "–", "–"],
|
||||
["Curfew and loitering law violations .\n.", "91.0", "91.0", "(X)", "63.1", "63.1", "(X)", "28.0", "28.0", "(X)"],
|
||||
["Runaways . . . . . . . .\n. .\n. .\n. .\n. .\n. .\n.\n.\n.", "75.8", "75.8", "(X)", "34.0", "34.0", "(X)", "41.8", "41.8", "(X)"],
|
||||
["", "– Represents zero. X Not applicable. 1 Buying, receiving, possessing stolen property. 2 Except forcible rape and prostitution.", "", "", "", "", "", "", "", ""],
|
||||
["", "Source: U.S. Department of Justice, Federal Bureau of Investigation, Uniform Crime Reports, Arrests Master Files.", "", "", "", "", "", "", "", ""]
|
||||
]
|
||||
@@ -128,41 +126,40 @@ data_stream_two_tables_2 = [
|
||||
["[Based on Uniform Crime Reporting (UCR) Program. Represents arrests reported (not charged) by 12,371 agencies", "", "", "", "", ""],
|
||||
["with a total population of 239,839,971 as estimated by the FBI. See headnote, Table 324]", "", "", "", "", ""],
|
||||
["", "", "", "", "American", ""],
|
||||
["Offense charged", "", "", "",
|
||||
"Indian/Alaskan", "Asian Pacific"],
|
||||
["Offense charged", "", "", "", "Indian/Alaskan", "Asian Pacific"],
|
||||
["", "Total", "White", "Black", "Native", "Islander"],
|
||||
["Total . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .", "10,690,561", "7,389,208", "3,027,153", "150,544", "123,656"],
|
||||
["Violent crime . . . . . . . . . . . . . . . . . . . . . . . . . . . .", "456,965", "268,346", "177,766", "5,608", "5,245"],
|
||||
["Murder and nonnegligent manslaughter . .. ... .", "9,739", "4,741", "4,801", "100", "97"],
|
||||
["Forcible rape . . . . . . . .. .. .. .. .... .. ...... .", "16,362", "10,644", "5,319", "169", "230"],
|
||||
["Robbery . . . . .. . . . ... . ... . .... .... .... . . .", "100,496", "43,039", "55,742", "726", "989"],
|
||||
["Aggravated assault . . . . . . . .. .. ...... .. ....", "330,368", "209,922", "111,904", "4,613", "3,929"],
|
||||
["Property crime . . . . . . . . . . . . . . . . . . . . . . . . . . .", "1,364,409", "922,139", "406,382", "17,599", "18,289"],
|
||||
["Burglary . . .. . . . .. . .... .... .... .... ... . . .", "234,551", "155,994", "74,419", "2,021", "2,117"],
|
||||
["Larceny-theft . . . . . . . .. .. .. .. .... .. ...... .", "1,056,473", "719,983", "306,625", "14,646", "15,219"],
|
||||
["Motor vehicle theft . . . . . .. ... . ... ..... ... ..", "63,919", "39,077", "23,184", "817", "841"],
|
||||
["Arson .. . . .. .. .. ... .... .... .... .... . . . . .", "9,466", "7,085", "2,154", "115", "112"],
|
||||
["Other assaults .. . . . . . ... . ... . ... ..... ... ..", "1,032,502", "672,865", "332,435", "15,127", "12,075"],
|
||||
["Forgery and counterfeiting .. . . . . . ... ..... .. ..", "67,054", "44,730", "21,251", "345", "728"],
|
||||
["Fraud ... . . . . .. .. .. .. .. .. .. .. .. .... . . . . . .", "161,233", "108,032", "50,367", "1,315", "1,519"],
|
||||
["Embezzlement . . . .. . . . ... . ... . .... ... .....", "13,960", "9,208", "4,429", "75", "248"],
|
||||
["Stolen property; buying, receiving, possessing .. .", "82,714", "51,953", "29,357", "662", "742"],
|
||||
["Vandalism . . . . . . . .. .. .. .. .. .. .... .. ..... .", "212,173", "157,723", "48,746", "3,352", "2,352"],
|
||||
["Weapons—carrying, possessing, etc. .. .. ... .. .", "130,503", "74,942", "53,441", "951", "1,169"],
|
||||
["Prostitution and commercialized vice . ... .. .. ..", "56,560", "31,699", "23,021", "427", "1,413"],
|
||||
["Sex offenses 1 . . . . . . . .. .. .. .. .... .. ...... .", "60,175", "44,240", "14,347", "715", "873"],
|
||||
["Drug abuse violations . . . . . . . .. . ..... .. .....", "1,301,629", "845,974", "437,623", "8,588", "9,444"],
|
||||
["Gambling . . . . .. . . . ... . ... . .. ... . ...... .. .", "8,046", "2,290", "5,518", "27", "211"],
|
||||
["Offenses against the family and children ... .. .. .", "87,232", "58,068", "26,850", "1,690", "624"],
|
||||
["Driving under the influence . . . . . . .. ... ...... .", "1,105,401", "954,444", "121,594", "14,903", "14,460"],
|
||||
["Liquor laws . . . . . . . .. .. .. .. .. . ..... .. .....", "444,087", "373,189", "50,431", "14,876", "5,591"],
|
||||
["Drunkenness . .. . . . . . ... . ... . ..... . .......", "469,958", "387,542", "71,020", "8,552", "2,844"],
|
||||
["Disorderly conduct . . .. . . . . .. .. . ..... .. .....", "515,689", "326,563", "176,169", "8,783", "4,174"],
|
||||
["Vagrancy . . .. .. . . .. ... .... .... .... .... . . .", "26,347", "14,581", "11,031", "543", "192"],
|
||||
["All other offenses (except traffic) . .. .. .. ..... ..", "2,929,217", "1,937,221", "911,670", "43,880", "36,446"],
|
||||
["Suspicion . . .. . . . .. .. .. .. .. .. .. ...... .. . . .", "1,513", "677", "828", "1", "7"],
|
||||
["Curfew and loitering law violations . .. ... .. ....", "89,578", "54,439", "33,207", "872", "1,060"],
|
||||
["Runaways . . . . . . . .. .. .. .. .. .. .... .. ..... .", "73,616", "48,343", "19,670", "1,653", "3,950"],
|
||||
["Total .\n .\n .\n .\n . .\n . . .\n . . .\n .\n . . .\n .\n . . .\n . .\n .\n . . .\n .\n .\n .\n . .\n . .\n . .", "10,690,561", "7,389,208", "3,027,153", "150,544", "123,656"],
|
||||
["Violent crime . . . . . . . .\n . .\n . .\n . .\n . .\n .\n .\n . .\n . .\n .\n .\n .\n .\n . .", "456,965", "268,346", "177,766", "5,608", "5,245"],
|
||||
["Murder and nonnegligent manslaughter . .\n. .\n.\n. .", "9,739", "4,741", "4,801", "100", "97"],
|
||||
["Forcible rape . . . . . . . .\n. .\n. .\n. .\n. .\n.\n.\n. .\n. .\n.\n.\n.\n.\n. .", "16,362", "10,644", "5,319", "169", "230"],
|
||||
["Robbery . . . . .\n. . . . .\n.\n. . .\n.\n. . .\n.\n.\n. .\n.\n.\n. .\n.\n.\n. . . .", "100,496", "43,039", "55,742", "726", "989"],
|
||||
["Aggravated assault . . . . . . . .\n. .\n. .\n.\n.\n.\n.\n. .\n. .\n.\n.\n.", "330,368", "209,922", "111,904", "4,613", "3,929"],
|
||||
["Property crime . . . . .\n . . . . .\n .\n . . .\n .\n . .\n .\n .\n .\n . .\n .\n . .\n .\n .", "1,364,409", "922,139", "406,382", "17,599", "18,289"],
|
||||
["Burglary . . .\n. . . . .\n. . .\n.\n.\n. .\n.\n.\n. .\n.\n.\n. .\n.\n.\n. .\n.\n. . . .", "234,551", "155,994", "74,419", "2,021", "2,117"],
|
||||
["Larceny-theft . . . . . . . .\n. .\n. .\n. .\n. .\n.\n.\n. .\n. .\n.\n.\n.\n.\n. .", "1,056,473", "719,983", "306,625", "14,646", "15,219"],
|
||||
["Motor vehicle theft . . . . . .\n. .\n.\n. . .\n.\n. .\n.\n.\n.\n. .\n.\n. .\n.", "63,919", "39,077", "23,184", "817", "841"],
|
||||
["Arson .\n. . . .\n. .\n. .\n. .\n.\n. .\n.\n.\n. .\n.\n.\n. .\n.\n.\n. .\n.\n.\n. . . . . .", "9,466", "7,085", "2,154", "115", "112"],
|
||||
["Other assaults .\n. . . . . . .\n.\n. . .\n.\n. . .\n.\n. .\n.\n.\n.\n. .\n.\n. .\n.", "1,032,502", "672,865", "332,435", "15,127", "12,075"],
|
||||
["Forgery and counterfeiting .\n. . . . . . .\n.\n. .\n.\n.\n.\n. .\n. .\n.", "67,054", "44,730", "21,251", "345", "728"],
|
||||
["Fraud .\n.\n. . . . . .\n. .\n. .\n. .\n. .\n. .\n. .\n. .\n. .\n. .\n.\n.\n. . . . . . .", "161,233", "108,032", "50,367", "1,315", "1,519"],
|
||||
["Embezzlement . . . .\n. . . . .\n.\n. . .\n.\n. . .\n.\n.\n. .\n.\n. .\n.\n.\n.\n.", "13,960", "9,208", "4,429", "75", "248"],
|
||||
["Stolen property; buying, receiving, possessing .\n. .", "82,714", "51,953", "29,357", "662", "742"],
|
||||
["Vandalism . . . . . . . .\n. .\n. .\n. .\n. .\n. .\n. .\n.\n.\n. .\n. .\n.\n.\n.\n. .", "212,173", "157,723", "48,746", "3,352", "2,352"],
|
||||
["Weapons—carrying, possessing, etc. .\n. .\n. .\n.\n. .\n. .", "130,503", "74,942", "53,441", "951", "1,169"],
|
||||
["Prostitution and commercialized vice . .\n.\n. .\n. .\n. .\n.", "56,560", "31,699", "23,021", "427", "1,413"],
|
||||
["Sex offenses 1 . . . . . . . .\n. .\n. .\n. .\n. .\n.\n.\n. .\n. .\n.\n.\n.\n.\n. .", "60,175", "44,240", "14,347", "715", "873"],
|
||||
["Drug abuse violations . . . . . . . .\n. . .\n.\n.\n.\n. .\n. .\n.\n.\n.\n.", "1,301,629", "845,974", "437,623", "8,588", "9,444"],
|
||||
["Gambling . . . . .\n. . . . .\n.\n. . .\n.\n. . .\n. .\n.\n. . .\n.\n.\n.\n.\n. .\n. .", "8,046", "2,290", "5,518", "27", "211"],
|
||||
["Offenses against the family and children .\n.\n. .\n. .\n. .", "87,232", "58,068", "26,850", "1,690", "624"],
|
||||
["Driving under the influence . . . . . . .\n. .\n.\n. .\n.\n.\n.\n.\n. .", "1,105,401", "954,444", "121,594", "14,903", "14,460"],
|
||||
["Liquor laws . . . . . . . .\n. .\n. .\n. .\n. .\n. . .\n.\n.\n.\n. .\n. .\n.\n.\n.\n.", "444,087", "373,189", "50,431", "14,876", "5,591"],
|
||||
["Drunkenness . .\n. . . . . . .\n.\n. . .\n.\n. . .\n.\n.\n.\n. . .\n.\n.\n.\n.\n.\n.", "469,958", "387,542", "71,020", "8,552", "2,844"],
|
||||
["Disorderly conduct . . .\n. . . . . .\n. .\n. . .\n.\n.\n.\n. .\n. .\n.\n.\n.\n.", "515,689", "326,563", "176,169", "8,783", "4,174"],
|
||||
["Vagrancy . . .\n. .\n. . . .\n. .\n.\n. .\n.\n.\n. .\n.\n.\n. .\n.\n.\n. .\n.\n.\n. . . .", "26,347", "14,581", "11,031", "543", "192"],
|
||||
["All other offenses (except traffic) . .\n. .\n. .\n. .\n.\n.\n.\n. .\n.", "2,929,217", "1,937,221", "911,670", "43,880", "36,446"],
|
||||
["Suspicion . . .\n. . . . .\n. .\n. .\n. .\n. .\n. .\n. .\n. .\n.\n.\n.\n.\n. .\n. . . .", "1,513", "677", "828", "1", "7"],
|
||||
["Curfew and loitering law violations . .\n. .\n.\n. .\n. .\n.\n.\n.", "89,578", "54,439", "33,207", "872", "1,060"],
|
||||
["Runaways . . . . . . . .\n. .\n. .\n. .\n. .\n. .\n. .\n.\n.\n. .\n. .\n.\n.\n.\n. .", "73,616", "48,343", "19,670", "1,653", "3,950"],
|
||||
["1 Except forcible rape and prostitution.", "", "", "", "", ""],
|
||||
["", "Source: U.S. Department of Justice, Federal Bureau of Investigation, “Crime in the United States, Arrests,” September 2010,", "", "", "", ""]
|
||||
]
|
||||
@@ -170,7 +167,7 @@ data_stream_two_tables_2 = [
|
||||
data_stream_table_areas = [
|
||||
["", "One Withholding"],
|
||||
["Payroll Period", "Allowance"],
|
||||
["Weekly", "$71.15"],
|
||||
["Weekly", "$\n71.15"],
|
||||
["Biweekly", "142.31"],
|
||||
["Semimonthly", "154.17"],
|
||||
["Monthly", "308.33"],
|
||||
@@ -315,9 +312,66 @@ data_stream_flag_size = [
|
||||
["ALL STATES", "513.38", "436.02", "-", "25.57", "51.06", "14.18", "-", "8.21", "11.83", "11.08"]
|
||||
]
|
||||
|
||||
data_stream_strip_text = [
|
||||
["V i n s a u Ve r r e", ""],
|
||||
["Les Blancs", "12.5CL"],
|
||||
["A.O.P Côtes du Rhône", ""],
|
||||
["Domaine de la Guicharde « Autour de la chapelle » 2016", "8 €"],
|
||||
["A.O.P Vacqueyras", ""],
|
||||
["Domaine de Montvac « Melodine » 2016", "10 €"],
|
||||
["A.O.P Châteauneuf du Pape", ""],
|
||||
["Domaine de Beaurenard 2017", "13 €"],
|
||||
["A.O.P Côteaux du Languedoc", ""],
|
||||
["Villa Tempora « Un temps pour elle » 2014", "9 €"],
|
||||
["A.O.P Côtes de Provence", ""],
|
||||
["Château Grand Boise 2017", "9 €"],
|
||||
["Les Rosés", "12,5 CL"],
|
||||
["A.O.P Côtes du Rhône", ""],
|
||||
["Domaine de la Florane « A fleur de Pampre » 2016", "8 €"],
|
||||
["Famille Coulon (Domaine Beaurenard) Biotifulfox 2017", "8 €"],
|
||||
["A.O.P Vacqueyras", ""],
|
||||
["Domaine de Montvac 2017", "9 €"],
|
||||
["A.O.P Languedoc", ""],
|
||||
["Domaine de Joncas « Nébla » 2015", "8 €"],
|
||||
["Villa Tempora « L’arroseur arrosé » 2015", "9 €"],
|
||||
["A.O.P Côtes de Provence", ""],
|
||||
["Château Grand Boise « Sainte Victoire » 2017", "9 €"],
|
||||
["Château Léoube 2016", "10 €"]
|
||||
]
|
||||
|
||||
data_stream_edge_tol = [
|
||||
["Key figures", ""],
|
||||
["", "2016"],
|
||||
["(all amounts in EUR)", ""],
|
||||
["C\nlass A", ""],
|
||||
["N\net Asset Value at 31 December", "5,111,372"],
|
||||
["N\number of outstanding units at 31 December", "49,136"],
|
||||
["N\net Asset Value per unit at 31 December", "104.03"],
|
||||
["C\nlass B", ""],
|
||||
["N\net Asset Value at 31 December", "49,144,825"],
|
||||
["N\number of outstanding units at 31 December", "471,555"],
|
||||
["N\net Asset Value per unit at 31 December", "104.22"],
|
||||
["T\notal for the Fund", ""],
|
||||
["N\net Asset Value at 31 December", "54,256,197"],
|
||||
["N\number of outstanding units at 31 December", "520,691"],
|
||||
["I\nnvestment result", ""],
|
||||
["Direct result", "-"],
|
||||
["Revaluation", "2,076,667"],
|
||||
["Costs", "(106,870)"],
|
||||
["T\notal investment result for the period1", "1,969,797"],
|
||||
["I\nnvestment result per unit2", ""],
|
||||
["Direct result", "-"],
|
||||
["Revaluation", "3.99"],
|
||||
["Costs", "(0.21)"],
|
||||
["T\notal investment result per unit", "3.78"],
|
||||
["1 The results cover the period from inception of the Fund at 8 April 2016 through 31 December 2016.", ""],
|
||||
["2 The result per unit is calculated using the total number of outstanding unit as per the end of the", ""],
|
||||
["period.", ""]
|
||||
]
|
||||
|
||||
data_lattice = [
|
||||
["Cycle Name", "KI (1/km)", "Distance (mi)", "Percent Fuel Savings", "", "", ""],
|
||||
["", "", "", "Improved Speed", "Decreased Accel", "Eliminate Stops", "Decreased Idle"],
|
||||
["Cycle \nName", "KI \n(1/km)", "Distance \n(mi)", "Percent Fuel Savings", "", "", ""],
|
||||
["", "", "", "Improved \nSpeed", "Decreased \nAccel", "Eliminate \nStops", "Decreased \nIdle"],
|
||||
["2012_2", "3.30", "1.3", "5.9%", "9.5%", "29.2%", "17.4%"],
|
||||
["2145_1", "0.68", "11.2", "2.4%", "0.1%", "9.5%", "2.7%"],
|
||||
["4234_1", "0.59", "58.7", "8.5%", "1.3%", "8.5%", "3.3%"],
|
||||
@@ -326,7 +380,7 @@ data_lattice = [
|
||||
]
|
||||
|
||||
data_lattice_table_rotated = [
|
||||
["State", "Nutritional Assessment (No. of individuals)", "", "", "", "IYCF Practices (No. of mothers: 2011-12)", "Blood Pressure (No. of adults: 2011-12)", "", "Fasting Blood Sugar (No. of adults:2011-12)", ""],
|
||||
["State", "Nutritional Assessment \n(No. of individuals)", "", "", "", "IYCF Practices \n(No. of mothers: \n2011-12)", "Blood Pressure \n(No. of adults: \n2011-12)", "", "Fasting Blood Sugar \n(No. of adults:\n2011-12)", ""],
|
||||
["", "1975-79", "1988-90", "1996-97", "2011-12", "", "Men", "Women", "Men", "Women"],
|
||||
["Kerala", "5738", "6633", "8864", "8297", "245", "2161", "3195", "1645", "2391"],
|
||||
["Tamil Nadu", "7387", "10217", "5813", "7851", "413", "2134", "2858", "1119", "1739"],
|
||||
@@ -343,7 +397,7 @@ data_lattice_table_rotated = [
|
||||
|
||||
data_lattice_two_tables_1 = [
|
||||
["State", "n", "Literacy Status", "", "", "", "", ""],
|
||||
["", "", "Illiterate", "Read & Write", "1-4 std.", "5-8 std.", "9-12 std.", "College"],
|
||||
["", "", "Illiterate", "Read & \nWrite", "1-4 std.", "5-8 std.", "9-12 std.", "College"],
|
||||
["Kerala", "2400", "7.2", "0.5", "25.3", "20.1", "41.5", "5.5"],
|
||||
["Tamil Nadu", "2400", "21.4", "2.3", "8.8", "35.5", "25.8", "6.2"],
|
||||
["Karnataka", "2399", "37.4", "2.8", "12.5", "18.3", "23.1", "5.8"],
|
||||
@@ -359,7 +413,7 @@ data_lattice_two_tables_1 = [
|
||||
|
||||
data_lattice_two_tables_2 = [
|
||||
["State", "n", "Literacy Status", "", "", "", "", ""],
|
||||
["", "", "Illiterate", "Read & Write", "1-4 std.", "5-8 std.", "9-12 std.", "College"],
|
||||
["", "", "Illiterate", "Read & \nWrite", "1-4 std.", "5-8 std.", "9-12 std.", "College"],
|
||||
["Kerala", "2400", "8.8", "0.3", "20.1", "17.0", "45.6", "8.2"],
|
||||
["Tamil Nadu", "2400", "29.9", "1.5", "8.5", "33.1", "22.3", "4.8"],
|
||||
["Karnataka", "2399", "47.9", "2.5", "10.2", "18.8", "18.4", "2.3"],
|
||||
@@ -376,7 +430,7 @@ data_lattice_two_tables_2 = [
|
||||
data_lattice_table_areas = [
|
||||
["", "", "", "", "", "", "", "", ""],
|
||||
["State", "n", "Literacy Status", "", "", "", "", "", ""],
|
||||
["", "", "Illiterate", "Read & Write", "1-4 std.", "5-8 std.", "9-12 std.", "College", ""],
|
||||
["", "", "Illiterate", "Read & \nWrite", "1-4 std.", "5-8 std.", "9-12 std.", "College", ""],
|
||||
["Kerala", "2400", "7.2", "0.5", "25.3", "20.1", "41.5", "5.5", ""],
|
||||
["Tamil Nadu", "2400", "21.4", "2.3", "8.8", "35.5", "25.8", "6.2", ""],
|
||||
["Karnataka", "2399", "37.4", "2.8", "12.5", "18.3", "23.1", "5.8", ""],
|
||||
@@ -392,13 +446,13 @@ data_lattice_table_areas = [
|
||||
]
|
||||
|
||||
data_lattice_process_background = [
|
||||
["State", "Date", "Halt stations", "Halt days", "Persons directly reached(in lakh)", "Persons trained", "Persons counseled" ,"Persons testedfor HIV"],
|
||||
["State", "Date", "Halt \nstations", "Halt \ndays", "Persons \ndirectly \nreached\n(in lakh)", "Persons \ntrained", "Persons \ncounseled", "Persons \ntested\nfor HIV"],
|
||||
["Delhi", "1.12.2009", "8", "17", "1.29", "3,665", "2,409", "1,000"],
|
||||
["Rajasthan", "2.12.2009 to 19.12.2009", "", "", "", "", "", ""],
|
||||
["Gujarat", "20.12.2009 to 3.1.2010", "6", "13", "6.03", "3,810", "2,317", "1,453"],
|
||||
["Maharashtra", "4.01.2010 to 1.2.2010", "13", "26", "1.27", "5,680", "9,027", "4,153"],
|
||||
["Karnataka", "2.2.2010 to 22.2.2010", "11", "19", "1.80", "5,741", "3,658", "3,183"],
|
||||
["Kerala", "23.2.2010 to 11.3.2010", "9", "17", "1.42", "3,559", "2,173", "855"],
|
||||
["Rajasthan", "2.12.2009 to \n19.12.2009", "", "", "", "", "", ""],
|
||||
["Gujarat", "20.12.2009 to \n3.1.2010", "6", "13", "6.03", "3,810", "2,317", "1,453"],
|
||||
["Maharashtra", "4.01.2010 to \n1.2.2010", "13", "26", "1.27", "5,680", "9,027", "4,153"],
|
||||
["Karnataka", "2.2.2010 to \n22.2.2010", "11", "19", "1.80", "5,741", "3,658", "3,183"],
|
||||
["Kerala", "23.2.2010 to \n11.3.2010", "9", "17", "1.42", "3,559", "2,173", "855"],
|
||||
["Total", "", "47", "92", "11.81", "22,455", "19,584", "10,644"]
|
||||
]
|
||||
|
||||
@@ -442,11 +496,11 @@ data_lattice_copy_text = [
|
||||
["PCCM", "San Francisco", "Family Mosaic", "25"],
|
||||
["PCCM", "Total PHP Enrollment", "", "853"],
|
||||
["All Models Total Enrollments", "", "", "10,132,875"],
|
||||
["Source: Data Warehouse 12/14/15", "", "", ""]
|
||||
["Source: Data Warehouse \n12/14/15", "", "", ""]
|
||||
]
|
||||
|
||||
data_lattice_shift_text_left_top = [
|
||||
["Investigations", "No. ofHHs", "Age/Sex/Physiological Group", "Preva-lence", "C.I*", "RelativePrecision", "Sample sizeper State"],
|
||||
["Investigations", "No. of\nHHs", "Age/Sex/\nPhysiological Group", "Preva-\nlence", "C.I*", "Relative\nPrecision", "Sample size\nper State"],
|
||||
["Anthropometry", "2400", "All the available individuals", "", "", "", ""],
|
||||
["Clinical Examination", "", "", "", "", "", ""],
|
||||
["History of morbidity", "", "", "", "", "", ""],
|
||||
@@ -455,12 +509,12 @@ data_lattice_shift_text_left_top = [
|
||||
["", "", "Women (≥ 18 yrs)", "", "", "", "1728"],
|
||||
["Fasting blood glucose", "2400", "Men (≥ 18 yrs)", "5%", "95%", "20%", "1825"],
|
||||
["", "", "Women (≥ 18 yrs)", "", "", "", "1825"],
|
||||
["Knowledge &Practices on HTN &DM", "2400", "Men (≥ 18 yrs)", "-", "-", "-", "1728"],
|
||||
["Knowledge &\nPractices on HTN &\nDM", "2400", "Men (≥ 18 yrs)", "-", "-", "-", "1728"],
|
||||
["", "2400", "Women (≥ 18 yrs)", "-", "-", "-", "1728"]
|
||||
]
|
||||
|
||||
data_lattice_shift_text_disable = [
|
||||
["Investigations", "No. ofHHs", "Age/Sex/Physiological Group", "Preva-lence", "C.I*", "RelativePrecision", "Sample sizeper State"],
|
||||
["Investigations", "No. of\nHHs", "Age/Sex/\nPhysiological Group", "Preva-\nlence", "C.I*", "Relative\nPrecision", "Sample size\nper State"],
|
||||
["Anthropometry", "", "", "", "", "", ""],
|
||||
["Clinical Examination", "2400", "", "All the available individuals", "", "", ""],
|
||||
["History of morbidity", "", "", "", "", "", ""],
|
||||
@@ -469,12 +523,12 @@ data_lattice_shift_text_disable = [
|
||||
["Blood Pressure #", "2400", "Women (≥ 18 yrs)", "10%", "95%", "20%", "1728"],
|
||||
["", "", "Men (≥ 18 yrs)", "", "", "", "1825"],
|
||||
["Fasting blood glucose", "2400", "Women (≥ 18 yrs)", "5%", "95%", "20%", "1825"],
|
||||
["Knowledge &Practices on HTN &", "2400", "Men (≥ 18 yrs)", "-", "-", "-", "1728"],
|
||||
["Knowledge &\nPractices on HTN &", "2400", "Men (≥ 18 yrs)", "-", "-", "-", "1728"],
|
||||
["DM", "2400", "Women (≥ 18 yrs)", "-", "-", "-", "1728"]
|
||||
]
|
||||
|
||||
data_lattice_shift_text_right_bottom = [
|
||||
["Investigations", "No. ofHHs", "Age/Sex/Physiological Group", "Preva-lence", "C.I*", "RelativePrecision", "Sample sizeper State"],
|
||||
["Investigations", "No. of\nHHs", "Age/Sex/\nPhysiological Group", "Preva-\nlence", "C.I*", "Relative\nPrecision", "Sample size\nper State"],
|
||||
["Anthropometry", "", "", "", "", "", ""],
|
||||
["Clinical Examination", "", "", "", "", "", ""],
|
||||
["History of morbidity", "2400", "", "", "", "", "All the available individuals"],
|
||||
@@ -484,5 +538,53 @@ data_lattice_shift_text_right_bottom = [
|
||||
["", "", "Men (≥ 18 yrs)", "", "", "", "1825"],
|
||||
["Fasting blood glucose", "2400", "Women (≥ 18 yrs)", "5%", "95%", "20%", "1825"],
|
||||
["", "2400", "Men (≥ 18 yrs)", "-", "-", "-", "1728"],
|
||||
["Knowledge &Practices on HTN &DM", "2400", "Women (≥ 18 yrs)", "-", "-", "-", "1728"]
|
||||
["Knowledge &\nPractices on HTN &\nDM", "2400", "Women (≥ 18 yrs)", "-", "-", "-", "1728"]
|
||||
]
|
||||
|
||||
data_arabic = [
|
||||
["ً\n\xa0\nﺎﺒﺣﺮﻣ", "ﻥﺎﻄﻠﺳ\xa0ﻲﻤﺳﺍ"],
|
||||
["ﻝﺎﻤﺸﻟﺍ\xa0ﺎﻨﻴﻟﻭﺭﺎﻛ\xa0ﺔﻳﻻﻭ\xa0ﻦﻣ\xa0ﺎﻧﺍ", "؟ﺖﻧﺍ\xa0ﻦﻳﺍ\xa0ﻦﻣ"],
|
||||
["1234", "ﻂﻄﻗ\xa047\xa0ﻱﺪﻨﻋ"],
|
||||
["؟ﻙﺎﺒﺷ\xa0ﺖﻧﺍ\xa0ﻞﻫ", "ﺔﻳﺰﻴﻠﺠﻧﻻﺍ\xa0ﻲﻓ\xa0Jeremy\xa0ﻲﻤﺳﺍ"],
|
||||
["Jeremy\xa0is\xa0ﻲﻣﺮﺟ\xa0in\xa0Arabic", ""]
|
||||
]
|
||||
|
||||
data_stream_layout_kwargs = [
|
||||
["V i n s a u Ve r r e", ""],
|
||||
["Les Blancs", "12.5CL"],
|
||||
["A.O.P Côtes du Rhône", ""],
|
||||
["Domaine de la Guicharde « Autour de la chapelle » 2016", "8 €"],
|
||||
["A.O.P Vacqueyras", ""],
|
||||
["Domaine de Montvac « Melodine » 2016", "10 €"],
|
||||
["A.O.P Châteauneuf du Pape", ""],
|
||||
["Domaine de Beaurenard 2017", "13 €"],
|
||||
["A.O.P Côteaux du Languedoc", ""],
|
||||
["Villa Tempora « Un temps pour elle » 2014", "9 €"],
|
||||
["A.O.P Côtes de Provence", ""],
|
||||
["Château Grand Boise 2017", "9 €"],
|
||||
["Les Rosés", "12,5 CL"],
|
||||
["A.O.P Côtes du Rhône", ""],
|
||||
["Domaine de la Florane « A fleur de Pampre » 2016", "8 €"],
|
||||
["Famille Coulon (Domaine Beaurenard) Biotifulfox 2017", "8 €"],
|
||||
["A.O.P Vacqueyras", ""],
|
||||
["Domaine de Montvac 2017", "9 €"],
|
||||
["A.O.P Languedoc", ""],
|
||||
["Domaine de Joncas « Nébla » 2015", "8 €"],
|
||||
["Villa Tempora « L’arroseur arrosé » 2015", "9 €"],
|
||||
["A.O.P Côtes de Provence", ""],
|
||||
["Château Grand Boise « Sainte Victoire » 2017", "9 €"],
|
||||
["Château Léoube 2016", "10 €"],
|
||||
["Les Rouges", "12,CL"],
|
||||
["A.O.P Côtes du Rhône", ""],
|
||||
["Domaine de Dionysos « La Cigalette »", "8 €"],
|
||||
["Château Saint Estève d’Uchaux « Grande Réserve » 2014", "9 €"],
|
||||
["Domaine de la Guicharde « Cuvée Massillan » 2016", "9 €"],
|
||||
["Domaine de la Florane « Terre Pourpre » 2014", "10 €"],
|
||||
["L’Oratoire St Martin « Réserve des Seigneurs » 2015", "11 €"],
|
||||
["A.O.P Saint Joseph", ""],
|
||||
["Domaine Monier Perréol « Châtelet » 2015", "13 €"],
|
||||
["A.O.P Châteauneuf du Pape", ""],
|
||||
["Domaine de Beaurenard 2011", "15 €"],
|
||||
["A.O.P Cornas", ""],
|
||||
["Domaine Lionnet « Terre Brûlée » 2012", "15 €"]
|
||||
]
|
||||
|
||||
|
Before Width: | Height: | Size: 8.2 KiB After Width: | Height: | Size: 8.2 KiB |
|
Before Width: | Height: | Size: 35 KiB After Width: | Height: | Size: 48 KiB |
|
After Width: | Height: | Size: 46 KiB |
|
Before Width: | Height: | Size: 6.6 KiB After Width: | Height: | Size: 6.7 KiB |
|
After Width: | Height: | Size: 13 KiB |
|
After Width: | Height: | Size: 18 KiB |
@@ -62,6 +62,7 @@ def test_stream_two_tables():
|
||||
|
||||
filename = os.path.join(testdir, "tabula/12s0324.pdf")
|
||||
tables = camelot.read_pdf(filename, flavor='stream')
|
||||
|
||||
assert len(tables) == 2
|
||||
assert df1.equals(tables[0].df)
|
||||
assert df2.equals(tables[1].df)
|
||||
@@ -80,7 +81,7 @@ def test_stream_columns():
|
||||
|
||||
filename = os.path.join(testdir, "mexican_towns.pdf")
|
||||
tables = camelot.read_pdf(
|
||||
filename, flavor="stream", columns=["67,180,230,425,475"], row_close_tol=10)
|
||||
filename, flavor="stream", columns=["67,180,230,425,475"], row_tol=10)
|
||||
assert df.equals(tables[0].df)
|
||||
|
||||
|
||||
@@ -101,6 +102,31 @@ def test_stream_flag_size():
|
||||
assert df.equals(tables[0].df)
|
||||
|
||||
|
||||
def test_stream_strip_text():
|
||||
df = pd.DataFrame(data_stream_strip_text)
|
||||
|
||||
filename = os.path.join(testdir, "detect_vertical_false.pdf")
|
||||
tables = camelot.read_pdf(filename, flavor="stream", strip_text="\n")
|
||||
assert df.equals(tables[0].df)
|
||||
|
||||
|
||||
def test_stream_edge_tol():
|
||||
df = pd.DataFrame(data_stream_edge_tol)
|
||||
|
||||
filename = os.path.join(testdir, "edge_tol.pdf")
|
||||
tables = camelot.read_pdf(filename, flavor="stream", edge_tol=500)
|
||||
assert df.equals(tables[0].df)
|
||||
|
||||
|
||||
def test_stream_layout_kwargs():
|
||||
df = pd.DataFrame(data_stream_layout_kwargs)
|
||||
|
||||
filename = os.path.join(testdir, "detect_vertical_false.pdf")
|
||||
tables = camelot.read_pdf(
|
||||
filename, flavor="stream", layout_kwargs={"detect_vertical": False})
|
||||
assert df.equals(tables[0].df)
|
||||
|
||||
|
||||
def test_lattice():
|
||||
df = pd.DataFrame(data_lattice)
|
||||
|
||||
@@ -178,4 +204,20 @@ def test_repr():
|
||||
tables = camelot.read_pdf(filename)
|
||||
assert repr(tables) == "<TableList n=1>"
|
||||
assert repr(tables[0]) == "<Table shape=(7, 7)>"
|
||||
assert repr(tables[0].cells[0][0]) == "<Cell x1=120.48 y1=218.42 x2=164.64 y2=233.89>"
|
||||
assert repr(tables[0].cells[0][0]) == "<Cell x1=120.48 y1=218.43 x2=164.64 y2=233.77>"
|
||||
|
||||
|
||||
def test_url():
|
||||
url = "https://camelot-py.readthedocs.io/en/master/_static/pdf/foo.pdf"
|
||||
tables = camelot.read_pdf(url)
|
||||
assert repr(tables) == "<TableList n=1>"
|
||||
assert repr(tables[0]) == "<Table shape=(7, 7)>"
|
||||
assert repr(tables[0].cells[0][0]) == "<Cell x1=120.48 y1=218.43 x2=164.64 y2=233.77>"
|
||||
|
||||
|
||||
def test_arabic():
|
||||
df = pd.DataFrame(data_arabic)
|
||||
|
||||
filename = os.path.join(testdir, "tabula/arabic.pdf")
|
||||
tables = camelot.read_pdf(filename)
|
||||
assert df.equals(tables[0].df)
|
||||
|
||||
@@ -50,13 +50,25 @@ def test_no_tables_found():
|
||||
assert str(e.value) == 'No tables found on page-1'
|
||||
|
||||
|
||||
def test_no_tables_found_logs_suppressed():
|
||||
filename = os.path.join(testdir, 'foo.pdf')
|
||||
with warnings.catch_warnings():
|
||||
# the test should fail if any warning is thrown
|
||||
warnings.simplefilter('error')
|
||||
try:
|
||||
tables = camelot.read_pdf(filename, suppress_stdout=True)
|
||||
except Warning as e:
|
||||
warning_text = str(e)
|
||||
pytest.fail('Unexpected warning: {}'.format(warning_text))
|
||||
|
||||
|
||||
def test_no_tables_found_warnings_suppressed():
|
||||
filename = os.path.join(testdir, 'blank.pdf')
|
||||
with warnings.catch_warnings():
|
||||
# the test should fail if any warning is thrown
|
||||
warnings.simplefilter('error')
|
||||
try:
|
||||
tables = camelot.read_pdf(filename, suppress_warnings=True)
|
||||
tables = camelot.read_pdf(filename, suppress_stdout=True)
|
||||
except Warning as e:
|
||||
warning_text = str(e)
|
||||
pytest.fail('Unexpected warning: {}'.format(warning_text))
|
||||
|
||||
@@ -29,12 +29,20 @@ def test_grid_plot():
|
||||
|
||||
@pytest.mark.mpl_image_compare(
|
||||
baseline_dir="files/baseline_plots", remove_text=True)
|
||||
def test_contour_plot():
|
||||
def test_lattice_contour_plot():
|
||||
filename = os.path.join(testdir, "foo.pdf")
|
||||
tables = camelot.read_pdf(filename)
|
||||
return camelot.plot(tables[0], kind='contour')
|
||||
|
||||
|
||||
@pytest.mark.mpl_image_compare(
|
||||
baseline_dir="files/baseline_plots", remove_text=True)
|
||||
def test_stream_contour_plot():
|
||||
filename = os.path.join(testdir, "tabula/12s0324.pdf")
|
||||
tables = camelot.read_pdf(filename, flavor='stream')
|
||||
return camelot.plot(tables[0], kind='contour')
|
||||
|
||||
|
||||
@pytest.mark.mpl_image_compare(
|
||||
baseline_dir="files/baseline_plots", remove_text=True)
|
||||
def test_line_plot():
|
||||
@@ -49,3 +57,11 @@ def test_joint_plot():
|
||||
filename = os.path.join(testdir, "foo.pdf")
|
||||
tables = camelot.read_pdf(filename)
|
||||
return camelot.plot(tables[0], kind='joint')
|
||||
|
||||
|
||||
@pytest.mark.mpl_image_compare(
|
||||
baseline_dir="files/baseline_plots", remove_text=True)
|
||||
def test_textedge_plot():
|
||||
filename = os.path.join(testdir, "tabula/12s0324.pdf")
|
||||
tables = camelot.read_pdf(filename, flavor='stream')
|
||||
return camelot.plot(tables[0], kind='textedge')
|
||||
|
||||