PDFファイルのコードを表示および編集する方法


11

PDFファイルのコードを表示および編集する方法を知りたいですか?

  1. 見てhexdumpみると、バイナリ形式は見たくないので、見たくないかもしれません。を試しましたgeditが、PDFコンテンツのデコードに使用できるエンコード方式はありません。

  2. 編集/Fitすること/XYZで、例えばsedで検索して変更し たいと思います。しかし、sed s/\/Fit/\/XYZ/ < 1.pdf > 2.pdfエラーは報告されていませんが、私のコマンドでは、予想どおりPDFの外観が変更されていないようです。sedPDFファイルをプレーンテキストのように実際に処理できるかどうか疑問に思っていましたか?

私の質問のコンテキストは、この質問から見つけることができます。私のOSはUbuntu 10.10です。

回答:


9

sedバイナリファイルで使用できます(少なくともGNU sed。一部の実装では、null文字を含むファイルや改行文字で終わっていないファイルで問題が発生する場合があります)。ただし、使用したコマンドは/Fit、各行の最初のを置き換えるだけであり、行はPDFファイルではほとんど意味がありません。すべての出現箇所を置き換える必要があります:

 sed s/\/Fit/\/XYZ/g

/Fit単語の構成要素が続かない場合にのみ、置換はより堅牢になります(たとえば、置換/Fitnessしない。ファイルに問題が発生するかどうかわからない/Fit)。これが1つの方法です。

perl -pe 's!/Fit\b!/XYZ!g'

ありがとう!うまくいきました!(1)バイナリコンテンツの検索文字がどのようにsedされたのだろうと思いましたか?検索する前に、sedは最初にクエリ文字をエンコードしますか?(2)最後のコマンドで!\bとはgどういう意味ですか?Perlなしでsedだけでそれを行うことはできますか?
Tim

1
@Tim(1)Sedはデータをメモリにロードし、操作して印刷します。何かをエンコードする必要があるのはなぜですか?(2)gsedとperlの両方で、各行のすべての出現箇所を置き換えることを意味します。!セパレータです。sコマンドの区切り文字として(ほぼ)任意の文字を選択できます(これはsedとperlの両方で使用できます)。\b単語の境界を意味します。perlには存在しますが、sedには存在しません。
Gilles「SO-邪悪なことをやめよう」

(1)については、コマンドでsedに指定した文字は人間が読めるためです。検索するコンテンツが完全にバイナリである場合、sedはどのようにしてそこでクエリワードを見つけることができますか?
Tim

@Tim Textは、たまたま人間が読めるバイナリデータです。
Gilles「SO-悪をやめる」

1
@Timはい、クエリでバイナリデータを渡すことができます。文字を文字どおりsedまたはシェルのソースコードに挿入する必要があります。
Gilles「SO-悪をやめる」

16

最初の質問(「ソースコードを表示するがバイナリはありません」)に関して:多くのオブジェクトにアタッチされている内部バイナリストリームを解凍するために使用できるオプションがいくつかあります。

このための私のお気に入りのツールは、すべての主要なOSプラットフォームで利用可能なQPDFです。次のコマンドは、すべてのストリームとすべてのオブジェクトストリームを解凍します。

 qpdf --qdf --object-streams=disable orig.pdf expanded.pdf

これで、PDFを任意のテキストエディターで開くことができます。(まだそこにいくつかのバイナリblobがある可能性があります:たとえば、フォントファイルやICCプロファイルは、QPDFを拡張しても意味がありません)。

再圧縮expanded.pdfを再度編集した後、次のコマンドを実行します。

 qpdf expanded.pdf orig2.pdf

(PDFを手動で編集する場合は注意が必要です。これを正しく行うには、内部構文について多くの知識が必要です。1バイトを追加または削除するとすぐに、PDFリーダーからエラーメッセージが表示される可能性があります。 PDFファイル内部のTOCは、バイト・オフセット計算に基づいている、破損しているため、それを開く。ただ、交換するFitことでXYZも、罰金を行くべき文字列...)


1
テキストを追加または削除することもできます。オブジェクトストリームの長さが変わると、バイトオフセットfix-qdfはqpdfの一部であるプログラムを使用して再計算できます。ただし、少し注意が必要です。qpdf.sourceforge.net/files/qpdf-manual.html#ref.qdfを
H. Rittich

@ H.Rittich:コメントのThx ...これはどのように問題について新しい見方を開くと思いますか?この方法でテキストを追加または削除できることを知らないと思いましたか?
カートファイフル

@KursPfeifle:私はあなたが知っていることについて何も仮定しません。答えは、この方法でPDFを編集するには、ファイル内のオブジェクトのバイトオフセットを保持する必要があることを示しています。ただし、後でを使用してバイトオフセットを修正するときに、バイトオフセットを変更することができますfix-qdf。したがって、文字列を別の長さの文字列に置き換える場合は可能ですが、fix-qdfツールを使用する必要があります。これは答えへの便利な追加だと思います。
H. Rittich

@ H.Rittich:あなたの視点を与えるためのThx。私は、オブジェクトのバイトオフセットを維持する必要性を強調したとき、私はアドバイスの人々にしたくなかったHOW彼らはこれを行う必要があります。コメントの表現が少し違っていれば、コメントの意図がより早く理解できただろう。
カートファイファイ

1

sed行指向なので、行ではなくブロックとして構成されているバイナリファイルにはあま​​り適していません。
代わりにbbe(bbe-.sourceforge.net)を使用してみてください。

または、Emacs(GNUおよびXEmacs)とvimの両方がPDFファイルをシームレスに開きます。もちろんテキストとバイナリが混在しているため、あまりきれいに印刷されていませんが、編集目的には十分です。すべてを簡単にするvim用のPdftkプラグイン
があります。ここからダウンロードしてください(zipファイル)。 おそらくご存じのとおり、上記の両方のエディターには強力な検索および置換機能があります。

また、PDFをQDFモードに変換してからPDFファイルを簡単に編集できます。


スイッチをsed使用して編集を試みることもできます-b。うまくいけば、これを私の答えに追加します。
Philomath

@Tim:「何も表示しない」とはどういう意味ですか?エラーメッセージはありますか?また、XEmacsで試すことはできますか?(それらの3つはすべて私のために働いた)。
Philomath

について-bは気にしないでください。これはcygwin固有のものです。
Philomath

Emacsは、「ファイル1.pdfは大きい(9MB)、本当に開いていますか(yまたはn)」と述べています。「y」を選択したが、何もない。
ティム

ほとんどの場合Emacsの問題ですが、XEmacsはありますか?(問題なく31 MBのPDFを開いたところです)。
Philomath

0

LibreOfficeまたはOpenOfficeを使用して、PDFを開いたり、表示したり、置き換えたり、新しいPDFを書き込んだりします。処理するドキュメントがたくさんある場合は、コマンドラインから、またはプログラムで使用することもできます。

スキャナーなどの一部のソースからのPDFには、ページがテキストではなく画像として含まれていることが多いので、検索と置換を使用してもうまくいかないことに注意してください。


3
(1/2)次の事実に注意してください:LibreOfficeはネイティブPDFエディターではありません。PDFを開くと、すべてのページがベクター画像に変換され(元のPDFからのラスターパーツがラスターパーツとして保持される場合があります)、LibreOfficeスイートのLibreOffice Drawパーツで開きます。次に、編集したPDFファイルを保存すると、ネイティブのLibreOffice Draw形式(拡張子.odg付き)からPDF にエクスポートされたPDFファイルになります。
カートファイフル2017

3
(2/2)このワークフローには予期しない副作用がある可能性があります。さらに、LibreOffice Drawアプリケーションは、元のPDFからすべての要素を正しくインポートできない場合があります。しかし、多くの場合、それはまだより良い手段が利用できないすべての人々にとって有用なツールかもしれません。
カートファイフル2017
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.