Извлечение векторных данных из PDF‑файла с использованием Java
Contents
[
Hide
]
Получение доступа к векторным данным из PDF‑документа
Используйте GraphicsAbsorber для проверки векторных графических элементов на странице и записи их базовой геометрии в текстовый файл.
- Откройте исходный PDF в экземпляре Document.
- Создайте 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
- Откройте исходный PDF в экземпляре Document.
- Получите нужную страницу 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
- Откройте исходный PDF в экземпляре Document.
- Создайте 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
- Откройте исходный PDF в экземпляре Document.
- Создайте 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());
}
}
Извлечение отдельного векторного элемента
- Откройте исходный PDF в экземпляре Document.
- Создайте 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());
}
}
}
}