65.9K
CodeProject 正在变化。 阅读更多。
Home

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

starIconstarIconstarIconstarIcon
emptyStarIcon
starIcon

4.41/5 (7投票s)

2006年9月20日

2分钟阅读

viewsIcon

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 论坛 上。

© . All rights reserved.