Generalize the search for FlateDecode (there can be several filters in an array)
This commit is contained in:
parent
3b1a5152e4
commit
b6c1f670ef
1 changed files with 14 additions and 4 deletions
|
@ -61,7 +61,7 @@ getKey :: PDFContent m => String -> Object -> m DirectObject
|
||||||
getKey key object = getDictionary object >>= catchMaybe . Map.lookup (Name key)
|
getKey key object = getDictionary object >>= catchMaybe . Map.lookup (Name key)
|
||||||
where
|
where
|
||||||
errorMessage =
|
errorMessage =
|
||||||
printf "Key %s not found in dictionary %s" key (show object)
|
printf "Key %s not found in object %s" key (show object)
|
||||||
catchMaybe = maybe (fail errorMessage) return
|
catchMaybe = maybe (fail errorMessage) return
|
||||||
|
|
||||||
objectById :: PDFContent m => ObjectId -> m Object
|
objectById :: PDFContent m => ObjectId -> m Object
|
||||||
|
@ -96,17 +96,27 @@ data Raw = Raw
|
||||||
onLazy :: (Lazy.ByteString -> Lazy.ByteString) -> ByteString -> ByteString
|
onLazy :: (Lazy.ByteString -> Lazy.ByteString) -> ByteString -> ByteString
|
||||||
onLazy f = Lazy.toStrict . f . Lazy.fromStrict
|
onLazy f = Lazy.toStrict . f . Lazy.fromStrict
|
||||||
|
|
||||||
|
contains :: String -> DirectObject -> Bool
|
||||||
|
contains needle (NameObject (Name n)) = needle == n
|
||||||
|
contains needle (Array directObjects) = oneOf directObjects (contains needle)
|
||||||
|
where
|
||||||
|
oneOf [] _ = False
|
||||||
|
oneOf (x:xs) p = p x || oneOf xs p
|
||||||
|
contains _ _ = False
|
||||||
|
|
||||||
instance MonadFail m => Box m Clear Object ByteString where
|
instance MonadFail m => Box m Clear Object ByteString where
|
||||||
r Clear (Stream {header, streamContent}) = return $
|
r Clear (Stream {header, streamContent}) = return $
|
||||||
case Map.lookup (Name "Filter") header of
|
case Map.lookup (Name "Filter") header of
|
||||||
Just (NameObject (Name "FlateDecode")) -> onLazy decompress streamContent
|
Just directObject
|
||||||
|
| contains "FlateDecode" directObject -> onLazy decompress streamContent
|
||||||
_ -> streamContent
|
_ -> streamContent
|
||||||
r _ obj = expected "stream" obj
|
r _ obj = expected "stream" obj
|
||||||
|
|
||||||
w Clear streamContent obj@(Stream {header}) = return $
|
w Clear streamContent obj@(Stream {header}) = return $
|
||||||
case Map.lookup (Name "Filter") header of
|
case Map.lookup (Name "Filter") header of
|
||||||
Just (NameObject (Name "FlateDecode")) ->
|
Just directObject
|
||||||
obj {streamContent = onLazy compress streamContent}
|
| contains "FlateDecode" directObject ->
|
||||||
|
obj {streamContent = onLazy compress streamContent}
|
||||||
_ -> obj {streamContent}
|
_ -> obj {streamContent}
|
||||||
w _ _ obj = expected "stream" obj
|
w _ _ obj = expected "stream" obj
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue