import qualified Data.ByteString.Char8 as BS (readFile) import qualified Data.Map as Map (toList) import qualified Data.Text.IO as Text (putStrLn) import PDF (Document(..), parseDocument) import PDF.Object (Content) import PDF.Pages (Page(..), get, getAll) import PDF.Update (unify) import System.Environment (getArgs) import System.Exit (die) import System.IO (BufferMode(..), hSetBuffering, stdout) onDoc :: FilePath -> (Content -> Either String a) -> IO a onDoc inputFile f = do content <- fmap (unify . updates) . parseDocument <$> BS.readFile inputFile case content >>= f of Left someError -> die someError Right value -> return value displayPage :: Page -> IO () displayPage = mapM_ Text.putStrLn . contents wholeDoc :: FilePath -> IO () wholeDoc inputFile = do pages <- onDoc inputFile getAll mapM_ (displayPage . snd) $ Map.toList pages singlePage :: FilePath -> Int -> IO () singlePage inputFile pageNumber = onDoc inputFile (`get` pageNumber) >>= displayPage main :: IO () main = do hSetBuffering stdout LineBuffering args <- getArgs case args of [inputFile] -> wholeDoc inputFile [inputFile, pageNumber] -> singlePage inputFile (read pageNumber) _ -> die "Syntax: getText INPUT_FILE [PAGE_NUMBER]"