Open3

Unity プリンター実装調査

ピン留めされたアイテム
aiaiosaruaiaiosaru

実装方法

  • Unityから印刷コマンドをたたく形で、プリンターで印刷を行う
  • 多くのプリンターは、PCからlprコマンドでアクセスできるようになっているため、lprコマンドを使用する
aiaiosaruaiaiosaru

印刷コマンドって何?

コンピュータがプリンターに「このファイルを印刷して!」とお願いするときに使う方法のことです。印刷コマンドにはいくつか種類があります。ここでは主に以下の2つを比較して説明します:

  • rundll32 コマンド:Windows専用の方法。
  • lpr コマンド:もっと多くのプリンターで使える方法。

1. rundll32 コマンドってなに?

簡単にいうと:

Windowsがもともと持っている機能を使って、画像を印刷する方法です。

どうやって動くの?

Windowsには「画像ビューアー(画像を表示するアプリ)」が入っていて、このビューアーを使って印刷します。

いいところ:

  • 特別な準備をしなくても、すぐに使えます。
  • USBでつながったローカル(近くにある)プリンターによく対応しています。

よくないところ:

  • ネットワークプリンター(Wi-Fiなどで接続されているプリンター)では使えないことがあります。
  • 画像以外(PDFやWordのファイルなど)は印刷できません。

2. lpr コマンドってなに?

簡単にいうと:

多くのプリンターが使える「標準的な印刷方法」です。ネットワークでも使えます。

どうやって動くの?

コンピュータがプリンターに「このファイルを印刷して」と直接お願いする仕組みです。

いいところ:

  • ネットワークプリンターでも使えます。
  • PDFやテキストファイルも簡単に印刷できます。
  • Windowsだけでなく、MacやLinuxでも使えます。

よくないところ:

  • Windowsでは、事前に「LPRを使えるようにする」設定が必要な場合があります。
  • 古いプリンターでは使えないことがあります。

どうしてコマンドを変える必要があるの?

プリンターの種類によって、使える印刷方法が違うからです。たとえば:

  • 家庭用のUSB接続プリンターrundll32でOK。
  • オフィスにあるネットワークプリンターlprを使う方が良い。

つまり、使いたいプリンターに合わせてコマンドを選ぶ必要があります。


具体的な違いを見てみよう

使うコマンド どんなプリンターで使える? 印刷できるファイルの種類 使いやすさ
rundll32 USB接続のプリンター JPEG、PNGなどの画像ファイル 簡単(特に設定は不要)
lpr USB接続のプリンター、ネットワークプリンターやPDF対応プリンター PDF、画像、テキストなど幅広い 少し準備が必要(設定が必要な場合あり)

3. どのコマンドを選ぶべきか?

利用する環境やプリンターの種類によって適切なコマンドを選ぶ必要があります。

条件 推奨コマンド 理由
ローカルUSBプリンター rundll32 簡単に設定・印刷可能であり、特別なセットアップが不要。
ネットワークプリンター lpr LPRプロトコルを使用することで、ネットワーク接続のプリンターに直接アクセスできる。
高品質印刷や詳細設定が必要 専用ドライバやAPI プリンターの詳細機能(解像度設定や両面印刷)を活用するためには、メーカー提供のツールが必要。
クロスプラットフォーム lpr Windows、Linux、MacOSのすべてで動作可能な標準プロトコル。
PDF/多様な形式を印刷 lpr PDFやPostScript形式をそのまま印刷可能。

aiaiosaruaiaiosaru

参考になりそうなサンプルコード

リポジトリ

https://github.com/GimChuang/UnityPrintingTool


機能概要

  1. wmic printer get name

    • コマンドを使ってシステム上の利用可能なプリンター名を取得している
  2. rundll32 コマンド

    • Windowsのライブラリ(shimgvw.dll)を使用して、指定したプリンターにファイルを印刷しています。
    • ローカルプリンター(USB接続など)での簡単な印刷に適しています。

※shimgvw.dllって何?
shimgvw.dll は、Windowsに入っている画像を表示するための機能を持ったファイルです。主に古いWindows(Windows XPや7)で使われていたもので、画像ビューアや画像の印刷をサポートしています。