استخراج بيانات المتجه من ملف PDF باستخدام Java

الوصول إلى بيانات المتجه من مستند PDF

استخدام GraphicsAbsorber لفحص عناصر الرسومات المتجهية على صفحة وكتابة هندستها الأساسية إلى ملف نصي.

  1. افتح ملف PDF المصدر في كائن Document.
  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. افتح ملف PDF المصدر في كائن Document.
  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. افتح ملف PDF المصدر في كائن Document.
  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. افتح ملف PDF المصدر في كائن Document.
  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. افتح ملف PDF المصدر في كائن Document.
  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());
            }
        }
    }
}