在Microsoft Word、Excel、PowerPoint這些軟體中,使用者可以通過選單給檔案增加相關的資訊,包括檔案的標題、主題、摘要、類別、關鍵詞等,同時Application本身還會加入最後使用的使用者、最後使用和修改列印的日期時間等訊息。


文件檔案的屬性和正文是分開保存的。如前所述,OLE 2 CDF文件內部就像是一個容器,裡面包含許多類似目錄和文件的結構,而POIFS就是用來訪問其中的文件的工具。這些文件也稱為流,文檔的屬性就保存在POIFS文件系統中專用的流裡面。

以一個Word文檔為例:
雖然在資源管理器中你只看到一個叫做MyFile.doc的文檔,其實在這個文檔的內部,又包含了一個WordDocument、一個SummaryInformation和一個DocumentSummaryInformation檔案;通常還會有其他的文檔,這裡暫且不管。

WordDocument包含了你在Word裡面編輯的文本,文檔的屬性保存在SummaryInformation和DocumentSummaryInformation裡面。也許將所有屬性保存在單個檔案裡面看起來太簡單了,所以Microsoft決心要使用兩個'檔案,為了使事情更複雜一點,這兩個檔案的名字前面還加上了八進制的\005字串—這是一個不可印出的字串,因此前面就把它省略了。

Microsoft定義的標準屬性有一個好處,它們並不在乎主檔案到底是什麼類型——不管是Word檔、Excel工作簿還是PowerPoint。只要你知道如何讀取Excel檔的屬性,就知道了如何讀取其他檔案的屬性。

讀取檔案屬性其實並不複雜,因為Java程序可以利用POI的HPSF。HPSF是 Horrible Property Set Format的縮寫,翻成中文就是「討厭的屬性集格式」。HPSF是POI的讀取屬性工具,目前還不支持屬性寫入。

對於讀取Microsoft定義的標準屬性,通過HPSF提供的API可以很方便地辦到;但如果要讀取任意屬性集就要用到更一般化的API,可以想像它要比讀取標準屬性的API複雜不少。本文只介紹讀取標準屬性的簡單API,因為對大多數應用程序來說這已經完全足夠了。

下面就是一個讀取OLE 2 CDF檔案的標題(title)屬性的Java程序: 

import java.io.*;
import org.apache.poi.hpsf.*;
import org.apache.poi.poifs.eventfilesystem.*;

/**
* 讀取OLE 2文檔標題的範例程式,在命令行參數中指定檔案名字。
*/

public class ReadTitle
{
    public static void main(String[] args) throws IOException
    {
        final String filename = args[0];
        POIFSReader r         = new POIFSReader();
        r.registerListener(new MyPOIFSReaderListener(),
            "\005SummaryInformation");
        r.read(new FileInputStream(filename));
    }

    static class MyPOIFSReaderListener
     implements POIFSReaderListener
    {
        public void processPOIFSReaderEvent(POIFSReaderEvent event)
        {
            SummaryInformation si = null;
            try
            {
                si = (SummaryInformation)
                PropertySetFactory.create(event.getStream());
            }
            catch (Exception ex)
            {
                throw new RuntimeException
                    (event.getPath() + event.getName() + "\": " + ex);
            }

            final String title = si.getTitle();

            if (title != null)
                System.out.println("標題: \"" + title + "\"");
            else
                System.out.println("該檔案沒有標題.");
            }
        }
}


arrow
arrow
    全站熱搜

    天天都要努力 發表在 痞客邦 留言(0) 人氣()