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. 해당 페이지의 벡터 그래픽 콘텐츠를 SVG로 직접 내보내려면 page.trySaveVectorGraphics(outputFile.toString())를 호출하세요.
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());
            }
        }
    }
}