コンテンツへスキップ

Getting Started

このコンテンツはまだあなたの言語で利用できません。

  1. Install the package

    Terminal window
    npm i @capgo/capacitor-printer
  2. Sync with native projects

    Terminal window
    npx cap sync

Usage

Import the plugin and print various types of content:

import { Printer } from '@capgo/capacitor-printer';
// Print HTML content
const printHTML = async () => {
await Printer.print({
content: '<h1>Hello World</h1><p>This is a test print.</p>',
name: 'test-print'
});
};
// Print a PDF file
const printPDF = async () => {
await Printer.print({
content: 'file:///path/to/document.pdf',
name: 'my-document'
});
};
// Print an image
const printImage = async () => {
await Printer.print({
content: 'file:///path/to/image.jpg',
name: 'my-image'
});
};

API Reference

print(options)

Opens the native print dialog with the specified content.

interface PrintOptions {
content: string; // HTML string, file URI, or base64 data
name?: string; // Print job name
orientation?: 'portrait' | 'landscape';
grayscale?: boolean; // Print in grayscale (default: false)
}
await Printer.print(options);

canPrint()

Checks if printing is available on the device.

const { value } = await Printer.canPrint();
console.log('Printing available:', value);

Complete Example

import { Printer } from '@capgo/capacitor-printer';
import { Filesystem, Directory } from '@capacitor/filesystem';
export class PrintService {
async checkPrintAvailability(): Promise<boolean> {
const { value } = await Printer.canPrint();
return value;
}
async printHTML(htmlContent: string, jobName: string = 'Document') {
try {
const canPrint = await this.checkPrintAvailability();
if (!canPrint) {
throw new Error('Printing not available on this device');
}
await Printer.print({
content: htmlContent,
name: jobName,
orientation: 'portrait'
});
} catch (error) {
console.error('Print failed:', error);
throw error;
}
}
async printDocument(filePath: string, jobName?: string) {
await Printer.print({
content: filePath,
name: jobName || 'Document'
});
}
async printReceipt(receiptData: any) {
const html = `
<!DOCTYPE html>
<html>
<head>
<style>
body { font-family: Arial, sans-serif; padding: 20px; }
.header { text-align: center; margin-bottom: 20px; }
.item { display: flex; justify-content: space-between; margin: 10px 0; }
.total { font-weight: bold; font-size: 1.2em; margin-top: 20px; padding-top: 10px; border-top: 2px solid #000; }
</style>
</head>
<body>
<div class="header">
<h2>Receipt</h2>
<p>Date: ${new Date().toLocaleDateString()}</p>
</div>
${receiptData.items.map((item: any) => `
<div class="item">
<span>${item.name}</span>
<span>$${item.price.toFixed(2)}</span>
</div>
`).join('')}
<div class="total">
<div class="item">
<span>Total:</span>
<span>$${receiptData.total.toFixed(2)}</span>
</div>
</div>
</body>
</html>
`;
await this.printHTML(html, 'Receipt');
}
async printFromURL(url: string) {
// Download the file first
const response = await fetch(url);
const blob = await response.blob();
const reader = new FileReader();
return new Promise((resolve, reject) => {
reader.onloadend = async () => {
try {
await Printer.print({
content: reader.result as string,
name: 'Downloaded Document'
});
resolve(true);
} catch (error) {
reject(error);
}
};
reader.onerror = reject;
reader.readAsDataURL(blob);
});
}
}

Advanced Usage

Printing with Custom Styling

const printStyledDocument = async () => {
const html = `
<!DOCTYPE html>
<html>
<head>
<style>
@page {
size: A4;
margin: 2cm;
}
body {
font-family: 'Times New Roman', serif;
line-height: 1.6;
}
h1 {
color: #333;
border-bottom: 2px solid #333;
padding-bottom: 10px;
}
.content {
margin-top: 20px;
}
</style>
</head>
<body>
<h1>Professional Document</h1>
<div class="content">
<p>This is a professionally styled document ready for printing.</p>
</div>
</body>
</html>
`;
await Printer.print({
content: html,
name: 'Styled Document',
orientation: 'portrait'
});
};

Printing Tables

const printTable = async (data: any[]) => {
const tableRows = data.map(row => `
<tr>
<td>${row.id}</td>
<td>${row.name}</td>
<td>${row.value}</td>
</tr>
`).join('');
const html = `
<!DOCTYPE html>
<html>
<head>
<style>
table {
width: 100%;
border-collapse: collapse;
}
th, td {
border: 1px solid #ddd;
padding: 8px;
text-align: left;
}
th {
background-color: #f2f2f2;
font-weight: bold;
}
</style>
</head>
<body>
<table>
<thead>
<tr>
<th>ID</th>
<th>Name</th>
<th>Value</th>
</tr>
</thead>
<tbody>
${tableRows}
</tbody>
</table>
</body>
</html>
`;
await Printer.print({
content: html,
name: 'Data Table'
});
};

Printing Images

const printImageWithDetails = async (imagePath: string, title: string) => {
const html = `
<!DOCTYPE html>
<html>
<head>
<style>
body { text-align: center; padding: 20px; }
h2 { margin-bottom: 20px; }
img { max-width: 100%; height: auto; }
</style>
</head>
<body>
<h2>${title}</h2>
<img src="${imagePath}" alt="${title}" />
</body>
</html>
`;
await Printer.print({
content: html,
name: title
});
};

Best Practices

  1. Check Availability: Always check if printing is available before attempting to print
  2. Valid Content: Ensure HTML is well-formed and file paths are valid
  3. Job Names: Use descriptive names for print jobs to help users identify them
  4. Styling: Use inline CSS or embedded styles for consistent print output
  5. Error Handling: Wrap print calls in try-catch blocks for user feedback

Troubleshooting

Common Issues

Print dialog not appearing: Check that printing is available with canPrint() Content not printing: Verify that HTML is valid and file paths are correct Images not showing: Ensure image paths are absolute and files are accessible Styling issues: Use @page CSS rules and test print output