使用 Java 从 PDF 文件提取矢量数据

从 PDF 文档访问矢量数据

使用 GraphicsAbsorber 检查页面上的矢量图形元素并将其基本几何信息写入文本文件。

  1. 使用 Document 实例打开源 PDF。
  2. 创建一个 GraphicsAbsorber 并访问目标 Page 收集矢量图形操作。
  3. 遍历提取的 GraphicElement 对象并读取它们的矩形、位置和操作符集合。
  4. 为每个元素构建包含几何形状和运算符计数细节的输出文本。
  5. 将提取的矢量数据写入输出文件。
public static void extractGraphicsElements(Path inputFile, Path outputFile) throws Exception {
    try (Document document = new Document(inputFile.toString())) {
        GraphicsAbsorber absorber = new GraphicsAbsorber();
        absorber.visit(document.getPages().get_Item(1));

        StringBuilder text = new StringBuilder();
        int index = 1;
        for (GraphicElement element : absorber.getElements()) {
            text.append("Element ").append(index)
                    .append(": Rectangle = ").append(element.getRectangle())
                    .append(", Position = ").append(element.getPosition())
                    .append(", Operators = ").append(element.getOperators().size())
                    .append("\n");
            index++;
        }
        Files.writeString(outputFile, text.toString());
    }
}

将页面矢量图形保存为 SVG

  1. 使用 Document 实例打开源 PDF。
  2. 从文档中获取目标 Page。
  3. 调用 page.trySaveVectorGraphics(outputFile.toString()) 将该页面的矢量图形内容直接导出为 SVG。
public static void saveVectorGraphicsToSvg(Path inputFile, Path outputFile) {
    try (Document document = new Document(inputFile.toString())) {
        Page page = document.getPages().get_Item(1);
        page.trySaveVectorGraphics(outputFile.toString());
    }
}

将每个提取的元素保存为单独的 SVG

  1. 使用 Document 实例打开源 PDF。
  2. 创建一个 GraphicsAbsorber 并访问目标 Page。
  3. 在写入任何文件之前,为提取的子路径创建输出目录。
  4. 遍历提取的 GraphicElement 对象,并对每个元素调用 saveToSvg(...)。
  5. 将每个提取的元素保存为单独的 SVG 文件。
public static void extractSubpathsToSvgs(Path inputFile, Path outputDir) throws Exception {
    try (Document document = new Document(inputFile.toString())) {
        GraphicsAbsorber absorber = new GraphicsAbsorber();
        absorber.visit(document.getPages().get_Item(1));
        Path subpathsDir = outputDir.resolve("subpaths");
        Files.createDirectories(subpathsDir);

        int index = 1;
        for (GraphicElement element : absorber.getElements()) {
            element.saveToSvg(subpathsDir.resolve("subpath_" + index + ".svg").toString());
            index++;
        }
    }
}

将提取的元素合并为单个 SVG

  1. 使用 Document 实例打开源 PDF。
  2. 创建一个 GraphicsAbsorber 并访问目标 Page。
  3. 创建将容纳合并矢量片段的 SVG 包装标记。
  4. 遍历提取的 GraphicElement 对象 并追加每个生成的 SVG 片段。
  5. 将合并后的 SVG 输出写入目标文件。
public static void extractListOfElementsToSingleImage(Path inputFile, Path outputFile) throws Exception {
    try (Document document = new Document(inputFile.toString())) {
        GraphicsAbsorber absorber = new GraphicsAbsorber();
        absorber.visit(document.getPages().get_Item(1));

        StringBuilder svg = new StringBuilder();
        svg.append("<svg xmlns=\"http://www.w3.org/2000/svg\">\n");
        for (GraphicElement element : absorber.getElements()) {
            svg.append(element.saveToSvg()).append("\n");
        }
        svg.append("</svg>\n");
        Files.writeString(outputFile, svg.toString());
    }
}

提取单个矢量元素

  1. 使用 Document 实例打开源 PDF。
  2. 创建一个 GraphicsAbsorber 并访问目标 Page。
  3. 从提取的元素集合中获取所需的 GraphicElement。
  4. 检查所选元素是否为一个 XFormPlacement 并在需要时深入其嵌套元素。
  5. 将选定的矢量元素保存到输出 SVG 文件。
public static void extractSingleVectorElement(Path inputFile, Path outputFile) {
    try (Document document = new Document(inputFile.toString())) {
        GraphicsAbsorber graphicsAbsorber = new GraphicsAbsorber();
        Page page = document.getPages().get_Item(1);
        graphicsAbsorber.visit(page);
        if (graphicsAbsorber.getElements().size() > 1) {
            GraphicElement xformPlacement = graphicsAbsorber.getElements().get_Item(1);
            if (xformPlacement instanceof XFormPlacement) {
                XFormPlacement placement = (XFormPlacement) xformPlacement;
                if (placement.getElements().size() > 2) {
                    placement.getElements().get_Item(2).saveToSvg(outputFile.toString());
                }
            } else {
                xformPlacement.saveToSvg(outputFile.toString());
            }
        }
    }
}