2

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 個以上のバッチ)、通常は正常に動作しますが、1 つの 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";
        };
4

1 に答える 1

4

同じ実行可能ファイルで複数のインスタンスが開始されると、GhostScript は永続的にクラッシュします。

  • これは、アプリ プールに複数のアプリケーションまたはアプリケーション フォルダーがある場合に発生します。
  • または、重複したリサイクルを手動で無効にしていない場合。

[アップデート]

PDF 固有の問題は、メタデータ内のエンコードされていないアンパサンドが原因です。これは、PDF に関する情報を返す PostScript スクリプトの欠陥であり、修正可能なはずです。

于 2012-06-02T14:38:19.553 に答える