2

ここで見つけたsplitPDFメソッドを翻訳することにより、clojureを使用してpdfから単一のページを抽出しようとしていますhttp://viralpatel.net/blogs/itext-tutorial-merge-split-pdf-files-using-itext-jar/

このエラーが発生し続けます

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))))
4

1 に答える 1

3

ドキュメントを閉じるのを忘れました:

(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))))
于 2012-08-28T09:37:17.630 に答える