Install any skill in seconds. Free to start, no credit card required.
Get Started Free →Use this skill whenever the user wants to do anything with PDF files. This includes reading or extracting text/tables from PDFs, combining or merging multiple PDFs into one, splitting PDFs apart, rotating pages, adding watermarks, creating new PDFs, filling PDF forms, encrypting/decrypting PDFs, extracting images, and OCR on scanned PDFs to make them searchable. If the user mentions a .pdf file or asks to produce one, use this skill.
| Test case | Without → With | Effect | Δ tokens | Δ turns |
|---|---|---|---|---|
| case-09 | ✗→✓ | ▲ Improved | -37% | 0% |
| case-10 | ✗→✓ | ▲ Improved | -11% | 0% |
| case-13 | ✗→✓ | ▲ Improved | 11% | 0% |
| case-14 | ✗→✓ | ▲ Improved | -34% | 0% |
| case-16 | ✗→✓ | ▲ Improved | -50% | 0% |
Use repl with aside.pdf API for visual inspection of PDFs.
tsinterface PDFReadResult { pages: { /* Image path of the rendered page. */ path: string; /* Width of the rendered page. */ width: number; /* Height of the rendered page. */ height: number; }[]; /** If there are form fields, it's metadata JSON path. Use `read_file` to read it. */ formFieldsPath: string | undefined; } interface AsidePdf { /** Render PDF pages as images and inspect form fields using macOS native PDFKit. */ read(options: { filePath: string; outputDir?: string; maxDimension?: number }): Promise<PDFReadResult>; /** Inspect AcroForm/XFA fields and return field descriptions when embedded in the PDF. */ inspectFormFields(options: { filePath: string }): Promise<Record<string, unknown>>; /** Fill AcroForm fields into a new output PDF. */ fillFormFields(options: { filePath: string; outputPath: string; fields: { field_id: string; value: boolean | number | string | null }[]; }) }
js// Reading a PDF (pages[].path is the image path of the rendered page- use either `read_file` tool or `display(await fs.readFile(path))` to read the PDF as image) console.log(await aside.pdf.read({ filePath: './input.pdf' })); // Inspecting form fields console.log(await aside.pdf.inspectFormFields({ filePath: './input.pdf' })); // Filling form fields await aside.pdf.fillFormFields({ filePath: './input.pdf', outputPath: './artifacts/filled.pdf', fields: [ { field_id: 'topmostSubform[0].Page1[0].f1_14[0]', value: 'John' }, { field_id: 'topmostSubform[0].Page1[0].c1_1[0]', value: true } ] });
Do not answer "the form is empty" when the user is asking what fields exist. Report the field meanings and separately say whether current values are blank.
If aside.pdf fails or the native helper cannot perform the requested operation, read fallback.md and use the fallback workflow.
Use bash tool with node + pdf-lib to write PDFs. NEVER use repl for pdf-lib- it's not available on REPL. Please read ./reference.md for more advanced PDF writing examples.
Other measured skills in the registry, with their headline benchmark lift.