2011-08-20 34 views

回答

2

據我所知PDF元數據僅僅是在PDF/A文件明文可用。

因此,您可以在文件中搜索<x:xmpmeta模式,然後可以在此處找到整個元數據,直到</x:xmpmeta>。然後你檢索XML內容。

function ExtractPDFMetadata(const aPDFFileName: TFileName): UTF8String; 
var tmp: RawByteString; 
    i: integer; 
begin 
    with TFileStream.Create(aPDFFileName,fmOpenRead) do 
    try 
    SetLength(tmp,Size); 
    Read(tmp[1],Size); 
    finally 
    Free; 
    end; 
    result := ''; 
    i := pos('<x:xmpmeta',tmp); 
    if i=0 then exit; 
    delete(tmp,1,i-1); 
    i := pos('</x:xmpmeta>',tmp); 
    if i=0 then exit; 
    result := copy(tmp,1,i+12); 
end; 

然後,像往常一樣,這個UTF8String可以用來解析XML內容。

您也可以找到使用「元數據」樣的PDF目錄條目這個XML內容:這將是更快(沒有解析文件),但將需要多少額外的編碼。

+0

謝謝!流式傳輸XML(SAX)解析器將方便在這裏:) – mjn

+0

請注意,元數據可以通過zlib的或任何其他的PDF流過濾器進行壓縮。該文檔指出:元數據流的內容是以可擴展標記語言(XML)表示的元數據。只有在元數據流未經過濾和未加密的情況下,這些信息才以純文本形式顯示給不支持PDF的工具。另外:PDF/A標準沒有指定這個流應該保持未壓縮 - >因此:這可能不適用於所有PDF/A文檔。 –

+0

AFAIK爲了有效,根據PDF/A標準,XML元數據不應該被壓縮。至少,一些PDF/A驗證器期待這一點。 –

相關問題