web-dev-qa-db-ja.com

PDFのテキストを検索および置換するコマンドラインツール

かなり長いPDFファイル全体にわずらわしい透かしとして私の名前を持つPDFがあります。 LibreOffice Drawのテキストを空白に置き換えようとしましたが、私の名前はテキストとして表示されますが、検索と置換機能はコンピューターの処理にかなりのRAMとCPU時間を費やしているようです。

PDFから文字列を削除するコマンドラインの方法はありますか?うーん... sedできますか?

4
j0h

多くの場合、それは単なるテキストであるため、多くの場合、sedまたは実際には任意のテキストエディターで簡単に削除できます。「透かし」と言うとしましょう。

sed 's/watermark//g' in.pdf >out.pdf

PDFファイルが圧縮されている場合、これは機能しません。最初に圧縮を解除する必要があります。 with pdftkbuntu 18.04以降にpdftkをインストールするにはどうすればよいですか? ):

pdftk in.pdf output out.pdf uncompress 

sedの出力がお好みのPDFリーダーで読み取れない場合は、pdftkで修復してみてください:

pdftk out.pdf output out_pdftk.pdf

さらに読む: PDFの編集方法

ソース: pdftk•スーパーユーザーを使用してPDFから透かしを削除する方法

7
dessert

受け入れられた回答は、まれにしか機能しません

申し訳ありませんが、@ dessertの回答は、一般的なアドバイスと同じくらい間違っています。 PDFのテキスト置換の一般的な場合(透かしかどうか)には機能しません。また、非常にまれなPDFが機能する場合に遭遇することは非常に幸運である必要があります。 (さらに、LibreOfficeによって挿入された透かしは、画面上で印刷または表示されたときにテキストのように表示される場合でも、ベクトルまたはピクセルグラフィックに頻繁に変換されます.... -以下では、PDFの実際のテキストコンテンツのみを扱います。)

理由

その理由は次のとおりです。

  1. ASCIIビューアーのコンテンツの視覚的表現でPDFテキストであると表示されるものは、ASCII PDFソースコード内のテキスト。代わりに、16進エンコードされている場合があります。

  2. さらに、ASCII文字列の個々の文字は連続した順序でページに配置される場合がありますが、個々の文字間に散在する独自の座標情報を持つそれぞれで簡単に個別に配置できます...

  3. また、ASCII(および非ASCII)文字テーブル(「マッピング」)の16進エンコードは予測不可能であり、フォントごとに変わる可能性があります。

したがって、これらのすべての場合、sedコマンドは成功しません-PDFを解凍した後でもです。

以下は、「文字列」Watermarkの例で、LibreOfficeで作成されたPDF内にどのように表示されるかを示しています。

56.8 726.989 Td /F2 16 Tf[<01>29<0203>-2<0405>6<06>-1<020507>]TJ

その意味を詳しく説明します。

  • 56.8 726.989 TdTdは、ページ上のテキストの位置を移動する演算子です。 56.8 726.989は、その正確な位置を記述するためのx/y座標です。

  • /F2 16 TfTfは、特定のフォントとそのサイズを現在アクティブなフォントとして設定する演算子です。この場合、名前は/F2でタグ付けされたフォントで、サイズは16 ptである必要があります。

  • [<01>29<0203>-2<0405>6<06>-1<020507>]TJTJは、個々のグリフの配置を許可しながらテキストを表示する演算子です。山カッコで囲まれた16進数スニペットの意味は、そのPDFおよび使用されているフォントに固有の「charmap」テーブルによると、次のとおりです。

    • <01>:これは'W'です。

    • <0203>:これは'at'です。

    • <0405>:これは'er'です。

    • <06>:これは'm'です。

    • <020507>:これは'ark'です。

    これらの16進数スニペット(29-26-1)の間の数字は、異なる文字の個々の間隔を決定する修正値です。

次に、sed...を使用して、その「文字列」を別の文字列に置き換える方法を示します。前もってエンコードも配置修正番号もわかりません。 、任意のPDFを扱う場合。エディタでソースコードを開き、そのコンテンツを分析することによってのみ見つけることができます。

エグゼクティブサマリー

いいえ、PDFから不要な文字列を確実に削除するコマンドラインの方法はありません!

次の場合にのみこれを行うことができます...

(a)...あなたはPDFソースコードを読むことができるPDF専門家です。

(b)...問題のPDFファイルを個別に分析する準備ができています。

(c)... PDFソースコードを解凍した後、テキストエディターを使用してその内容を変更します。

WARNING:現在「承認済み」とマークされている回答は、OPの特定のPDFに対して機能した可能性があります。ただし、一般的なケースでは機能しません。それが当たり前のように宣伝する「レシピ」を取らないでください!

4
Kurt Pfeifle