レイアウトした図面を連続で印刷する方法

714 views
Skip to first unread message

QGIS初心者

unread,
Nov 16, 2021, 8:51:24 PM11/16/21
to QGIS初心者質問グループ
お世話になります。
レイアウトした図面をたくさん作っているのですが、今レイアウトマネージャーで確認したところ、数が50近くできており、手作業でTiff出力、Jpeg出力、pdf出力と3通り実施するのが非常につらくなってきております。(このままだと、100近いレイアウトができる予定です。)

なんとか、レイアウトの出力形式を指定して、連続印刷をかけたいのですが良い方法はありませんでしょうか?
なお、地図帳機能は図面の装飾の配置の問題上、使用できません

何か良いプラグインや、あるならばpythonスクリプトなど教えて欲しいです。
申し訳ありませんがよろしくお願いします。。

Bun

unread,
Nov 16, 2021, 11:12:43 PM11/16/21
to QGIS初心者質問グループ
こんにちは
ひとつのレイアウトに、複数ページで管理する
というのも難しいのでしょうか。
とはいえ一つのレイアウトにまとめるのにも一苦労ですね

一応やり方ですが、
1)一度全てのレイアウトで「レイアウト-テンプレートとして保存」
2)新規レイアウトで「レイアウト-ページを追加」
3)「レイアウト-テンプレートからアイテム追加」ということを50回繰り返し・・・でしょうか



2021年11月17日水曜日 10:51:24 UTC+9 QGIS初心者:

QGIS初心者

unread,
Nov 17, 2021, 1:02:06 AM11/17/21
to QGIS初心者質問グループ
Bun様
ご意見ありがとうございます。
試しに実施してみたのですが、ご記載いただいたのは、「レイアウトを使いまわして、レイアウトを追加する方法」、ではないでしょうか?  
同じレイアウトを使いまわす際には有効となりますので、次から使用させて頂きます。

今回は、あらかじめ作ってあるレイアウトから、連続出力(例えばレイアウト1~レイアウト100まで)を行いたいという内容です。
どこかでpythonでできるという話を聞いたことがあるのですが、組み方が分かってない状況です。

2021年11月17日水曜日 13:12:43 UTC+9 Bun:

sakuya_izayoi

unread,
Nov 17, 2021, 1:02:17 AM11/17/21
to QGIS初心者質問グループ
QGIS初心者さま
izayoiです。

プラグインですが、
Quick Print Layout Creator and Exporter
を使用してみてはいかがでしょうか?


2021年11月17日水曜日 13:12:43 UTC+9 Bun:
こんにちは

sakuya_izayoi

unread,
Nov 17, 2021, 1:18:10 AM11/17/21
to QGIS初心者質問グループ
すみません、読み違いました。私の投稿は無視してください。

2021年11月17日水曜日 15:02:17 UTC+9 sakuya_izayoi:

sakuya_izayoi

unread,
Nov 17, 2021, 1:28:21 AM11/17/21
to QGIS初心者質問グループ
すみません。
Maps Printer
というプラグインでした。

2021年11月17日水曜日 15:18:10 UTC+9 sakuya_izayoi:

ありた

unread,
Nov 17, 2021, 7:17:27 AM11/17/21
to QGIS初心者質問グループ
こんにちは

Python コンソールから実行するとしたら、こんな感じかと思います。

for l in QgsProject.instance().layoutManager().printLayouts():
    exporter = QgsLayoutExporter(l)
    pdf_settings = QgsLayoutExporter.PdfExportSettings()
    img_settings = QgsLayoutExporter.ImageExportSettings()
    
    exporter.exportToPdf(  f"C:/Users/user/Desktop/{l.name()}.pdf", pdf_settings)
    exporter.exportToImage(f"C:/Users/user/Desktop/{l.name()}.tif", img_settings)
    exporter.exportToImage(f"C:/Users/user/Desktop/{l.name()}.jpg", img_settings)

レイアウトは QgsLayoutManager.printLayouts() で取得することができます。
また、レイアウトのファイル出力は QgsLayoutExporter クラスで行うことができます。
解像度等の設定は QgsLayoutExporter.PdfExportSettings 構造体(クラス)や 
QgsLayoutExporter.ImageExportSettings 構造体(クラス)で行います。
上記例では特に設定せずデフォルト状態で出力しましたが、適宜設定してください。


なお、上記例では出力ファイル名としてレイアウト名 QgsPrintLayout.name() を利用
していますが、ファイル名として使用できない文字が含まれている場合の例外処理は行っていません。

QGIS初心者

unread,
Nov 18, 2021, 2:48:37 AM11/18/21
to QGIS初心者質問グループ
izayoiさん
プラグインの紹介ありがとうございます。
このプラグイン導入すると非常に楽ですね。助かります。



ありたさん
すみません。教えてください。
今回の画像を、試しに512dpiのjpeやtifで出力させようとしました。

そのため
    dpi_settings = QgsLayoutExporter.ImageExportSettings.dpi=512
としてやりdpiの設定をしてやったつもりです。
で、以下の赤文字のところを書き加えたところです。

for l in QgsProject.instance().layoutManager().printLayouts():
    exporter = QgsLayoutExporter(l)
    pdf_settings = QgsLayoutExporter.PdfExportSettings()
    img_settings = QgsLayoutExporter.ImageExportSettings()
    dpi_settings = QgsLayoutExporter.ImageExportSettings.dpi=512
    exporter.exportToPdf(  f"C:/Users/user/Desktop/演習/{l.name()}.pdf", pdf_settings)
    exporter.exportToImage(f"C:/Users/user/Desktop/演習/{l.name()}.tif", img_settings , dpi_settings)
    exporter.exportToImage(f"C:/Users/user/Desktop/演習/{l.name()}.jpg", img_settings , dpi_settings)



上記コマンドを実施した結果、構文が違うと言われました。

Traceback (most recent call last):
  File "C:\PROGRA~1\QGIS3~1.10\apps\Python37\lib\code.py", line 90, in runcode
    exec(code, self.locals)
  File "<input>", line 7, in <module>
TypeError: QgsLayoutExporter.exportToImage(): arguments did not match any overloaded call:
  overload 1: too many arguments
  overload 2: argument 1 has unexpected type 'str'

すみません。自分では解決策が分からなかったです。
dpi設定について教えて頂けませんでしょうか。
2021年11月17日水曜日 21:17:27 UTC+9 ありた:

ありた

unread,
Nov 18, 2021, 5:58:15 AM11/18/21
to QGIS初心者質問グループ
img_settingss = QgsLayoutExporter.ImageExportSettings()
これで、 ImageExportSettings クラスのインスタンスが作成されましたので、
この作成されたインスタンスに対し、次のように設定値を格納させ
img_settings.dpi = 512

exporter.exportToImage(f"C:/Users/user/Desktop/演習/{l.name()}.tif", img_settings)
のようにファイル出力を行ってください。

dpi_settings なる変数に数値を代入した箇所は厳密には文法上おかしくはないですが
意図するところとは異なった処理をしています。
エラーの直接的な原因は、2つしか引数をとらない QgsLayoutExporter.exportToImage に対し
dpi_settings も含めた3つの引数を指定したためです。

QGIS初心者

unread,
Nov 18, 2021, 7:53:47 PM11/18/21
to QGIS初心者質問グループ
ありた様

ありがとうございます。
そうでしたか。教えて頂いた今になって考えれば、ファイル名指定も引数となるので、3つめは読まないよという事ですね。
Pythonというかプログラム初学者なので疑問に思う所なのですが、

    img_settings = QgsLayoutExporter.ImageExportSettings()
    img_settings.dpi = 512

とすればdpi設定ができるようになったのですが、

 img_settings = QgsLayoutExporter.ImageExportSettings()
でimg_settingsはQgs~ですよ。と命令しているわけですよね?
その下の
img_settings.dpi = 512
でimg_settings.dpiは512に設定しなさいよとなっていると思います。で最終的に、出力画像はimg_settingsに従いなさいとなっていると思います。

それなら
img_settings=dpi.512の方が
img_settingsで指定するdpiは512としなさいという命令になるような気もするのですが、こういうもの(仕様)だと思った方が良いのでしょうか?

2021年11月18日木曜日 19:58:15 UTC+9 ありた:

ありた

unread,
Nov 19, 2021, 1:44:53 AM11/19/21
to QGIS初心者質問グループ
まず ImageExportSettings() ですが、 ImageExportSettings クラスのインスタンスを
作成するための処理です。( ImageExportSettingsQgsLayoutExporter の配下にあり、
名前解決のため QgsLayoutExporter を記述していますが、本質的には関係ありません)
ですので
img_settings = QgsLayoutExporter.ImageExportSettings()
は、 ImageExportSettings インスタンスを作成して img_settings という変数に代入する処理です。

img_settings.dpi = 512
は、 img_settings に格納されている ImageExportSettings インスタンスの dpi という名前の
メンバ変数(プロパティ)に512という数値を代入しています。


設計の考え方にもよりますが、 ImageExportSettings は、出力時の設定をまとめるための
いれもので、メンバに値を代入したからといって、命令という意味合いはありません。
もちろん、たとえば( QGIS にはありませんが) mapCanvas.setDpi() のようなメソッドがあったとして、
メソッド実行のタイミングで新しい DPI 値を書き換えるとともに新しい値に従い再描画する。
といった考えももちろん可能性としてはありえます。

ただ、ファイル出力という処理を行うにあたってのパラメータですので、もっと言ってしまえば
dpi = 512
exportMetadata = True
generateWorldFile = True
exporter.exportToImage("file/to/path", dpi, exportMetadata, generateWorldFile)
のように個別に引数として与えてもいいものです。
Reply all
Reply to author
Forward
0 new messages