# HG changeset patch # User G. Eyaeb # Date 1606779768 -28800 # Tue Dec 01 07:42:48 2020 +0800 # Node ID 7c50ba9df3a67cd8e225bedc38662b20ab1db2ad # Parent 2f4d0fe3496e05e52c90685fcf8eb3d541dca9bd Prevent deletion of document before deletion of pages Solves random segmentation faults, cf. https://todo.sr.ht/~geyaeb/haskell-pdftotext/4 . diff --git a/src/Pdftotext/Internal.hs b/src/Pdftotext/Internal.hs --- a/src/Pdftotext/Internal.hs +++ b/src/Pdftotext/Internal.hs @@ -66,11 +66,12 @@ pageNumber :: Int, -- | Total number of pages in original document. pageOutOf :: Int, + pageDocument :: ForeignPtr Poppler_Document, pagePtr :: ForeignPtr Poppler_Page } instance Show Page where - show (Page n o _) = "Page " ++ show n ++ "/" ++ show o + show (Page n o _ _) = "Page " ++ show n ++ "/" ++ show o -- | Layout of text extracted from PDF. data Layout @@ -112,14 +113,14 @@ pageno <- ffiDocumentPages docptr forM [0 .. pageno - 1] \pno -> do p <- ffiDocumentOpenPage docptr pno >>= newForeignPtr ffiPageDelete - return $ Page (fromIntegral pno + 1) (fromIntegral pageno) p + return $ Page (fromIntegral pno + 1) (fromIntegral pageno) doc p -- | Return page number 'no' from PDF document, if the page exists. pageIO :: Int -> Document -> IO (Maybe Page) pageIO no d@(Document docptr) = withForeignPtr docptr \ptr -> do pno <- pagesTotalIO d if no > 0 && no <= pno - then Just . Page no pno <$> (ffiDocumentOpenPage ptr (fromIntegral no - 1) >>= newForeignPtr ffiPageDelete) + then Just . Page no pno docptr <$> (ffiDocumentOpenPage ptr (fromIntegral no - 1) >>= newForeignPtr ffiPageDelete) else return Nothing -- | Return number of pages contained in document. @@ -129,7 +130,7 @@ -- | Extract text from a page with given 'Layout'. pageTextIO :: Layout -> Page -> IO T.Text -pageTextIO layout (Page _ _ ptr) = withForeignPtr ptr \p -> asText (ffiPageText p l) +pageTextIO layout (Page _ _ _ ptr) = withForeignPtr ptr \p -> asText (ffiPageText p l) where l = case layout of