惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

量子位
S
Securelist
MyScale Blog
MyScale Blog
Jina AI
Jina AI
罗磊的独立博客
The Cloudflare Blog
美团技术团队
博客园 - 叶小钗
阮一峰的网络日志
阮一峰的网络日志
博客园 - 三生石上(FineUI控件)
月光博客
月光博客
雷峰网
雷峰网
小众软件
小众软件
aimingoo的专栏
aimingoo的专栏
大猫的无限游戏
大猫的无限游戏
博客园 - Franky
博客园 - 聂微东
Y
Y Combinator Blog
酷 壳 – CoolShell
酷 壳 – CoolShell
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
MongoDB | Blog
MongoDB | Blog
T
Tailwind CSS Blog
Attack and Defense Labs
Attack and Defense Labs
博客园_首页
Latest news
Latest news
Apple Machine Learning Research
Apple Machine Learning Research
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
The Hacker News
The Hacker News
G
GRAHAM CLULEY
Simon Willison's Weblog
Simon Willison's Weblog
Exploit-DB.com RSS Feed
Exploit-DB.com RSS Feed
P
Proofpoint News Feed
CTFtime.org: upcoming CTF events
CTFtime.org: upcoming CTF events
U
Unit 42
D
Docker
Webroot Blog
Webroot Blog
N
Netflix TechBlog - Medium
T
Tor Project blog
C
Cyber Attacks, Cyber Crime and Cyber Security
L
LINUX DO - 最新话题
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
The Last Watchdog
The Last Watchdog
B
Blog
Recent Announcements
Recent Announcements
GbyAI
GbyAI
Microsoft Azure Blog
Microsoft Azure Blog
Security Latest
Security Latest
V2EX - 技术
V2EX - 技术
N
News | PayPal Newsroom
Microsoft Security Blog
Microsoft Security Blog

博客园 - canbeing

Cocos2d-x游戏引擎实战开发炸弹超人项目教程 全套下载 1至6课 关于Android多项目依赖在Eclipse中无法关联源代码的问题解决 免费将Mac OS X从Snow Leopard升级到Mountain Lion 文档在线预览:总体思路 开发服务器恢复手记与心得 养成良好习惯 铸造高效管理 计算机管理:电脑定时开关机 [深圳]金蝶软件招聘多名网站架构师、规划师、开发工程师、策划师、设计师 微博平台StatusNet研究(5):支持Jabber/Gtalk 微博平台StatusNet研究(4):快速安装 微博平台StatusNet研究(3):友好URL与OpenID支持 微博平台StatusNet研究(2):基本安装 微博平台StatusNet研究(1):介绍 分享微博平台间的信息同步方法 在线服务器性能状态监控预警软件推荐:监控宝 VPS上安装LAMP(Linux+Apache+MySQL+PHP)步骤 [已送完]赠送Google Wave 邀请码 偶对《蜗居》人物的观点感想 Linux使用入门与服务器管理交流 PPT
文档在线预览:文档生成技术细节
canbeing · 2010-11-27 · via 博客园 - canbeing

  之前的“文档在线预览:总体思路”受到很多朋友的欢迎,为此我继续讲一下文档在线预览两个步骤的一些技术细节。以下我以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

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”字体

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”进行转化;