web-dev-qa-db-ja.com

PHPネットワークプリンタに出力

私がやろうとしていること

色、向き、両面印刷などの印刷パラメータを渡しながら、PDFドキュメントをネットワークプリンタで印刷します。

詳しくは

  • 複数のネットワークプリンタがあり、そのため[〜#〜] ip [〜#〜] sは静的かつ既知です(つまり、192.168。 0.10)
  • ドキュメントが含まれていますパラメータ/オプションのリストを含み、変更のためにプリンタに渡すことができます印刷設定ここ =(そのほとんどは25ページにあります)
  • 2ページ目以外のドキュメントを白黒で印刷するプロセスを作成しています。これは、最初のページおよび3ページ目以降印刷された白黒であることを意味します。 ページ2印刷済みになります。 (これはカラー印刷のコストが原因であり、他のページには色が含まれていないため、カラーで印刷するとまったく意味がなく、約8倍の費用がかかります。このプロセスでは、毎月数千ページが印刷されます。たくさんの$$$)

私がしてきたことsomewhatで成功

プリンターの1つ(192.168.0.10-Ricoh MP C5503 [本当に知っている必要がある場合])にログインし、FTPアクセスを追加しました

Windowsでコマンドプロンプトを使用してドキュメントを印刷する

_> ftp 192.168.0.10
> User (192.168.0.10:(none)): username
> Password: password
> put path\to\file.pdf filetype=PDF
> bye
_

私がやろうとしたこと

PHPのexec()関数を使用して1を試みる

私はexecを機能させるために多くの方法を試しましたが、役に立ちませんでした。 PHPのexec関数を使用して複数行のコマンドを実行できませんでした(理想的には、以下を実行しています)。次のexec()内で実行すると、前の行が実行された後に各行を実行する必要があるため、FTPに接続できません。オンラインで何も見つかりませんでした(複数のGoogle検索で結果が得られません(cmdから複数の出力行をエコーする方法-複数のcmd行を連続して挿入する方法を除く))

_> ftp 192.168.0.10
> User (192.168.0.10:(none)): username
> Password: password
> put path\to\test.pdf filetype=PDF
> bye
_

PHPのexec()関数を使用して2を試みる

this の投稿の提案に対するいくつかの回答としてテキストファイルを渡して、ftpコマンドを実行しようとしました。このソリューションは期待どおりに機能しません。コマンドプロンプトから_ftp -i -s:test.txt_を実行すると、これは機能します。 PHPではそうではありません。

PHPファイル

_exec("ftp -i -s:test.txt");
_

テキストファイル(test.txt

_open 192.168.0.10
username
password
put test.pdf filetype=PDF
bye
_

PHPのFTP関数を使用した3つの試み

私が今理解できないことは、ftp経由でプリンターにファイルを送信する方法とプリンター設定を設定する方法です。

_$ftp = [
    'server'   => gethostbyaddr('192.168.0.10'),
    'username' => 'username',
    'password' => 'password',
];
$conn = ftp_connect($ftp['server']);
$login = ftp_login($conn, $ftp['username'], $ftp['password']);
if (is_readable($file)) {
    if (ftp_put($conn, $file, $file, FTP_ASCII)) {
        echo 'Successfully executed command';
    }
    else {
        echo 'Failed execution of command';
    }
}
else {
    echo 'File is not readable';
}
_

理想的には...

IIS)からNGINX(ありがとうございます...)に移行している最中なので、WindowsとLinuxの両方のシステムで機能するソリューションを探しています。 Windowsの場合はftpを使用し、Linuxの場合はrcpまたはrshを使用するのが最良の実装であると考えます(Moreの下に接続したプリンターのドキュメントから情報私がやろうとしていることセクションには、これらの印刷方法が記載されています)。

また、これらのドキュメントを印刷するためにtxtファイルやその他の種類のファイルを生成する必要がなかったかどうかも教えてください。ユーザーは一度に何百ものファイルを処理している可能性があります。これは、各txtファイルに一意の名前を付け、スクリプトが正常に実行された後に削除できることを理解しています。ただし、プリンターなどのパラメーターを渡すことができるクリーンソリューション( IPまたはgethostbyaddr() functionからの名前)、ユーザー名、パスワード、印刷するファイル、オプション(色、両面印刷、ファイルタイプ、向き、バインディングなど)。 MPDFを使用してPDFファイルを生成しているため、実際にサーバーに作成せずにファイルを配置し、その後削除する必要がある方法が推奨されます(つまり [〜#〜] mpdf [〜#〜] メールの添付ファイル)ただし、これらは必須ではありません。

さらに

ソリューションはPHPで動作する必要があります。

viableソリューションが見つかるまでこれを投稿した後、ネットワークプリンターでドキュメントを印刷するための方法をさらに調査し、試行ごとに投稿を更新します。

これに関するどんな助けでも大歓迎です。



編集


失敗したメソッド

メソッド:PHPプリンター関数

プリンター関数 は印刷を許可しますが、印刷ジョブ(カラー/白黒印刷、ファイルタイプ、両面印刷などのオプション)を制御できません。したがって、このオプション(誰かが「ハック」を行わない限り、機能しません)

メソッド:JavaScript/AJAX

JavaScript/AJAXは印刷(および印刷設定を許可)で機能しますが、数百のページを一度に処理する可能性があり、その処理により複数のプリンター(つまり、異なるオフィス)に印刷ジョブがプッシュされる場合があります。アイデアは、このプロセスと同様に将来のプロセスのために印刷を自動化することです。


テストされていないメソッド

方法:まだテストされていません


解決?

結局、必要なすべてのことを実行するC#スクリプトを作成することになりました。私の要件は印刷設定に関してかなり具体的であるため、 これはMicrosoftのSystem.Drawing.Printing名前空間へのリンクです 。この名前空間を使用して、自分のニーズに適したメソッドを作成することができました。以下のいくつかのStackOverflowの質問/回答は、使用法の詳細を提供します。

PHPでC#を実行する方法は?それはあなた次第です。 C#API(たとえば、C#を別のWebサーバーで実行する)とのインターフェース、.NET DLLの参照、PeachPieの使用、または実行時の宣言の注入を行うことができます。


また、PowerShellを使用して何かを思い付くことができる場合もあります( PrintManagementのドキュメントはこちら を参照)。これにより、exec()を使用してスクリプトを実行できます- PHPからのPowerShellの実行 に関するこの質問を参照してください。

17
ctwheels

これを試して:

_$ftp = ftp_connect('192.168.0.10');
if(ftp_login($ftp,'username','password')){
    if(ftp_put($ftp,'filetype=PDF','yourfile.pdf',FTP_BINARY)){
        echo 'success';
    }
}
_

あなたが得るものを私に知らせてください。

Update:from プリンタのマニュアル (19ページ)、次のコマンドを使用してファイルを送信し、デバイスオプションを設定できます同時に:

_ftp> put file1 filetype=postscript,tray=tray1,copies=3,resolution=600
_

その例では、_file1_は送信するローカルファイル名、_filetype=postscript,tray=tray1,copies=3,resolution=600_はリモートファイル名です。正確には、実際のFTPコマンドは次のとおりです。

_STOR filetype=postscript,tray=tray1,copies=3,resolution=600
_

PHPのFTP関数を使用すると、PHPコードは次のようになります:

_ftp_put($ftp,'filetype=postscript,tray=tray1,copies=3,resolution=600','file1',FTP_BINARY);
_

ここで、_$ftp_は、ftp_connect()への正常な呼び出しからの接続ハンドルです。

最初の例に当てはめると、コードは次のようになります。

_$ftp = ftp_connect('192.168.0.10');
if(ftp_login($ftp,'username','password')){
    if(ftp_put($ftp,'filetype=postscript,tray=tray1,copies=3,resolution=600','file1',FTP_BINARY)){
        echo 'success';
    }
}
_

試してみる。

2
Rei

しかし、私の試みの多くはネットワークプリンターでの印刷に失敗し、適切な解決策を見つけることができませんでした。また、Shell_exec( "AcroRd32.exe")および "その他のpdfprinter"経由では、WAMPサーバーがGUIプログラムに特別な権限を必要とするため、機能しません。今、私は最終的に私に役立つ解決策を見つけました。

これはWindowsのみのソリューション用です

ダウンロード PDFtoPrinter

ネットワーク/ローカルプリンターで印刷するコード

$command = escapeshellcmd('PDFtoPrinter YOURFILE.PDF "\\\YOURSERVERNAME\YOURPRINTERNAME"');
$output = Shell_exec($command);
echo $output;
0
Bhadresh