diff --git a/changelog.md b/changelog.md
--- a/changelog.md
+++ b/changelog.md
@@ -1,3 +1,6 @@
+0.0.7.0
+
+* support xobjects in text extraction
 
 0.0.6.0
 
diff --git a/lib/Pdf/Toolbox/Document/Page.hs b/lib/Pdf/Toolbox/Document/Page.hs
--- a/lib/Pdf/Toolbox/Document/Page.hs
+++ b/lib/Pdf/Toolbox/Document/Page.hs
@@ -9,16 +9,23 @@
   pageContents,
   pageMediaBox,
   pageFontDicts,
-  pageExtractText
+  pageExtractText,
+  XObject(..),
+  pageXObjects
 )
 where
 
 import qualified Data.Traversable as Traversable
+import qualified Data.ByteString.Lazy as Lazy (ByteString)
+import qualified Data.ByteString.Lazy as Lazy.ByteString
 import Data.Text (Text)
 import qualified Data.Text.Lazy as TextL
 import qualified Data.Text.Lazy.Builder as TextB
+import Data.Map (Map)
 import qualified Data.Map as Map
 import Control.Monad
+import qualified System.IO.Streams as Streams
+import qualified System.IO.Streams.Attoparsec as Streams
 
 import Pdf.Toolbox.Core
 import Pdf.Toolbox.Content
@@ -93,6 +100,36 @@
             ensureType "Font" fontDict
             return (name, FontDict fontDict)
 
+data XObject = XObject Lazy.ByteString GlyphDecoder
+
+pageXObjects :: (MonadPdf m, MonadIO m) => Page -> PdfE m [(Name, XObject)]
+pageXObjects (Page _ dict) =
+  case lookupDict' "Resources" dict of
+    Nothing -> return []
+    Just res -> do
+      resDict <- deref res >>= fromObject
+      case lookupDict' "XObject" resDict of
+        Nothing -> return []
+        Just xo -> do
+          Dict xosDict <- deref xo >>= fromObject
+          forM xosDict $ \(name, o) -> do
+            ref <- fromObject o
+            xo <- lookupObject ref >>= toStream
+
+            Stream xoDict is <- streamContent ref xo
+            cont <- liftIO $ Lazy.ByteString.fromChunks <$> Streams.toList is
+
+            fontDicts <- Map.fromList <$> pageFontDicts (Page undefined xoDict)
+
+            glyphDecoders <- Traversable.forM fontDicts $ \fontDict ->
+              fontInfoDecodeGlyphs <$> fontDictLoadInfo fontDict
+            let glyphDecoder fontName = \str ->
+                  case Map.lookup fontName glyphDecoders of
+                    Nothing -> []
+                    Just decode -> decode str
+
+            return (name, XObject cont glyphDecoder)
+
 -- | Extract text from the page
 --
 -- It tries to add spaces between chars if they don't present
@@ -108,6 +145,8 @@
           Nothing -> []
           Just decode -> decode str
 
+  xobjects <- Map.fromList <$> pageXObjects page
+
   -- prepare content streams
   contents <- pageContents page
   streams <- forM contents $ \ref -> do
@@ -127,14 +166,29 @@
   is <- parseContentStream ris filters decr streams
 
   -- use content stream processor to extract text
-  let loop p = do
-        next <- readNextOperator is
+  let loop s p = do
+        next <- readNextOperator s
         case next of
-          Just op -> processOp op p >>= loop
-          Nothing -> return $ glyphsToText (prGlyphs p)
-  loop $ mkProcessor {
+          Just op@(Op_Do, [OName xoName]) -> processDo xoName p >>= loop s
+          Just op -> processOp op p >>= loop s
+          Nothing -> return p
+
+      processDo name p = do
+        case Map.lookup name xobjects of
+          Nothing -> return p
+          Just (XObject cont gdec) -> do
+            xois <- liftIO $ do
+              cont_is <- Streams.fromLazyByteString cont
+              Streams.parserToInputStream parseContent cont_is
+            let gdec' = prGlyphDecoder p
+            p' <- loop xois (p {prGlyphDecoder = gdec})
+            return (p' {prGlyphDecoder = gdec'})
+
+  p <- loop is $ mkProcessor {
     prGlyphDecoder = glyphDecoder
     }
+
+  return $ glyphsToText (prGlyphs p)
 
 -- | Convert glyphs to text, trying to add spaces and newlines
 --
diff --git a/pdf-toolbox-document.cabal b/pdf-toolbox-document.cabal
--- a/pdf-toolbox-document.cabal
+++ b/pdf-toolbox-document.cabal
@@ -1,5 +1,5 @@
 name:                pdf-toolbox-document
-version:             0.0.6.0
+version:             0.0.7.0
 synopsis:            A collection of tools for processing PDF files.
 license:             BSD3
 license-file:        LICENSE
@@ -48,4 +48,4 @@
                        cryptohash,
                        crypto-api,
                        pdf-toolbox-core ==0.0.4.*,
-                       pdf-toolbox-content ==0.0.4.*
+                       pdf-toolbox-content ==0.0.5.*
