Field operations / A4
Inspection checklist PDF template
A structured pass, fail or not-applicable list grouped by section, with a comment column and an overall verdict.
When this document is the right one
A planned inspection where the same checks are made every time and the record has to be comparable between visits. The value is in the sameness: a checklist that changes between visits cannot show a trend.
Why each part is there
The fields are visible in the markup. What is not visible is why they are present, which is the part that gets removed first when someone adapts a template for their own use.
- Three outcome columns rather than a single tick. A blank tick box is ambiguous between not applicable and not checked, and those are very different.
- A comment column on every row, wide enough to be usable, because a fail without a comment is not an inspection result.
- Sections with headings that carry break-after: avoid, since a section heading stranded at the foot of a page reads as checks that were skipped.
- An overall verdict with a small number of options, so the document ends in a decision rather than a list.
- Two signatures, engineer and site, which is what makes the record admissible in a dispute about condition.
The template
A complete file. Doctype, stylesheet, body: paste it into a renderer unchanged and it produces a finished A4 page. Replace the sample data and the styling holds.
<!doctype html>
<html lang="en">
<head>
<meta charset="utf-8">
<title>Pre-service inspection, RVH-AHU-003</title>
<style>
@page { size: A4; margin: 14mm 13mm 18mm; }
* { box-sizing: border-box; }
body { margin: 0; font: 9pt/1.35 Arial, sans-serif; color: #111; }
header { border-bottom: 2px solid #111; padding-bottom: 4mm;
display: grid; grid-template-columns: 1fr auto; gap: 6mm; }
h1 { margin: 0; font-size: 15pt; }
.idbox { border: 1px solid #111; padding: 2.5mm 3mm; font-size: 8.5pt; }
.meta { display: grid; grid-template-columns: repeat(4, 1fr); gap: 4mm; margin: 5mm 0; }
.meta div { border-bottom: 1px solid #111; padding-bottom: 1mm; }
.meta .k { font-size: 7pt; text-transform: uppercase; letter-spacing: 0.06em; color: #666; }
.meta .v { min-height: 6mm; }
h2 { font-size: 8.5pt; text-transform: uppercase; letter-spacing: 0.08em;
background: #111; color: #fff; padding: 1.6mm 3mm; margin: 6mm 0 0;
/* A section heading alone at the foot of a page is worse here than
almost anywhere else: it looks like the checks were skipped. */
break-after: avoid; }
table { width: 100%; border-collapse: collapse; }
thead { display: table-header-group; }
th { font-size: 7pt; text-transform: uppercase; letter-spacing: 0.05em; color: #666;
border-bottom: 1px solid #111; padding: 1.5mm 1mm; text-align: center; }
th:first-child { text-align: left; }
td { border-bottom: 1px solid #ddd; padding: 2mm 1mm; }
tr { break-inside: avoid; }
.mark { width: 9mm; text-align: center; }
.box { display: inline-block; width: 3.6mm; height: 3.6mm; border: 1px solid #111; }
.notes-col { width: 52mm; border-left: 1px solid #ddd; padding-left: 2mm; }
/* Any fail has to force a comment. The template cannot enforce that, so it
makes the omission obvious by giving the row a tinted comment cell. */
tr.failed .notes-col { background: #fdeceb; }
.summary { margin-top: 7mm; border: 1px solid #111; padding: 4mm; break-inside: avoid; }
.verdict { display: flex; gap: 8mm; margin-top: 2mm; font-weight: 700; }
.verdict label { display: flex; align-items: center; gap: 2mm; }
.sig { margin-top: 6mm; display: grid; grid-template-columns: 1fr 1fr 32mm; gap: 6mm; }
.sig div { border-top: 1px solid #111; padding-top: 1.5mm; margin-top: 12mm;
font-size: 8pt; color: #555; }
</style>
</head>
<body>
<header>
<div>
<h1>Pre-service inspection</h1>
<div style="margin-top:1.5mm">Air handling unit, planned maintenance</div>
</div>
<div class="idbox">
Checklist AHU-PPM-02 rev 4<br>
Asset RVH-AHU-003<br>
Ravenshill Hotel, Bath
</div>
</header>
<div class="meta">
<div><div class="k">Date</div><div class="v">14 May 2026</div></div>
<div><div class="k">Engineer</div><div class="v"></div></div>
<div><div class="k">Start time</div><div class="v"></div></div>
<div><div class="k">Permit number</div><div class="v"></div></div>
</div>
<h2>1. Isolation and safety</h2>
<table>
<thead>
<tr><th>Check</th><th class="mark">Pass</th><th class="mark">Fail</th>
<th class="mark">N/A</th><th>Comment</th></tr>
</thead>
<tbody>
<tr><td>Electrical isolation proved dead at the local isolator</td>
<td class="mark"><span class="box"></span></td><td class="mark"><span class="box"></span></td>
<td class="mark"><span class="box"></span></td><td class="notes-col"></td></tr>
<tr><td>Lock-off applied, tag carries engineer name and time</td>
<td class="mark"><span class="box"></span></td><td class="mark"><span class="box"></span></td>
<td class="mark"><span class="box"></span></td><td class="notes-col"></td></tr>
<tr><td>Plant room ventilation and lighting adequate</td>
<td class="mark"><span class="box"></span></td><td class="mark"><span class="box"></span></td>
<td class="mark"><span class="box"></span></td><td class="notes-col"></td></tr>
</tbody>
</table>
<h2>2. Air path</h2>
<table>
<thead>
<tr><th>Check</th><th class="mark">Pass</th><th class="mark">Fail</th>
<th class="mark">N/A</th><th>Comment</th></tr>
</thead>
<tbody>
<tr><td>Panel filters, condition and differential pressure</td>
<td class="mark"><span class="box"></span></td><td class="mark"><span class="box"></span></td>
<td class="mark"><span class="box"></span></td><td class="notes-col"></td></tr>
<tr class="failed"><td>Bag filters, seating and bypass leakage</td>
<td class="mark"><span class="box"></span></td><td class="mark"><span class="box"></span></td>
<td class="mark"><span class="box"></span></td><td class="notes-col"></td></tr>
<tr><td>Coil face clean, fins undamaged</td>
<td class="mark"><span class="box"></span></td><td class="mark"><span class="box"></span></td>
<td class="mark"><span class="box"></span></td><td class="notes-col"></td></tr>
<tr><td>Condensate tray clear, trap primed and draining</td>
<td class="mark"><span class="box"></span></td><td class="mark"><span class="box"></span></td>
<td class="mark"><span class="box"></span></td><td class="notes-col"></td></tr>
</tbody>
</table>
<h2>3. Mechanical and controls</h2>
<table>
<thead>
<tr><th>Check</th><th class="mark">Pass</th><th class="mark">Fail</th>
<th class="mark">N/A</th><th>Comment</th></tr>
</thead>
<tbody>
<tr><td>Fan bearings, noise and vibration within limits</td>
<td class="mark"><span class="box"></span></td><td class="mark"><span class="box"></span></td>
<td class="mark"><span class="box"></span></td><td class="notes-col"></td></tr>
<tr><td>Belt tension and alignment, or direct drive coupling</td>
<td class="mark"><span class="box"></span></td><td class="mark"><span class="box"></span></td>
<td class="mark"><span class="box"></span></td><td class="notes-col"></td></tr>
<tr><td>High-pressure switch tested and reset</td>
<td class="mark"><span class="box"></span></td><td class="mark"><span class="box"></span></td>
<td class="mark"><span class="box"></span></td><td class="notes-col"></td></tr>
<tr><td>Control setpoints match the schedule on file</td>
<td class="mark"><span class="box"></span></td><td class="mark"><span class="box"></span></td>
<td class="mark"><span class="box"></span></td><td class="notes-col"></td></tr>
</tbody>
</table>
<section class="summary">
<strong>Outcome.</strong> Every failed item above must carry a comment and either a
remedial action on this visit or a follow-up work order number. An inspection with
a fail and no comment is not a completed inspection.
<div class="verdict">
<label><span class="box"></span> Asset serviceable</label>
<label><span class="box"></span> Serviceable with defects</label>
<label><span class="box"></span> Out of service</label>
</div>
<div class="sig">
<div>Engineer signature</div>
<div>Site representative</div>
<div>Date</div>
</div>
</section>
</body>
</html>The layout decision worth understanding
Rows that commonly fail get a tinted comment cell. The template cannot force a comment to be written, so it does the next best thing and makes the empty cell visible. It is a small honesty about what a printed form can and cannot enforce.
The mistake people make adapting it
Making the comment column narrow to fit more checks on a page. Comments then get abbreviated to two words, the record loses its diagnostic value, and the next visit starts from nothing.
Rendering it
The page box is declared in the template's own CSS as A4, so the size travels with the markup rather than living in the code that calls the renderer. A4 is also one of the six named formats the API accepts, so it can be passed in the request options instead if that suits your setup better.
curl -X POST https://api.pdfpipe.xyz/v1/pdf \
-H "Authorization: Bearer $PDFPIPE_KEY" \
-H "Content-Type: application/json" \
-d '{
"html": "<!doctype html>...",
"options": { "format": "A4" }
}' \
--output inspection-checklist.pdfFrequently asked
Can I use this template commercially?
Yes. Copy it, change it, ship it. It is sample markup written to be taken, and the sample data in it is invented, so replace the names and the numbers before anyone sees it.
Why is the page size in the CSS rather than in the API call?
Because a inspection checklist is a A4 document, and that is a property of the document rather than of the code that renders it. Declaring it in the page box means the size cannot be lost between the template and the call, which is the usual way a document ends up on the wrong paper.
Will it look the same in every renderer?
The layout will, because it uses ordinary CSS. The page break behaviour will not: break-inside and break-after are implemented differently by browser engines and by dedicated print engines, and some of the paged media specification is not implemented in browser renders at all. That difference is documented per property in the paged CSS reference.
Other templates
Documents from the same part of a business, and one from each of the other groups.
Work order HTML template for field service
A job sheet issued to an engineer: the asset, the reported fault, space to record what was done and what parts were used, and two signatures.
Permit to work PDF template
A time-limited authorisation for hazardous work, with precautions as an initialled checklist, a fire watch requirement and a formal hand back.
Incident report HTML template
A factual record of what happened, kept separate from any judgement about why, with corrective actions that have an owner and a date.
HTML invoice template with CSS
The standard commercial invoice: a demand for payment with line items, a tax figure, and terms that say when the money is due.
Payment receipt HTML template
Proof that a payment was made: the amount, the payment reference, the method, and what it was for.
Quotation HTML template with CSS
A priced proposal with a validity date, a scope, optional items kept out of the headline total, and somewhere to sign.
Packing slip HTML template
The document that goes in the box: what was ordered, what was actually shipped, and no prices at all.
Every template
The full set, grouped by what part of a business produces the document.
A4 page size for PDF generation
A4 is the default page for business documents everywhere except North America, and the default this API uses when no format is given.
Paste the template into the playground and get the PDF back. No signup, no key.