\href{myfile.pdf#page.42}{link text}
Linuxのコマンドラインを使用して、指定されたPDFターゲット(LaTeXで参照できるものと同様に外部リンクのスーパーターゲット)をエクスポートできることを知っていますpdfinfo -dests
。
しかし、コマンドラインツールを使用して、どこかから受け取った既製のPDFファイルに名前付きターゲットリンクを追加/作成するにはどうすればよいですか?
ベストアンサー1
@meuhのヒントに従ってAdobeのPDFを指します。PDFマーク\hypertarget{}
私は関数を使ってファイルからpdfmarkを取得する(おそらく手作り)(LaTeXなどで作成されたように名前付きターゲットなどを使用するため)Ghostscriptを介して実行できることを発見しました。たとえば、次のようになります。
gs -q -dBATCH -dNOPAUSE -sDEVICE=pdfwrite -dPDFDontUseFontObjectNum -dPrinted=false -sOutputFile=FILE_NEW.pdf FILE_ORIGINAL.PDF PDFMARKS_TO_BE_ADDED_TO.ps
...プログラムのマニュアルページでは、以下を提案しますextractpdfmark
(多くのLinuxディストリビューションに含まれています、ソースコードは次の場所にあります。https://github.com/trueroad/extractpdfmark)、PDFファイルのすべてのpdfmark(検索リンク、名前付きターゲットなど)をPostScript PSファイルとして表示/エクスポートすることです。その後、ghostscript
上記のコマンドラインから別のファイルにインポートすることができます。ターゲットローカルシチュエーションを含むソースファイルはプロセス間で失われ、再インポートする必要があります(例:全体のユースケースでは、その部分はここでは関連しないため、詳細には説明しません)。
インポートしたら、LaTeXからファイルの特定のPDFページに正常にリンクすることができます。
次のコードスニペットは、説明されているユースケースのプロセスを簡素化できます。
#!/bin/bash
# copy pdfmarks from a SOURCE_FILE .pdf to the existing TARGET_FILE .pdf
SOURCE_FILE=$1
TARGET_FILE=$2
PDFMARKS=$(mktemp)
TMPFILE=$(mktemp)
extractpdfmark "${SOURCE_FILE}" > "${PDFMARKS}"
cp "${TARGET_FILE}" ${TMPFILE}
# combine exported PDFMARKS with the content of the TARGET_FILE into the TMPFILE copy of the target file
gs -q -dBATCH -dNOPAUSE -sDEVICE=pdfwrite -dPDFDontUseFontObjectNum -dPrinted=false \
-sOutputFile=${TMPFILE} "${TARGET_FILE}" "${PDFMARKS}"
cp ${TMPFILE} "${TARGET_FILE}"
(私の経験では、多くの変換に望ましくない副作用があったので、これを追加してください。また、PDFmarkを追加した後でも、XournalやOkularを介して行われたコメントなどの操作は以前と同じように機能しますが、ブックマーク/テーブルは引き継がれていないようですpdftk
。機能)。dump_data
また、注:PDFのいくつかの簡単なターゲットを作成するには、次のファイルを作成しますpdfmarks.ps
。
% manually crafted
[ /PageMode /UseOutlines /DOCVIEW pdfmark
次に、コマンドラインフラグメントを実行します。
for i in $(seq 1 999); do
echo "[ /Dest (page.$i) /Page $i /View [/Fit] /DEST pdfmark" >> pdfmarks.ps
done
999ページの指定された宛先としてスーパー宛先を作成します。これを上記のGhostscriptコマンドと一緒に使用して他のPDFに追加できます。 (PSの場合、1行の最初の角かっこは最後で閉じません。)