Fix precision bug caused by using Floats to represent PDF Number values sometimes used to represent a byte offset within a file

This commit is contained in:
Tissevert 2019-09-22 01:34:17 +02:00
parent 9ab010de61
commit 29c5823f34
2 changed files with 4 additions and 3 deletions

View File

@ -57,7 +57,7 @@ lookupOffset objectId = do
entryOffset (InUse {offset}) = Just offset entryOffset (InUse {offset}) = Just offset
entryOffset _ = Nothing entryOffset _ = Nothing
loadNumber :: ObjectId -> SParser Float loadNumber :: ObjectId -> SParser Double
loadNumber objectId = do loadNumber objectId = do
offset <- getOffset <$> lookupOffset objectId offset <- getOffset <$> lookupOffset objectId
objectStart <- BS.drop offset <$> gets input objectStart <- BS.drop offset <$> gets input
@ -70,7 +70,7 @@ loadNumber objectId = do
invalidValue :: Object -> String invalidValue :: Object -> String
invalidValue v = "Invalid value " ++ show v invalidValue v = "Invalid value " ++ show v
getSize :: Maybe DirectObject -> SParser Float getSize :: Maybe DirectObject -> SParser Double
getSize Nothing = fail "Missing '/Length' key on stream" getSize Nothing = fail "Missing '/Length' key on stream"
getSize (Just (NumberObject (Number size))) = return size getSize (Just (NumberObject (Number size))) = return size
getSize (Just (Reference (IndirectObjCoordinates {objectId}))) = do getSize (Just (Reference (IndirectObjCoordinates {objectId}))) = do

View File

@ -5,6 +5,7 @@ module PDF.Object (
Content(..) Content(..)
, DirectObject(..) , DirectObject(..)
, Flow(..) , Flow(..)
, IndexedObjects
, IndirectObjCoordinates(..) , IndirectObjCoordinates(..)
, InputStructure(..) , InputStructure(..)
, Name(..) , Name(..)
@ -87,7 +88,7 @@ boolean =
-- --
-- Number -- Number
-- --
newtype Number = Number Float deriving Show newtype Number = Number Double deriving Show
instance Output Number where instance Output Number where
output (Number f) = Output.string $ output (Number f) = Output.string $