Groovy PDFBox 按顺序提取PDF文件内容 - 将多个键值对映射到列表
以下是使用Groovy和PDFBox按顺序读取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.text.TextPosition
def extractText(PDPage pdPage, List<Map<String,String>> contentList) {
def stripper = new PDFTextStripper() {
List<Map<String,String>> content = []
Map<String,String> currentMap = [: ]
String currentKey = ""
@Override
void processTextPosition(TextPosition text) {
def textValue = text.getUnicode()
if (textValue.trim().length() == 0) {
return
}
if (currentKey != "") {
currentMap[currentKey] = textValue
currentKey = ""
} else {
currentKey = textValue
}
if (currentMap.size() == 2) {
content.add(currentMap)
currentMap = [: ]
}
}
@Override
void endPage(PDPage page) {
if (currentMap.size() > 0) {
content.add(currentMap)
currentMap = [: ]
}
contentList.addAll(content)
content.clear()
}
}
stripper.setSortByPosition(true)
stripper.setStartPage(pdPage.getLogicalNumber())
stripper.setEndPage(pdPage.getLogicalNumber())
stripper.getText(pdPage)
}
def extractContent(PDDocument pdDoc) {
def contentList = []
pdDoc.pages.each { PDPage pdPage ->
extractText(pdPage, contentList)
}
return contentList
}
def pdDoc = PDDocument.load(new File('test.pdf'))
def contentList = extractContent(pdDoc)
pdDoc.close()
contentList.each { contentMap ->
println 'Key 1: ${contentMap['Key 1']}'
println 'Key 2: ${contentMap['Key 2']}'
println '---------------------------'
}
代码中定义了两个方法:extractText和extractContent。extractText方法使用PDFTextStripper类提取页面文本,并将每个内容存储在一个Map中,最终将所有Map存储在一个List中。extractContent方法则遍历PDF文档中的所有页面,调用extractText方法提取每个页面的内容,并返回最终的List。
该代码假设每个内容包含两个键值对,分别为'Key 1'和'Key 2'。你可以根据实际情况修改代码,以提取不同的键值对或内容格式。
原文地址: https://www.cveoy.top/t/topic/nwVo 著作权归作者所有。请勿转载和采集!