用于 PDF 光栅化的 ASP.NET 剪贴板






4.41/5 (7投票s)
2006年9月20日
2分钟阅读

75248
使用剪贴板对 PDF 文件进行光栅化和/或调整大小。 这也允许您将其保存为 JPG 使用。
背景
您可能首先会问的问题是“为什么您要使用服务器的剪贴板来做任何事情?” 这是一个好问题 :)。 当我尝试编写一个 PDF 解析器来光栅化首页并将其保存到 Bitmap
对象中时,我遇到了这个问题。 从这里,您可以将其保存到文件、数据库等。为此,我正在使用 Adobe Acrobat 7.0 附带的 Adobe Acrobat COM 库。 不幸的是,他们没有一个函数允许您直接保存到文件。 但是,他们允许您将图像复制到剪贴板,然后以您想要的任何格式恢复它。
问题
我从 Jonathan Hodgson 这里找到了一些很棒的代码:从 PDF 文档生成缩略图。 这段代码是为 C#/VB.NET Windows 应用程序编写的,如果以这种方式使用,效果很好。 但是,当我尝试将这段文本用于 ASP.NET Button
控件的 OnClick
事件中时,我发现没有任何事情发生。 事实证明,CopyToClipboard
命令工作正常,因为如果我跟踪代码,我可以按 Ctrl+v 并完美地看到图像。 但是,当调用 Clipboard.GetObject
方法时,它总是返回 null
。
解决方案
经过大量的挖掘和两天的努力,我偶然发现了原因:为 ASP.NET 应用程序启动的线程没有正确的 ApartmentState
来读取 Clipboard
类。 因此,我做了以下操作来解决这个问题
protected void Button_Click(object sender, EventArgs e)
{
Thread cbThread = new Thread(new ThreadStart(CopyToClipboard));
cbThread.ApartmentState = ApartmentState.STA;
cbThread.Start();
cbThread.Join();
}
[STAThread]
protected void CopyToClipboard()
{
/*
In here, put the code that copies AND retrieves from the clipboard.
If you use global variables, the Bitmap you populate
here can be used elsewhere in your code.
*/
}
最终注释
我不建议在多用户环境中执行此操作,因为无法保证将内容复制到剪贴板的用户将是检索内容的用户。 此外,图像/PDF 文件可能非常大,并且剪贴板速度较慢。
我希望这对某人有所帮助。 它解决了我的问题,并避免了我购买 PDF 光栅化控件而花费 900 美元。 欢迎回复,告诉我它是否对您有帮助,或者您是否有任何问题。
历史
这篇文章最初发布在 telerik 论坛 上。