(これはXYの問題、最後にコンテキストの詳細)
章のタイトルに基づいてPDFをプログラムで分割する方法はありますか?それは
このPDFから2つのPDFを生成します。 1つは「XY」部分まですべてを含み、2番目は他のすべてを含みます。
私ページ番号に基づいてPDFを分割する方法を学ぶしかし、より多くの「意味」を使用できますか?
(簡単に言えば、元の質問は次のとおりです。NSFは、ある文書に参照リストを持ち、別の文書に説明をしたく、LaTeX / pandocを使用して文書を生成しているので、すべての内容を含めたいです。する方が簡単で、リンクは重要ではありません。)
ベストアンサー1
pdftk
私はこの種の作業に使用するのが好きです。
Latexを使用して基本文書を作成すると、次のようになります。
\documentclass{report}
\usepackage{blindtext} % For lorem ipsum text
\usepackage{hyperref} % Turns chapters/sections into bookmarks
\begin{document}
\chapter{First Chapter}
\Blindtext[10]
\section{Subsection of chapter 1}
\Blindtext[3]
\chapter{Second Chapter}
\Blindtext[20]
\chapter{Third Chapter}
\Blindtext
\pdfbookmark{Example bookmark}{A}
\Blindtext
\end{document}
を実行すると、pdflatex
各章の自動ブックマーク、セクション1.1の詳細なブックマーク、その後の手動ブックマーク、および多くのlorem ipsumフレーズを含む13ページのPDFが生成されます。
これでPDFファイルがあるので、それを使用してpdftk
その洞察を得ることができます。資料が多すぎて興味深い部分だけ切りました。
$ pdftk sample.pdf dump_data
InfoBegin
...
NumberOfPages: 13
BookmarkBegin
BookmarkTitle: First Chapter
BookmarkLevel: 1
BookmarkPageNumber: 1
BookmarkBegin
BookmarkTitle: Subsection of chapter 1
BookmarkLevel: 2
BookmarkPageNumber: 3
BookmarkBegin
BookmarkTitle: Second Chapter
BookmarkLevel: 1
BookmarkPageNumber: 5
BookmarkBegin
BookmarkTitle: Third Chapter
BookmarkLevel: 1
BookmarkPageNumber: 11
BookmarkBegin
BookmarkTitle: Example bookmark
BookmarkLevel: 1
BookmarkPageNumber: 12
PageMediaBegin
...
ラベルをクリックすると、ブックマークがBookmarkBegin
あることがわかります。それを見ると、BookmarkTitle: X
私たちはパート1に達したことがわかりますX
。BookmarkPageNumber:
各ブックマークには関連するブックマークがあります。これを分割に使用できます。BookmarkLevel
分割したいレベル(章、セクション、サブセクション)をフィルタリングするためにも使用できます。
チャプター1とチャプター2に分割したいとしましょう。 4ページ前に分割を追加する必要があるというデータを見ると、次のようになります。
BookmarkTitle: Second Chapter
BookmarkPageNumber: 5
これでページ番号があるので、それをpdftk
分割に使用できます。これには実際にcat
特定のページでの使用が含まれます。
pdftk sample.pdf cat 1-4 output sample-1.pdf
pdftk sample.pdf cat 5-end output sample-2.pdf
より一般的なアプローチをとり、.pdfというpdfスクリプトで書いてみましょうsample.pdf
。各高度なブックマークでPDFを分割してみましょう(該当部分のフィルタリング)。
まず、ブックマークタグをより簡単に解析できる形式に変換し、何かを書くことができるようにします。awk
(別名で保存しますparser.awk
)
#!/bin/awk -f
BEGIN {
FS=": "
OFS=";"
}
/^BookmarkBegin/ {
if (this_level > 1) { # Only handle high-level sections
next
}
if (this_page == "" || this_title == ""){
next
}
if (last_page != "" && last_title != "") {
print last_title, last_page, this_page-1
}
last_title=this_title
last_page=this_page
this_title=this_page=this_level=""
}
/^BookmarkTitle:/ {
this_title=$2
}
/^BookmarkPageNumber:/ {
this_page=$2
}
/^BookmarkLevel:/ {
this_level=$2
}
END {
print last_title, last_page, this_page-1
print this_title, this_page, "end"
}
ここでは、ヘッダーにaが含まれていないと仮定するため、;
これを出力区切り文字として使用します。スクリプトは以下を出力します。
- 各部の名称
- このセクションのホームページ
- このセクションの最後のページです。
$ pdftk sample.pdf dump_data | awk -f parser.awk
First Chapter;1;4
Second Chapter;5;10
Third Chapter;11;11
Example bookmark;12;end
それでは、各行を繰り返して、pdftk
bashでこれを呼び出してみましょう。
#!/bin/bash
sequence=1
pdftk sample.pdf dump_data | awk -f parser.awk | \
while IFS=";" \
read -r title start end
do
pdftk sample.pdf cat "$start"-"$end" output sample-$sequence-"$title".pdf
sequence=$((sequence+1))
done
これにより、以下が残ります。
$ ls *.pdf
'sample-1-First Chapter.pdf'
'sample-2-Second Chapter.pdf'
'sample-3-Third Chapter.pdf'
'sample-4-Example bookmark.pdf'
sample.pdf
これに対する1つの制限は、同じページに複数のブックマークがある場合、または非常に少ないブックマークがある場合は少し混乱する可能性があることです。