Print a Paper Pattern

Welcome to my printshop! I created this shop especially for sewists and crafters to easily print pdf patterns purchased online. I print both A0 size patterns and letter size/A4 size patterns on 36" rolls. You can choose your preferred paper type and whether to pick-up or receive by mail.

Keep it Simple

All of my products are printed on a 36" wide paper roll, no matter the original file size. I use a lovely free-source program created by Charlotte Curtis, called PDF Stitcher , to create one large image of all the original pages. Then I print it in one continuous page with minimal wasted paper and minimal lining up pages, cutting, and taping for you!

Reasonable Pricing

Universal Paper
B&W or Partial Colour prints
$3.50 per A0 size page (or sixteen A4/letter size pages)
Full-colour prints (more than 25% of the page filled)
$6 per A0 size page (or sixteen A4/letter size pages)
Polypropylene Paper (does not tear)
B&W or Partial Colour prints
$10 per A0 size page (or sixteen A4/letter size pages)
Full-colour prints (more than 25% of the page filled)
$15 per A0 size page (or sixteen A4/letter size pages)
PDF Stitching
$2 per pattern submitted in A4/Letter size format for "stitching" the pattern into a larger size format (automatic charge)

Pick-up or Shipping Option

Pick-up is available in the Ottawa, Ontario, region. Please contact for details.Shipping is available via Canada Post. Pricing is as follows:
$5 - base rate for first page
+$1.25 per A0 size page
Special Arrangements can be made for large quantity orders.

Print My Pattern

Upload My Patterns

var activeFiles = []; var pdfjsLib = window['pdfjs-dist/build/pdf']; function initPdfApp() { if (!pdfjsLib) { setTimeout(initPdfApp, 200); return; } pdfjsLib.GlobalWorkerOptions.workerSrc = 'https://unpkg.com/[email protected]/build/pdf.worker.min.js'; document.getElementById('pdf-input').addEventListener('change', function(e) { var files = e.target.files; if (!files.length) return; document.getElementById('status-msg').style.display = 'block'; var processedCount = 0; for (var i = 0; i < files.length; i++) { (function(file) { var reader = new FileReader(); reader.onload = function() { var typedarray = new Uint8Array(this.result); pdfjsLib.getDocument({data: typedarray}).promise.then(function(pdf) { var pageCount = pdf.numPages; pdf.getPage(1).then(function(page) { var vp = page.getViewport({scale: 1}); var widthIn = vp.width / 72; var heightIn = vp.height / 72; var sqInPerPage = widthIn * heightIn; var isAO = (sqInPerPage > 1400); var fileId = "f" + Math.random().toString(36).substr(2, 9); activeFiles.push({ id: fileId, name: file.name, pages: pageCount, sqInPerPage: sqInPerPage, isAO: isAO, fileBlob: file }); processedCount++; if (processedCount === files.length) { document.getElementById('status-msg').style.display = 'none'; e.target.value = ""; document.getElementById('upload-title').textContent = "Add More Patterns?"; renderCards(); } }); }).catch(function() { processedCount++; }); }; reader.readAsArrayBuffer(file); })(files[i]); } }); } function countPagesFromRange(inputStr, maxPages) { if (!inputStr || inputStr.trim() === "") return maxPages; var counted = new Set(); var parts = inputStr.split(','); parts.forEach(function(p) { var range = p.trim().split('-'); if (range.length === 1) { var num = parseInt(range[0]); if (!isNaN(num) && num > 0 && num <= maxPages) counted.add(num); } else if (range.length === 2) { var start = parseInt(range[0]); var end = parseInt(range[1]); if (!isNaN(start) && !isNaN(end)) { for (var i = Math.min(start, end); i <= Math.max(start, end); i++) { if (i > 0 && i <= maxPages) counted.add(i); } } } }); return counted.size > 0 ? counted.size : maxPages; } function renderCards() { var list = document.getElementById('files-list'); list.innerHTML = ""; activeFiles.forEach(function(f) { var card = document.createElement('div'); card.style.cssText = 'border:2px solid #bbb; border-radius:10px; padding:12px; margin-bottom:12px; background:#fff; width:100%; box-sizing:border-box; position:relative;'; var head = document.createElement('div'); head.style.cssText = 'margin-bottom:8px; padding-right:25px; font-weight:bold; font-size:0.8em; color:#444; overflow:hidden; text-overflow:ellipsis; white-space:nowrap;'; head.textContent = f.name; var remBtn = document.createElement('button'); remBtn.innerHTML = "×"; remBtn.style.cssText = 'position:absolute; right:8px; top:8px; background:none; border:none; color:#bbb; cursor:pointer; font-size:1.3em; padding:0;'; remBtn.onclick = function() { removeFile(f.id); }; card.appendChild(head); card.appendChild(remBtn); var info = document.createElement('div'); info.id = "info-" + f.id; info.style.cssText = 'width:100%; background:#fcfcfc; padding:6px; border-radius:4px; font-size:0.75em; margin-bottom:10px; border:1px solid #eee; text-align:center; color:#666; box-sizing:border-box;'; card.appendChild(info); var sel = document.createElement('select'); sel.id = "paper-" + f.id; sel.style.cssText = "width:100%; height:34px; padding:0 10px; border-radius:4px; border:1px solid #ddd; background:#fff; font-size: 0.8em; margin-bottom:10px; display:block; color:#444;"; [ { v: "bw-std", t: "B&W/Colour Line Standard ($3.50 per AO sheet)" }, { v: "bw-poly", t: "B&W/Colour Line Polypropylene ($10.00 per AO sheet)" }, { v: "full-std", t: "Full Colour Standard ($6.00 per AO sheet)" }, { v: "full-poly", t: "Full Colour Polypropylene ($15.00 per AO sheet)" } ].forEach(function(o) { var op = document.createElement('option'); op.value = o.v; op.text = o.t; sel.add(op); }); sel.onchange = calculateFinalPrice; card.appendChild(sel); var bottomGrid = document.createElement('div'); bottomGrid.style.cssText = 'display: flex; gap: 8px; align-items: flex-end;'; var qtyContainer = document.createElement('div'); qtyContainer.style.cssText = 'flex: 1;'; qtyContainer.innerHTML = ''; var qtyInput = document.createElement('input'); qtyInput.type = "number"; qtyInput.id = "qty-" + f.id; qtyInput.value = 1; qtyInput.min = 1; qtyInput.style.cssText = 'width:100%; height:30px; border:1px solid #ddd; border-radius:4px; padding:0 5px; font-size:0.8em;'; qtyInput.oninput = calculateFinalPrice; qtyContainer.appendChild(qtyInput); var rangeContainer = document.createElement('div'); rangeContainer.style.cssText = 'flex: 2;'; rangeContainer.innerHTML = ''; var rangeInput = document.createElement('input'); rangeInput.type = "text"; rangeInput.id = "rng-" + f.id; rangeInput.placeholder = "e.g. 1, 3-5"; rangeInput.style.cssText = 'width:100%; height:30px; border:1px solid #ddd; border-radius:4px; padding:0 5px; font-size:0.8em;'; rangeInput.oninput = calculateFinalPrice; rangeContainer.appendChild(rangeInput); bottomGrid.appendChild(qtyContainer); bottomGrid.appendChild(rangeContainer); card.appendChild(bottomGrid); var commentContainer = document.createElement('div'); commentContainer.style.cssText = 'width: 100%; margin-top: 12px;'; commentContainer.innerHTML = ''; var commentInput = document.createElement('textarea'); commentInput.id = "cmt-" + f.id; commentInput.placeholder = "e.g. Please only print specific sizes, etc."; commentInput.style.cssText = 'width:100%; height:45px; border:1px solid #ddd; border-radius:4px; padding:6px; font-size:0.8em; font-family: inherit; resize: none; box-sizing: border-box; color: #444;'; commentContainer.appendChild(commentInput); card.appendChild(commentContainer); list.appendChild(card); }); document.getElementById('summary-section').style.display = (activeFiles.length > 0) ? 'block' : 'none'; calculateFinalPrice(); } function removeFile(id) { activeFiles = activeFiles.filter(function(x) { return x.id !== id; }); renderCards(); } function calculateFinalPrice() { var pSum = 0; var tUnits = 0; var subTotals = {}; activeFiles.forEach(function(f) { var rawRange = document.getElementById('rng-' + f.id).value; var pageCount = countPagesFromRange(rawRange, f.pages); var qty = parseInt(document.getElementById('qty-' + f.id).value) || 1; var pType = document.getElementById('paper-' + f.id).value; var rate = (pType === 'bw-poly') ? 10 : (pType === 'full-std') ? 6 : (pType === 'full-poly') ? 15 : 3.5; var totalSqIn = f.sqInPerPage * pageCount; var aoSheets = Math.ceil(totalSqIn / 1550); var stitching = (f.isAO) ? 0 : 2.00; var sub = (aoSheets * rate + stitching) * qty; subTotals[f.id] = sub; pSum += sub; tUnits += (aoSheets * qty); var infoEl = document.getElementById('info-' + f.id); if (infoEl) { var stitchingText = (f.isAO) ? '' : ' | $2 Stitching fee applied'; infoEl.textContent = pageCount + " pages → " + aoSheets + " AO sheets" + stitchingText; } }); var sSum = 0; var gDel = document.getElementById('global-delivery'); if (gDel && gDel.value !== 'pickup') { sSum = 5.00 + (Math.max(0, tUnits - 1) * 1.25); } document.getElementById('total-display').textContent = (pSum + sSum).toFixed(2); var breakdown = ""; activeFiles.forEach(function(f) { var name = f.name.length > 28 ? f.name.substr(0, 28) + "..." : f.name; var q = document.getElementById('qty-' + f.id).value; breakdown += name + " (x" + q + "): $" + (subTotals[f.id] || 0).toFixed(2) + "\n"; }); breakdown += "Shipping: $" + sSum.toFixed(2); document.getElementById('price-breakdown').textContent = breakdown; } document.getElementById('checkout-btn').addEventListener('click', async function() { const btn = this; const originalText = btn.textContent; btn.disabled = true; btn.textContent = "Uploading files..."; const formData = new FormData(); formData.append('delivery', document.getElementById('global-delivery').value); const manifest = activeFiles.map(f => ({ id: f.id, name: f.name, paper: document.getElementById('paper-' + f.id).value, qty: document.getElementById('qty-' + f.id).value, range: document.getElementById('rng-' + f.id).value, comment: document.getElementById('cmt-' + f.id).value, isAO: f.isAO, totalSqIn: Math.round(f.sqInPerPage * f.pages), aoSheets: Math.ceil((f.sqInPerPage * f.pages) / 1550) })); formData.append('manifest', JSON.stringify(manifest)); activeFiles.forEach(function(f) { formData.append('files', f.fileBlob); }); try { const response = await fetch('https://pattern-quote-api.pastordanbyrne.workers.dev', { method: 'POST', body: formData }); const data = await response.json(); if (data.url) window.location.href = data.url; else throw new Error(data.error || 'Checkout failed'); } catch (err) { alert("Error: " + err.message); btn.disabled = false; btn.textContent = originalText; } }); window.onload = initPdfApp;

Resource: Finding Patterns Online

Here are a few sites with downloadable patterns to check out.
Simplicity - clothing, crafts, home decor
Mood Fabrics - clothing
Peppermint - clothing
Unfettered Patterns - clothing
Aloha Sewing Company - home decor, bags, accessories, toys, holiday crafts, some clothing
Purl Soho - home decor, quilting patterns, aprons, accessories, some clothing and more
Threads Monthly - links to free patterns for various clothing & crafts
I AM Patterns - women's clothing
Super Bison - clothing (note: site is in French)
Maison Fauve - clothing (note: site is in French, but pattern instructions are available in French and English)
Life Sew Savory - clothing, bags, accessories
DRCOS Sewing Patterns - costumes, especially Japanese cosplay
Coraline St. - dresses, accessories
SCRIBD - human sourced documents on everything you can think of

Questions?

I'd love to hear from you!
Do you have questions about printing? Suggestions for additional services? Would you like to recommend a website for my resource list? Are you wondering if I can do a rush job for an urgent project? Anything else? Send me a message and I'll reply as quickly as I'm able.

Thank you very much!

Your patterns are in good hands. We’re so grateful you chose Print A Paper Pattern for your sewing project. We know how exciting it is to start a new garment, so we’re getting to work on your prints right away.What happens next?If you chose Mail (Folded in Envelope):
Sit tight! We are preparing your patterns now. You can expect your envelope to arrive in your mailbox within a few business days.
If you chose Local Ottawa Pickup:
We’ll be reaching out to you via email shortly (usually within a few hours) to coordinate a pickup time. We are centrally located in the Alta Vista neighbourhood, near the Bank and Heron intersection.
Keep an eye on your inbox for your official receipt and further updates. If you have any questions in the meantime, feel free to reach out!Happy Sewing!