使用 Java 从 PDF 文件提取矢量数据
Contents
[
Hide
]
从 PDF 文档访问矢量数据
使用 GraphicsAbsorber 检查页面上的矢量图形元素并将其基本几何信息写入文本文件。
- 使用 Document 实例打开源 PDF。
- 创建一个 GraphicsAbsorber 并访问目标 Page 收集矢量图形操作。
- 遍历提取的 GraphicElement 对象并读取它们的矩形、位置和操作符集合。
- 为每个元素构建包含几何形状和运算符计数细节的输出文本。
- 将提取的矢量数据写入输出文件。
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
- 使用 Document 实例打开源 PDF。
- 从文档中获取目标 Page。
- 调用
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
- 使用 Document 实例打开源 PDF。
- 创建一个 GraphicsAbsorber 并访问目标 Page。
- 在写入任何文件之前,为提取的子路径创建输出目录。
- 遍历提取的 GraphicElement 对象,并对每个元素调用
saveToSvg(...)。 - 将每个提取的元素保存为单独的 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
- 使用 Document 实例打开源 PDF。
- 创建一个 GraphicsAbsorber 并访问目标 Page。
- 创建将容纳合并矢量片段的 SVG 包装标记。
- 遍历提取的 GraphicElement 对象 并追加每个生成的 SVG 片段。
- 将合并后的 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());
}
}
提取单个矢量元素
- 使用 Document 实例打开源 PDF。
- 创建一个 GraphicsAbsorber 并访问目标 Page。
- 从提取的元素集合中获取所需的 GraphicElement。
- 检查所选元素是否为一个 XFormPlacement 并在需要时深入其嵌套元素。
- 将选定的矢量元素保存到输出 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());
}
}
}
}