Source profileQuality 89/100

AstrBotDevs/AstrBot/astrbot/builtin_stars/astrbot/skills/pdf/SKILL.md

pdf

Read, create, inspect, merge, split, rotate, encrypt, fill, and validate PDF files. Use when the user asks to work with a PDF or convert supported Markdown into a polished PDF in AstrBot.

Source repository stars
38,567
Declared platforms
0
Static risk flags
2
Last source update
2026-08-04
Source checked
2026-08-04

Decision brief

What it does—and where it fits

Use pypdf for PDF structure operations and validation. Use ReportLab for new page layout. Do not install another PDF library unless the requested feature cannot be implemented safely with the bundled dependencies.

Best for

  • Use when the user asks to work with a PDF or convert supported Markdown into a polished PDF in AstrBot.

Not for

  • Tasks that require unconfirmed production actions or broad system permissions.
  • Environments where the pinned source and install steps cannot be inspected.

Compatibility matrix

Platform support, with evidence labels

PlatformStatusEvidenceWhat to check
CodexNot declaredNo explicit evidencePortability before use
Claude CodeNot declaredNo explicit evidencePortability before use
CursorNot declaredNo explicit evidencePortability before use
Gemini CLINot declaredNo explicit evidencePortability before use
Open the compatibility checker

Installation

Inspect first. Install second.

The source command is displayed only when detected. A safe inspection prompt is always available so your agent can explain every action before execution.

Source-detected install commandSource
npx skills add https://github.com/AstrBotDevs/AstrBot --skill "astrbot/builtin_stars/astrbot/skills/pdf"
Safe inspection promptEditorial

Inspect the Agent Skill "pdf" from https://github.com/AstrBotDevs/AstrBot/blob/bb9b1878474e5ed65667d5c2c6b7fd6efbc51db4/astrbot/builtin_stars/astrbot/skills/pdf/SKILL.md at commit bb9b1878474e5ed65667d5c2c6b7fd6efbc51db4. List every install step, command, network request, credential, file read/write, external action, and rollback step. Explain whether it fits my task. Do not install or execute anything until I approve.

Workflow

What the source asks the agent to do

  1. 01

    Follow the workflow

    1. Preserve source files unless the user explicitly requests an in-place change. 2. Inspect the input with pypdf.PdfReader: page count, metadata, encryption, page sizes, text, annotations, and form fields as relevant. 3. Perform the smallest operation that satisfies the request.…

    Preserve source files unless the user explicitly requests an in-place change.Inspect the input with pypdf.PdfReader: page count, metadata, encryption, page sizes, text, annotations, and form fields as relevant.Perform the smallest operation that satisfies the request.
  2. 02

    Read and inspect

    Use astrbotfilereadtool for a quick text extraction when it is sufficient. Use Python with pypdf when page structure or exact metadata matters:

    Use astrbotfilereadtool for a quick text extraction when it is sufficient. Use Python with pypdf when page structure or exact metadata matters:Text extraction does not prove that visual layout is correct. Render with pdftoppm when it is available:
  3. 03

    Create from Markdown

    Prefer the bundled deterministic converter:

    ATX headings ( through )paragraphsflat ordered and unordered lists
  4. 04

    Transform existing PDFs

    Use small pypdf scripts directly for ordinary operations.

    Use small pypdf scripts directly for ordinary operations.Merge documents in the requested order:Split selected pages without modifying the source:
  5. 05

    Fill forms

    Read forms.md before modifying AcroForms. Preserve interactivity unless the user requests a flattened result. Validate both the canonical field tree and page widget annotations; a successful render alone is not proof that field values were saved.

    Read forms.md before modifying AcroForms. Preserve interactivity unless the user requests a flattened result. Validate both the canonical field tree and page widget annotations; a successful render alone is not proof th…

Permission review

Static risk signals and limitations

Network access

medium · line 78

The documentation includes network, browsing, or remote request actions.

Official: https://github.com/googlefonts/noto-cjk/raw/main/Sans/Variable/TTF/Subset/NotoSansSC-VF.ttf

Network access

medium · line 79

The documentation includes network, browsing, or remote request actions.

Proxy: https://edgeone.gh-proxy.com/https://github.com/googlefonts/noto-cjk/raw/main/Sans/Variable/TTF/Subset/NotoSansSC-VF.ttf

Reads files

low · line 82

The documentation asks the agent to read local files, directories, or repositories.

These proxies are not operated by the font project or AstrBot. Their availability and returned content can change. Never send credentials, private repository URLs, or other sensitive data through them. After downloading, verify that the fin

Reads files

low · line 84

The documentation asks the agent to read local files, directories, or repositories.

Do not download a font silently. Obtain user approval when network access or a new file is required, use HTTPS, and keep the downloaded font in a workspace or temporary directory rather than installing it system-wide.

Evidence record

Why each signal appears

EvidenceSourceComputedTestedEditorial
SignalValueEvidence typeMeaning
Quality score89/100ComputedDocumentation, specificity, maintenance, and trust rules
Repository stars38,567SourceRepository attention, not individual Skill quality
Compatibility0 platformsSourceDeclared in the catalog source record
Usage guideautomated source guideEditorialGenerated or reviewed according to the visible evidence level

Pinned source

Provenance and original SKILL.md

Repository
AstrBotDevs/AstrBot
Skill path
astrbot/builtin_stars/astrbot/skills/pdf/SKILL.md
Commit
bb9b1878474e5ed65667d5c2c6b7fd6efbc51db4
License
AGPL-3.0
Collected
2026-08-04
Default branch
master
View the original SKILL.md

Work with PDFs

Use pypdf for PDF structure operations and validation. Use ReportLab for new page layout. Do not install another PDF library unless the requested feature cannot be implemented safely with the bundled dependencies.

Follow the workflow

  1. Preserve source files unless the user explicitly requests an in-place change.
  2. Inspect the input with pypdf.PdfReader: page count, metadata, encryption, page sizes, text, annotations, and form fields as relevant.
  3. Perform the smallest operation that satisfies the request.
  4. Reopen every output with pypdf and verify its page count, expected text or fields, and encryption state.
  5. Render representative pages when a PDF renderer is available. Inspect the rendered images for clipping, overlap, missing glyphs, broken spacing, and blank pages. If rendering is unavailable, state that only structural validation was completed.

Work in the current workspace unless the user provides another writable location. Keep intermediate files separate from final outputs and remove them when they are no longer needed.

Read and inspect

Use astrbot_file_read_tool for a quick text extraction when it is sufficient. Use Python with pypdf when page structure or exact metadata matters:

from pypdf import PdfReader

reader = PdfReader(input_path)
print(len(reader.pages), reader.metadata)
for page_number, page in enumerate(reader.pages, start=1):
    print(page_number, page.mediabox, page.rotation)
    print(page.extract_text() or "")

Text extraction does not prove that visual layout is correct. Render with pdftoppm when it is available:

pdftoppm -png -r 144 input.pdf rendered/page

Create from Markdown

Prefer the bundled deterministic converter:

python <this-skill-directory>/scripts/markdown_to_pdf.py input.md output.pdf

The converter intentionally supports a limited Markdown subset:

  • ATX headings (# through ######)
  • paragraphs
  • flat ordered and unordered lists
  • block quotes
  • fenced code blocks
  • horizontal rules
  • <!-- pagebreak -->
  • bold, italic, inline code, and HTTP(S) or mail links

It does not interpret raw HTML, images, tables, nested lists, footnotes, or arbitrary Markdown extensions. Simplify unsupported content or explain the limitation instead of silently changing meaning.

Font selection follows this order:

  1. Use an explicit readable font passed with --font path/to/font.ttf or --font path/to/font.ttc.
  2. Otherwise, search common system locations for a readable Chinese font and verify that it contains every character used by the document.
  3. If no suitable system font is available, use ReportLab's built-in Simplified Chinese fallback for supported Latin and Chinese text. The converter stops instead of silently emitting missing glyphs when the fallback cannot represent the input.

When a broader or embedded font is required and no suitable system font is readable, download it into the workspace and pass its path with --font. Prefer an official source over an arbitrary font mirror or CDN:

  • MiSans from Xiaomi is an official source that is generally accessible from mainland China. Review its license before use and do not redistribute the font package unless the license permits it.
  • Noto Sans CJK is an official open-source fallback with documented download options.

If an official GitHub font URL times out for a user in mainland China, the user may choose one of these third-party proxy prefixes:

  • https://edgeone.gh-proxy.com/
  • https://hk.gh-proxy.com/
  • https://gh-proxy.com/
  • https://gh.dpik.top/

Append the complete official GitHub URL directly after the prefix. For example:

Official: https://github.com/googlefonts/noto-cjk/raw/main/Sans/Variable/TTF/Subset/NotoSansSC-VF.ttf
Proxy:   https://edgeone.gh-proxy.com/https://github.com/googlefonts/noto-cjk/raw/main/Sans/Variable/TTF/Subset/NotoSansSC-VF.ttf

These proxies are not operated by the font project or AstrBot. Their availability and returned content can change. Never send credentials, private repository URLs, or other sensitive data through them. After downloading, verify that the final response used HTTPS, inspect the file type, and compare a checksum with an official checksum when one is published.

Do not download a font silently. Obtain user approval when network access or a new file is required, use HTTPS, and keep the downloaded font in a workspace or temporary directory rather than installing it system-wide.

After conversion, use pypdf to confirm the output opens, contains pages, and exposes representative expected text. Render and inspect the first page plus any page with dense content, code, or a page break.

Transform existing PDFs

Use small pypdf scripts directly for ordinary operations.

Merge documents in the requested order:

from pypdf import PdfWriter

writer = PdfWriter()
for path in input_paths:
    writer.append(path)
writer.write(output_path)

Split selected pages without modifying the source:

from pypdf import PdfReader, PdfWriter

reader = PdfReader(input_path)
writer = PdfWriter()
for page_index in selected_zero_based_indexes:
    writer.add_page(reader.pages[page_index])
writer.write(output_path)

Rotate by a multiple of 90 degrees with page.rotate(angle). Encrypt with writer.encrypt(password) only when the user asks, and never echo a password into logs or the final response. Reopen encrypted outputs with the password before reporting success.

Fill forms

Read forms.md before modifying AcroForms. Preserve interactivity unless the user requests a flattened result. Validate both the canonical field tree and page widget annotations; a successful render alone is not proof that field values were saved.

Finish

Report the final path, the operation performed, and the validation completed. Mention any unsupported content, unavailable renderer, password requirement, or form ambiguity. Do not claim visual verification unless rendered pages were actually inspected.

Alternatives

Compare before choosing