import Control.Monad ((>=>)) 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 (UnifiedLayers(..), parseDocument) import PDF.Box (Box(..)) import PDF.Layer (Layer) import PDF.Pages (Page(..), PageNumber(..), Pages(..), cacheFonts) import System.Environment (getArgs) import System.Exit (die) import System.IO (BufferMode(..), hSetBuffering, stdout) displayPage :: Page -> IO () displayPage = mapM_ Text.putStrLn . contents getAll :: Layer -> IO () getAll layer = (cacheFonts $ r Pages layer) >>= mapM_ (displayPage . snd) . Map.toList get :: Int -> Layer -> IO () get n layer = (cacheFonts $ r (P n) layer) >>= displayPage onDoc :: FilePath -> (Layer -> IO ()) -> IO () onDoc inputFile f = do (parseDocument <$> BS.readFile inputFile) >>= either die (r UnifiedLayers >=> f) main :: IO () main = do hSetBuffering stdout LineBuffering args <- getArgs case args of [inputFile] -> onDoc inputFile getAll [inputFile, pageNumber] -> onDoc inputFile (get $ read pageNumber) _ -> die "Syntax: getText INPUT_FILE [PAGE_NUMBER]"