mirror of
https://github.com/jsvine/pdfplumber.git
synced 2026-08-29 16:40:24 +08:00
104 lines
3.0 KiB
Python
104 lines
3.0 KiB
Python
#!/usr/bin/env python
|
|
import io
|
|
import logging
|
|
import os
|
|
import unittest
|
|
|
|
import PIL.Image
|
|
import pytest
|
|
|
|
import pdfplumber
|
|
from pdfplumber.table import TableFinder
|
|
|
|
logging.disable(logging.ERROR)
|
|
|
|
HERE = os.path.abspath(os.path.dirname(__file__))
|
|
|
|
|
|
class Test(unittest.TestCase):
|
|
@classmethod
|
|
def setup_class(self):
|
|
path = os.path.join(HERE, "pdfs/nics-background-checks-2015-11.pdf")
|
|
self.pdf = pdfplumber.open(path)
|
|
self.im = self.pdf.pages[0].to_image()
|
|
|
|
@classmethod
|
|
def teardown_class(self):
|
|
self.pdf.close()
|
|
|
|
def test_basic_conversion(self):
|
|
self.im.reset()
|
|
self.im.draw_rects(self.im.page.rects)
|
|
self.im.draw_circle(self.im.page.chars[0])
|
|
self.im.draw_line(self.im.page.edges[0])
|
|
self.im.draw_vlines([10])
|
|
self.im.draw_hlines([10])
|
|
|
|
def test_width_height(self):
|
|
p = self.pdf.pages[0]
|
|
with pytest.raises(ValueError):
|
|
p.to_image(resolution=72, height=100)
|
|
|
|
im = p.to_image(width=503)
|
|
assert im.original.width == 503
|
|
|
|
im = p.to_image(height=805)
|
|
assert im.original.height == 805
|
|
|
|
def test_debug_tablefinder(self):
|
|
self.im.reset()
|
|
settings = {"horizontal_strategy": "text", "intersection_tolerance": 5}
|
|
self.im.debug_tablefinder(settings)
|
|
finder = TableFinder(self.im.page, settings)
|
|
self.im.debug_tablefinder(finder)
|
|
|
|
self.im.debug_tablefinder(None)
|
|
|
|
with pytest.raises(ValueError):
|
|
self.im.debug_tablefinder(0)
|
|
|
|
def test_bytes_stream_to_image(self):
|
|
path = os.path.join(HERE, "pdfs/nics-background-checks-2015-11.pdf")
|
|
page = pdfplumber.PDF(io.BytesIO(open(path, "rb").read())).pages[0]
|
|
page.to_image()
|
|
|
|
def test_curves(self):
|
|
path = os.path.join(HERE, "../examples/pdfs/ag-energy-round-up-2017-02-24.pdf")
|
|
page = pdfplumber.open(path).pages[0]
|
|
im = page.to_image()
|
|
im.draw_lines(page.curves)
|
|
|
|
def test_cropped(self):
|
|
im = self.pdf.pages[0].crop((10, 20, 30, 50)).to_image()
|
|
assert im.original.size == (20, 30)
|
|
|
|
def test_copy(self):
|
|
assert self.im.copy().original == self.im.original
|
|
|
|
def test_outline_words(self):
|
|
self.im.outline_words(
|
|
stroke="blue",
|
|
fill=(0, 200, 10),
|
|
stroke_width=2,
|
|
x_tolerance=5,
|
|
y_tolerance=5,
|
|
)
|
|
|
|
def test_outline_chars(self):
|
|
self.im.outline_chars(stroke="blue", fill=(0, 200, 10), stroke_width=2)
|
|
|
|
def test__repr_png_(self):
|
|
png = self.im._repr_png_()
|
|
assert isinstance(png, bytes)
|
|
assert len(png) in (
|
|
71939,
|
|
61247,
|
|
) # PNG encoder seems to work differently on different setups
|
|
|
|
def test_decompression_bomb(self):
|
|
original_max = PIL.Image.MAX_IMAGE_PIXELS
|
|
PIL.Image.MAX_IMAGE_PIXELS = 10
|
|
with pytest.raises(PIL.Image.DecompressionBombError):
|
|
self.pdf.pages[0].to_image()
|
|
PIL.Image.MAX_IMAGE_PIXELS = original_max
|