PDFファイルで指定されたターゲットをインポートする

PDFファイルで指定されたターゲットをインポートする

\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用のラッパーにすぎませんpdfjampdfpagesしたがって、次のように使用できます。

pdfjam --preamble '\usepackage{hyperref}' --picturecommand'*' '{\put(300,300){\hypertarget{destname}{}}}' inputfile.pdf --outfile outputfile.pdf

300x300ホームページで指定されたターゲット位置を配置しますinputfile.pdfpdfjam --help高度なタスクの実行の詳細については、参考資料を参照してください。

この方法の実際の欠点は、すでに存在する可能性のあるターゲットを保存しないことです。しかし、私はこれがまだこれらの機能を持っていないPDFに役立つと思いますpdfinfo -dests

関連情報