我们正在使用 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";
};