大家好!能不能请你帮我弄清楚如何提取文本和附加图像到它?例如,在一个文件中,有描述图片的文本,以及文本下的图片。PDF文件中有许多图片,它们可以是不同的大小。一页上也可以有几张带有说明的图片。
首先,我提取了所有的文本,然后我提取了所有的图像与参考的网页。现在我不知道怎么把它们联系起来我有一个理论,我需要使用文本和图像的元数据,但我不知道如何做到这一点。
我使用Java 11,PDFbox 2.0.27
public class PdfFileReaderService implements FileReaderService {
@Override
public String getAllTextFromFile(String filepath) {
try (PDDocument document = PDDocument.load(new File(filepath))) {
PDFTextStripper stripper = new PDFTextStripper();
return stripper.getText(document);
} catch (IOException e) {
throw new RuntimeException("Can't get text from file: " + filepath, e);
}
}
@Override
public Map<Integer, List<RenderedImage>> getAllImageFromFile(String pathToFile) {
Map<Integer, List<RenderedImage>> images = new HashMap<>();
try (PDDocument document = PDDocument.load(new File(pathToFile))) {
for (int i = 0; i < document.getNumberOfPages(); i++) {
PDPage page = document.getPage(i);
List<RenderedImage> pageImages = getImagesFromResources(page.getResources());
images.put(i, pageImages.isEmpty() ? new ArrayList<>() : pageImages);
}
} catch (IOException e) {
throw new RuntimeException("Can't get images from file: " + pathToFile);
}
return images;
}
private List<RenderedImage> getImagesFromResources(PDResources resources) throws IOException {
List<RenderedImage> images = new ArrayList<>();
for (COSName xObjectName : resources.getXObjectNames()) {
PDXObject xObject = resources.getXObject(xObjectName);
if (xObject instanceof PDFormXObject) {
images.addAll(getImagesFromResources(((PDFormXObject) xObject).getResources()));
} else if (xObject instanceof PDImageXObject) {
BufferedImage image = ((PDImageXObject) xObject).getImage();
images.add(image);
}
}
return images;
}
}
1条答案
按热度按时间6tqwzwtp1#
我解决了问题。我找到了页面上所有文本行的最后一个字符的坐标,并将其与图片的坐标进行了比较。如果图像的Y坐标小于上一行的Y坐标,大于下一行的Y坐标,则图像必须在这些行之间:)