0

私はJavaプログラミングが初めてです。私の現在のプロジェクトでは、Excel シートに埋め込まれた (ole) ファイルを読み取り、それらのテキスト コンテンツを取得する必要があります。埋め込まれた単語ファイルを読み取る例は正常に機能しましたが、埋め込まれた pdf ファイルを読み取るためのヘルプが見つかりません。同様の例を見て、いくつかのことを試しました....うまくいきませんでした。

http://poi.apache.org/spreadsheet/quick-guide.html#Embedded

以下にコードがありますが、おそらく助けがあれば正しい方向に進むことができます。Apache POI を使用して 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

Error reading Error: End-of-File, expected line 最終的に何もありません

4

1 に答える 1

1

PDF は OLE 1.0 でパッケージ化されていませんでしたが、何らかの方法で埋め込まれていました。少なくとも、抽出はうまくいきました。埋め込みアプリケーションがエントリに名前を付ける方法に依存するため、これは一般的な解決策ではありません...もちろん、PDFの場合はDocumentNode、マジックナンバー「%PDF」のすべての-sをチェックできます-OLE 1.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();
    }
}
于 2013-08-27T23:18:28.353 に答える