使用ImageResizer调整PDF大小有时会导致异常,直到重新启动应用程序池才会解析

时间:2012-06-02 00:01:28

标签: imageresizer

我们正在使用ImageResizer(imageresizing.net)生成PDF首页的缩略图。它的效果很好(与使用ImageResizer几乎所有其他功能一样)除了我在这里发布的以下场景,可能信息不足,希望有人以适当的分辨率体验相同的问题。

1)在几千个PDF中,有一些PDF不允许生成缩略图。每次尝试都会导致以下异常:

Message :  An error occurred while parsing EntityName. Line 3, position 85.
Source: System.Xml
Stack Trace : 
at System.Xml.XmlTextReaderImpl.Throw(String res, String arg)
at System.Xml.XmlTextReaderImpl.ParseEntityName()
at System.Xml.XmlTextReaderImpl.ParseEntityReference()
at System.Xml.XmlTextReaderImpl.Read()
at System.Xml.XmlReader.ReadString()
at System.Xml.XmlReader.ReadElementString()
at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReaderPdfInfo.Read4_PdfInfo(Boolean isNullable, Boolean checkType)
at Microsoft.Xml.Serialization.GeneratedAssembly.XmlSerializationReaderPdfInfo.Read5_pdf()

TargetSite : Void Throw(System.String, System.String)

我们的假设是实际的PDF文件实际上在某种程度上是损坏的(无论是元数据还是其他方式),在尝试解析它时会导致异常。不幸的是,无法从源重新生成它们(源不再可用)。

此问题似乎没有发布任何GhostScript或ImageResizer错误。

2)当试图同时在多个PDF上生成缩略图(即批量> ~100)时,它通常可以正常工作,但偶尔会在一个PDF(没有押韵或理由)和所有后续缩略图生成中踢罐头尝试失败直到重新启动应用程序池。哎哟。最初我们并不太关心,因为我们只是在开始时进行批量生成,随后的缩略图生成将使用更小的数字。但是,我们发现即使数量较少,这个问题偶尔也会出现。我们会自动收到警报,但不得不重置应用程序是一个非常大的必须使用的大锤。

Source: ImageResizer
Stack Trace : 
 at ImageResizer.ImageBuilder.LoadImage(Object source, ResizeSettings settings, Boolean restoreStreamPos)
 at ImageResizer.ImageBuilder.BuildJob(ImageJob job)
 at ImageResizer.ImageBuilder.Build(ImageJob job)
 at ImageResizer.ImageBuilder.Build(Object source, Object dest, ResizeSettings settings, Boolean disposeSource, Boolean addFileExtension)
 at ImageResizer.ImageBuilder.Build(Object source, Object dest, ResizeSettings settings, Boolean disposeSource)
 at ImageResizer.ImageBuilder.Build(Object source, Object dest, ResizeSettings settings)
 at ImageResizer.InterceptModule.<>c__DisplayClass2.<HandleRequest>b__1(Stream stream)
 at ImageResizer.Plugins.DiskCache.CustomDiskCache.<>c__DisplayClasse.<TryWriteFile>b__d()
 at ImageResizer.Plugins.DiskCache.LockProvider.TryExecute(String key, Int32 timeoutMs, LockCallback success)
 at ImageResizer.Plugins.DiskCache.CustomDiskCache.TryWriteFile(CacheResult result, String physicalPath, String relativePath, ResizeImageDelegate writeCallback, DateTime sourceModifiedUtc, Int32 timeoutMs, Boolean recheckFS)
 at ImageResizer.Plugins.DiskCache.CustomDiskCache.GetCachedFile(String keyBasis, String extension, ResizeImageDelegate writeCallback, DateTime sourceModifiedUtc, Int32 timeoutMs, Boolean asynchronous)
 at ImageResizer.Plugins.DiskCache.DiskCache.Process(IResponseArgs e)
 at ImageResizer.Plugins.DiskCache.DiskCache.Process(HttpContext context, IResponseArgs e)
 at ImageResizer.InterceptModule.HandleRequest(HttpContext context, String virtualPath, NameValueCollection queryString, IVirtualFile vf)
 at ImageResizer.InterceptModule.CheckRequest_PostAuthorizeRequest(Object sender, EventArgs e)
 at System.Web.HttpApplication.SyncEventExecutionStep.System.Web.HttpApplication.IExecutionStep.Execute()
 at System.Web.HttpApplication.ExecuteStep(IExecutionStep step, Boolean& completedSynchronously)
 TargetSite : System.Drawing.Bitmap LoadImage(System.Object, ImageResizer.ResizeSettings, Boolean)

在这一点上,我们假设这是一个内存/资源问题,但是再次,没有能够忠实地重现这里的问题,希望其他人遇到问题并找出解决方案。

  • IIS 7.5(Windows Server 2008 R2)
  • ASP.NET MVC 3

利用App Start中的以下内容强制生成指定文件夹中所有PDF的特定大小和类型的图像(通过不同的路径处理对PDF的实际访问以进行身份​​验证和下载跟踪):

        Config.Current.Pipeline.Rewrite += delegate(IHttpModule sender, HttpContext context, IUrlEventArgs ev)
        {
            if (!ev.VirtualPath.StartsWith(VirtualPathUtility.ToAbsolute("~/pdf/"), StringComparison.OrdinalIgnoreCase))
                return;

            ev.QueryString["width"] = "160";
            ev.QueryString["format"] = "png";
        };

1 个答案:

答案 0 :(得分:4)

如果在同一个可执行文件中启动了多个实例,GhostScript将永久崩溃。

  • 如果您在应用程序池中有多个应用程序或应用程序文件夹,则会发生这种情况
  • 或者,如果您没有手动禁用重叠回收。

[更新]

特定于PDF的问题是由元数据中未编码的&符号引起的;这是PostScript脚本中的缺陷,它返回有关PDF的信息,应该是可修复的。

相关问题