在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("該檔案沒有標題.");
}
}
}
文件檔案的屬性和正文是分開保存的。如前所述,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("該檔案沒有標題.");
}
}
}
全站熱搜
留言列表