3

JavaでWord文書からページを数えようとしています。

これは私の実際のコードです。Apache POI ライブラリを使用しています。

String path1 = "E:/iugkh";
File f = new File(path1);
File[] files = f.listFiles();
int pagesCount = 0;
for (int i = 0; i < files.length; i++) {
    POIFSFileSystem fis = new POIFSFileSystem(new FileInputStream(files[i]));
    HWPFDocument wdDoc = new HWPFDocument(fis);
    int pagesNo = wdDoc.getSummaryInformation().getPageCount();
    pagesCount += pagesNo;
    System.out.println(files[i].getName()+":\t"+pagesNo);
}

出力は次のとおりです。

ten.doc:    1
twelve.doc: 1
nine.doc:   1
one.doc:    1
eight.doc:  1
4teen.doc:  1
5teen.doc:  1
six.doc:    1
seven.doc:  1

最初の 3 つのドキュメントのページの長さは 4 ページで、残りのドキュメントは 1 ~ 5 ページの長さなので、これは私が期待したものではありません。

私は何が欠けていますか?

ページを正しくカウントするには、別のライブラリを使用する必要がありますか?

前もって感謝します

4

2 に答える 2

2

これはあなたを助けるかもしれません。フォーム フィードの数をカウントします (ページを分割するために使用されることもあります) が、すべてのドキュメントで機能するかどうかはわかりません (機能しないと思います)。

WordExtractor extractor = new WordExtractor(document);
String[] paragraphs = extractor.getParagraphText();

int pageCount = 1;
for (int i = 0; i < paragraphs.length; ++i) {
    if (paragraphs[i].indexOf("\f") >= 0) {
        ++pageCount;
    }
}

System.out.println(pageCount);
于 2014-02-12T15:35:35.503 に答える
0

残念ながら、これは Word の一部のバージョン (明らかに 2010 年より前のバージョン、おそらく Word 9.0 aka 2000 のみ) のバグ、または少なくともページをカウントするために使用される COM プレビューアの一部のバージョンのバグです。Apache 開発者は、それに対する回避策の実装を拒否しました: https://issues.apache.org/jira/browse/TIKA-1523

実際に Word でファイルを開くと、もちろん実際のページが表示され、カウントも再計算されますが、最初は「1」も表示されます。ただし、ここでは、ファイルに保存されているメタデータは単に「1」であるか、何もない可能性があります (以下を参照)。POI は、その情報を計算するためにレイアウトを「リフロー」しません。

これが、ファイルを開いて編集するときにワープロ プログラムによってのみメタデータが更新される理由です。Word 2010 にファイルを "読み取り専用" で開くように指示すると (インターネットからダウンロードしたため)、ページ列に "" と表示されます。2 番目のスクリーンショットを参照してください。したがって、明らかにこのファイルのバグであり、TIKA や POI の問題ではありません。

また、バグ (Word 9.0/2000 の場合) が MS によって確認されていることもわかりました: http://support.microsoft.com/kb/212653/en-us

新しいバージョンの Word で開いて再度閉じることができない/利用できない場合は、別の回避策として、ドキュメントを pdf (または xps) に変換し、そのページを数えます。

于 2015-02-19T00:24:44.803 に答える