Groovy PDFBox 读取所有文本元素内容 - 不使用 PDFTextStripper
要按顺序读取所有文本元素内容,可以使用 PDFBox 的文本提取器 (PDFTextStripper)。以下是一个示例代码,它使用 PDFTextStripper 将文本元素提取为字符串,然后将其按顺序输出到控制台。
import java.io.IOException
import org.apache.pdfbox.cos.COSDocument
import org.apache.pdfbox.io.RandomAccessRead
import org.apache.pdfbox.pdfparser.PDFParser
import org.apache.pdfbox.pdmodel.PDDocument
import org.apache.pdfbox.text.PDFTextStripper
public class PdfBoxReader {
public static void main(String[] args) throws IOException {
// 加载 PDF 文档
String filepath = 'example.pdf'
PDFParser parser = new PDFParser(new RandomAccessRead(filepath))
parser.parse()
COSDocument cosDoc = parser.getDocument()
PDDocument pdDoc = new PDDocument(cosDoc)
// 创建文本提取器
PDFTextStripper stripper = new PDFTextStripper()
// 设置文本元素排序顺序
stripper.setSortByPosition(true)
// 从文档中提取文本并打印到控制台
String text = stripper.getText(pdDoc)
System.out.println(text)
// 关闭文档
pdDoc.close()
}
}
如果不想使用 PDFTextStripper,可以使用 PDFBox 的 PDFTextStripperByArea 类来按顺序读取所有文本元素内容。以下是一个示例代码,它使用 PDFTextStripperByArea 类来提取文本元素,并将其按顺序输出到控制台。
import java.awt.Rectangle
import java.io.IOException
import java.util.ArrayList
import java.util.Collections
import java.util.Comparator
import java.util.List
import org.apache.pdfbox.cos.COSDocument
import org.apache.pdfbox.io.RandomAccessRead
import org.apache.pdfbox.pdfparser.PDFParser
import org.apache.pdfbox.pdmodel.PDDocument
import org.apache.pdfbox.pdmodel.PDPage
import org.apache.pdfbox.text.PDFTextStripperByArea
public class PdfBoxReader {
public static void main(String[] args) throws IOException {
// 加载 PDF 文档
String filepath = 'example.pdf'
PDFParser parser = new PDFParser(new RandomAccessRead(filepath))
parser.parse()
COSDocument cosDoc = parser.getDocument()
PDDocument pdDoc = new PDDocument(cosDoc)
// 创建列表以存储文本元素
List<String> textList = new ArrayList<String>()
// 遍历页面并提取文本元素
for (PDPage page in pdDoc.getPages()) {
PDFTextStripperByArea stripper = new PDFTextStripperByArea()
stripper.setSortByPosition(true)
List<Rectangle> regions = new ArrayList<Rectangle>()
regions.add(page.getCropBox())
stripper.addRegion('text', regions)
stripper.extractRegions(page)
textList.addAll(stripper.getRegions().get('text'))
}
// 按位置排序文本元素
Collections.sort(textList, new Comparator<String>() {
public int compare(String s1, String s2) {
String[] parts1 = s1.split(',')
String[] parts2 = s2.split(',')
int x1 = Integer.parseInt(parts1[0])
int y1 = Integer.parseInt(parts1[1])
int x2 = Integer.parseInt(parts2[0])
int y2 = Integer.parseInt(parts2[1])
if (y1 < y2) {
return -1
} else if (y1 > y2) {
return 1
} else {
if (x1 < x2) {
return -1
} else if (x1 > x2) {
return 1
} else {
return 0
}
}
}
})
// 将文本元素打印到控制台
for (String text in textList) {
System.out.println(text)
}
// 关闭文档
pdDoc.close()
}
}
该代码将 PDF 文档分成页面,并使用 PDFTextStripperByArea 类提取每个页面上的文本元素。然后,它将文本元素按其位置排序,并将它们按顺序输出到控制台。
原文地址: https://www.cveoy.top/t/topic/nARa 著作权归作者所有。请勿转载和采集!