私はJavaプログラミングに不慣れです。私の現在のプロジェクトでは、Excelシートの埋め込み(ole)ファイルを読み取り、その中のテキストコンテンツを取得する必要があります。埋め込まれたWordファイルを読み取る例は正常に機能しましたが、埋め込まれたpdfファイルを読み取るためのヘルプが見つかりません。同様の例を見て、いくつかのことを試しましたが、うまくいきませんでした。
http://poi.apache.org/spreadsheet/quick-guide.html#Embedded
私は以下のコードを持っています、おそらく私が正しい方向に進むことができる助けを借りて。私はApachePOIを使用して、Excelおよびpdfboxに埋め込まれたファイルを読み取り、pdfデータを解析しました。
public class ReadExcel1 {
public static void main(String[] args) {
try {
FileInputStream file = new FileInputStream(new File("C:\\test.xls"));
POIFSFileSystem fs = new POIFSFileSystem(file);
HSSFWorkbook workbook = new HSSFWorkbook(fs);
for (HSSFObjectData obj : workbook.getAllEmbeddedObjects()) {
String oleName = obj.getOLE2ClassName();
if(oleName.equals("Acrobat Document")){
System.out.println("Acrobat reader document");
try{
DirectoryNode dn = (DirectoryNode) obj.getDirectory();
for (Iterator<Entry> entries = dn.getEntries(); entries.hasNext();) {
DocumentEntry nativeEntry = (DocumentEntry) dn.getEntry("CONTENTS");
byte[] data = new byte[nativeEntry.getSize()];
ByteArrayInputStream bao= new ByteArrayInputStream(data);
PDFParser pdfparser = new PDFParser(bao);
pdfparser.parse();
COSDocument cosDoc = pdfparser.getDocument();
PDFTextStripper pdfStripper = new PDFTextStripper();
PDDocument pdDoc = new PDDocument(cosDoc);
pdfStripper.setStartPage(1);
pdfStripper.setEndPage(2);
System.out.println("Text from the pdf "+pdfStripper.getText(pdDoc));
}
}catch(Exception e){
System.out.println("Error reading "+ e.getMessage());
}finally{
System.out.println("Finally ");
}
}else{
System.out.println("nothing ");
}
}
file.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
以下はEclipseでの出力です
Acrobat reader document
読み取りエラーエラー:ファイルの終わり、予想される行最後に何もありません
PDFはOLE1.0でパッケージ化されていませんでしたが、どういうわけか異なって埋め込まれていました-少なくとも抽出は私にとってはうまくいきました。これは一般的な解決策ではありません。埋め込みアプリケーションがエントリに名前を付ける方法に依存するためです...もちろんPDFの場合は、すべてのDocumentNode
-sでマジックナンバー "%PDF"を確認できます。OLE1.0パッケージ要素の場合は、これが必要です。別の方法で行う必要があります...
pdfの実際のファイル名は、\1Ole
またはCompObj
エントリのどこかに隠されていると思いますが、例として、そして明らかにあなたのユースケースのために、決定する必要はありません。
import java.io.*;
import java.net.URL;
import org.apache.poi.hssf.usermodel.*;
import org.apache.poi.poifs.filesystem.*;
import org.apache.poi.util.IOUtils;
public class EmbeddedPdfInExcel {
public static void main(String[] args) throws Exception {
NPOIFSFileSystem fs = new NPOIFSFileSystem(new URL("http://jamesshaji.com/sample.xls").openStream());
HSSFWorkbook wb = new HSSFWorkbook(fs.getRoot(), true);
for (HSSFObjectData obj : wb.getAllEmbeddedObjects()) {
String oleName = obj.getOLE2ClassName();
DirectoryNode dn = (DirectoryNode)obj.getDirectory();
if(oleName.contains("Acro") && dn.hasEntry("CONTENTS")){
InputStream is = dn.createDocumentInputStream("CONTENTS");
FileOutputStream fos = new FileOutputStream(obj.getDirectory().getName()+".pdf");
IOUtils.copy(is, fos);
fos.close();
is.close();
}
}
fs.close();
}
}
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加