文檔在線預覽:文檔生成技術細節
文檔在線預覽研究系列
文檔生成技術細節
利用百度閱讀器
之前的“文檔在線預覽:總體思路”受到很多朋友的歡迎,為此我繼續講一下文檔在線預覽兩個步驟的一些技術細節。以下我以C#語言和Windows平臺為例展開做一些介紹。請記住,本文講的是文檔轉化為pdf再轉化為其他格式的方法,不討論轉化成的flash如何展示的問題(暫且假設用FlexPaper來展示吧)。文章后面附帶本文講到的相關操作的源碼和軟件下載,有些軟件需要購買授權才能使用。
利用百度閱讀器
之前的“文檔在線預覽:總體思路”受到很多朋友的歡迎,為此我繼續講一下文檔在線預覽兩個步驟的一些技術細節。以下我以C#語言和Windows平臺為例展開做一些介紹。請記住,本文講的是文檔轉化為pdf再轉化為其他格式的方法,不討論轉化成的flash如何展示的問題(暫且假設用FlexPaper來展示吧)。文章后面附帶本文講到的相關操作的源碼和軟件下載,有些軟件需要購買授權才能使用。
四項基本操作
1、調用Windows打印機打印文檔
PrintDocument docToPrint = new PrintDocument();
docToPrint.DocumentName = GetPath(sourcePath);
//開始打印
docToPrint.Print();
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;
}
/// 運行命令
/// </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;
}
/// 檢查是否轉換成功(文件是否生成完畢)
/// </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();
}
}
}
/// 根據進程名稱來關閉進程
/// </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”的“打印機首選項”,結合程序,進行如下兩個圖的設置;
![](https://imageproxy.pixnet.cc/imgproxy?url=https://images.cnblogs.com/cnblogs_com/flashlm/doc-pdf-1.png&width=576&height=533)
優點:
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)
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)
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
pdf轉文本(見源碼方法:ParseText)
有時為了生成摘要或者索引文檔內容,需要將文檔里的文本讀取進來,xpdf是一個不錯的工具。
原理:使用“xpdf”軟件,調用命令行“pdftotext.exe c:\1.pdf c:\1.txt”進行轉化;
常見問題:要讓xpdf支持中文,還需要下載中文語言包并做一些配置,xpdf中文化詳細配置請參考:http://emily2ly.javaeye.com/blog/743552
全站熱搜