回答:
これが実用的なソリューションです。ただし、ニーズに合わせて調整する必要があります。
私の例では、PDFの最初のページを削除してから、正しい場所を指すようにブックマークを更新する必要がありました。
in.pdfからページ1を削除します。
pdftk A=in.pdf cat A2-end output temp.pdf
in.pdfからin.infoファイルを作成します。
pdftk in.pdf dump_data > in.info
私はページを削除するので、in.infoを修正する必要があります。
したがって、ブックマークを正しいページに導くには、BookmarkPageNumberを1つ減らす必要があります。
PHPコード:
$file = "in.info";
$data = file_get_contents($file);
foreach (explode("\n", $data) as $row) {
$tmp = explode(": ", $row);
if ($tmp[0] == "BookmarkPageNumber") {
if ($tmp[1] != "1") $tmp[1]--;
echo $tmp[0].": ".$tmp[1]."\n";
} else {
echo $row."\n";
}
}
最終的なout.pdfを作成します。
pdftk temp.pdf update_info in2.info output out.pdf
pdftk 2.01を使用して、debianでの動作テスト済み
あなたがする必要がありpdftk in.pdf dump_data > in.info
、それからupdate_info
生成するときにパラメータを追加しますout.pdf
。からの引用man pdftk
:
update_info <info data filename | - | PROMPT>
単一のPDFの情報ディクショナリに保存されているメタデータを変更して、入力データファイルに一致させます。入力データファイルは、dump_dataからの出力と同じ構文を使用します。非ASCII文字は、XML数値エンティティとしてエンコードする必要があります。PDFのXMPストリームに保存されているメタデータがある場合、これは変更しません。例えば:
pdftk in.pdf update_info in.info output out.pdf
update_info_utf8 <info data filename | - | PROMPT>
入力がUTF-8としてエンコードされることを除いて、update_infoと同じです。
dump_data_utf8
ために使用する必要がありますupdate_info_utf8
。
pdftk in.pdf dump_data > in.info
、pdftk in.pdf cat 1-22 43 23-42 44-end output out.pdf
およびpdftk out.pdf update_info in.info output out1.pdf
にはまだブックマークがありませんout1.pdf
。`
「pdfmod」は、既存のPDFから1つまたはモードのページを削除できるシンプルなグラフィカルツールです。数回クリックするだけです。また、pdfのコンテンツ情報とクロスリンクを保持します。
「pdftk」は正常に機能し、長期間使用していましたが、pdfから1つまたは2つのページを削除した後にコンテンツを失うことがありました。「pdftk」と「pdfmod」でテストされているこれらのpdfファイルは、openofficeから作成されます。
pdfmod
pdftk
メタデータを保存することよりも優れているようです。exiftool
出力のdiffはpdfmod
、メタデータを保持することを示していpdftk
ますが、dump_data_utf8
&を使用しても、すべてを保持するわけではありませんupdate_info_utf8
。
#!/usr/bin/python output = open('res.info','w') with open('temp.info','r') as f: for line in f: if line.startswith("BookmarkPageNumber"): output.write( "BookmarkPageNumber: "+ str(int(line.split()[1])+1)+"\n") else: output.write(line)