diff --git a/src/Yesod/Content/PDF.hs b/src/Yesod/Content/PDF.hs
--- a/src/Yesod/Content/PDF.hs
+++ b/src/Yesod/Content/PDF.hs
@@ -1,4 +1,3 @@
-{-# OPTIONS -fno-warn-orphans #-}
 -- | Utilities for serving PDF from Yesod
 --   Uses and depends on command line utility wkhtmltopdf to render PDF from HTML
 
@@ -8,13 +7,14 @@
 import Data.ByteString
 import Text.Blaze.Html
 import Text.Blaze.Html.Renderer.String
+import Blaze.ByteString.Builder.ByteString
 import System.Process
 import System.IO.Temp
 import System.IO
-import System.IO.Unsafe
 import Network.URI
+import Data.Conduit
 
-type PDF = ByteString
+newtype PDF = PDF ByteString
 
 -- | Provide MIME type "application/pdf" as a ContentType for Yesod
 typePDF :: ContentType
@@ -26,36 +26,31 @@
 instance ToTypedContent PDF where
   toTypedContent = TypedContent typePDF . toContent
 
-instance HasContentType (IO PDF) where
-  getContentType _ = typePDF
-
-instance ToTypedContent (IO PDF) where
-  toTypedContent = TypedContent typePDF . toContent
-
-instance ToContent (IO PDF) where
-  toContent = toContent . unsafePerformIO
+instance ToContent PDF where
+  toContent (PDF bs) = ContentSource $ do
+    yield $ Chunk $ fromByteString bs
 
 -- | Use wkhtmltopdf to render a PDF given the URI pointing to an HTML document
 uri2PDF :: URI -> IO PDF
 uri2PDF uri = withSystemTempFile "output.pdf" $ uri2PDF' uri
   where
     uri2PDF' :: URI -> FilePath -> Handle -> IO PDF
-    uri2PDF' uri tempPDFFile tempHandle = do
+    uri2PDF' uri' tempPDFFile tempHandle = do
       hClose tempHandle
-      (_,_,_, pHandle) <- createProcess (proc "wkhtmltopdf" ["--quiet", show uri, tempPDFFile])
+      (_,_,_, pHandle) <- createProcess (proc "wkhtmltopdf" ["--quiet", show uri', tempPDFFile])
       _ <- waitForProcess pHandle
-      Data.ByteString.readFile tempPDFFile
+      PDF <$> Data.ByteString.readFile tempPDFFile
 
 -- | Use wkhtmltopdf to render a PDF from an HTML (Text.Blaze.Html) type
 html2PDF :: Html -> IO PDF
 html2PDF html = withSystemTempFile "output.pdf" (html2PDF' html)
   where
     html2PDF' :: Html -> FilePath -> Handle -> IO PDF
-    html2PDF' html tempPDFFile tempPDFHandle = do
+    html2PDF' html' tempPDFFile tempPDFHandle = do
       hClose tempPDFHandle
       withSystemTempFile "input.html" $ \tempHtmlFile tempHtmlHandle -> do
-        System.IO.hPutStrLn tempHtmlHandle $ renderHtml html
+        System.IO.hPutStrLn tempHtmlHandle $ renderHtml html'
         hClose tempHtmlHandle
         (_,_,_, pHandle) <- createProcess (proc "wkhtmltopdf" ["--quiet", tempHtmlFile, tempPDFFile])
         _ <- waitForProcess pHandle
-        Data.ByteString.readFile tempPDFFile
+        PDF <$> Data.ByteString.readFile tempPDFFile
diff --git a/yesod-content-pdf.cabal b/yesod-content-pdf.cabal
--- a/yesod-content-pdf.cabal
+++ b/yesod-content-pdf.cabal
@@ -1,5 +1,5 @@
 name:                yesod-content-pdf
-version:             0.1.0.1
+version:             0.1.0.2
 synopsis:            PDF Content Type for Yesod
 description:         Please see README.md
 homepage:            https://github.com/alexkyllo/yesod-content-pdf#readme
@@ -21,13 +21,16 @@
                      , FlexibleInstances
 
   build-depends:       base >= 4.7 && < 5
-                     , yesod-core
-                     , process
-                     , bytestring
+                     , blaze-builder
                      , blaze-html
-                     , temporary
+                     , bytestring
                      , directory
                      , network-uri
+                     , process
+                     , temporary
+                     , yesod-core
+                     , conduit
+
   default-language:    Haskell2010
 
 test-suite yesod-content-pdf-test
