当前位置: 首页 > 知识库问答 >
问题:

使用iText和clojure从PDF中提取页面

顾斌
2023-03-14

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

IOException流关闭java.io.FileOutputStream.WriteBytes(:-2)

这将阻止我在repl仍然打开时打开文档。一旦我关闭了repl,我就可以访问文档了。

为什么我会得到错误?

我怎么才能让它更clojurey?

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

共有1个答案

顾俊誉
2023-03-14

您忘记关闭文档:

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

编辑:

(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))))
 类似资料:
  • 有可能吗?如果是,那么它可以怎么做。

  • 问题内容: 我需要使用iText从pdf文件中提取文本。 问题是:一些pdf文件包含2列,当我提取文本时,我得到一个文本文件,其中的列作为结果合并(即同一行中两列的文本) 这是代码: 你能帮我完成这个任务吗? 问题答案: 我是iText文本提取子系统的作者。您需要做的是开发自己的文本提取策略(如果您看一下如何实现的话,就会发现您可以提供可插拔的策略)。 您将如何确定列的开始和停止位置完全取决于您-

  • 我正在使用Rest-Assured和GSON进行自动化测试,并且需要验证POST请求响应中返回的PDF文件的内容。文件的内容各不相同,可以包含任何内容,从文本到文本和表格,或者文本和表格和图形。就字形内容而言,每个页面都可能不同,而且很可能会不同。我只关心pdf页面上的所有文本——无论是纯文本,还是表格中的文本,或者是与图像相关的文本(或者是图像中的文本)。由于请求返回的所有pdf都是不同的,我无

  • 我知道如何生成单个超文本标记语言页面。我想知道如何从多个超文本标记语言页面生成的pdf生成单个pdf页面。 例如,有和另一个文件我可以生成单独的pdf文件和分别来自html。我可以将它们写入文件系统,然后像iTextConcatenate示例中那样连接它们。 我只是想知道我是否可以在不将它们写入文件系统的情况下动态地组合此操作。我无法识别丢失的链接

  • 在python代码中,如何有效地将pdf中的某个页面保存为jpeg文件?(用例:我有一个python烧瓶Web服务器,其中pdf-s将被上传,每个页面对应的jpeg-s是存储的。) 这个解决方案很接近,但问题是它无法将整个页面转换为jpeg。

  • 免责声明: 我使用的是iText5。我知道这通常不受欢迎(相对于使用iText7),但我正在使用大量使用iText5的遗留代码,升级不在我的控制范围内。 null 进展/办法: 我扩展了以生成包含字体信息(大小和系列、粗体或斜体等)以及位置信息(相对于绝对坐标系,原点位于输入PDF第一页的左上角)的XML。 然后逐页生成一个新的PDF(根据上面概述的要求,每个页都是所需的长度),根据每个新页的边界