This documentation is available as Markdown for AI agents and LLMs. See the full Markdown index or append .md to any documentation URL.

Expo Print iconExpo Print

A library that provides printing functionality for Android and iOS (AirPrint).

Android
iOS
Web
Included in Expo Go
Recommended version:
~56.0.4

expo-print provides an API for Android and iOS (AirPrint) printing functionality.

Installation

Terminal
- npx expo install expo-print
- yarn expo install expo-print
- pnpm expo install expo-print
- bun expo install expo-print

If you are installing this in an existing React Native app, make sure to install expo in your project.

Usage

Print usage
import { useState } from 'react'; import { View, StyleSheet, Button, Platform, Text } from 'react-native'; import * as Print from 'expo-print'; import { shareAsync } from 'expo-sharing'; const html = ` <html> <head> <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0, user-scalable=no" /> </head> <body style="text-align: center;"> <h1 style="font-size: 50px; font-family: Helvetica Neue; font-weight: normal;"> Hello Expo! </h1> <img src="https://docs.expo.dev/static/images/expo-logo.svg" style="width: 90vw;" /> </body> </html> `; export default function App() { const [selectedPrinter, setSelectedPrinter] = useState(); const print = async () => { // On iOS/android prints the given html. On web prints the HTML from the current page. await Print.printAsync({ html, printerUrl: selectedPrinter?.url, // iOS only }); }; const printToFile = async () => { // On iOS/android prints the given html. On web prints the HTML from the current page. const { uri } = await Print.printToFileAsync({ html }); console.log('File has been saved to:', uri); await shareAsync(uri, { UTI: '.pdf', mimeType: 'application/pdf' }); }; const selectPrinter = async () => { const printer = await Print.selectPrinterAsync(); // iOS only setSelectedPrinter(printer); }; return ( <View style={styles.container}> <Button title="Print" onPress={print} /> <View style={styles.spacer} /> <Button title="Print to PDF file" onPress={printToFile} /> {Platform.OS === 'ios' && ( <> <View style={styles.spacer} /> <Button title="Select printer" onPress={selectPrinter} /> <View style={styles.spacer} /> {selectedPrinter ? ( <Text style={styles.printer}>{`Selected printer: ${selectedPrinter.name}`}</Text> ) : undefined} </> )} </View> ); } const styles = StyleSheet.create({ container: { flex: 1, justifyContent: 'center', backgroundColor: '#ecf0f1', flexDirection: 'column', padding: 8, }, spacer: { height: 8, }, printer: { textAlign: 'center', }, });

API

import * as Print from 'expo-print';

No API data file found, sorry!

Local images

On iOS, printing from HTML source doesn't support local asset URLs (due to WKWebView limitations). Instead, images need to be converted to base64 and inlined into the HTML.

Example
import { Asset } from 'expo-asset'; import { useImageManipulator } from 'expo-image-manipulator'; import { printAsync } from 'expo-print'; import { useEffect } from 'react'; const IMAGE = Asset.fromModule(require('@/assets/images/icon.png')); export function ImageManipulatorExample() { const context = useImageManipulator(IMAGE.uri); useEffect(() => { async function generateAndPrint() { try { await IMAGE.downloadAsync(); const manipulatedImage = await context.renderAsync(); const result = await manipulatedImage.saveAsync({ base64: true }); const html = ` <html> <img src="data:image/png;base64,${result.base64}" style="width: 90vw;" /> </html> `; await printAsync({ html }); } catch (error) { console.error('Error:', error); } } generateAndPrint(); }, [context]); return <>{/* Render UI */}</>; }

Page margins

On iOS you can set the page margins using the margins option:

const { uri } = await Print.printToFileAsync({ html: 'This page is printed with margins', margins: { left: 20, top: 50, right: 20, bottom: 100, }, });

If useMarkupFormatter is set to true, setting margins may cause a blank page to appear at the end of your printout. To prevent this, make sure your HTML string is a well-formed document, including <!DOCTYPE html> at the beginning of the string.

On Android, if you're using html option in printAsync or printToFileAsync, the resulting print might contain page margins (it depends on the WebView engine). They are set by @page style block and you can override them in your HTML code:

<style> @page { margin: 20px; } </style>

See @page documentation on MDN for more details.