1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90
|
import shutil
from subprocess import PIPE, run
import sys
import pytest
import pikepdf
@pytest.fixture
def pal(resources):
return pikepdf.open(resources / 'pal-1bit-rgb.pdf')
class FilterThru(pikepdf.TokenFilter):
def handle_token(self, token):
return token
class FilterDrop(pikepdf.TokenFilter):
def handle_token(self, token):
return None
class FilterNumbers(pikepdf.TokenFilter):
def __init__(self):
super().__init__()
def handle_token(self, token):
if token.type_ in (pikepdf.TokenType.real, pikepdf.TokenType.integer):
return [token, pikepdf.Token(pikepdf.TokenType.space, b" ")]
class FilterCollectNames(pikepdf.TokenFilter):
def __init__(self):
super().__init__()
self.names = []
def handle_token(self, token):
if token.type_ == pikepdf.TokenType.name:
self.names.append(token.value)
return None
@pytest.mark.parametrize(
'filter, expected',
[
(FilterThru, b'q\n144.0000 0 0 144.0000 0.0000 0.0000 cm\n/Im0 Do\nQ'),
(FilterDrop, b''),
(FilterNumbers, b'144.0000 0 0 144.0000 0.0000 0.0000 '),
],
)
def test_filter_thru(pal, filter, expected):
page = pikepdf.Page(pal.pages[0])
page.add_content_token_filter(filter())
after = page.obj.Contents.read_bytes()
assert after == expected
def test_filter_names(pal):
page = pikepdf.Page(pal.pages[0])
filter = FilterCollectNames()
result = page.get_filtered_contents(filter)
assert result == b''
assert filter.names == ['/Im0']
after = page.obj.Contents.read_bytes()
assert after != b''
class FilterInvalid(pikepdf.TokenFilter):
def handle_token(self, token):
return 42
def test_invalid_handle_token(pal):
page = pikepdf.Page(pal.pages[0])
with pytest.raises((TypeError, pikepdf.PdfError)):
page.get_filtered_contents(FilterInvalid())
def test_invalid_tokenfilter(pal):
page = pikepdf.Page(pal.pages[0])
with pytest.raises(TypeError):
page.get_filtered_contents(list())
def test_tokenfilter_is_abstract(pal):
page = pikepdf.Page(pal.pages[0])
with pytest.raises((RuntimeError, pikepdf.PdfError)):
page.get_filtered_contents(pikepdf.TokenFilter())
|