Python: WIA API を使用して Windows でドキュメントをスキャンする

1713498442
2024-04-18 07:06:17

現在取り組んでいるプロジェクトの目的のため、スキャナーにアクセスして以下を実行する必要があります。 書類をスキャンする スクリプトから パイソン さまざまなプラットフォーム (主に Windows と macOS) 上で動作します。

今日はドキュメントスキャンについてお話します。 ウィンドウズ 離れてAPI WIA (Windows イメージの取得)、ライブラリを使用する pywin32

依存関係のインストール

もちろん、コーディングを開始する前に、マシンにいくつかの小さなものをインストールする必要があります。まず、以下からダウンロードできる最新バージョンの Python 3 から始めます。 Python.org。 Python をインストールするときは、必ずチェックボックスをオンにしてください « python.exe を PATH に追加します » ターミナルからプログラムにアクセスできるようにします。

PATH 更新を有効にするには、セッションを再起動する必要がある場合があります。

次に、インストールする必要があります pywin32。 これを行うには、ターミナルを開きます (実行します) Windows>+R"、次に入力します 「CMD.EXE」)、次のコマンドを入力します。

pip install pywin32

注記

注記 : Python についてある程度の知識がある場合は、依存関係を 仮想環境, しかし、この記事では最も簡単な手順に固執します。 😉️

さあ、これで準備は完了です。

リストスキャナー

まず、マシンで利用可能なさまざまなスキャナーを一覧表示する方法を見ていきます。

これを行うには、小さな Python スクリプトを作成します。私としては、次の名前を付けます。 「list_scanners.py」 そしてそれをフォルダーに置きます 「スキャナーの例」 それは私の机の上にあります。 スクリプトの内容と正しいコメントは次のとおりです。

#!/usr/bin/env python3

# On charge la bibliothèque cliente pour les API Win32/COM
import win32com.client

# On charge et on instancie la classe qui permet de lister et manipuler les
# scanners
device_manager = win32com.client.Dispatch("WIA.DeviceManager")

# On parcourt tous les scanners dispo. Le "DeviceManager" va nous retourner
# des objets "DeviceInfo" qui nous permettront de récupérer les propriétés
# des périphériques et de nous y connecter par la suite.
for device_info in device_manager.DeviceInfos:
    print("-------------------------------------")
    # On affiche une à une les propriétés du scanner
    for prop in device_info.Properties:
        print("%s: %s" % (prop.Name, str(prop.Value)))

このスクリプトを実行するには、

  • ターミナルを開きます: Windows> + R"
  • スクリプトが含まれているフォルダーに移動します。 "CD C:UsersFabienDesktopScannerExamples" (1)、
  • 次に、Python スクリプトを起動します。 「python list_scanners.py」 (5)。

すべてがうまくいけば、スキャナのリストがすべてのプロパティとともに表示されるはずです (5)。

CMD.exe の結果のスクリーンショット

このスクリーンショットでは、以前に説明したことよりも少し多くのことを実行したことがわかりますが、パニックにならないでください。すべてを簡単に説明します。

  1. スクリプトが含まれているフォルダーに移動します。
  2. を作成してアクティブ化します 仮想環境 私は Python ライブラリをシステムに直接インストールしたくないので、それを制限しておきたいと思っています (ただし、同じようにする必要はありません)。
  3. ライブラリをインストールします 「pywin32」 前に説明したとおりです。
  4. フォルダーの内容をリストして、スクリプトが 「list_scanners.py」 とても存在感があります。
  5. 上記のようにスクリプトを実行します。 スキャナーが私のマシンに接続されていることがわかります (正確なモデルを特定できる情報は検閲しました)。

すべてが機能し、スクリプトを実行できるようにするために実際に必要な手順は、1、3、および 5 だけです。

文書をスキャンする

スキャナーをリストする方法がわかったので、文書をスキャンして結果をファイルに保存する方法を見てみましょう。

これが私のスクリプトです 「スキャン.py」 あるべきようにコメントしました:

#!/usr/bin/env python3

import win32com.client

device_manager = win32com.client.Dispatch("WIA.DeviceManager")

# On prend le premier scanner disponible
#
# ATTENTION : contrairement aux listes Python, les listes Win32/COM
#             commencent à 1 et non à 0.
device_info = device_manager.DeviceInfos(1)

# On se connecte au scanner
device = device_info.Connect()

# On récupère le premier "élément" du périphérique (le scanner à plat pour
# moi). Il est possible qu'il y en ait plusieurs sur un scanner plus
# complexe, mais tous les scanners que j'ai utilisés n'en avait qu'un...
scan_source = device.Items(1)

# On numérise le document en sélectionnant au passage le format de l'image
# souhaité.
#
# NOTE¹ : À priori WIA semble supporter du BMP, du PNG, du JPEG etc. mais
#         je n'ai jamais réussi à obtenir autre chose que du BMP (c'est
#         peut-être dépendant des drivers ?). Je vous recommande donc de
#         choisir BMP et de convertir vous-même l'image dans un autre
#         format après coup, en utilisant la bibliothèque PIL par exemple.
#
# NOTE² : la constante « win32com.client.constants.wiaFormatBMP » n'existe
#         qu'après avoir exécuté « win32com.client.Dispatch("WIA.DeviceManager") »
#         dans le script.
#
#         Si jamais cette constante n'était pas disponible pour une raison
#         ou pour une autre, sachez que vous pouvez la remplacer par la
#         string suivante : "{B96B3CAB-0728-11D3-9D7B-0000F81EF32E}".
wia_image = scan_source.Transfer(win32com.client.constants.wiaFormatBMP)

# On sauvegarde l'image dans le fichier "out.bmp" dans le dossier courant
wia_image.SaveFile("out.bmp")

前と同じ方法で、次のコマンドを使用してスクリプトを起動できます。 「Python scan.py」 :

CMD.exe で scan.py を実行しているスクリーンショット

上のスクリーンショットでは、ファイルが 「out.bmp」 コマンド呼び出しに従って作成されました。 😃️

スキャン設定を変更する

WIA API を使用すると、スキャナーで定義、コントラスト、明るさなどのいくつかのパラメーターを構成できます。

利用可能なオプションを表示するための小さなスクリプトを次に示します。

#!/usr/bin/env python3

import win32com.client

device_manager = win32com.client.Dispatch("WIA.DeviceManager")
device_info = device_manager.DeviceInfos(1)
device = device_info.Connect()
scan_source = device.Items(1)

# On liste les différents réglages du scanner
for prop in scan_source.Properties:
    print("%s: %s" % (prop.Name, str(prop.Value)))

上記のスクリプトを実行すると、スキャナーで得られる結果は次のとおりです。

Item Name: Scan
Full Item Name: 0000RootScan
Item Flags: 532483
Color Profile Name: C:Windowssystem32spooldriverscolorsRGB Color Space Profile.icm
Access Rights: 1
Lamp Warm up Time: 120
Current Intent: 0
Horizontal Resolution: 200
Vertical Resolution: 200
Horizontal Start Position: 0
Vertical Start Position: 0
Horizontal Extent: 1700
Vertical Extent: 2340
Rotation: 0
Brightness: 0
Contrast: 0
Item Size: 0
Data Type: 3
Bits Per Pixel: 24
Compression: 0
Channels Per Pixel: 3
Bits Per Channel: 8
Photometric Interpretation: 0
Planar: 0
Buffer Size: 27262976
Threshold: 128
Filename extension: BMP
Media Type: 2
Preferred Format: {B96B3CAB-0728-11D3-9D7B-0000F81EF32E}  # <= GUID correspondant à BMP
Format: {B96B3CAB-0728-11D3-9D7B-0000F81EF32E}            # <= GUID correspondant à BMP
Pixels Per Line: 1700
Bytes Per Line: 5100
Number of Lines: 2340

ここでは、API によってかなり多くのパラメーターにアクセスできることがわかります。 また、パラメーターの名前にはスペースが含まれる可能性があるため、これについては後で注意する必要があることがわかります... 🙃️

注記

注記 : 次の例では、Python の REPL (コマンド ライン インターフェイス) 構文を使用します。

  • 3 つの山形 (>>>) は Python 命令であり、スクリプトで記述することができます。
  • そして 3 つの小さな点 (...) 前の命令の結果を表示できるようにします。

利用可能なパラメータをリストしたので、それらを変更する方法を見てみましょう。 パラメータを例に挙げてみましょう "対比"

このパラメータの値を読み取るには、次のように API をクエリします。

>>> scan_source.Properties("Contrast").Value
... 0

この値を変更したい場合は、新しい値を割り当てるだけです。

>>> scan_source.Properties("Contrast").Value = 1000  # +100% de contraste

変更が考慮されていることを確認できます。

>>> scan_source.Properties("Contrast").Value
... 1000

ここで、このパラメータを次のように定義する必要があることに驚かれるかもしれません。 1000 のコントラストを上げるには 100%... これは API の任意の選択です (また、API に依存する場合もあります)。 運転者 特定のパラメータの場合)。 幸いなことに、各パラメータの最小値と最大値、およびその「粒度」を知ることができます。

>>> scan_source.Properties("Contrast").SubTypeMin
... -1000
>>> scan_source.Properties("Contrast").SubTypeMax
... 1000
>>> scan_source.Properties("Contrast").SubTypeStep
... 1

部分を少しまとめるために、次のスクリプトは、次のようなコントラストでドキュメントをスキャンします。 +50% 最初に利用可能なスキャナーで:

#!/usr/bin/env python3

import win32com.client

device_manager = win32com.client.Dispatch("WIA.DeviceManager")
device_info = device_manager.DeviceInfos(1)
device = device_info.Connect()
scan_source = device.Items(1)
scan_source.Properties("Contrast").Value = scan_source.Properties("Contrast").SubTypeMax // 2
wia_image = scan_source.Transfer(win32com.client.constants.wiaFormatBMP)
wia_image.SaveFile("out.bmp")

それほど複雑ではありませんでした

最終的に、この API は非常に使いやすいことがわかります。唯一の難点は、理論的かつ冗長すぎる Microsoft のドキュメントと、 pywin32 / パイソンコム 対象となる例が不足している可能性があります。

このテーマについてさらに詳しく知りたい場合は、以下のさまざまな役立つドキュメントへのリンクを提供します。

今後の記事でお会いしましょう! 😉️

#Python #WIA #API #を使用して #Windows #でドキュメントをスキャンする

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.

Recent News

Editor's Pick