PDF の初期表示を確実に設定する:Acrobat・pikepdf ガイド

強制できない命令ではなく、初期表示の希望を設定する

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 値意味
/SinglePageName.SinglePage一度に一 page を表示
/OneColumnName.OneColumnPage を一つの連続 column で表示
/TwoColumnLeftName.TwoColumnLeft連続した見開き column。奇数 page は左
/TwoColumnRightName.TwoColumnRight連続した見開き column。奇数 page は右
/TwoPageLeftName.TwoPageLeft一度に二 page。奇数 page は左
/TwoPageRightName.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 で変わります。

  1. 保護された backup を作り、Acrobat で作業 copy を開きます。
  2. Windows は menu から Document properties、macOS は File → Document Properties を選びます。
  3. Initial View を選びます。
  4. Page Layout を設定します。文書化された必要性がある場合だけ Navigation TabMagnificationOpen to page を変えます。
  5. 唯一の source を上書きせず、新しい output file として保存します。
  6. 文書を完全に閉じ、新しい file を再度開きます。
  7. 表示結果を確認し、他の 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
/UseNoneName.UseNoneOutline/thumbnail panel なし
/UseOutlinesName.UseOutlines文書 outline を表示
/UseThumbsName.UseThumbsPage thumbnail を表示
/FullScreenName.FullScreenFull-screen mode に入る
/UseOCName.UseOCOptional-content-group panel を表示
/UseAttachmentsName.UseAttachmentsAttachment 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 testAccessibility/usability test
Adobe Acrobat/Reader desktopLayout、見開き側、panel、最初の pageRestore-last-view を切り替えて reopenKeyboard navigation、zoom、reflow、screen reader
Chromium/Edge built-in viewerLayout と最初の見開き新 profile/private window と download copyBrowser zoom、high contrast、keyboard control
Firefox PDF.jsLayout と最初の見開きClean profile と local-file openText layer、keyboard control、screen-reader route
macOS PreviewLayout と表紙位置Fresh copy と recent-document stateVoiceOver、zoom、sidebar availability
iOS/Android の指定 readerPortrait/landscape behavior可能なら fresh install/profileDynamic zoom、touch target、reading order
組織 accessibility workflowCatalog preference の採用/無視承認済み viewer/policyTag、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 で最初の見開きを試します。TwoPageLeftTwoPageRight だけでは 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. 現在の一次資料

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}

Leave a Reply