# Scientific Report PDF

> Generate a structured scientific PDF report from a JSON description. Accepts a JSON file specifying title, authors, abstract, sections (headings, text, tables, figures), and inline data panels (heatmap, bar, scatter, line). Produces a publication-style A4 PDF using reportlab with no LaTeX dependency. All figures are either loaded from PNG paths or generated on-the-fly from inline data.

- Skill: `lamm-mit/scientific-report-pdf` (Agent Skill, multi-file: 2 files)
- Install (CLI): `npx skillmds@latest add lamm-mit/scientific-report-pdf`
- Raw SKILL.md: https://api.skillmd.com/api/skills/lamm-mit/scientific-report-pdf/raw
- Safety review: pending
- Works with: Claude Code, Claude.ai, OpenAI Codex
- Category: Docs & Writing
- Author: lamm-mit (https://skillmd.com/u/lamm-mit)
- Updated: 2026-09-17
- Page: https://skillmd.com/skills/lamm-mit/scientific-report-pdf

---


# scientific-report-pdf

Generates a structured scientific PDF report from a JSON input file. No LaTeX or pandoc required — uses reportlab for pure-Python PDF rendering.

## Usage

```bash
python3 skills/scientific-report-pdf/scripts/scientific_report_pdf.py --input-json report.json
python3 skills/scientific-report-pdf/scripts/scientific_report_pdf.py --input-json report.json --output-dir /tmp/
python3 skills/scientific-report-pdf/scripts/scientific_report_pdf.py --describe-schema
```

## Input JSON Structure

```json
{
  "title": "The Sound of Molecules",
  "authors": ["ReportAgent", "MusicAnalyst"],
  "subtitle": "CS1 Investigation | LAMM Research Platform",
  "abstract": "We present ...",
  "sections": [
    {"type": "heading", "level": 1, "text": "1. Introduction"},
    {"type": "text", "text": "Sonification has been applied to ..."},
    {
      "type": "table",
      "label": "Table 1",
      "caption": "RDKit descriptors for 16 compounds.",
      "headers": ["Compound", "MW", "LogP"],
      "rows": [["aspirin", "180.2", "1.19"], ["ibuprofen", "206.3", "3.72"]]
    },
    {
      "type": "figure",
      "label": "Figure 1",
      "caption": "Era-match heatmap.",
      "path": "/path/to/era_match.png"
    },
    {
      "type": "panel",
      "label": "Figure 2",
      "caption": "Mean similarity by drug class.",
      "panel_type": "bar",
      "figsize": [10, 5],
      "data": {
        "categories": ["NSAID", "Opioid", "Stimulant"],
        "series": [{"name": "Bach", "values": [0.4, 0.7, 0.3], "color": "#c0392b"}],
        "xlabel": "Drug class",
        "ylabel": "Mean cosine similarity",
        "title": "Harmonic Affinity by Drug Class"
      }
    },
    {"type": "pagebreak"},
    {
      "type": "panel",
      "label": "Figure 3",
      "caption": "Cosine similarity heatmap.",
      "panel_type": "heatmap",
      "data": {
        "values": [[0.8, 0.3], [0.2, 0.9]],
        "row_labels": ["aspirin", "fentanyl"],
        "col_labels": ["Bach", "Beethoven"],
        "cmap": "YlOrRd",
        "annotate": true
      }
    }
  ],
  "metadata": {
    "investigation_id": "cs1_sound_of_molecules",
    "platform": "LAMM Infinite",
    "agents": ["SoundAgent1", "MusicAnalyst", "ReportAgent"]
  }
}
```

## Section Types

| type | Required fields | Description |
|------|----------------|-------------|
| `heading` | `level` (1-3), `text` | Section heading |
| `text` | `text` | Paragraph body |
| `table` | `headers`, `rows` | Data table with optional `label`, `caption`, `highlight_col` |
| `figure` | `path` | Embed existing PNG/JPG |
| `panel` | `panel_type`, `data` | Auto-generate matplotlib figure |
| `pagebreak` | — | Force page break |
| `hr` | — | Horizontal rule |

## Panel Types

| panel_type | Required data fields |
|-----------|---------------------|
| `heatmap` | `values` (2D array), `row_labels`, `col_labels` |
| `matrix` | same as heatmap |
| `bar` | `categories`, `series` (list of `{name, values, color}`) |
| `grouped_bar` | same as bar |
| `scatter` | `x`, `y` |
| `line` | `x`, `y` |

## Output

```json
{
  "pdf_path": "/tmp/The_Sound_of_Molecules_20260403_001234.pdf",
  "n_pages": 8,
  "n_figures": 4,
  "size_kb": 512
}
```

## Dependencies

- `reportlab` — PDF generation
- `matplotlib` — auto-generated panel figures
- `pillow` — RGBA→RGB image conversion
- `pypdf` (optional) — page count in output

