![PDF 파일로 지정된 대상 가져오기](https://linux55.com/image/210281/PDF%20%ED%8C%8C%EC%9D%BC%EB%A1%9C%20%EC%A7%80%EC%A0%95%EB%90%9C%20%EB%8C%80%EC%83%81%20%EA%B0%80%EC%A0%B8%EC%98%A4%EA%B8%B0.png)
\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(탐색 링크, 명명된 대상 등)를 포스트스크립트 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의 경우 한 줄의 첫 번째 대괄호는 끝에서 닫히지 않습니다.)
답변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
이 방법과 함께 사용하여 이전 PDF를 다시 삽입하는 스크립트를 작성할 수도 있습니다.