在 Groovy 中使用 PDFBox 可以很容易地读取 PDF 中的所有元素,包括文本和图片。

以下是一个简单的示例代码,它将打开一个 PDF 文件并遍历所有页面,然后将每个页面中的所有文本和图片提取出来:

@Grab(group='org.apache.pdfbox', module='pdfbox', version='2.0.23')

import org.apache.pdfbox.pdmodel.PDDocument
import org.apache.pdfbox.text.PDFTextStripper
import org.apache.pdfbox.contentstream.PDFGraphicsStreamEngine
import org.apache.pdfbox.contentstream.operator.DrawObject
import org.apache.pdfbox.contentstream.operator.state.Save
import org.apache.pdfbox.contentstream.operator.state.Restore
import org.apache.pdfbox.contentstream.operator.color.SetNonStrokingColor
import org.apache.pdfbox.contentstream.operator.color.SetNonStrokingColorSpace
import org.apache.pdfbox.contentstream.operator.color.SetNonStrokingColorSpace.PDFNonStrokingColorSpace
import org.apache.pdfbox.contentstream.operator.color.SetNonStrokingColorSpace.PDFNonStrokingColorSpace.CalGray
import org.apache.pdfbox.contentstream.operator.color.SetNonStrokingColorSpace.PDFNonStrokingColorSpace.CalRGB
import org.apache.pdfbox.contentstream.operator.color.SetNonStrokingColorSpace.PDFNonStrokingColorSpace.CalCMYK
import org.apache.pdfbox.contentstream.operator.color.SetNonStrokingColorSpace.PDFNonStrokingColorSpace.ICCBased
import org.apache.pdfbox.contentstream.operator.color.SetNonStrokingColorSpace.PDFNonStrokingColorSpace.DeviceN
import org.apache.pdfbox.contentstream.operator.color.SetNonStrokingColorSpace.PDFNonStrokingColorSpace.Indexed
import org.apache.pdfbox.contentstream.operator.graphics.ExtendedGraphicsState
import org.apache.pdfbox.contentstream.operator.graphics.SetLineCapStyle
import org.apache.pdfbox.contentstream.operator.graphics.SetLineDashPattern
import org.apache.pdfbox.contentstream.operator.graphics.SetLineJoinStyle
import org.apache.pdfbox.contentstream.operator.graphics.SetLineWidth
import org.apache.pdfbox.contentstream.operator.graphics.SetMiterLimit
import org.apache.pdfbox.contentstream.operator.graphics.SetRenderingIntent
import org.apache.pdfbox.contentstream.operator.graphics.SetStrokingColor
import org.apache.pdfbox.contentstream.operator.graphics.SetStrokingColorSpace
import org.apache.pdfbox.contentstream.operator.graphics.SetStrokingColorSpace.PDFStrokingColorSpace
import org.apache.pdfbox.contentstream.operator.graphics.SetStrokingColorSpace.PDFStrokingColorSpace.CalGray
import org.apache.pdfbox.contentstream.operator.graphics.SetStrokingColorSpace.PDFStrokingColorSpace.CalRGB
import org.apache.pdfbox.contentstream.operator.graphics.SetStrokingColorSpace.PDFStrokingColorSpace.CalCMYK
import org.apache.pdfbox.contentstream.operator.graphics.SetStrokingColorSpace.PDFStrokingColorSpace.ICCBased
import org.apache.pdfbox.contentstream.operator.graphics.SetStrokingColorSpace.PDFStrokingColorSpace.DeviceN
import org.apache.pdfbox.contentstream.operator.graphics.SetStrokingColorSpace.PDFStrokingColorSpace.Indexed
import org.apache.pdfbox.contentstream.operator.markedcontent.BeginMarkedContentSequence
import org.apache.pdfbox.contentstream.operator.markedcontent.BeginMarkedContentSequenceWithProperties
import org.apache.pdfbox.contentstream.operator.markedcontent.EndMarkedContentSequence
import org.apache.pdfbox.contentstream.operator.markedcontent.DrawObjectMark
import org.apache.pdfbox.contentstream.operator.markedcontent.EndMarkedContentSequence
import org.apache.pdfbox.contentstream.operator.markedcontent.BeginTextObject
import org.apache.pdfbox.contentstream.operator.markedcontent.EndTextObject
import org.apache.pdfbox.contentstream.operator.text.BeginText
import org.apache.pdfbox.contentstream.operator.text.EndText
import org.apache.pdfbox.contentstream.operator.text.MoveText
import org.apache.pdfbox.contentstream.operator.text.MoveTextSetLeading
import org.apache.pdfbox.contentstream.operator.text.NextLine
import org.apache.pdfbox.contentstream.operator.text.SetCharSpacing
import org.apache.pdfbox.contentstream.operator.text.SetFontAndSize
import org.apache.pdfbox.contentstream.operator.text.SetTextHorizontalScaling
import org.apache.pdfbox.contentstream.operator.text.SetTextLeading
import org.apache.pdfbox.contentstream.operator.text.SetTextRenderingMode
import org.apache.pdfbox.contentstream.operator.text.SetTextRise
import org.apache.pdfbox.contentstream.operator.text.SetTextWordSpacing
import org.apache.pdfbox.contentstream.operator.text.ShowText
import org.apache.pdfbox.contentstream.operator.text.ShowTextAdjusted
import org.apache.pdfbox.contentstream.operator.text.ShowTextLine
import org.apache.pdfbox.contentstream.operator.text.ShowTextLineAndSpace
import org.apache.pdfbox.contentstream.operator.text.ShowTextLineMetrics
import org.apache.pdfbox.contentstream.operator.text.ShowTextMatrix
import org.apache.pdfbox.contentstream.operator.text.ShowTextMatrixAdjusted
import org.apache.pdfbox.contentstream.operator.text.ShowTextMatrixLine
import org.apache.pdfbox.contentstream.operator.text.ShowTextMatrixLineAndSpace

def extractTextFromPdf(String filename) {
    PDDocument document = PDDocument.load(new File(filename))
    def stripper = new PDFTextStripper()
    def text = stripper.getText(document)
    document.close()
    return text
}

def extractImagesFromPdf(String filename) {
    PDDocument document = PDDocument.load(new File(filename))
    def images = []
    for (int i = 0; i < document.getNumberOfPages(); i++) {
        def page = document.getPage(i)
        def stream = page.getContentStreams()
        def engine = new PDFGraphicsStreamEngine(stream) {
            @Override
            public void drawImage(PDImage pdImage) throws IOException {
                images.add(pdImage.getImage())
                super.drawImage(pdImage)
            }
        }
        engine.processPage(page)
    }
    document.close()
    return images
}

// Example usage
def text = extractTextFromPdf('example.pdf')
def images = extractImagesFromPdf('example.pdf')

在这个例子中,我们首先定义了两个函数extractTextFromPdfextractImagesFromPdf,它们分别读取 PDF 文件中的文本和图像。extractTextFromPdf函数使用 PDFBox 的PDFTextStripper类提取 PDF 文件中的文本。extractImagesFromPdf函数遍历每个页面,并使用 PDFBox 的PDFGraphicsStreamEngine类提取页面中的所有图像。在drawImage方法中,我们将所有找到的图像添加到一个列表中,并在之后返回该列表。

在这个例子中,我们还使用了 PDFBox 的一些其他类来处理页面内容。这些类是用于处理各种 PDF 内容类型的操作符类。例如,SetNonStrokingColor用于设置非描边颜色,SetLineWidth用于设置线宽等。如果您需要处理其他类型的 PDF 内容,您可以查看 PDFBox 文档中的操作符类,以了解如何处理它们。

Groovy PDFBox: 从 PDF 文件中提取文本和图片

原文地址: https://www.cveoy.top/t/topic/nw1e 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录