文檔在線預覽:文檔生成技術細節

作者: canbeing  來源: 博客園  發布時間: 2010-12-05 16:05  閱讀: 908 次  推薦: 0   原文鏈接   [收藏]  
  文檔在線預覽研究系列
  文檔生成技術細節
  利用百度閱讀器
  之前的“文檔在線預覽:總體思路”受到很多朋友的歡迎,為此我繼續講一下文檔在線預覽兩個步驟的一些技術細節。以下我以C#語言和Windows平臺為例展開做一些介紹。請記住,本文講的是文檔轉化為pdf再轉化為其他格式的方法,不討論轉化成的flash如何展示的問題(暫且假設用FlexPaper來展示吧)。文章后面附帶本文講到的相關操作的源碼和軟件下載,有些軟件需要購買授權才能使用。

四項基本操作

  1、調用Windows打印機打印文檔

            PrintDocument docToPrint = new PrintDocument();
            docToPrint.DocumentName 
= GetPath(sourcePath);
            
//開始打印
            docToPrint.Print();
  2、調用命令行執行CMD命令
 
/// <summary>
/// 運行命令
/// </summary>
/// <param name="strShellCommand">命令字符串</param>
/// <returns>命令運行時間</returns>
private static double RunShell(string strShellCommand)
{

double spanMilliseconds = 0;
DateTime beginTime
= DateTime.Now;

Process cmd
= new Process();
cmd.StartInfo.FileName
= "cmd.exe";
cmd.StartInfo.UseShellExecute
= false;
cmd.StartInfo.CreateNoWindow
= true;
cmd.StartInfo.Arguments
= String.Format(@"/c {0}", strShellCommand);
cmd.Start();
cmd.WaitForExit();
DateTime endTime
= DateTime.Now;
TimeSpan timeSpan
= endTime - beginTime;
spanMilliseconds
= timeSpan.TotalMilliseconds;

return spanMilliseconds;
}

 

   3、檢查文件是否生成完畢

 
/// <summary>
/// 檢查是否轉換成功(文件是否生成完畢)
/// </summary>
/// <param name="sourcePath">要檢查文件地址</param>
/// <param name="targetPath">要復制到的地址(如果不需要真正復制,請跟sourcePath一致)</param>
/// <param name="timeout">最大等待時間</param>
/// <returns></returns>
private static bool IsParseSuccess(string sourcePath, string targetPath, int timeout)
{
bool isSuccess
= false;

if (timeout <= 0)
timeout
= 30;

int i = 0;
while (!RenameFile(sourcePath, targetPath))
{
Thread.Sleep(
1000);
i
++;
if (i == timeout)
break;
}

if (i < timeout)
isSuccess
= true;

return isSuccess;
}


/// <summary>
/// 重命名文件(用來檢查文件是否生成完成)
/// </summary>
/// <param name="sourePath">源地址</param>
/// <param name="targetPath">目標地址</param>
/// <returns></returns>
private static bool RenameFile(string sourePath, string targetPath)
{
bool isOpen
= false;

//如果是相同地址,直接移動檢查是否文件已經生成,否則進行復制(因為目標文件存在的話會有問題)
if (sourePath.Equals(targetPath))
{

try
{
//移動文件
File.Move(sourePath, targetPath);
isOpen
= true;
}

catch (Exception e)
{

}
}

else
{
bool isCopySuccess
= false;
try
{
//復制文件
File.Copy(sourePath, targetPath, true);
isCopySuccess
= true;
}

catch (Exception e)
{
isCopySuccess
= false;
}

if (isCopySuccess)
{

//如果復制成功,刪除源文件
File.Delete(sourePath);
}
}


return isOpen;
}

 

   4、殺掉進行函數

 
/// <summary>
/// 根據進程名稱來關閉進程
/// </summary>
/// <param name="processName"></param>
private static void KillPrecess(string processName)
{
foreach (Process p in Process.GetProcesses())
{

if (p.ProcessName == processName)
{
p.Kill();
}
}
}

  文檔轉pdf

  我們介紹的文檔轉化為pdf的方法,要求是較為通用,即不需要根據具體文檔寫具體的程序,且不僅要支持Office文檔,最好還要支持txt、html等其他文檔。
  1、使用pdfFactory(見源碼方法:ParsePDFWithPdfFactory)
  說明:軟件需要注冊才能使用
  原理:
  a. 調用系統默認打印機(pdfFactory)打印文檔;
  b. 從打印機的臨時目錄里將pdf拷貝到目標路徑;
  pdfFactory的設置:
  a. 打開打印機,設置“pdfFactory Pro”為默認打印機;
  b. 打開“pdfFactory Pro”的“打印機首選項”,在“Licensing”選項卡里注冊打印機;
  c. 打開“pdfFactory Pro”的“打印機首選項”,結合程序,進行如下兩個圖的設置;

  優點:
  a. 只要支持打印的文件均可以用此法轉化為pdf;
  不足:
  a. 服務器上經常會彈出文件打印窗口;
  b. 一些損壞的文件或者格式不正確的文檔會中止生成過程;
  c. 如果遇到帶病毒宏的文檔,會對服務器產生破壞;
  注意事項:
  a. 打印過程中會產生大量臨時文件在用戶目錄,需要及時清理垃圾文件,或者將對應目錄遷移到磁盤空間較大的位置;
  b. Windows Server需要安裝Server版pdfFactory;
  2、使用FlashPaper(見源碼方法:ParsePDFWithFlashPrinter)
  原理:調用命令行“flashprinter c:\document.doc -o c:\document.pdf”進行打印;
  優點:
  a. 只要支持打印的文件均可以用此法轉化為pdf;
  b. 操作簡單
  不足:
  a. 由于程序本身問題,有時可能導致打印不能結束,幾百個進程同時運行拖垮系統的情況;
  3、其他方法(未附源碼)
  使用其他虛擬打印機,例如:Virtual PDF Printer
  使用jcom或其它方式調用Office的Component進行轉化,具體請參考:將office文檔(word,excel,powerpoint)轉換為pdf
  調用使用JodConverter調用OpenOffice轉化,具體請參考:JodConverter實現Office轉化PDF格式
  pdf轉flash(見源碼方法:ParseSWF)
  原理:使用SWFTools的pdf2swf,調用命令行“pdf2swf.exe -T 9 -p 1-3 -s languagedir=D:\xpdf-3.02pl5\xpdf-chinese-simplified D:\document.pdf -o D:\document.swf”進行轉換;
  常見問題:
  1、部分文檔轉化后亂碼,控制臺提示:找不到“Adobe-GB1”字體
  解決辦法:在pdf2swf命令中帶上語言包,詳情請看:http://cqfish.blog.51cto.com/622299/163566
  2、部分文檔可能無法在FlexPaper里無法顯示
  解決辦法:flash版本的問題,在pdf2swf命令中帶上參數,設置生成的版本為9(參數為:-T 9),這樣兼容性最好。
  pdf轉圖片(見源碼方法:ParseCoverImage)
  原理:使用“VeryPDF PDF To Image Converter”軟件,調用命令行“pdf2img.exe -r 25 -f 1 -l 1 -i c:\1.pdf -o c:\11.jpg ”進行轉換;
  pdf轉文本(見源碼方法:ParseText)
  有時為了生成摘要或者索引文檔內容,需要將文檔里的文本讀取進來,xpdf是一個不錯的工具。
  原理:使用“xpdf”軟件,調用命令行“pdftotext.exe c:\1.pdf c:\1.txt”進行轉化;
  常見問題:要讓xpdf支持中文,還需要下載中文語言包并做一些配置,xpdf中文化詳細配置請參考:http://emily2ly.javaeye.com/blog/743552
0
0
 
 
 

文章列表

arrow
arrow
    全站熱搜
    創作者介紹
    創作者 大師兄 的頭像
    大師兄

    IT工程師數位筆記本

    大師兄 發表在 痞客邦 留言(0) 人氣()