From 60dff8d785dcd4bea20be35b0f6a249ba4d44216 Mon Sep 17 00:00:00 2001 From: Manuel Zapata Date: Fri, 12 Aug 2016 11:36:36 +0100 Subject: [PATCH 1/2] Add support for PNG filters average and paeth --- PyPDF2/filters.py | 15 ++++++++++++++- PyPDF2/utils.py | 14 ++++++++++++++ 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/PyPDF2/filters.py b/PyPDF2/filters.py index ea8361c..f6b2158 100644 --- a/PyPDF2/filters.py +++ b/PyPDF2/filters.py @@ -34,7 +34,9 @@ Implementation of stream filters for PDF. __author__ = "Mathieu Fenniak" __author_email__ = "biziqe@mathieu.fenniak.net" -from .utils import PdfReadError, ord_, chr_ +import math + +from .utils import PdfReadError, ord_, chr_, paethPredictor from sys import version_info if version_info < ( 3, 0 ): from cStringIO import StringIO @@ -136,6 +138,17 @@ class FlateDecode(object): elif filterByte == 2: for i in range(1, rowlength): rowdata[i] = (rowdata[i] + prev_rowdata[i]) % 256 + elif filterByte == 3: + for i in range(2, rowlength): + floor = math.floor(rowdata[i-1] + prev_rowdata[i])/2 + rowdata[i] = (rowdata[i] + int(floor)) % 256 + elif filterByte == 4: + for i in range(2, rowlength): + left = rowdata[i - 1] + up = prev_rowdata[i] + up_left = prev_rowdata[i - 1] + paeth = paethPredictor(left, up, up_left) + rowdata[i] = (rowdata[i] + paeth) % 256 else: # unsupported PNG filter raise PdfReadError("Unsupported PNG filter %r" % filterByte) diff --git a/PyPDF2/utils.py b/PyPDF2/utils.py index 6772c0c..e7419e5 100644 --- a/PyPDF2/utils.py +++ b/PyPDF2/utils.py @@ -283,3 +283,17 @@ def hexStr(num): WHITESPACES = [b_(x) for x in [' ', '\n', '\r', '\t', '\x00']] + + +def paethPredictor(left, up, up_left): + p = left + up - up_left + dist_left = abs(p - left) + dist_up = abs(p - up) + dist_up_left = abs(p - up_left) + + if dist_left <= dist_up and dist_left <= dist_up_left: + return left + elif dist_up <= dist_up_left: + return up + else: + return up_left From 60abb83056b34a35dcec51a68bdbb2e58e6a57d4 Mon Sep 17 00:00:00 2001 From: Juan Pablo Gaviria Date: Fri, 12 Aug 2016 08:35:18 -0500 Subject: [PATCH 2/2] Fix filter type 3 and 4 byte range --- PyPDF2/filters.py | 11 ++++++----- 1 file changed, 6 insertions(+), 5 deletions(-) diff --git a/PyPDF2/filters.py b/PyPDF2/filters.py index f6b2158..bbf9556 100644 --- a/PyPDF2/filters.py +++ b/PyPDF2/filters.py @@ -139,14 +139,15 @@ class FlateDecode(object): for i in range(1, rowlength): rowdata[i] = (rowdata[i] + prev_rowdata[i]) % 256 elif filterByte == 3: - for i in range(2, rowlength): - floor = math.floor(rowdata[i-1] + prev_rowdata[i])/2 + for i in range(1, rowlength): + left = rowdata[i-1] if i > 1 else 0 + floor = math.floor(left + prev_rowdata[i])/2 rowdata[i] = (rowdata[i] + int(floor)) % 256 elif filterByte == 4: - for i in range(2, rowlength): - left = rowdata[i - 1] + for i in range(1, rowlength): + left = rowdata[i - 1] if i > 1 else 0 up = prev_rowdata[i] - up_left = prev_rowdata[i - 1] + up_left = prev_rowdata[i - 1] if i > 1 else 0 paeth = paethPredictor(left, up, up_left) rowdata[i] = (rowdata[i] + paeth) % 256 else: