\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行の最初の角かっこは最後で閉じません。)
答え2
これは最善の方法ではないかもしれませんが、LaTeX自体を使用してpdfpages
パッケージhyperref
を組み合わせてこれを行うことができます。
inputfile.pdfというPDFがあるとします。コマンド\includepdf
を含むpicturecommand=
オプションを使用して、このようなラッパーを作成して、名前付きのターゲットを追加することができます\hypertarget
。
\documentclass{article}
\usepackage{pdfpages,hyperref}
\pagestyle{empty}
\begin{document}
% put two named destinations on page 1
\includepdf[pages=1,
picturecommand={
\put(100,100){\hypertarget{mydestination2}{}}
\put(200,250){\hypertarget{anotherdestination3}{}}
}
]{inputfile}
% put a named destination on page 2
\includepdf[pages=2,
picturecommand={
\put(200,100){\hypertarget{yetanother}{}}
}
]{inputfile}
% put rest of pages as is with only page number targets
\includepdf[pages=3-]{inputfile}
\end{document}
この\put(x,y)
コマンドは、左下隅に基づいてページ上の特定の位置にターゲットを配置します。これは、使用時に表示される数字と同じか少なくとも非常に近いですpdfinfo -dests
。
フォームの目標はpage.###
自動的に挿入されるため、「無料」で取得できます。
中間のLaTeXファイルを生成せずにコマンドラインでこれを実行したい場合、このユーティリティはデフォルトでパッケージを含むLaTeX用のラッパーにすぎませんpdfjam
。pdfpages
したがって、次のように使用できます。
pdfjam --preamble '\usepackage{hyperref}' --picturecommand'*' '{\put(300,300){\hypertarget{destname}{}}}' inputfile.pdf --outfile outputfile.pdf
300x300ホームページで指定されたターゲット位置を配置しますinputfile.pdf
。pdfjam --help
高度なタスクの実行の詳細については、参考資料を参照してください。
この方法の実際の欠点は、すでに存在する可能性のあるターゲットを保存しないことです。しかし、私はこれがまだこれらの機能を持っていないPDFに役立つと思いますpdfinfo -dests
。