module Pdf.Toolbox.Core.Parsers.XRef
(
startXRef,
tableXRef,
parseSubsectionHeader,
parseTrailerAfterTable,
parseTableEntry
)
where
import Data.Int
import Data.Attoparsec (Parser)
import qualified Data.Attoparsec.ByteString.Char8 as P
import Control.Applicative (many)
import Pdf.Toolbox.Core.Object.Types
import Pdf.Toolbox.Core.Parsers.Object
import Pdf.Toolbox.Core.Parsers.Util
startXRef :: Parser Int64
startXRef = do
res <- many $ do
_ <- P.manyTill P.anyChar $ P.string "startxref"
P.skipSpace
offset <- P.decimal
P.skipSpace
_ <- P.string "%%EOF"
return offset
case res of
[] -> fail "Trailer not found"
xs -> return $ last xs
tableXRef :: Parser ()
tableXRef = do
_ <- P.string "xref"
endOfLine
parseSubsectionHeader :: Parser (Int, Int)
parseSubsectionHeader = do
start <- P.decimal
P.skipSpace
count <- P.decimal
endOfLine
return (start, count)
parseTrailerAfterTable :: Parser Dict
parseTrailerAfterTable = do
_ <- P.string "trailer"
endOfLine
P.skipSpace
parseDict
parseTableEntry :: Parser (Int64, Int, Bool)
parseTableEntry = do
offset <- P.decimal
P.skipSpace
generation <- P.decimal
P.skipSpace
c <- P.anyChar
case c of
'n' -> return (offset, generation, False)
'f' -> return (offset, generation, True)
_ -> fail $ "error parsing XRef table entry: unknown char: " ++ [c]