目的:office文件轉換為PDF或SWF,最終可使用Flexpaper調用adobe flash player進行浏覽
放棄兩個文件轉換工具:
1.FlashPaper,轉換出的文件由於自帶工具欄,無法控制打印等操作;
程序中進行命令行調用時,依賴MSOffice及adobe reader,對於環境依賴比較大
2.print2flash,代碼中調用必須使用server版本(5000¥),未有破解
最終方案:
OpenOffice+JodConverter+SWFtools(office文件→PDF→SWF)
環境配置要求:
jre 1.4以上(JodConverter依賴)
office文件→PDF
在java中可以直接調用JodConverter類庫執行
delphi中可調用JodConverter的可執行文件jar+命令行參數
命令行實例:
java -jar "D:\jodconverter-2.2.2\lib\jodconverter-cli-2.2.2.jar" "D:\業務部\1.doc" "D:\業務部\1.pdf"
PDF→SWF
調用swftools中的pdf2swf.exe+命令行參數(包括中文字體包位置,中文字體包位置需自行設置)
具體見:http://blog.csdn.net/fh13760184/article/details/4100421
命令行實例
D:\SWFTools\pdf2swf.exe -o "D:\業務部\1.swf" -t "D:\業務部\1.pdf" -s languagedir="D:\xpdf\chinese-simplified"
delphi中的關鍵代碼,思路是每條轉換任務作為一個線程,進程中創建一個進程,進程結束就表示任務結束
procedure StopProcess(ProcessID: DWORD);
var
Handle: THandle;
begin
Handle := OpenProcess(PROCESS_TERMINATE or PROCESS_VM_READ, False, ProcessID);
if Handle <> 0 then
try
TerminateProcess(Handle, 0);
WaitForSingleObject(Handle, INFINITE);
finally
CloseHandle(Handle);
end;
end;
procedure TFileConvertThread.Execute;
var
pInfo: TProcessInformation;
StartInfo: TStartupInfo;
Path: array[0..MAX_PATH - 1] of Char;
cmdLines: string;
fileExName: string;
dw: HWND;
begin
inherited;
FillChar(StartInfo, sizeof(StartInfo), 0);
StartInfo.cb := sizeof(StartInfo);
StartInfo.wShowWindow := SW_HIDE; //隱藏命令行窗口
StartInfo.dwFlags := STARTF_USESHOWWINDOW;
StartInfo.hStdError := 0;
StartInfo.hStdInput := 0;
StartInfo.hStdOutput := 0;
cmdLines :='java -jar "D:\jodconverter-2.2.2\lib\jodconverter-cli-2.2.2.jar" "D:\業務部\1.doc" "D:\業務部\1.pdf"';
//cmdLines :='D:\SWFTools\pdf2swf.exe -o "D:\業務部\1.swf" -t "D:\業務部\1.pdf" -s languagedir="D:\xpdf\chinese-simplified"';
//打開一個進程
CreateProcess(nil, PAnsiChar(cmdLines), nil, nil, False, 0, nil, nil,
StartInfo, pInfo);
FSysPid := pInfo.dwProcessId; //獲取系統進程pid
dw := WaitForSingleObject(pInfo.hProcess, 120000); //120000表示超時時間為2分鐘,等待進程執行的信號狀態
case dw of
WAIT_OBJECT_0: // 進程正常執行完畢
begin
// '轉換成功!'
end;
WAIT_TIMEOUT: // 進程執行超時
begin
//'轉換超時!'; 此處可kill pid
StopProcess(FSysPid);
end;
WAIT_FAILED: // 進程執行失敗
begin
// '轉換失敗!';
end
end;
end;