Table of Contents
強制できない命令ではなく、初期表示の希望を設定する
PDF は、page layout、navigation panel、初期 destination など、文書単位の開始時の希望を保存できます。しかし、すべての reader に従わせることはできません。Browser viewer、mobile app、accessibility mode、管理者 policy、「前回の表示を復元」設定、利用者の選択によって Catalog entry が上書きまたは無視される場合があります。
この記事の最終確認日は 2026 年 9 月 1 日です。検証済みの Adobe Acrobat UI 手順と、再現可能な open-source pikepdf 手順を示します。どちらも新しい file に書き、再度開いて Catalog を検査し、配布前に実際の viewer test を必要とします。
1. PDF Catalog が制御するもの
文書 Catalog には /PageLayout と /PageMode を置けます。Adobe の PDF 1.7 referenceは、これらを任意の開始時 preference と定義します。保守中の pikepdf page-layout 文書も、viewer が無視したり user preference が上書きしたりできると明記しています。
/PageLayout は最初の page 配列を記述します。Page を結合せず、page box、print、論理 reading order を変更/修復しません。/PageMode は要求する navigation panel/full-screen 状態で、page 配列とは別です。
値がない場合や GUI editor が「Default」を保存した場合、全 viewer が同じ動作をすると仮定しないでください。実際の Catalog を記録し、利用者が使う reader で clean-open test を行います。
2. PageLayout の正確な名前と意味
値は PDF name object で、file 内では先頭 slash を持ち、code では pikepdf.Name 値として表されます。
| Catalog 値 | pikepdf 値 | 意味 |
|---|---|---|
/SinglePage | Name.SinglePage | 一度に一 page を表示 |
/OneColumn | Name.OneColumn | Page を一つの連続 column で表示 |
/TwoColumnLeft | Name.TwoColumnLeft | 連続した見開き column。奇数 page は左 |
/TwoColumnRight | Name.TwoColumnRight | 連続した見開き column。奇数 page は右 |
/TwoPageLeft | Name.TwoPageLeft | 一度に二 page。奇数 page は左 |
/TwoPageRight | Name.TwoPageRight | 一度に二 page。奇数 page は右 |
「Left」「Right」は奇数 page を置く側に作用します。Page label、content order、binding direction、accessibility tree は書き換えません。Filename/言語から推測せず、表紙と最初の見開きを実際に試してください。
3. 検証済み Adobe Acrobat UI 手順
Adobe の現在の初期表示手順とpage view 文書に基づく手順です。文書 property の編集には Acrobat Pro が必要な場合があり、名称は OS、release、locale で変わります。
- 保護された backup を作り、Acrobat で作業 copy を開きます。
- Windows は menu から Document properties、macOS は File → Document Properties を選びます。
- Initial View を選びます。
- Page Layout を設定します。文書化された必要性がある場合だけ Navigation Tab、Magnification、Open to page を変えます。
- 唯一の source を上書きせず、新しい output file として保存します。
- 文書を完全に閉じ、新しい file を再度開きます。
- 表示結果を確認し、他の reader でも試します。
Acrobat 自身も、後の open では初期 preference ではなく前回の view を復元する場合があります。新しい copy/clean profile で一度試し、「Restore last view settings when reopening documents」を有効にしてもう一度試してください。「Default」は layout/magnification を user preference に委ねます。
4. 再現可能な open-source 環境
次の script は、この記事で監査した文書 release である pikepdf 10.12.0 を対象にします。専用 virtual environment を使い、script と正確な dependency version を一緒に保管します。将来 upgrade する前に release/Python support を再監査してください。
set -euo pipefail
python3 -m venv .venv
. .venv/bin/activate
python -m pip install 'pikepdf==10.12.0'
python -c 'import pikepdf; print(pikepdf.__version__)'
公式 pikepdf installation guideに対応 Python/platform が記載されています。Windows の activate は異なります。無関係な production environment へ導入せず、許可と承認済み secret 処理経路がなければ、暗号化/access-controlled PDF を処理しないでください。
5. 安全な pikepdf editor/validator
次を set_initial_view.py として保存します。仕様で定義された名前だけを受け付け、in-place write/既存 output の上書きを拒否し、input.pdf.bak を作ります。要求された Catalog field だけを変更し、別 output へ保存し、再度開いて page 数、metadata snapshot、保存名、PDF syntax を検査します。
#!/usr/bin/env python3
from argparse import ArgumentParser
from pathlib import Path
from shutil import copy2
from pikepdf import Name, Pdf
LAYOUTS = {
"SinglePage": Name.SinglePage,
"OneColumn": Name.OneColumn,
"TwoColumnLeft": Name.TwoColumnLeft,
"TwoColumnRight": Name.TwoColumnRight,
"TwoPageLeft": Name.TwoPageLeft,
"TwoPageRight": Name.TwoPageRight,
}
PAGE_MODES = {
"UseNone": Name.UseNone,
"UseOutlines": Name.UseOutlines,
"UseThumbs": Name.UseThumbs,
"FullScreen": Name.FullScreen,
"UseOC": Name.UseOC,
"UseAttachments": Name.UseAttachments,
}
def snapshot(pdf: Pdf) -> tuple[int, dict[str, str], bytes | None]:
docinfo = {str(key): str(value) for key, value in pdf.docinfo.items()}
xmp = (
bytes(pdf.Root.Metadata.read_bytes())
if "/Metadata" in pdf.Root
else None
)
return len(pdf.pages), docinfo, xmp
def main() -> None:
parser = ArgumentParser()
parser.add_argument("input", type=Path)
parser.add_argument("output", type=Path)
parser.add_argument("--layout", required=True, choices=LAYOUTS)
parser.add_argument("--page-mode", choices=PAGE_MODES)
args = parser.parse_args()
source = args.input.resolve()
output = args.output.resolve()
backup = source.with_suffix(source.suffix + ".bak")
if not source.is_file():
parser.error(f"input does not exist: {source}")
if source == output:
parser.error("input and output must be different files")
if output.exists():
parser.error(f"refusing to overwrite output: {output}")
if backup.exists():
parser.error(f"refusing to overwrite backup: {backup}")
copy2(source, backup)
with Pdf.open(source) as pdf:
before = snapshot(pdf)
open_action_present = "/OpenAction" in pdf.Root
pdf.Root.PageLayout = LAYOUTS[args.layout]
if args.page_mode is not None:
pdf.Root.PageMode = PAGE_MODES[args.page_mode]
pdf.save(output, fix_metadata_version=False)
with Pdf.open(output) as check:
after = snapshot(check)
open_action_after = "/OpenAction" in check.Root
actual_layout = str(
check.Root.get("/PageLayout", Name.SinglePage)
)
actual_mode = str(check.Root.get("/PageMode", Name.UseNone))
issues = check.check_pdf_syntax()
if before != after:
raise RuntimeError("page count or metadata changed unexpectedly")
if open_action_after != open_action_present:
raise RuntimeError("OpenAction presence changed unexpectedly")
if actual_layout != f"/{args.layout}":
raise RuntimeError(f"unexpected PageLayout: {actual_layout}")
if args.page_mode is not None and actual_mode != f"/{args.page_mode}":
raise RuntimeError(f"unexpected PageMode: {actual_mode}")
if issues:
raise RuntimeError("PDF syntax issues: " + "; ".join(issues))
print(f"backup: {backup}")
print(f"output: {output}")
print(f"PageLayout: {actual_layout}")
print(f"PageMode: {actual_mode}")
print(f"OpenAction preserved: {open_action_present}")
if __name__ == "__main__":
main()
fix_metadata_version=False は pikepdf による PDF version metadata の自動調整を抑えますが、output を byte-identical にせず、signature も保持しません。Metadata snapshot は DocumentInfo/decoded XMP の guard であり、conformance/privacy audit ではありません。
6. 実行・検査し、証拠を残す
使い捨て作業 copy で実行します。Baseline は /PageLayout だけを変えます。正確で検証済み outline があり、viewer matrix で開く理由を確認した場合だけ --page-mode UseOutlines を追加してください。
set -euo pipefail
python set_initial_view.py input.pdf output.pdf --layout TwoPageRight
qpdf --check output.pdf
sha256sum input.pdf input.pdf.bak output.pdf
Script は output を再び開き、/PageLayout、任意の /PageMode、page 数、DocumentInfo、decoded XMP を比較します。`qpdf --check`は独立した構造検査です。sha256sum がない platform では同等の SHA-256 command を使います。Input/.bak の同一 hash は backup copy を証明し、output は通常異なります。
Command、tool version、hash、Catalog 値、syntax check、viewer matrix を release record に保存します。Parser 合格だけでは render、tag conformance、全 viewer の preference 採用を証明しません。
7. PageMode と OpenAction の境界
/PageMode は任意です。関連する content が存在する場合だけ、控えめに使います。
| Catalog 値 | pikepdf 値 | 要求する開始 mode |
|---|---|---|
/UseNone | Name.UseNone | Outline/thumbnail panel なし |
/UseOutlines | Name.UseOutlines | 文書 outline を表示 |
/UseThumbs | Name.UseThumbs | Page thumbnail を表示 |
/FullScreen | Name.FullScreen | Full-screen mode に入る |
/UseOC | Name.UseOC | Optional-content-group panel を表示 |
/UseAttachments | Name.UseAttachments | Attachment panel を表示 |
一般文書で /FullScreen を既定にしないでください。慣れた control が消え、keyboard/mobile/assistive-technology user を驚かせます。/UseOutlines は bookmark が正確な場合だけ有用で、/UseAttachments は attachment が期待され安全な場合だけ意味があります。
/OpenAction は別の Catalog entry です。PDF reference は destination array または action dictionary を許可します。初期 page/magnification を要求できますが、action は JavaScript、launch、URI など security-sensitive behavior も導入できます。Baseline script は /OpenAction を保持しますが、作成、変更、実行せず、有無だけを報告します。既存 action は信頼できる PDF security tool で審査します。Layout 制御だけのために launch/JavaScript action を追加しないでください。
8. 実 viewer で clean open を試す
履歴や cache が動作を隠さないよう、clean-open test ごとに新しい filename へ copy します。正確な application、version、OS、device、policy state を記録してください。
| Viewer 経路 | Fresh-open 観察 | Override/reopen test | Accessibility/usability test |
|---|---|---|---|
| Adobe Acrobat/Reader desktop | Layout、見開き側、panel、最初の page | Restore-last-view を切り替えて reopen | Keyboard navigation、zoom、reflow、screen reader |
| Chromium/Edge built-in viewer | Layout と最初の見開き | 新 profile/private window と download copy | Browser zoom、high contrast、keyboard control |
| Firefox PDF.js | Layout と最初の見開き | Clean profile と local-file open | Text layer、keyboard control、screen-reader route |
| macOS Preview | Layout と表紙位置 | Fresh copy と recent-document state | VoiceOver、zoom、sidebar availability |
| iOS/Android の指定 reader | Portrait/landscape behavior | 可能なら fresh install/profile | Dynamic zoom、touch target、reading order |
| 組織 accessibility workflow | Catalog preference の採用/無視 | 承認済み viewer/policy | Tag、heading、alt text、language、order、form label |
Web 埋め込み preview は server-rendered image/JavaScript viewer を使い、Catalog を完全に無視する場合があります。これは viewer result であり、PDF 破損の証拠ではありません。Layout が重要なら随伴 text で推奨 view を示し、reader が変更する自由を残します。
9. Accessibility/usability の注意
Facing page は phone/狭い window で文字を小さくします。固定 magnification、hidden interface、forced panel、full-screen request は zoom、reflow、navigation、exit route を妨げ得ます。控えめな layout preference を選び、user control を残してください。
Initial view は PDF tag を作らず、logical reading order も修正しません。Document title、language、heading、list、table、alt text、bookmark、form label、link purpose、tab order、contrast、selectable text を別に検証します。Right-to-left/vertical publication では代表的 viewer/assistive technology で最初の見開きを試します。TwoPageLeft/TwoPageRight だけでは semantic reading direction を符号化しません。
Blank page、壊れた crop box、誤 pagination を page layout で隠さず、文書構造を直してください。
10. Metadata、signature、encryption、conformance
どの PDF editor も保存時に byte を書き換え、page content を変えなくても object order、compression、trailer identifier、metadata handling が変わり得ます。Release 前に descriptive metadata/privacy-sensitive field を比較してください。Script は予期しない DocumentInfo/decoded-XMP 変更を検出しますが、hidden metadata は削除しません。
Byte の変更は既存 digital signature を無効化し得ます。pikepdf のsecurity 文書は digital signature を支援しないと明記します。Signed PDF では停止し、許可された unsigned source を取得するか、承認済み signing step 前に preference を変更します。Encryption/permission を迂回せず、PDF password を source code、shell history、public log に置きません。
PDF/A、PDF/UA、PDF/X、組織 profile は保存後に個別検証が必要です。pikepdf のmetadata 文書は conformance claim が証拠ではないと警告し、veraPDFなどの validator を推奨します。関連 validator/accessibility check を再実行します。Page 数/metadata の保持だけでは不十分です。
11. Rollback と release checklist
Rollback は output.pdf を取り下げ、検証済み input.pdf.bak または version-controlled original を再配布することです。唯一の source 上で「修復」を続けません。Output がすでに公開済みなら CDN/browser cache を考慮し、release timeline/hash を保存します。
- [ ] Source は許可済みで、unsigned または re-signing 予定があり、承認済み経路で復号できる。
- [ ] Input、output、
.bakは別物で、既存 file を上書きしない。 - [ ] 選択した
PageLayoutは仕様定義の六名称の一つ。 - [ ] 検証済み navigation requirement がない限り
PageModeを省略。 - [ ] 既存
OpenActionを審査し、新しい JavaScript/launch action を追加していない。 - [ ] Output が再度開き、期待する Catalog 値/page 数を報告。
- [ ] DocumentInfo/decoded XMP が一致し、privacy metadata は別途審査。
- [ ] pikepdf/qpdf 構造検査が ignored error なしで合格。
- [ ] 関連 PDF/A、PDF/UA、PDF/X、signature、accessibility validation を再実行。
- [ ] Multiple-viewer matrix に fresh open と user-override/reopen test がある。
- [ ] Narrow screen、keyboard、zoom、reflow、assistive technology が使える。
- [ ] Release version、command、hash、observed override、rollback artifact を記録。
12. 現在の一次資料
- Adobe Acrobat:初期表示の設定
- Adobe Acrobat:PDF view の調整
- Adobe:PDF Reference 1.7
- PDF Association:ISO 32000-2 resource
- pikepdf:PDF viewer の default appearance
- pikepdf:installation
- pikepdf:open/save
- pikepdf:main API/syntax check
- pikepdf:metadata
- pikepdf:security/signature
- qpdf:command-line check
- veraPDF:validator software
13. 2018 年原文の正確なアーカイブ
以下は source_export の可視本文を完全かつ正確に保存しています。本文、link、space、punctuation は一切変更せず、無効化する外側 code fence だけを追加しました。元 export/Git history も未変更です。
警告:アーカイブの表現と Acrobat 経路は 2018 年の歴史資料です。「force」は interoperability guarantee ではありません。現在の操作には上の保守版 guide を使ってください。
Recently, I read a paper with a default 2-page-in-one-sheet view like a book. Thus, I was wondering how it get achieved.
Open your pad file with Adobe Acrobat or any other editable software. Then, click File->Properties->Initial View->Page Layout->{Any View You Want}
