From be1f0a2884c890ff81978a352de772b0745e6abd Mon Sep 17 00:00:00 2001 From: Vinayak Mehta Date: Fri, 21 Dec 2018 16:32:44 +0530 Subject: [PATCH] Update advanced docs --- docs/_static/png/edge_tol_1.png | Bin 0 -> 20450 bytes docs/_static/png/edge_tol_2.png | Bin 0 -> 20252 bytes docs/user/advanced.rst | 81 +++++++++++++++++- .../{edge_tolerance.pdf => edge_tol.pdf} | Bin tests/test_common.py | 2 +- 5 files changed, 80 insertions(+), 3 deletions(-) create mode 100644 docs/_static/png/edge_tol_1.png create mode 100644 docs/_static/png/edge_tol_2.png rename tests/files/{edge_tolerance.pdf => edge_tol.pdf} (100%) diff --git a/docs/_static/png/edge_tol_1.png b/docs/_static/png/edge_tol_1.png new file mode 100644 index 0000000000000000000000000000000000000000..f7f7a67a00a98649fc067dbf3fadfca5a3ec55c7 GIT binary patch literal 20450 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 literal 0 HcmV?d00001 diff --git a/docs/user/advanced.rst b/docs/user/advanced.rst index 31d9bd3..ca40bb8 100644 --- a/docs/user/advanced.rst +++ b/docs/user/advanced.rst @@ -316,8 +316,85 @@ 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 strip unwanted characters like spaces, dots and newlines from a string using the ``strip_text`` keyword argument. Take a look at `this 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 `. + :: + + $ 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 `, automatic table detection can fail for PDFs like `this one `_. 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 `_. + +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 `. + :: + + $ 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 `. + :: + + $ 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. diff --git a/tests/files/edge_tolerance.pdf b/tests/files/edge_tol.pdf similarity index 100% rename from tests/files/edge_tolerance.pdf rename to tests/files/edge_tol.pdf diff --git a/tests/test_common.py b/tests/test_common.py index 0289655..83c436b 100644 --- a/tests/test_common.py +++ b/tests/test_common.py @@ -113,7 +113,7 @@ def test_stream_strip_text(): def test_stream_edge_tol(): df = pd.DataFrame(data_stream_edge_tol) - filename = os.path.join(testdir, "edge_tolerance.pdf") + filename = os.path.join(testdir, "edge_tol.pdf") tables = camelot.read_pdf(filename, flavor="stream", edge_tol=500) assert df.equals(tables[0].df)