コマンドラインを使用してPDFの画像を置き換える

コマンドラインを使用してPDFの画像を置き換える

一部のPDFファイルを処理する必要があります。タスクは、与えられた画像ファイルを他の画像ファイルと交換することからなる。最初の質問は、バッチ処理中にコマンドラインからPDFイメージを置き換える方法です。次に、置き換える必要がある画像を識別する方法など、他の問題を解決しようとします(PDFファイルには複数の画像がある可能性があるため)。しかし、まず最初の問題であるPDFの画像を別の画像に置き換える方法を解決したいと思います。

poppler-utilsとpdftkについて読みましたが、私が知っている限り、これらのツールのどれも画像をPDFに置き換えることはできません。

答え1

うーん…私の考えでは、pdflatexそれがここで抜けた部分だと思います。

OPは自分が調査をしたと述べpoppler-utilspdftk。何かを追加しますpdfimages。これらはpdflatexすべてソリューションの一部です。

pdfimages -f 4 -l 20 -j -png target.pdf imageroot

上記のサンプルコードでは、pdfimages 4ページから20ページに移動して、target.pdfすべての画像を名前で始まるファイルに抽出しますimageroot

poppler-utilspdftotextこのオプションをお勧めします。文書-layoutを読みやすく保つのに効果的です。

pdftotext -layout $1.pdf $1.txt

imagemagick提供されたソリューションのOPオブジェクトシールドドラゴン画像に抽出可能なテキストがないことです。私が説明したユーティリティを使用すると、OPにすべての画像と抽出されたすべてのテキストが含まれ、オプションは-layoutページ番号と内容を保持します。 OPは正しいテキストページを識別し、.texディレクティブで終わるファイルに入れ、%includegraphicsファイル名参照で画像を置き換えることができます。次に、pdflatex新しい単一ページの.pdfを取得し、この.pdfを使用して文書の残りの部分を挿入しますpdftk。元のページテキスト内の画像がどこにあるかを知ることで、%includegraphics [h]画像を正しい位置に配置できます。

答え2

単純なPythonスクリプトがあなたの要件に十分であれば、ソリューションは簡単です。pdfrwライブラリ

簡単な作業例:

#!/bin/python

import pdfrw

# Read the example pdf file originating from:
# https://getsamplefiles.com/download/pdf/sample-3.pdf
reader = pdfrw.PdfReader('sample-3.pdf')

# Opening the new image file originating from:
# https://www.picserver.org/assets/library/2020-10-31/originals/example1.jpg
with open('example1.jpg', 'rb') as f:
    # Overwriting the desired image in the original pdf structure.
    reader.Root.Pages.Kids[0].Resources.XObject['/X9'].stream = f.read().decode('latin')

# Write the modified pdf file out.
pdfrw.PdfWriter('sample-3_out.pdf', trailer=reader).write()

使用されるサンプルファイルは次のとおりです。ここ(pdf)ここ(.jpg)

PDF構造で正しい画像要素を見つけることは少し難しいかもしれませんが、PDF構造を調べるのに非常に便利なツールです。PDFアナライザ

次のようにツリービューの場合は-tフラグと一緒にpdfalyzeを使用し、リッチツリービューの場合は-rフラグと一緒に使用します。

pdfalyze --maximize-width -r sample-3.pdf | less -R

私が知る限り、/Filter /DCTDecode構造のpdfはjpg画像データを表し、/Filter /FlateDecodegzip圧縮データを表します。データストリームには複数のフィルタがあり、フィルタの数はこれら2つよりはるかに多くなります。

PDF構造に関する追加情報。

答え3

より明確に説明するには、多数の.pdfファイルとその一部で置き換える必要がある画像名のリストがありますが、各画像を開かずに交換する必要がある各画像をすばやく見つける方法が必要ですか? .pdf ファイルです。 PDFファイルはディレクトリにありますか?

私があなたの状況にあり、コードベースのソリューションを見つけて開発するのに十分な時間を費やすことができない場合は、Inkscapeでバッチを試してみます。想像を超越することですが…

  1. 使用しているすべてのPDFファイルをコピーしてください。
  2. InkscapeでPDFを開き、Transform / Scaleコマンドを使用してサイズを縮小します(ファイルサイズも小さくします)。 PDFページをどれだけ小さくして画像を認識できるかをテストしてください。
  3. バッチコマンドを使用して、コピーしたディレクトリ内のすべてのPDFのファイルサイズを変換/サイズ変更します。また、バッチ処理を使用して画像の最適化やその他の処理の種類を有効にして、各ファイルのサイズを縮小することもできます。
  4. Inkscapeで一度に20枚の画像を開き(ドラッグ&ドロップ?)、交換する画像を視覚的に検索します。
  5. InkscapeでPDFをクリックすると、ファイル名を取得したり、積み重ねた順序でファイル名を確認したり、元の画像を開いたり変更したりできます。

最悪の場合、大変な仕事=ポッドキャスト時間です。

関連情報