Azure (BLOB)から取り出したWordファイルのPDF変換

Azure のBLOBに、ExcelやWORDなどのデータを格納しております。
.NETプログラムで、BLOBからデータ取り出し、ファイルを実体化し
Groupdocsに渡し、PDFを作成する機能を作成しています。

その際、ExcelやDWGなどのファイル形式はPDFに変換が行えますが、
Word(doc、docx)だけPDF変換に失敗します。
※Wordファイルは、特殊なものではありません。必ず失敗します。
すべてのWordファイルで発生します。
※プログラムで実体化したファイルは、Wordソフト自体で正常に開けます。

記の事象の解決に向けて、原因究明に向けての切り分け方法、調査方法
なんでも構わないので、情報を頂け頂けないでしょうか。

@strsugi

次の詳細を共有していただけますか。このシナリオを検討させていただきます。

  • BLOB からデータを抽出し、.NET でファイルを実体化するサンプル コード
  • アプリケーションで使用する GroupDocs.Viewer API バージョン
  • 開発環境の詳細 (OS、.NET バージョンなど)

返信頂きありがとうございます。以下回答させて頂きます。
①サンプルコードについては、別途調整してご連絡いたします。
②Groupdocsについては、22.5です。
③OS :AzureのAppServiceのため、OSはありません。
.NET:6.0

また、PDF変換についての追加情報です。
excelファイル(.xlsx)の拡張子を、.docxにリネームすると、PDF変換は成功。
wordファイル(.docx)の拡張子を、.xlsxにリネームすると、PDF変換は失敗。
→つまり、拡張子は関係なく、wordファイル自体が、NGとなっています。

以下、改めて処理のシーケンスは以下です。
AppService(.net 6.0)
→ Azure BLOBアクセス・ファイル取り出し
→ AppServiceのフォルダに、ファイルを実体化
→ GroupdocsのAPIにファイルを渡し、PDF変換開始
→ Wordのみ失敗。

@strsugi

はい、サンプル アプリケーションを楽しみにしています。

@strsugi

実行しているコードも共有してください。

どの Viewer コンストラクターを使用しますか?

大変お待たせしてすみません。
再現するサンプルコードを提供したかったのですが、
私のチームで作ったコードではAzureでWordの変換は行えています。

私のチームで作ったコード(DLL)を他ベンダーに提供しているので、
その他ベンダーのコードはお渡しできなくて時間が経っておりました。
※再現するコードを作成するようにしたいのでしばらくお時間をください。

Viewerコンストラクターは、streamのみを引数としているものを使用しています。

@strsugi

ファイルの種類を自分で渡す次のコードを使用してみてください。 CPU とメモリのリソースが節約され、信頼性も向上します。

 Stream stream = GetFileStream();
 string fileName = GetFileName(); // e.g. "my-file-name.docx";
 
 FileType fileType = FileType.FromFilePath(fileName);
 LoadOptions loadOptions = new LoadOptions(fileType);
 
 using (Viewer viewer = new Viewer(stream, loadOptions))
 {
     HtmlViewOptions options = HtmlViewOptions.ForEmbeddedResources();
     viewer.View(options);
 }

ありがとうございます。
コードを組み込んで試して、結果をご連絡します。

頂いたコードで検証しましたが、私たちのチームではPDF変換は成功しています。
一方、他ベンダーの別環境での検証は、失敗しました。
以下、コードとログを示しますが、どうのように解決すればわかりますでしょうか。

    try
    {
        MemoryStream ms = new(File.ReadAllBytes(file));
        FileType fileType = FileType.FromFilePath(file);
        LoadOptions loadOptions = new(fileType);
        using (Viewer viewer = new(stream: ms, loadOptions: loadOptions))
        {
            PdfViewOptions pdfOptions = new PdfViewOptions(pdfOutput);
            viewer.View(pdfOptions);
        }
        ...
    }
    catch (System.Exception ex)
    {
        logWriter.ErrLogMessage("ToPdf", file, ex.Message);
        logWriter.ErrLogMessage("ToPdf", file, ex.StackTrace);
    }

<ログ>

Could not load file or assembly 'SkiaSharp, Version=2.80.0.0, Culture=neutral, PublicKeyToken=0738eb9f132ed756'. The system cannot find the file specified.

<スタックトレース(文字化けあり)>

at ​ .()
   at ​ .†  ​(BaseViewOptions )
   at † .†  ​(String , Stream , LoadOptions , BaseViewOptions , CancellationToken )
   at GroupDocs.Viewer.Viewer.(LoadOptions , BaseViewOptions , CancellationToken )
   at GroupDocs.Viewer.Viewer.(BaseViewOptions , CancellationToken )
   at   .   ​(Func`3 , ViewOptions , CancellationToken )
   at GroupDocs.Viewer.Viewer.View(ViewOptions options)
   at OfficeViewerDll.PDFConv.ToPdf(String file, String pdfName)

<考察>

SkiaSharp.dllというファイルがロードできないため、例外が発生していると判断。
このDLLはdocx/docの時のみ使用されていると推測

環境には、SkiaSharp.dllは存在しており、バージョンが2.80.2.0です。
例外メッセージから、2.80.0.0のDLLも試しましたが、現象は同じでした。

@strsugi

アプリが動作しない環境について、以下の情報を共有してください。

OSのバージョン
ターゲットフレームワーク
GroupDocs.Viewer のバージョン
サンプルファイル

ありがとう

返信ありがとうございます。以下回答いたします。
・OSのバージョン :AzureのAppServiceのため、OSはありません。
・ターゲットフレームワーク:NET:6.0
・GroupDocs.Viewer のバージョン:22.5
・サンプルファイル :どう提示できるか考えますのでお時間ください。
.

1 Like

@strsugi

最新バージョンのいずれかを試してみてはいかがでしょうか。 23.6 は .NET 6 のサポートが強化されているのでしょうか?

DLLの参照などビルド環境が誤っていることが原因でした。
1カ月以上前に解決したのですが、こちらに回答するのを失念していました。
本件はクローズでお願いいたします。

@strsugi

フィードバックをお寄せいただきありがとうございます。