【问题标题】:Extract page from PDF using iText and clojure使用 iText 和 clojure 从 PDF 中提取页面
【发布时间】:2012-08-27 19:36:20
【问题描述】:

我正在尝试通过翻译我在http://viralpatel.net/blogs/itext-tutorial-merge-split-pdf-files-using-itext-jar/ 找到的 splitPDF 方法,使用 clojure 从 pdf 中提取单个页面。

我一直收到这个错误

IOException Stream Closed java.io.FileOutputStream.writeBytes (:-2)

这会阻止我在 repl 仍处于打开状态时打开文档。关闭 repl 后,我就可以访问该文档。

为什么我会收到错误消息?

我该如何解决?

我怎样才能让它更酷?

(import '(com.itextpdf.text Document)
            '(com.itextpdf.text.pdf PdfReader PdfWriter PdfContentByte PdfImportedPage BaseFont)
            '(java.io File FileInputStream FileOutputStream InputStream OutputStream))

(defn extract-page [src dest pagenum]
  (with-open  [ d (Document.) 
                os (FileOutputStream. dest)]
    (let [ srcpdf (->> src FileInputStream. PdfReader.)
           destpdf  (PdfWriter/getInstance d os)]
         (doto d
            (.open )
            (.newPage ))
          (.addTemplate 
                (.getDirectContent destpdf)
                (.getImportedPage destpdf srcpdf pagenum) 0 0))))

【问题讨论】:

  • 当你重新打开 REPL 时它会重新开始工作吗?

标签: clojure itext


【解决方案1】:

您忘记关闭文档:

(close. d)

以下代码有效:

(import '(com.itextpdf.text Document)
            '(com.itextpdf.text.pdf PdfReader PdfWriter PdfContentByte PdfImportedPage BaseFont)
            '(java.io File FileInputStream FileOutputStream InputStream OutputStream))

(defn extract-page [src dest pagenum]
  (with-open  [ is (FileInputStream. src)
                os (FileOutputStream. dest)]
    (let [ srcpdf (PdfReader. src)
           d (Document.)
           destpdf  (PdfWriter/getInstance d os)]
         (doto d
            (.open )
            (.newPage ))
         (println "Number of pages" (.getNumberOfPages srcpdf))
         (.addTemplate 
                (.getDirectContent destpdf)
                (.getImportedPage destpdf srcpdf pagenum) 0 0)
         (.close d))))

编辑:

如果你有兴趣,我发现使用 apache pdfbox 更容易。

(import '(org.apache.pdfbox.pdmodel PDDocument)
        '(org.apache.pdfbox.util PDFTextStripper)
        '(java.io File OutputStreamWriter FileOutputStream BufferedWriter))

(defn convert-to-text [src dest]
  (with-open [ pd (PDDocument/load (File. src))
               wr (BufferedWriter. (OutputStreamWriter. (FileOutputStream. (File. dest))))]
    (let [ stripper (PDFTextStripper.)]
      (println "Number of pages" (.getNumberOfPages pd))
      (.writeText stripper pd wr))))

【讨论】:

  • 你为什么将文档从 with-open 中取出并将输入流移入?
  • 我也在学习 Clojure。我只是不习惯在 with-open 正文中打开文档(而不是在绑定中)并依靠自动关闭。你是对的,你的原始代码不需要明确地关闭它。我认为您原始代码中的错误是您忘记关闭 FileInputStream。但是,那么我不知道您为什么在 FileOutputStream 中遇到错误。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-05-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-06-27
相关资源
最近更新 更多