السلام عليكم
مكتبة 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 مرفق
