0
對於包含在其嵌入的元數據的其他信息(如條碼數據)PDF/A文件,有沒有從Delphi應用程序訪問這些信息的簡單方法 - 而不是使用一個全功能的PDF閱讀器/寫入應用程序庫? (例如開放源代碼的命令行工具)從Delphi應用程序讀取PDF(/ A)元數據的最簡單方法?
對於包含在其嵌入的元數據的其他信息(如條碼數據)PDF/A文件,有沒有從Delphi應用程序訪問這些信息的簡單方法 - 而不是使用一個全功能的PDF閱讀器/寫入應用程序庫? (例如開放源代碼的命令行工具)從Delphi應用程序讀取PDF(/ A)元數據的最簡單方法?
據我所知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內容:這將是更快(沒有解析文件),但將需要多少額外的編碼。
謝謝!流式傳輸XML(SAX)解析器將方便在這裏:) – mjn
請注意,元數據可以通過zlib的或任何其他的PDF流過濾器進行壓縮。該文檔指出:元數據流的內容是以可擴展標記語言(XML)表示的元數據。只有在元數據流未經過濾和未加密的情況下,這些信息才以純文本形式顯示給不支持PDF的工具。另外:PDF/A標準沒有指定這個流應該保持未壓縮 - >因此:這可能不適用於所有PDF/A文檔。 –
AFAIK爲了有效,根據PDF/A標準,XML元數據不應該被壓縮。至少,一些PDF/A驗證器期待這一點。 –