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
フィードバックをお寄せいただきありがとうございます。