java 如何从PDF文件中提取文本和图像并在PDFbox 2.0.27中将它们链接在一起?

2izufjch  于 2023-05-05  发布在  Java
关注(0)|答案(1)|浏览(158)

大家好!能不能请你帮我弄清楚如何提取文本和附加图像到它?例如,在一个文件中,有描述图片的文本,以及文本下的图片。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;
    }
}
6tqwzwtp

6tqwzwtp1#

我解决了问题。我找到了页面上所有文本行的最后一个字符的坐标,并将其与图片的坐标进行了比较。如果图像的Y坐标小于上一行的Y坐标,大于下一行的Y坐标,则图像必须在这些行之间:)

相关问题