packages feed

pdf-toolbox-document-0.1.4: lib/Pdf/Document/Document.hs

{-# LANGUAGE OverloadedStrings #-}

-- | PDF document

module Pdf.Document.Document
(
  Document,
  documentCatalog,
  documentInfo,
  documentEncryption
)
where

import Pdf.Core.Object
import Pdf.Core.Object.Util
import Pdf.Core.Exception
import Pdf.Core.Util

import Pdf.Document.Pdf
import Pdf.Document.Internal.Types

import qualified Data.HashMap.Strict as HashMap
import Control.Exception hiding (throw)

dict :: Document -> Dict
dict (Document _ d) = d

pdf :: Document -> Pdf
pdf (Document p _) = p

-- | Get the document catalog
documentCatalog :: Document -> IO Catalog
documentCatalog doc = do
  ref <- sure $ (HashMap.lookup "Root" (dict doc) >>= refValue)
    `notice` "trailer: Root should be an indirect reference"
  obj <- lookupObject (pdf doc) ref
  d <- sure $ dictValue obj `notice` "catalog should be a dictionary"
  return (Catalog (pdf doc) ref d)

-- | Infornation dictionary for the document
documentInfo :: Document -> IO (Maybe Info)
documentInfo doc = do
  case HashMap.lookup "Info" (dict doc) of
    Nothing -> return Nothing
    Just (Ref ref) -> do
      obj <- lookupObject (pdf doc) ref
      d <- sure $ dictValue obj `notice` "info should be a dictionary"
      return (Just (Info (pdf doc) ref d))
    _ -> throwIO $ Corrupted "document Info should be an indirect reference" []

-- | Document encryption dictionary
documentEncryption :: Document -> IO (Maybe Dict)
documentEncryption doc = do
  case HashMap.lookup "Encrypt" (dict doc) of
    Nothing -> return Nothing
    Just o -> do
      o' <- deref (pdf doc) o
      case o' of
        Dict d -> return (Just d)
        Null -> return Nothing
        _ -> throwIO (Corrupted "document Encrypt should be a dictionary" [])