2016-02-20 19:42:37 -05:00
{
"cells": [
{
"cell_type": "markdown",
2017-02-25 13:23:51 -05:00
"metadata": {
"deletable": true,
"editable": true
},
2016-02-20 19:42:37 -05:00
"source": [
2017-02-25 13:23:51 -05:00
"# Demonstration of `pdfplumber`'s table-extraction options\n",
2016-02-20 19:42:37 -05:00
"\n",
2017-02-25 13:23:51 -05:00
"This notebook uses a [report from the FBI's National Instant Criminal Background Check System](../pdfs/background-checks.pdf)."
2016-02-20 19:42:37 -05:00
]
},
{
"cell_type": "markdown",
2017-02-25 13:23:51 -05:00
"metadata": {
"deletable": true,
"editable": true
},
2016-02-20 19:42:37 -05:00
"source": [
2016-03-06 18:30:41 -05:00
"### Import `pdfplumber`"
2016-02-20 19:42:37 -05:00
]
},
{
"cell_type": "code",
"execution_count": 1,
"metadata": {
2017-02-25 13:23:51 -05:00
"collapsed": false,
"deletable": true,
"editable": true
2016-02-20 19:42:37 -05:00
},
"outputs": [],
"source": [
2016-03-06 18:30:41 -05:00
"import pdfplumber"
2016-02-20 19:42:37 -05:00
]
},
{
"cell_type": "markdown",
2017-02-25 13:23:51 -05:00
"metadata": {
"deletable": true,
"editable": true
},
2016-02-20 19:42:37 -05:00
"source": [
"### Load the PDF"
]
},
{
"cell_type": "code",
"execution_count": 2,
"metadata": {
2017-02-25 13:23:51 -05:00
"collapsed": false,
"deletable": true,
"editable": true
2016-02-20 19:42:37 -05:00
},
"outputs": [],
"source": [
2016-03-09 07:21:17 -05:00
"pdf = pdfplumber.open(\"../pdfs/background-checks.pdf\")"
2016-02-20 19:42:37 -05:00
]
},
{
"cell_type": "markdown",
2017-02-25 13:23:51 -05:00
"metadata": {
"deletable": true,
"editable": true
},
2016-02-20 19:42:37 -05:00
"source": [
2016-03-06 18:30:41 -05:00
"### Get the first page"
2016-02-20 19:42:37 -05:00
]
},
{
"cell_type": "code",
"execution_count": 3,
"metadata": {
2017-02-25 13:23:51 -05:00
"collapsed": false,
"deletable": true,
"editable": true
2016-02-20 19:42:37 -05:00
},
"outputs": [],
"source": [
2017-02-25 13:23:51 -05:00
"p0 = pdf.pages[0]"
]
},
{
"cell_type": "code",
"execution_count": 4,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"image/png": "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\n65e/6lWw/4jjwD6wluY
"text/plain": [
"<pdfplumber.display.PageImage at 0x10be0ada0>"
]
},
"execution_count": 4,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"im = p0.to_image()\n",
"im"
2016-02-20 19:42:37 -05:00
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
2017-02-25 13:23:51 -05:00
"### What data would we get if we used the default settings?\n",
2016-03-06 18:30:41 -05:00
"\n",
2017-02-25 13:23:51 -05:00
"We can check by using `PageImage.debug_tablefinder()`:"
2016-02-20 19:42:37 -05:00
]
},
{
"cell_type": "code",
2017-02-25 13:23:51 -05:00
"execution_count": 5,
2016-02-20 19:42:37 -05:00
"metadata": {
"collapsed": false
},
2017-02-25 13:23:51 -05:00
"outputs": [
{
"data": {
"image/png": "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\n2ji7dAff4nOvJBKJRMI
"text/plain": [
"<pdfplumber.display.PageImage at 0x10be0ada0>"
]
},
"execution_count": 5,
"metadata": {},
"output_type": "execute_result"
}
],
2016-02-20 19:42:37 -05:00
"source": [
2017-02-25 13:23:51 -05:00
"im.reset().debug_tablefinder()"
2016-02-20 19:42:37 -05:00
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
2017-02-25 13:23:51 -05:00
"The default settings correctly identify the table's vertical demarcations, but don't capture the horizontal demarcations between each group of five states/territories. So:"
]
},
{
"cell_type": "markdown",
"metadata": {
"deletable": true,
"editable": true
},
"source": [
"### Using custom `.extract_table`'s settings\n",
2016-02-20 19:42:37 -05:00
"\n",
2017-02-25 13:23:51 -05:00
"- Because the columns are separated by lines, we use `vertical_strategy=\"lines\"`\n",
"- Because the rows are, primarily, separated by gutters between the text, we use `horizontal_strategy=\"text\"`\n",
"- And because the left and right-hand extremities of the text aren't quite flush with the vertical lines, we use `\"intersection_tolerance\": 15`"
2016-02-20 19:42:37 -05:00
]
},
{
"cell_type": "code",
2017-02-25 13:23:51 -05:00
"execution_count": 6,
2016-02-20 19:42:37 -05:00
"metadata": {
2017-02-25 13:23:51 -05:00
"collapsed": true
},
"outputs": [],
"source": [
"table_settings = {\n",
" \"vertical_strategy\": \"lines\",\n",
" \"horizontal_strategy\": \"text\",\n",
" \"intersection_x_tolerance\": 15\n",
"}"
]
},
{
"cell_type": "code",
"execution_count": 7,
"metadata": {
"collapsed": false,
"deletable": true,
"editable": true
},
"outputs": [
{
"data": {
"image/png": "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\nSUmNhxJxiA3AIyvu66q
"text/plain": [
"<pdfplumber.display.PageImage at 0x10be0ada0>"
]
},
"execution_count": 7,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"im.reset().debug_tablefinder(table_settings)"
]
},
{
"cell_type": "code",
"execution_count": 8,
"metadata": {
"collapsed": false,
"deletable": true,
"editable": true
},
"outputs": [],
"source": [
"table = p0.extract_table(table_settings)"
]
},
{
"cell_type": "code",
"execution_count": 9,
"metadata": {
"collapsed": false,
"deletable": true,
"editable": true
2016-02-20 19:42:37 -05:00
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
2017-02-25 13:23:51 -05:00
"['November - 2015', None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None]\n",
"['Pre-Pawn Redemption Returned/Disposition Rentals Private Sale Return to Seller - Private Sale', None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None, None]\n",
"['State / Territory', 'Permit', 'Handgun', 'Long Gun', '*Other', '**Multiple', 'Admin', 'Handgun', 'Long Gun', '*Other', 'Handgun', 'Long Gun', '*Other', 'Handgun', 'Long Gun', '*Other', 'Handgun', 'Long Gun', 'Handgun', 'Long Gun', '*Other', 'Handgun', 'Long Gun', '*Other', 'Totals']\n",
"['Alabama', '18,870', '23,022', '22,650', '859', '1,178', '0', '14', '15', '0', '2,179', '2,307', '11', '0', '0', '0', '', '', '13', '14', '0', '3', '2', '0', '71,137']\n",
"['Alaska', '209', '3,062', '3,209', '191', '184', '0', '9', '3', '0', '100', '100', '0', '18', '9', '1', '', '', '0', '0', '0', '0', '0', '0', '7,095']\n"
2016-02-20 19:42:37 -05:00
]
}
],
"source": [
2016-03-06 18:30:41 -05:00
"for row in table[:5]:\n",
" print(row)"
2016-02-20 19:42:37 -05:00
]
},
{
"cell_type": "markdown",
2017-02-25 13:23:51 -05:00
"metadata": {
"deletable": true,
"editable": true
},
2016-02-20 19:42:37 -05:00
"source": [
2017-02-25 13:23:51 -05:00
"### Cleaning up the data\n",
2016-02-20 19:42:37 -05:00
"\n",
2017-02-25 13:23:51 -05:00
"`.extract_table` worked with our custom settings, but the table it detected contains extraneous headers and footers. Since we know that the `Alabama` row is the first, and that there are 56 rows we care about (50 states + DC + 4 territories + the \"Totals\" row), we can slice away the rest:"
2016-02-20 19:42:37 -05:00
]
},
{
"cell_type": "code",
2017-02-25 13:23:51 -05:00
"execution_count": 10,
2016-02-20 19:42:37 -05:00
"metadata": {
"collapsed": true
},
"outputs": [],
2017-02-25 13:23:51 -05:00
"source": [
"core_table = table[3:3+56]"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The first row:"
]
},
{
"cell_type": "code",
"execution_count": 11,
"metadata": {
"collapsed": false
},
"outputs": [
{
"data": {
"text/plain": [
"'Alabama • 18,870 • 23,022 • 22,650 • 859 • 1,178 • 0 • 14 • 15 • 0 • 2,179 • 2,307 • 11 • 0 • 0 • 0 • • • 13 • 14 • 0 • 3 • 2 • 0 • 71,137'"
]
},
"execution_count": 11,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"\" • \".join(core_table[0])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"The last:"
]
},
{
"cell_type": "code",
"execution_count": 12,
"metadata": {
"collapsed": false,
"deletable": true,
"editable": true
},
"outputs": [
{
"data": {
"text/plain": [
"'Totals • 804,006 • 671,330 • 636,903 • 26,597 • 23,015 • 1,281 • 218 • 249 • 13 • 29,905 • 38,487 • 102 • 1,656 • 533 • 44 • 0 • 0 • 1,067 • 905 • 65 • 31 • 45 • 5 • 2,236,457'"
]
},
"execution_count": 12,
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
"\" • \".join(core_table[-1])"
]
},
{
"cell_type": "markdown",
"metadata": {},
"source": [
"Now, let's turn those rows into dictionaries, and also convert strings-representing-numbers to the numbers themselves, e.g., `\"18,870\" -> 18870`:"
]
},
{
"cell_type": "code",
"execution_count": 13,
"metadata": {
"collapsed": true,
"deletable": true,
"editable": true
},
"outputs": [],
2016-02-20 19:42:37 -05:00
"source": [
"COLUMNS = [\n",
" \"state\",\n",
" \"permit\",\n",
" \"handgun\",\n",
" \"long_gun\",\n",
" \"other\",\n",
" \"multiple\",\n",
" \"admin\",\n",
" \"prepawn_handgun\",\n",
" \"prepawn_long_gun\",\n",
" \"prepawn_other\",\n",
" \"redemption_handgun\",\n",
" \"redemption_long_gun\",\n",
" \"redemption_other\",\n",
" \"returned_handgun\",\n",
" \"returned_long_gun\",\n",
" \"returned_other\",\n",
" \"rentals_handgun\",\n",
" \"rentals_long_gun\",\n",
" \"private_sale_handgun\",\n",
" \"private_sale_long_gun\",\n",
" \"private_sale_other\",\n",
" \"return_to_seller_handgun\",\n",
" \"return_to_seller_long_gun\",\n",
" \"return_to_seller_other\",\n",
" \"totals\"\n",
"]"
]
},
{
"cell_type": "code",
2017-02-25 13:23:51 -05:00
"execution_count": 14,
2016-02-20 19:42:37 -05:00
"metadata": {
2017-02-25 13:23:51 -05:00
"collapsed": true,
"deletable": true,
"editable": true
2016-02-20 19:42:37 -05:00
},
"outputs": [],
"source": [
2016-03-06 18:30:41 -05:00
"def parse_value(i, x):\n",
" if i == 0: return x\n",
2017-02-25 13:23:51 -05:00
" if x == \"\": return None\n",
2016-02-20 19:42:37 -05:00
" return int(x.replace(\",\", \"\"))"
]
},
{
"cell_type": "code",
2017-02-25 13:23:51 -05:00
"execution_count": 15,
2016-02-20 19:42:37 -05:00
"metadata": {
2017-02-25 13:23:51 -05:00
"collapsed": false,
"deletable": true,
"editable": true
2016-02-20 19:42:37 -05:00
},
"outputs": [],
"source": [
2017-02-25 13:23:51 -05:00
"from collections import OrderedDict\n",
2016-02-20 19:42:37 -05:00
"def parse_row(row):\n",
2017-02-25 13:23:51 -05:00
" return OrderedDict((COLUMNS[i], parse_value(i, cell))\n",
2016-03-06 18:30:41 -05:00
" for i, cell in enumerate(row))"
2016-02-20 19:42:37 -05:00
]
},
{
"cell_type": "code",
2017-02-25 13:23:51 -05:00
"execution_count": 16,
2016-02-20 19:42:37 -05:00
"metadata": {
2017-02-25 13:23:51 -05:00
"collapsed": false,
"deletable": true,
"editable": true
2016-02-20 19:42:37 -05:00
},
"outputs": [],
"source": [
2017-02-25 13:23:51 -05:00
"data = [ parse_row(row) for row in core_table ]"
2016-02-20 19:42:37 -05:00
]
},
{
"cell_type": "markdown",
2017-02-25 13:23:51 -05:00
"metadata": {
"deletable": true,
"editable": true
},
2016-02-20 19:42:37 -05:00
"source": [
2017-02-25 13:23:51 -05:00
"Now here's the first row, parsed:"
2016-02-20 19:42:37 -05:00
]
},
{
"cell_type": "code",
2017-02-25 13:23:51 -05:00
"execution_count": 17,
2016-02-20 19:42:37 -05:00
"metadata": {
2017-02-25 13:23:51 -05:00
"collapsed": false,
"deletable": true,
"editable": true
2016-02-20 19:42:37 -05:00
},
"outputs": [
{
"data": {
"text/plain": [
2017-02-25 13:23:51 -05:00
"OrderedDict([('state', 'Alabama'),\n",
" ('permit', 18870),\n",
" ('handgun', 23022),\n",
" ('long_gun', 22650),\n",
" ('other', 859),\n",
" ('multiple', 1178),\n",
" ('admin', 0),\n",
" ('prepawn_handgun', 14),\n",
" ('prepawn_long_gun', 15),\n",
" ('prepawn_other', 0),\n",
" ('redemption_handgun', 2179),\n",
" ('redemption_long_gun', 2307),\n",
" ('redemption_other', 11),\n",
" ('returned_handgun', 0),\n",
" ('returned_long_gun', 0),\n",
" ('returned_other', 0),\n",
" ('rentals_handgun', None),\n",
" ('rentals_long_gun', None),\n",
" ('private_sale_handgun', 13),\n",
" ('private_sale_long_gun', 14),\n",
" ('private_sale_other', 0),\n",
" ('return_to_seller_handgun', 3),\n",
" ('return_to_seller_long_gun', 2),\n",
" ('return_to_seller_other', 0),\n",
" ('totals', 71137)])"
2016-02-20 19:42:37 -05:00
]
},
2017-02-25 13:23:51 -05:00
"execution_count": 17,
2016-02-20 19:42:37 -05:00
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
2017-02-25 13:23:51 -05:00
"data[0]"
2016-02-20 19:42:37 -05:00
]
},
{
"cell_type": "markdown",
2017-02-25 13:23:51 -05:00
"metadata": {
"deletable": true,
"editable": true
},
2016-02-20 19:42:37 -05:00
"source": [
"### Sort the data\n",
"\n",
"For demonstration purposes, let's list the rows with the highest number of handgun-only background checks:"
]
},
{
"cell_type": "code",
2017-02-25 13:23:51 -05:00
"execution_count": 18,
2016-02-20 19:42:37 -05:00
"metadata": {
2017-02-25 13:23:51 -05:00
"collapsed": false,
"deletable": true,
"editable": true
2016-02-20 19:42:37 -05:00
},
"outputs": [
{
"name": "stdout",
"output_type": "stream",
"text": [
"Totals: 671,330 handgun-only checks\n",
"Pennsylvania: 62,752 handgun-only checks\n",
"Texas: 56,941 handgun-only checks\n",
"Florida: 50,796 handgun-only checks\n",
"California: 41,181 handgun-only checks\n",
"Ohio: 34,878 handgun-only checks\n"
]
}
],
"source": [
2017-02-25 13:23:51 -05:00
"for row in list(reversed(sorted(data, key=lambda x: x[\"handgun\"])))[:6]:\n",
2016-02-20 19:42:37 -05:00
" print(\"{state}: {handgun:,d} handgun-only checks\".format(**row))"
]
},
{
"cell_type": "markdown",
2017-02-25 13:23:51 -05:00
"metadata": {
"deletable": true,
"editable": true
},
2016-02-20 19:42:37 -05:00
"source": [
2016-03-06 20:21:54 -05:00
"### Use `extract_text` to extract the report month\n",
2016-02-20 19:42:37 -05:00
"\n",
2017-02-25 13:23:51 -05:00
"It looks like the month of the report is listed in an area 35px to 65px from the top of the page. But there's also some other text directly above and below it. So when we crop for that area, we'll use `.within_bbox` instead of `.crop` to select only characters (and other objects) that are fully within the bounding box."
2016-02-20 19:42:37 -05:00
]
},
{
"cell_type": "code",
2017-02-25 13:23:51 -05:00
"execution_count": 19,
2016-02-20 19:42:37 -05:00
"metadata": {
2017-02-25 13:23:51 -05:00
"collapsed": false,
"deletable": true,
"editable": true
2016-02-20 19:42:37 -05:00
},
2017-02-25 13:23:51 -05:00
"outputs": [
{
"data": {
"image/png": "iVBORw0KGgoAAAANSUhEUgAAA/AAAAAeCAIAAAAEm2I2AAALU0lEQVR4nO3db2gb5x0H8OfmEBcX\nyz7Nod4c/8lpLnEJLHDCBWdrk+wO9i604/Ri0HmvdBDIu6Z365+ErKunS0vpSBPQ7UWX9sWCxdwV\nBtvQtWm7JVCjY1nqxd2KrpYdDW8eefSHmTqr57145uMiybKVWjpb+n4QRrp77nl+vjPmd49+d8et\nra2ReuI4blzTTsVidR0FAFpcmOMuJZOjksQ+npTlrONkHcddeEHXLxtGam2NEDKhqrO2/VYq5e1B\nj0RmbfuddHrask7K8lup1IgoumutREKPRFJl/zDDG/+L84bkfc/6fyed7hME1nJCVQ+KYpHSC7r+\n3p07AZ4nhMza9lPhcMUeKnboxlbSskqoE6p623EuJZOXDaPi0GxPekM9EQo9F4+PShIb5aAoPhUO\nS4rCumUburuOBcaCKQ/Yu4fdI1LerPoe6OR574hZxzkRClX89asf9I36L98D7GDtF4Sa9sy0Zd12\nnCejUdbY+9cIAM1t2rISly69NzVV11G+UtfeAQB88Vw8XqR0o7WSoszaNkv6CSFZx7mg61YiwXKv\nUUkaEUU9EpkyTdbeSiQuG8a4pm1LbAdFMcDzeiRSoJQQctkwpkxzvyCw1PAT2yaEzNr2hKpuy3Be\nRUqnLYu92LgsD95o6FFJ6hOEl1SVhTqhqkVKD3rOcwI8fyoWu2wY05ZFCBkRxRFRvKDrBUrZXq0Y\nBuuWNXP3wBPRKIvESiQIIVnHsRIJdoJRxYgojkoS66pA6UYjks0O+kY2Oli17plOnp9QVfYXxXaO\neyYAAPDlIaEHgCbUJwhV8u9RSWKTrydCoTDHnQiF3jbN2OSkpCiswcVk8lFJel3XwxwX5rgJVR2V\npIqZ37imPVo2GVxdgOd/nU538vzxYDDMcZcN49l4fFSSJEV5Mho9KcthjtMjkXFNc+PZLlOmeVKW\n2WvKNN0J+ypDv5VKFSlloX5kWReTyZIkW1IUSVHc1PZiMkkIOR4MnpRlNttdMXNlM+XuHjgVi7HZ\n63FN+8iy2EHp5HlviryR2OQk6+p4MFglS970oFe00cGqdc+MiOK4pk2oapjjjgeDBUpZMAAA24JD\nyQ0AtKxZ2y5S2snzI5USxwKln9g2m6Ot0+jl4xYordNwm6oydMVQK/bwiW27VSsltUDlKk5Uswns\nrQx3HxGSzQ56rf1vfVxCSIHSIqWYmwdoKY0puUFCDwAA22PasvRIJDY5OSpJrKYFU9EA0OIak9Dv\nqWvvAADQOkYl6Ylo9KQsux9ZPQwAANQVEnoAANg2bjU8CksAABoGCT0AAGwnpPIAAA2Gu9wAAAAA\nAOxiSOgBAAAAAHYxJPQAAAAAALsYEnoAgEYbluW+smeaDstyh237FU/DhuYTiZFwWOS4w8Fgn663\neR7o26frh4NBkePKdw4hZFBVy4PssO2AZbmvdsepb/QAADsSLooFAGg0ln0WJangecpswLL+4clu\nGxxPY4YOWJYQiSxqmjM52WHbg6pKCMnGYoSQPl3nE4lMPL7K80Ik4i5nBlW1xzRp2VNdR8Jh78dF\nTcvisScA0HqQ0AMA+GBFEAZUdTaVWvXpubC+4BOJgiSxnHtFENodp0/X2cd9ppmJx1nKfjsW27++\nvN1xBlT1wUpfILAJ+5l0egX31QGA1oaSGwAAH2RjsT2U9hpGxbVtlA6qKqs/GQmH+USCENKn695a\nlHbHGZZlVmTSRmmfrh8KhVj7gGWxNqyWZliWDweDw7LcRmmPaR4KhYZlmfXp6rQstnlJGUyVnvlE\n4lAoxGbTt2gpGp2Px92PX6yfzAQsq41SdwK+KEltlLKxBlT1riDMplLlvXXY9oogIJsHAEBCDwDg\ng1Wez8TjvYbhpsheg6raaVm3Y7GZdLogSUIk0u44y6LYaxhutt1jmu2Ow9JZIRIJWFb23vZkvcSF\nKoozOUkIYRl5Nha7Kwglderu5gHL2u9ZVaXnXsOgilJTPr0sit72+0yTFR113rsTvG2cyclMPF5x\nFBYJO9lgFflbjwQAoJmg5AYAwB9UUQqSVF5402HbfCIxm0otiyIhJBuLtTtOr2Gw+nI+kfhXNEoI\ncd+wC0Nv3LnDOsnGYgHL6jFNVrKyqGmsGSFkWJbZWFRRRI7rsG02BNuK5daLmiZEIkvR6LIoVu95\nKRp1e64V+wqi3XEyySS5N4MvUaUkqcO2V3k+G4utCEKPabKvO1BDDwAtCAk9AIBv5uPxkXC41zC8\naSibs3dTbfa+T9cz8fhSNMry+A7bbnccVqPCimcOB4Pent1qlrv35sre/HiPp7TGvTyX9clW1dSz\nN/iSPku0UfqwLLc7zt+SSfZrVuxqU58mk+57VsK0b/1kAwCgpSChBwDwzYogLGpan64XPbmvN5Vn\n3ByaKkqvYbQ7zj7TLCl3sdfW6hRkTT0Py3L1Dcuzee8qdr5xf3ef/ILn23y6TRAAgL9QQw8A4KdF\nTWOFNyXLvfdcf3C9NmZZFJdFscc0+UTCewkpuTcJZjd5rCkMd2advWGnCvfRs7225r7K17JsnhDy\ncTrtzebZcG4MrJZmowl+l8hx3kt791CKC2QBoDUhoQcA8Nl8PF5S/bIiCO7dZnoNo8c0l9ar1Zei\nUVYs7ib0/xZFdu92b/tai1geMow2Stl9JFkA29WzV69hdNj2UjT6oOeBUISQFUGgitJjmiyGXsNY\n2kJ1/ooguFcJs9hQbwMArQklNwAAPnMLb9wls6mUEImw4nV23ad7+SlVlEFV9ea7qzz/cTrtbZ+J\nxzed3i5RlCS2OVWUzPqdJbelZ699pkkIGbz36wg2l5+Jxx+WZTZQQZIWNW3T3j5NJgdU1Rtb+ZOn\nAABaAbdWt7LL/w/AceOadgqzJgAANXLvSrlF3rvWbO9wX7LnbYlhI+xu9C31fC4A2EWmLStx6dJ7\nU1N1HQUz9AAAO1Stqe2XzLmrDNeYbL56DBtpWGwAADsWaugBAAAAAHYxJPQAAAAAALtYI0puVj7/\nvAGj7ATPf++bA/2rfkcBO9TMjT2hkW/5HUVTKRbyXxTp1/Z/3e9AmkqhUPgPt7cj0OV3IE3ln7cz\nQwd6/I6ivmZv/vUbjxzyO4pm8+nNWw8fHPE7iqZSLBQeeuSRH54507AR7969+5W2tnqP0oiEvv2B\nBxowyk6wfGcu/quC31HADnXk24fPnpnwO4qmcu0P7//lj7/56fNP+x1IU3n3w+t/3/PVsceP+R1I\nU3ntxWcvvjrudxT1dfw7p85P6Ju3g1o8+d3vv6Y943cUTeXqtetTt241csS9e/f+d7Xus70ouQEA\n8JOTWaA5TATUZubGn7wfF+bm8rncFrf1Nq5pwybgOFlKW+WPLTM3n8vl/dq8FcwtLNy8dSuXv5+9\nNLewcH8bbsvmTQl3uQFoLS+/dHbm5o1Ad/fAwNDp587l87muru4qDTbqp3zDVvOjn7xCcwWazwuD\n/SXfErz74XXrw+vlXx3QXIHvDrjvz79uSo+NEULIIHGXl7dsDq+cO5PP5Qq5XP/Q0NNnf+wuHDt6\nrPzbgHwu19XdzX6WrLr+wdWrv/9te/sDv3vnbZaLd3V3jx091k8OlDSuuDkhZCHzWT858POfvTp2\n9BghZOsb7kC6foHSIqUFQeiLxU55V1Fa4PmArl+QpEclaZQtNM0p78dm8uLZ83++8XFXd9fQ0MAL\n557J5fJzcwtDQ6S7u7R47MWz5x87duTxo0fcJW/+4pcfXL2WmZt/4ZzmLn/zjSslzXaLsy+/nMsX\ncvn80ED/udOnvcuPjh05dmTM2ziXz3d3dbGfVZq9ceXK+9euf7awcO70aXfVG1euzN/O/iASqdhn\nSUg3Zma6A10spFw+/9n8woGB/vJmWx+6vGWL+x+iQoFjw3L/QQAAAABJRU5ErkJggg==\n",
"text/plain": [
"<pdfplumber.display.PageImage at 0x10c8c2ac8>"
]
},
"execution_count": 19,
"metadata": {},
"output_type": "execute_result"
}
],
2016-02-20 19:42:37 -05:00
"source": [
2017-02-25 13:23:51 -05:00
"month_crop = p0.within_bbox((0, 35, p0.width, 65))\n",
"month_crop.to_image()"
2016-02-20 19:42:37 -05:00
]
},
{
"cell_type": "code",
2017-02-25 13:23:51 -05:00
"execution_count": 20,
2016-02-20 19:42:37 -05:00
"metadata": {
2017-02-25 13:23:51 -05:00
"collapsed": false,
"deletable": true,
"editable": true
2016-02-20 19:42:37 -05:00
},
"outputs": [
{
"data": {
"text/plain": [
"'November - 2015'"
]
},
2017-02-25 13:23:51 -05:00
"execution_count": 20,
2016-02-20 19:42:37 -05:00
"metadata": {},
"output_type": "execute_result"
}
],
"source": [
2017-02-25 13:23:51 -05:00
"month_chars = month_crop.extract_text()\n",
2016-03-06 18:30:41 -05:00
"month_chars"
2016-02-20 19:42:37 -05:00
]
},
{
"cell_type": "markdown",
2017-02-25 13:23:51 -05:00
"metadata": {
"deletable": true,
"editable": true
},
2016-02-20 19:42:37 -05:00
"source": [
"---\n",
"\n",
"---\n",
"\n",
"---"
]
}
],
"metadata": {
"kernelspec": {
"display_name": "Python 3",
"language": "python",
"name": "python3"
},
"language_info": {
"codemirror_mode": {
"name": "ipython",
"version": 3
},
"file_extension": ".py",
"mimetype": "text/x-python",
"name": "python",
"nbconvert_exporter": "python",
"pygments_lexer": "ipython3",
"version": "3.4.3"
}
},
"nbformat": 4,
"nbformat_minor": 0
}