AgentStack
Browse Sign in
Browse Why AgentStack Sell Docs
Sign in
SKILL verified MIT Self-run

Frappe Printing Templates

skill-lubusin-frappe-skills-frappe-printing-templates · by lubusIN

Build print formats, email templates, and web page templates using Jinja. Generate PDFs and configure letter heads. Use when creating custom print layouts, email templates, or any Jinja-based rendering in Frappe.

No reviews yet
0 installs
3 views
0.0% view→install

Install

$ agentstack add skill-lubusin-frappe-skills-frappe-printing-templates

✓ scanned · ✓ verified, works with Claude Code, Cursor, and more.

Security review

✓ Passed

No issues found. Passed automated security review. · v0.1.0 How review works →

  • Prompt-injection patterns
  • Secret / credential exfiltration
  • Dangerous shell & filesystem operations
  • Untrusted network calls
  • Known-malicious package signatures

What it can access

  • Network access No
  • Filesystem access No
  • Shell / process execution No
  • Environment & secrets No
  • Dynamic code execution No

From automated source analysis of v0.1.0. “Used” means the capability is present in the source — more access means more to trust, not that it’s unsafe.

View the full security report →

Verified badge

Passed review? Show it. Paste this badge into your README, it links to the public security report.

AgentStack Verified badge Links to your public security report.
[![AgentStack Verified](https://agentstack.voostack.com/badges/verified.svg)](https://agentstack.voostack.com/security/report/skill-lubusin-frappe-skills-frappe-printing-templates)

Reliability & compatibility

Security review passed
0 installs to date
no reviews yet
2mo ago

Declared compatibility

Claude CodeClaude Desktop

Compatibility is declared by the source manifest. End-to-end runtime verification is coming, see below.

Preview Execution monitoring

We're building live execution health for every listing: tool-call success rate, median latency, uptime, and last-checked timestamps, measured, not self-reported. It isn't live yet, so we don't show numbers we can't stand behind.

How agent discovery & health will work →
Are you the author of Frappe Printing Templates? Claim this listing to set pricing, connect Stripe payouts, and keep 70% of every sale.
Sign up to claim

About

Frappe Printing & Templates

Create print formats, email templates, and document templates using Jinja in Frappe.

When to use

  • Creating custom print formats for documents
  • Building email templates with dynamic content
  • Generating PDFs from documents
  • Using Jinja templating in web pages
  • Configuring letter heads for branding
  • Using the Print Format Builder

Inputs required

  • Target DocType for the print format
  • Layout requirements (fields, tables, headers)
  • Whether format is standard (version controlled) or custom (DB-stored)
  • Letter Head / branding requirements
  • PDF generation needs

Procedure

0) Choose format type

| Type | How to Create | Version Controlled | Customizable by User | |------|--------------|-------------------|---------------------| | Standard | Developer Mode, saved as JSON | Yes | No | | Print Format Builder | Drag-and-drop UI | No (DB) | Yes | | Custom HTML (Jinja) | Type "new print format" in awesomebar | Optional | Depends |

1) Create a Jinja print format

Create via awesomebar → "New Print Format":

  1. Set a unique name
  2. Link to the target DocType
  3. Set "Standard" = "No" (or "Yes" for dev mode export)
  4. Check "Custom Format"
  5. Set Print Format Type = "Jinja"
  6. Write your Jinja HTML

    {{ doc.name }}
    {{ _("Customer") }}: {{ doc.customer }}
    {{ _("Date") }}: {{ frappe.format_date(doc.transaction_date) }}

    
        
            
                {{ _("Item") }}
                {{ _("Qty") }}
                {{ _("Rate") }}
                {{ _("Amount") }}
            
        
        
            {% for item in doc.items %}
            
                {{ item.item_name }}
                {{ item.qty }}
                {{ frappe.format(item.rate, {'fieldtype': 'Currency'}) }}
                {{ frappe.format(item.amount, {'fieldtype': 'Currency'}) }}
            
            {% endfor %}
        
        
            
                {{ _("Total") }}
                {{ frappe.format(doc.grand_total, {'fieldtype': 'Currency'}) }}
            
        
    

    {% if doc.terms %}
    
        {{ _("Terms & Conditions") }}
        {{ doc.terms }}
    
    {% endif %}

    .print-format { font-family: Arial, sans-serif; }
    .print-format h1 { color: #333; }
    .print-format table { width: 100%; margin-top: 20px; }

2) Use Frappe Jinja API

Data fetching in templates:

{# Fetch a document #}
{% set customer = frappe.get_doc('Customer', doc.customer) %}
{{ customer.customer_name }}

{# List query (ignores permissions) #}
{% set open_orders = frappe.get_all('Sales Order',
    filters={'customer': doc.customer, 'status': 'To Deliver and Bill'},
    fields=['name', 'grand_total'],
    order_by='creation desc',
    page_length=5) %}

{# Permission-aware list query #}
{% set my_tasks = frappe.get_list('Task',
    filters={'owner': frappe.session.user}) %}

{# Single value lookup #}
{% set company_abbr = frappe.db.get_value('Company', doc.company, 'abbr') %}

{# Settings value #}
{% set timezone = frappe.db.get_single_value('System Settings', 'time_zone') %}

Formatting:

{{ frappe.format(50000, {'fieldtype': 'Currency'}) }}
{{ frappe.format_date('2025-01-15') }}
{{ frappe.format_date(doc.posting_date) }}

Session and context:

{{ frappe.session.user }}
{{ frappe.get_fullname() }}
{{ frappe.lang }}
{{ _("Translatable string") }}

URLs:

View Order

3) Build email templates

Dear {{ doc.customer_name }},

Your order {{ doc.name }} has been confirmed.

Items:
{% for item in doc.items %}
- {{ item.item_name }} x {{ item.qty }}
{% endfor %}

Total: {{ frappe.format(doc.grand_total, {'fieldtype': 'Currency'}) }}

Thank you,
{{ frappe.get_fullname() }}

4) Generate PDFs programmatically

import frappe

# Generate PDF
pdf_content = frappe.get_print(
    doctype="Sales Invoice",
    name="SINV-001",
    print_format="Custom Invoice",
    as_pdf=True
)

# Attach PDF to document
frappe.attach_print(
    doctype="Sales Invoice",
    name="SINV-001",
    print_format="Custom Invoice",
    file_name="invoice.pdf"
)

# Send with email
frappe.sendmail(
    recipients=["customer@example.com"],
    subject="Your Invoice",
    message="Please find attached your invoice.",
    attachments=[{
        "fname": "invoice.pdf",
        "fcontent": pdf_content
    }]
)

5) Configure Letter Head

  1. Navigate to Letter Head list → New
  2. Upload company logo and header image
  3. Set as default for the company
  4. Letter Head appears automatically on print formats

6) Use Jinja filters

{{ doc.customer_name|upper }}        {# UPPERCASE #}
{{ doc.notes|truncate(100) }}        {# Truncate text #}
{{ doc.description|striptags }}      {# Remove HTML #}
{{ doc.html_content|safe }}          {# Render raw HTML (trusted only!) #}
{{ items|length }}                   {# Count items #}
{{ items|first }}                    {# First item #}
{{ names|join(', ') }}               {# Join list #}
{{ amount|round(2) }}               {# Round number #}
{{ value|default('N/A') }}          {# Default if undefined #}
{{ data|tojson }}                    {# Convert to JSON #}

7) Template inheritance and macros

{# macros/fields.html #}
{% macro field_row(label, value) %}

    {{ _(label) }}
    {{ value }}

{% endmacro %}

{# In print format #}
{% from "macros/fields.html" import field_row %}

    {{ field_row("Customer", doc.customer_name) }}
    {{ field_row("Date", frappe.format_date(doc.posting_date)) }}
    {{ field_row("Total", frappe.format(doc.grand_total, {'fieldtype': 'Currency'})) }}

Verification

  • [ ] Print format renders correctly in Print View
  • [ ] All fields display with proper formatting
  • [ ] PDF generation works without errors
  • [ ] Email templates render with correct data
  • [ ] Letter Head appears on printed documents
  • [ ] Translations work in templates (_())
  • [ ] No XSS risks from unescaped content

Failure modes / debugging

  • Template syntax error: Check Jinja delimiters ({{ }}, {% %}); look for unclosed blocks
  • Field not rendering: Verify field name matches DocType schema; check child table access pattern
  • PDF generation fails: Check wkhtmltopdf installation; verify print format Jinja is valid
  • Styling issues in PDF: Use inline styles; avoid complex CSS; test with Print View first
  • Permission error in template: Use frappe.get_all (no permission check) vs frappe.get_list

Escalation

  • For app-level hooks and structure → frappe-app-development
  • For DocType schema questions → frappe-doctype-development

References

  • [references/jinja.md](references/jinja.md) — Jinja templating and Frappe Jinja API
  • [references/printing.md](references/printing.md) — Print formats and PDF generation

Guardrails

  • Test with actual data: Always preview with real documents; edge cases break templates
  • Handle missing fields gracefully: Use {{ doc.field or '' }} or {% if doc.field %}
  • Use get_url() for images: Never hardcode URLs; use {{ frappe.utils.get_url() }}/files/...
  • Escape user content: Use {{ value | e }} for user-generated content to prevent XSS
  • Keep styling inline: PDF generators don't support external CSS; use inline style attributes

Common Mistakes

| Mistake | Why It Fails | Fix | |---------|--------------|-----| | Wrong Jinja syntax | Template error, blank output | Use {{ }} for output, {% %} for logic; check closing tags | | Missing filters | Raw data displayed | Use frappe.format() or frappe.format_date() for formatting | | Hardcoded URLs | Images/links break across sites | Use {{ frappe.utils.get_url() }} for absolute URLs | | Accessing child table wrong | Empty or error | Use {% for item in doc.items %} not doc.child_table_name | | Complex CSS in print format | Styling lost in PDF | Use inline styles, simple layouts, ` for structure | | Not handling None values | 'None' string in output | Use {{ value or '' }} or {% if value %}` |

Source & license

This open-source skill is cataloged on AgentStack and links to its original source — we do not rehost the code.

Install and usage instructions live in the source repository linked above.

Reviews

No reviews yet, be the first.

Versions

  • v0.1.0 Imported from the upstream source.