الفريق العربي للبرمجةأرشيف المنتديات · 2000 – 2023
نسخة أرشيفية للقراءة فقط — التسجيل والمشاركة مغلقان، والمحتوى محفوظ كما كان.

استخلاص النص وال metadata من ملف pdf باستعمال PDFBox

بدأه herch في 14 يوليو 2010 · 3 رد · 1,896 مشاهدة · في JavaSE
مشاركة: واتساب X فيسبوك تيليجرام
#1 صاحب الموضوع

السلام عليكم

مكتبة Apache PDFBox تسمح لنا بالتعامل مع الملفات pdf، حيث يمكننا استخراج النص الموجود داخل ال pdf (لاستعماله مع Lucene مثلا :wink:)، ويمكننا من استخراج ال bookmarks إذا وجدت، وأيضا ال metadata، مثل كاتب المستند، عنوان المستند، تاريخ كتابته ... والكثير من المزايا الأخرى.

الحصول على المكتبة

يمكن تحميل المكتبة من هذا الرابط، الملفات التي يجب تحميلها هي: pdfbox-1.2.1.jar, fontbox-1.2.1.jar & jempbox-1.2.1.jar.

كما أن المكتبة تعتمد على مكتبة أخرى: commons-logging. قم بتحميل الملف zip، وبعد فك الضغط عنه، استرجع الملف commons-logging-1.1.1.jar.

طبعا يجب إضافة هذه الملفات إلى ال classpath

تحميل الملف pdf

قبل القيام بأي شيء، يجب أولا أن نحصل على الملف pdf. مكتبة PDFBox تحتوي على الفئة PDDocument التي تمثل مستندا pdf وتحتوي على الطريقة load لتحميل الملف pdf

الطريقة load لها عدة أشكال، لكننا سنستعمل الشكل الذي ينتظر String يمثل مسار الملف pdf

PDDocument document = PDDocument.load("/home/issam/Desktop/test.pdf");

استخراج ال metadata

ال metadata الخاصة بالمستندات pdf ممثلة بالفئة PDDocumentInformation. يمكننا الحصول على كائن من هذه الفئة بالمناداة على الطريقة getDocumentInformation الحاصة بالفئة PDDocument.

PDDocumentInformation documentInfos = document.getDocumentInformation();

بعد أن نحصل على الكائن PDDocumentInformation، نقوم بالمناداة على مختلف الطرق getXXX، حيث XXX تمثل المعلومة التي نريد

System.out.println("Author: " + documentInfos.getAuthor());
System.out.println("Creator: " + documentInfos.getCreator());
System.out.println("Title: " + documentInfos.getTitle());
System.out.println("Subject: " + documentInfos.getSubject());
System.out.println("Keywords: " + documentInfos.getKeywords());
System.out.println("Creation Date: " + documentInfos.getCreationDate().getTime());
System.out.println("Modification Date: " + documentInfos.getModificationDate().getTime());

والنتيجة ستكون مثل التالي

Author: Arthur Conan Doyle

Creator: Acrobat PDFMaker 6.0 pour Word

Title: L'illustre client - Recueil Les archives de Sherlock Holmes

Subject: null

Keywords: null

Creation Date: Mon May 03 17:52:46 WET 2004

Modification Date: Mon May 03 17:54:44 WET 2004

كما تلاحظون، فيمكن أن تكون بعض المعلومات غير متوفرة، لأن صاحب المستند اختار أو نسي أن لا يوفرها.

استخلاص النص

لاستخلاص النص، نستعمل الفئة PDFTextStripper. يمكننا أن نستخلص فقط جزءا من المستند، أو كله، وذلك بتحديد صفحة البداية وصفحة النهاية باستعمال الطرق setStartPage و setEndPage

بعد ذلك، نستدعي الطريقة writeText التي تنتظر مُعْطيين، كائن PDDocument وكائن من فئة تطبق الواجهة java.io.Writer، مثلا FileWriter

مثلا لو أردنا استخراج نص الصفحات الثلاث الأولى:

PDFTextStripper stripper = new PDFTextStripper();
stripper.setStartPage(1);
stripper.setEndPage(3);
stripper.writeText(document, new FileWriter("text.txt"));


[/line]

كود الأمثلة بالكامل (لا تنسوا تغيير المسارات)

Main

package pdfboxtest;

import java.io.FileWriter;
import java.io.IOException;
import org.apache.pdfbox.pdmodel.PDDocument;

public class Main {


	public static void main(String[] args) {
		PDDocument document = null;
		try {
			document = PDDocument.load("/home/issam/Desktop/test.pdf");

			// ###### Print metadata ######
			PDFMetaData metadata = new PDFMetaData(document);
			metadata.printMetaData();

			// ###### Extract text to a file ######
			PDFTextExtractor extractor = new PDFTextExtractor(document);
			extractor.extract(1, 4, new FileWriter("/home/issam/Desktop/text.txt"));

		} catch (IOException ex) {
			ex.printStackTrace();
		} finally {
			try {
				if (document != null) {
					document.close();
				}
			} catch (IOException ex) {
				ex.printStackTrace();
			}
		}
	}
}

PDFMetaData

package pdfboxtest;

import java.io.IOException;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDDocumentInformation;

public class PDFMetaData {

	private PDDocumentInformation documentInfos;

	public PDFMetaData(PDDocument document) {
		documentInfos = document.getDocumentInformation();
	}

	public void printMetaData() throws IOException {
		System.out.println("Author: " + documentInfos.getAuthor());
		System.out.println("Creator: " + documentInfos.getCreator());
		System.out.println("Title: " + documentInfos.getTitle());
		System.out.println("Subject: " + documentInfos.getSubject());
		System.out.println("Keywords: " + documentInfos.getKeywords());
		System.out.println("Creation Date: " + documentInfos.getCreationDate().getTime());
		System.out.println("Modification Date: " + documentInfos.getModificationDate().getTime());
	}
}

PDFTextExtractor

package pdfboxtest;

import java.io.IOException;
import java.io.Writer;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.util.PDFTextStripper;

public class PDFTextExtractor {

	PDDocument document;

	public PDFTextExtractor(PDDocument document) {
		this.document = document;
	}

	public void extract(int startPage, int endPage, Writer writer) throws IOException {
		PDFTextStripper stripper = new PDFTextStripper();
		stripper.setStartPage(startPage);
		stripper.setEndPage(endPage);
		stripper.writeText(document, writer);
	}
}

مشروع netbeans مرفق

PDFBoxTest.zip

2
#2

هل تسمح لنا هذه المكتبة بالتعديل و بالتغير على الملف و ال metadata ؟

و تستطيع تكوين ملف PDF ايضا؟

#3

موضوع مميز أخر من مواضيعك أخي عصام,, شكرا لك دائما :)

@محمد عرسان:

اقتباس

Apache PDFBox is an open source Java PDF library for working with PDF documents. This project allows creation of new PDF documents, manipulation of existing documents and the ability to extract content from documents.

#4

لا كدا دا الموضوع عاوز قعده كويسه كدا

انتظرونى مره اخرى

ان فهمت حاجه :lol:

ههههههه

امزح طبعا

موضوعات اخى عصام كلها مميزه ومفيده

انتظرونى لان البرد مسكنى تانى بس انا عاوز اقراه بتركيز شويه

سلام عليكم

Software Developer
Mahmoudkelany.com


 

مواضيع مشابهة