C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[11]: xlsxをPDF変換したい


(過去ログ 132 を表示中)

[トピック内 12 記事 (1 - 12 表示)]  << 0 >>

■77863 / inTopicNo.1)  xlsxをPDF変換したい
  
□投稿者/ さとすけ (1回)-(2015/11/26(Thu) 14:45:26)

分類:[C#] 

2015/11/26(Thu) 16:36:33 編集(投稿者)
xlsxをPDFに変換する方法を探しています。
もしご存知の方がいらっしゃいましたらご教授下さい。

なお、変換はWebアプリ(IIS上)で実行し、
実行マシンにはMSオフィスはインストールしない予定です。

当方は以下の方法で試しましたが、
変換は出来たものの
IISのワーカープロセスを変えないと動きませんでした。

ワーカープロセスを変えずに実現できないか、
その方法を探しています。

-------------- 当方が試した内容 --------------
1. LbireOfficeを d:\tmp へインストール
2. 以下のソースで実行
=============
String xlsx = @"D:\tmp\c.xlsx";
String outDir = @"d:\tmp";

var pdfProcess = new Process();
pdfProcess.StartInfo.FileName = @"d:\tmp\LibreOffice 5\program\soffice.exe";
pdfProcess.StartInfo.Arguments = @"--norestore --nofirststartwizard --headless --convert-to pdf --outdir " + outDir + " " + xlsx;
pdfProcess.StartInfo.WorkingDirectory = outDir; //This is really important
pdfProcess.Start();
=============
-> PDF変換出来ない
   例外も発生しないので何が原因が不明
   タスクマネージャを見ると LibreOfficeプロセスが2個出現するが、そのまま動いていない
-> VisualStdioからデバッグモードで起動すると変換出来たので、権限かな?
-> d:\tmp の権限で以下のユーザ/グループにフルコントロールを設定。
   - Everyone
   - IIS_IUSERS
   - Classic.Net AppPool
   - DefaultAppPool
-> PDF変換出来ない
-> IISのワーカープロセスを ApplicationfoolIdentity から LocalSystem に変更
-> PDF変換出来た

-------------- 環境 --------------
# .Net : 4.0
# Server : Windows Server2012R2
# IIS : 8.5

引用返信 編集キー/
■77866 / inTopicNo.2)  Re[1]: xlsxをPDF変換したい
□投稿者/ WebSurfer (718回)-(2015/11/26(Thu) 17:14:02)
No77863 (さとすけ さん) に返信

> - IIS_IUSERS

IIS_IUSRS の間違いでしょうか?
引用返信 編集キー/
■77867 / inTopicNo.3)  Re[2]: xlsxをPDF変換したい
□投稿者/ さとすけ (2回)-(2015/11/26(Thu) 17:20:01)
>
>> - IIS_IUSERS
>
> IIS_IUSRS の間違いでしょうか?

ご指摘ありがとうございます。
仰る通り IIS_IUSRS でした。
記述の間違いでした。

引用返信 編集キー/
■77868 / inTopicNo.4)  Re[3]: xlsxをPDF変換したい
□投稿者/ WebSurfer (719回)-(2015/11/26(Thu) 18:56:15)
No77867 (さとすけ さん) に返信

思いつきで検証等はしてませんのでハズレかもしれませんが・・・

-> VisualStdioからデバッグモードで起動すると変換出来たので、権限かな?
-> IISのワーカープロセスを ApplicationfoolIdentity から LocalSystem に変更

Visual Studio は管理者権限で実行しているのですよね。LocalSystem も管理者権限を
持っているはずなので、ワーカープロセスに管理者権限があれば動くということなので
しょうか。

Visual Studio を実行したアカウントを偽装したらどうでしょう?

How To: ASP.NET 2.0 で偽装と委任を使用する方法
https://msdn.microsoft.com/ja-jp/library/ms998351.aspx


#LbireOffice のコミュニティがあればそちらで質問した方がいいと思いますが。
引用返信 編集キー/
■77869 / inTopicNo.5)  Re[4]: xlsxをPDF変換したい
□投稿者/ さとすけ (3回)-(2015/11/27(Fri) 10:53:44)
> Visual Studio は管理者権限で実行しているのですよね。

はい。

> LocalSystem も管理者権限を持っているはずなので、
> ワーカープロセスに管理者権限があれば動くということなのでしょうか。

そのように推測していました。

> Visual Studio を実行したアカウントを偽装したらどうでしょう?

ご提案ありがとうございます。
早速試してみましたが、変換できませんでした。
下記と似ている症状ですが、LibreOfficeプロセスの残留はありませんでした。

> 例外も発生しないので何が原因が不明
> タスクマネージャを見ると LibreOfficeプロセスが2個出現するが、そのまま動いていない

試したソースは以下の通りです。
----------------------
string xlsx = @"D:\tmp\c.xlsx";
string outDir = @"d:\tmp";

string userName = "******";
string pwd = "******";
string domain = "******";

System.Security.SecureString ssPwd = new System.Security.SecureString();
foreach (char c in pwd)
{
	ssPwd.AppendChar(c);
}

var pdfProcess = new Process();
pdfProcess.StartInfo.FileName = @"d:\tmp\LibreOffice 5\program\soffice.exe";
pdfProcess.StartInfo.Arguments = @"--norestore --nofirststartwizard --headless --convert-to pdf --outdir " + outDir + " " + xlsx;
pdfProcess.StartInfo.WorkingDirectory = outDir;
pdfProcess.StartInfo.UserName = userName;
pdfProcess.StartInfo.Password = ssPwd;
pdfProcess.StartInfo.Domain = domain;
pdfProcess.StartInfo.UseShellExecute = false;
pdfProcess.Start();
----------------------

> #LbireOffice のコミュニティがあればそちらで質問した方がいいと思いますが。

はい、そちらも確認してみます。
コメントありがとうございます。

引用返信 編集キー/
■77870 / inTopicNo.6)  Re[5]: xlsxをPDF変換したい
□投稿者/ WebSurfer (720回)-(2015/11/27(Fri) 11:19:32)
No77869 (さとすけ さん) に返信

> string userName = "******";
> string pwd = "******";
> string domain = "******";
> 
> System.Security.SecureString ssPwd = new System.Security.SecureString();
> foreach (char c in pwd)
> {
> 	ssPwd.AppendChar(c);
> }

上記のコードが「偽装」だと言ってますか? それは ASP.NET でいう「偽装」にはなって
いないのでは?

紹介した記事にも書いてありますが、web,config で identity 要素を設定して「偽装」し
て見てください。詳しくは下記の記事を見てください。

<identity> 要素
https://msdn.microsoft.com/ja-jp/library/cc433449(v=vs.71).aspx

設定の仕方を具体的に言うと impersonate 属性を true にして、userName 属性と password 
属性にサーバーで管理者権限を持つユーザーの ID(domain\username 形式)とパスワードを
設定してみてください。

引用返信 編集キー/
■77872 / inTopicNo.7)  Re[6]: xlsxをPDF変換したい
□投稿者/ さとすけ (4回)-(2015/11/27(Fri) 13:35:56)
ご指摘ありがとうございます。

> 上記のコードが「偽装」だと言ってますか? それは ASP.NET でいう「偽装」にはなっていないのでは?

失礼しました。
誤解していたようです。

> 設定の仕方を具体的に言うと impersonate 属性を true にして、userName 属性と password 
> 属性にサーバーで管理者権限を持つユーザーの ID(domain\username 形式)とパスワードを
> 設定してみてください。

ご指摘のサイト/方法にて設定しました。
しかし、残念ながら変換出来ませんでした。

----------------
<system.web>
  <identity impersonate="true" 
    userName="domain\username" 
    password="******" />
</system.web>
----------------

また色々と試してみます。

引用返信 編集キー/
■77881 / inTopicNo.8)  Re[7]: xlsxをPDF変換したい
□投稿者/ WebSurfer (721回)-(2015/11/27(Fri) 17:56:20)
No77872 (さとすけ さん) に返信
> ご指摘のサイト/方法にて設定しました。
> しかし、残念ながら変換出来ませんでした。

これも想像だけで確認したわけではありませんが Session 0 分離の影響があるのかもし
れません。

Windows Vista, Windows Server 2008 から Session 0 分離というセキュリティ対策が取
られています。(詳しくは、以下の記事からダウンロードできる word 文書を参照)。

ワーカープロセスは Session 0 で動いているが、Session 0 は noninteractive なので、
"any attempt that a service makes to render graphics fails" ということなのかも。

Impact of Session 0 Isolation on Services and Drivers in Windows
https://msdn.microsoft.com/ja-jp/library/windows/hardware/dn653293(v=vs.85).aspx

LibreOffice を起動するとそういう attempt をするのかは不明ですが、もしそうだとすると
Session 0 分離の影響なのかもしれません。

気になる記事もありました。(本当はどうかは未確認ですが)

LibreOfficeとunoconvを、IIS6で動かしたい
http://dd-kaihatsu-room.blogspot.jp/2012/06/libreofficeunoconviis6.html

"LibreOfficeがMessageBoxを表示して、入力を待っていることが分かりました。
デスクトップにはMessageBoxは表示されませんが、裏方で表示されている様です。"

そういうことがあるのなら MessageBox を表示しようとして(render graphics しようと
して)fail したのかもしれません。

上記は単なる想像の域を超えません。やはり、LbireOffice のコミュニティがあればそち
らで質問した方がいいと思います。

引用返信 編集キー/
■77884 / inTopicNo.9)  Re[8]: xlsxをPDF変換したい
□投稿者/ さとすけ (5回)-(2015/11/27(Fri) 18:46:44)
> Windows Vista, Windows Server 2008 から Session 0 分離というセキュリティ対策が取
> られています。(詳しくは、以下の記事からダウンロードできる word 文書を参照)。

度々恐れ入ます。

Session 0 というのは初めて聞きました。

これまでの調査で単純な権限だけの問題ではないのかな、
とも思いはじめてきたところだったので、
新たな手掛かりとなりました。

貴重な情報をありがとうございます。

> 上記は単なる想像の域を超えません。やはり、LbireOffice のコミュニティがあればそち
> らで質問した方がいいと思います。

はい、また少し調査してみて様子を見ることとします。
ひとまずこちらでの質問はクローズさせて頂きます。

度々のご投稿ありがとうございました。
解決済み
引用返信 編集キー/
■77900 / inTopicNo.10)  Re[9]: xlsxをPDF変換したい
□投稿者/ WebSurfer (724回)-(2015/11/28(Sat) 13:56:59)
No77884 (さとすけ さん) に返信

上のレスで紹介した記事「LibreOfficeとunoconvを、IIS6で動かしたい」をよく読ん
でみると、LibreOffice の起動に失敗した時にユーザーに知らせるため MessageBox
が出るようです。

ということは、無事起動できれば MessageBox は出ないのでその問題ではなさそうで
す。

で、上記の記事の続きを見つけたので紹介しておきます。

LibreOfficeとunoconvを、IIS6で動かした!
http://dd-kaihatsu-room.blogspot.jp/2012_06_01_archive.html

その記事に書いてある解決策を 100% 納得しているわけではありませんが、レジストリ
から情報を取得しているのは間違いなさそうです。

であれば、

(1) レジストリへのアクセス権の問題、
(2) アクセス権はあるとして %USERPROFILE%\Application Data から正しい情報が取得
  できるのか(ワーカープロセスの %USERPROFILE% って何?)

・・・は十分原因として考えられ、そのあたりはチェックした方がよさそうです。

これも検証したわけではないので、想像のレベルを超えてません。参考程度にとどめて
おいてください。
引用返信 編集キー/
■77907 / inTopicNo.11)  Re[10]: xlsxをPDF変換したい
□投稿者/ さとすけ (6回)-(2015/11/30(Mon) 12:12:42)
ご投稿ありがとうございます。

> (2) アクセス権はあるとして %USERPROFILE%\Application Data から正しい情報が取得
>   できるのか(ワーカープロセスの %USERPROFILE% って何?)

それぞれのケースにおいて、
USERPROFILEが何が表示されるか確認しました。

------------------------------
@VisualStdioから起動 → PDF変換OK
C:\Users\作業ユーザ名

@IISから起動(ワーカープロセスはApplicationPoolIdentity) → PDF変換NG
C:\Windows\system32\config\systemprofile

@IISから起動(ワーカープロセスはApplicationPoolIdentity、作業ユーザに偽装) → PDF変換NG
C:\Windows\system32\config\systemprofile

@IISから起動(ワーカープロセスはLocalSystem) → PDF変換OK
C:\Windows\system32\config\systemprofile

# 取得
System.Environment.ExpandEnvironmentVariables("%USERPROFILE%")
------------------------------

環境変数を設定すれば解決するかと思い以下を試しました。

------------------------------
@IISから起動(ワーカープロセスはApplicationPoolIdentity、作業ユーザに偽装、USERPROFILEを「C:\Users\作業ユーザ名」に設定) → PDF変換NG
C:\Users\作業ユーザ名

# 設定
System.Environment.SetEnvironmentVariable("USERPROFILE", @"C:\Users\作業ユーザ名")
------------------------------

残念ながらうまくいきませんでしたが
「権限は偽装したけど環境変数が整っていないためにうまくいかない」
というのは説得力ある仮説に思いました。

実は権限以外にも、libreOfficeでPDF変換すると
表示に少しずれが生じるケースがあるこもとわかりました。

xlsxをPDF変換出来ればよいため
libreOffice以外の選択肢も含めて
また色々と探ってみます。

貴重な情報をいくつもありがとうございました。
解決済み
引用返信 編集キー/
■77917 / inTopicNo.12)  Re[11]: xlsxをPDF変換したい
□投稿者/ WebSurfer (726回)-(2015/12/01(Tue) 14:21:30)
No77907 (さとすけ さん) に返信

「解決済み」マークがついているのに今さらながらですが、気になった点を
レスさせてください。

> 「権限は偽装したけど環境変数が整っていないためにうまくいかない」

特定のユーザーを偽装しても、LibreOffice を起動しているのはワーカープロ
セスのはずです。

タスクマネージャーの「ユーザー名」を見ると、偽装したユーザーではなくワ
ーカープロセスになっていませんでしたか。(自分は、実際に LibreOffice で
試したわけではないですが、他の .exe で試して確認しました)

なので、LibreOffice がワーカープロセスのアクセストークンで何らかのリソ
ースにアクセスに行って、権限がないので失敗したということのような気がし
ます。・・・これは単なる想像。想像ばかりでスミマセン。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -