Back to blog
Nov 06, 2022
2 min read

片面スキャンのプリンターから両面スキャンを生成する【Brother】

Pythonを使って片面スキャンのプリンターから両面スキャンを生成します。汎用的な手段なので、応用がききます。

はじめに

こんにちは、こふです。

自分なりに考えて可能にしたことなので記録として共有することにしました。

片面スキャンのプリンターから両面スキャンを生成する

大学の授業で、両面のレジュメがアナログに配布される事案が発生しました。

紙を持ち歩くなんて、重いし、非効率だし、バックアップが取れないので嫌ですよね。


当然、教授に言えば解決かも知れませんが、資料の原本データをくれることは著作権の都合でなかったりします。

聞いて断られるより、汎用的な片面スキャンから両面スキャンを生成する方法を考えたほうがこれからも便利だし良くない?と思い、実行した記録です。

状況

片面スキャンしかできないプリンターをお持ちの方(自分含め)で、両面スキャンを楽に実行したい、という状況です。

ADF(自動原稿送り装置)機能があるけど、両面スキャン・コピーは手作業が必要で自動でできないパターンですね。


ビジネス用の商品・高価な品であれば機能が備わっていたりして問題ないのですが、個人・家庭用の安価なものは、そういった機能がありません。

例えば、以下のような商品です。

公式サイト:MFC-J904N | インクジェットプリンター・複合機 | ブラザー

方針・使い方

両面ある資料を、次のように表します。

P1(表),P2(裏),P3(表),P4(裏)

説明の都合上、4 ページだとします。当然、ページ数は任意で、両面のスキャンになるので合計は偶数ページとなります。

まず、P1,P3 の面を好みの方向でスキャンします。

状況 1:続きをスキャンして PDF を連結できる場合

P2,P4 を裏から、P1,P3同じ向きでしスキャンする。つまり、P4,P2の順でスキャンされるようにしてください。

P4,P2の順は、単に裏から ADF に入れるだけです。

Brother のソフトウェアを使うと以下のように続けてスキャンができます。


使っているソフトウェアは以下からダウンロードできます。Brother に限りますが、他社でもあるかもしれません。

参考:Windows および Mac 向けの Brother iPrint&Scan の概要  | DCP‑J1200N

1.pdfとしてデスクトップに保存します。自由につけて良いですが、サンプルプログラムでは1.pdfとしています。

状況 2:続きをスキャンできず、別 PDF ファイルになる場合

P1,P3 のデータを1.pdfとして保存します

P2,P4P1,P3同じ向きでスキャンします

これを2.pdfとして保存します

こうしてスキャンしたデータを、次で説明するプログラムを使って、向きを変え、連結します。これが方針です。

サンプルプログラム

Python で非常に乱雑なコードです。手間を書けるほど利用するわけでもないためです、ご了承ください

Python のインストール

一般に普及している OS で使えます。各自でパッケージマネージャーを使っているなら、それを通してインストールしてください。

Download Python | Python.org

必要なパッケージのインストール

PyPDF2 · PyPIをインストールします。その他は標準ライブラリです。

pip install PyPDF2

プログラムでやりたいこと

表面のスキャンは、ページの小さい順になりますが、裏面のスキャンは裏からなので、新たな PDF に表面は先頭から追加し、裏面は末尾から追加します。

それを簡単に実行するのみです。

状況 1 用

使い方は、以下の通りで、引数として回転方向を与えます。回転が不要なら、360 を与えてください。output.pdfとして出力します、当然、自由に変えられます。

python3 scan1.py 90
from PyPDF2 import PdfFileReader, PdfFileWriter
import sys

pdf = "1.pdf"
rotate = int(sys.argv[1])
writer = PdfFileWriter()
reader = PdfFileReader(pdf), strict=False)

page_count = int(reader.getNumPages() / 2)
for i in range(page_count):
    writer.addPage(reader.getPage(i).rotateClockwise(rotate))
    # 後ろから追加
    writer.addPage(reader.getPage(
        reader.getNumPages() - i - 1).rotateClockwise(rotate))

with open("output.pdf", "wb") as f:
    writer.write(f)

状況 2 用

使い方は、以下の通りで、引数として回転方向を与えます。回転が不要なら、360 を与えてください。output.pdfとして出力します、当然、自由に変えられます。

python3 scan2.py 90
from PyPDF2 import PdfFileReader, PdfFileWriter
import sys

front_pdf = "1.pdf"
back_pdf = "2.pdf"
rotate = int(sys.argv[1])
writer = PdfFileWriter()
front_reader = PdfFileReader(front_pdf, strict=False)
back_reader = PdfFileReader(back_pdf, strict=False)

page_count = front_reader.getNumPages()
for i in range(page_count):
    writer.addPage(front_reader.getPage(i).rotateClockwise(rotate))
    # 後ろから追加
    writer.addPage(back_reader.getPage(
        page_count - i - 1).rotateClockwise(rotate))

with open("output.pdf", "wb") as f:
    writer.write(f)

おわりに

これで貧乏な僕でも、安いプリンタで両面スキャンが簡単に出来ました。工夫って大事ですね。

参考

  • 自分で考えた結果