API du pont JavaScript
Partage, presse-papiers et impression
La feuille de partage d'Android, le presse-papiers système, le texte qu'une autre application a partagé vers la vôtre, et la boîte de dialogue d'impression.
AppMint.pdf assistant#
AppMint.pdf.fromPage(options) / fromHtml(html, options)
Exemple
Crée un vrai PDF (texte sélectionnable, graphiques vectoriels) sans boîte de dialogue d'impression : fromPage enregistre la page telle qu'elle est à l'écran, mise en page avec votre CSS @media print ; fromHtml génère le HTML que vous transmettez dans une page invisible à l'adresse de l'application, de sorte que les images, feuilles de style et polices relatives se chargent comme dans votre page, attend les polices et toutes les images, puis l'enregistre. window.print() ouvre toujours la boîte de dialogue d'impression habituelle.
Renvoie : une Promise de {ok: true, fileName, pages, bytes, saved, uri?, base64?} ou {ok: false, code, message} : code vaut busy (un seul PDF à la fois), bad-options, failed, too-large (base64 de plus de 25 Mo) ou permission-denied (stockage refusé sur Android 7-9). Nécessite : rien : toutes les compilations l'ont. L'enregistrement dans Téléchargements ne nécessite aucune autorisation sur Android 10+.
Options : fileName (« .pdf » est ajouté ; par défaut : le titre de la page), pageSize 'A4' (par défaut) | 'Letter' | 'Legal' | 'A3' | 'A5', landscape (true/false), margins en millimètres (un nombre, ou {top, right, bottom, left} ; omis = votre propre règle @page), save 'downloads' (par défaut) | 'share' | 'base64'.
Enregistrer la page actuelle dans Téléchargements :
async function saveInvoice() {
if (!(window.AppMint && AppMint.pdf)) { window.print(); return; } // in a browser
var r = await AppMint.pdf.fromPage({ fileName: 'invoice-1042', pageSize: 'A4', margins: 12 });
if (r.ok) console.log('Saved ' + r.fileName + ' (' + r.pages + ' pages)');
else alert('Could not make the PDF: ' + r.message);
}Un reçu construit en HTML, directement vers la feuille de partage (les images et polices sont chargées avant la création du PDF) :
async function shareReceipt(order) {
var html = '<style>body{font-family:sans-serif} td{padding:4px 8px}</style>' +
'<img src="img/logo.png" width="120"><h1>Receipt #' + order.id + '</h1><table>' +
order.items.map(function (i) { return '<tr><td>' + i.name + '</td><td>' + i.price + '</td></tr>'; }).join('') +
'</table><p><b>Total ' + order.total + '</b></p>';
var r = await AppMint.pdf.fromHtml(html, { fileName: 'receipt-' + order.id, pageSize: 'Letter', save: 'share' });
if (!r.ok) console.warn(r.code, r.message);
}Récupérer les octets pour les envoyer vous-même :
async function uploadReport() {
var r = await AppMint.pdf.fromPage({ landscape: true, margins: { top: 10, right: 8, bottom: 10, left: 8 }, save: 'base64' });
if (!r.ok) return;
var bin = atob(r.base64), buf = new Uint8Array(bin.length);
for (var i = 0; i < bin.length; i++) buf[i] = bin.charCodeAt(i);
await fetch('/api/reports', { method: 'POST', headers: { 'Content-Type': 'application/pdf' }, body: buf });
}Les appels bruts prennent les options sous forme de texte JSON et un identifiant de rappel ; utilisez plutôt l'assistant ci-dessus :
if (window.WebToApk && typeof window.WebToApk.pdfFromPage === 'function') {
// AppMint.pdf.fromPage wraps: WebToApk.pdfFromPage(JSON.stringify(options), callbackId)
// and AppMint.pdf.fromHtml wraps: WebToApk.pdfFromHtml(html, JSON.stringify(options), callbackId)
AppMint.pdf.fromPage({ save: 'downloads' }).then(function (r) { console.log(r); });
}Remarques : Masquez les boutons et menus du PDF avec @media print { .no-print { display: none } }. Un PDF téléchargé affiche « <name> téléchargé · Ouvrir » comme tout téléchargement. fromHtml exécute les scripts du HTML (les graphiques dessinés par script apparaissent) mais n'a aucun accès aux fonctionnalités natives de l'application. Les pages plus longues qu'une feuille sont découpées comme le ferait Chrome ; utilisez break-before: page pour contrôler où.
window.print standard web#
window.print()
Exemple
L'appel d'impression standard, adapté pour fonctionner dans l'application : il ouvre l'écran d'impression d'Android, où l'utilisateur imprime sur papier ou enregistre un PDF.
Retourne : rien. Nécessite : rien.
document.getElementById('print-receipt').onclick = function () {
window.print();
};Masquez les contrôles de l'application sur papier avec une feuille de style d'impression :
<style>
@media print {
nav, .toolbar, button { display: none !important; }
body { background: #fff; color: #000; }
}
</style>Imprimer une étiquette d'expédition sans la page autour : un iframe srcdoc de même origine n'imprime que son propre document :
function esc(s) {
return String(s).replace(/[&<>"]/g, function (c) {
return { '&': '&', '<': '<', '>': '>', '"': '"' }[c];
});
}
function printLabel(name, address) {
var frame = document.createElement('iframe');
frame.style.cssText = 'position:fixed;width:0;height:0;border:0';
frame.srcdoc = '<title>Label</title><style>body{font:18px sans-serif;margin:24px}</style>' +
'<b>' + esc(name) + '</b><br>' + esc(address).replace(/\n/g, '<br>');
frame.onload = function () {
frame.contentWindow.print();
setTimeout(function () { frame.remove(); }, 1000);
};
document.body.appendChild(frame);
}Remarques : window.print() imprime la page principale telle qu'elle est dessinée maintenant. Un <iframe> de même origine, c'est-à-dire l'iframe caché qu'une bibliothèque d'impression remplit avec un reçu et sur lequel elle appelle iframe.contentWindow.print(), ou une page d'iframe appelant son propre window.print(), imprime le document de CET iframe (voir __printHtml). Un iframe d'origine différente ne peut pas être imprimé depuis la page. Le remplacement existe avant le premier script de la page. beforeprint ne peut pas être annulé (dans aucun navigateur).
__clipboardRead pont#
window.WebToApk.__clipboardRead(): String
navigator.clipboard.read() : `{parts:[{type, text|base64}]}`. Même portée que readClipboard() dans ce shell (qui n'a pas de contrôle d'origine).
Exemple
Transport interne derrière navigator.clipboard.read(). Les pages utilisent l'API standard ; n'appelez jamais ceci directement - les méthodes __ peuvent changer sans préavis.
Renvoie : {parts:[{type, text|base64}]} : la même portée que readClipboard() dans cette application. Nécessite : rien à activer.
Utilisez l'API publique :
canvas.toBlob(async (png) => {
await navigator.clipboard.write([new ClipboardItem({ 'image/png': png })]);
});
const [item] = await navigator.clipboard.read();
if (item && item.types.includes('image/png')) preview(await item.getType('image/png'));Coller du texte mis en forme dans un éditeur, en conservant la mise en forme quand le presse-papiers contient du HTML :
async function pasteRich(editor) {
try {
var items = await navigator.clipboard.read();
if (!items.length) { showMessage('The clipboard is empty'); return; }
var item = items[0];
if (item.types.includes('text/html')) {
editor.insertHtml(sanitize(await (await item.getType('text/html')).text()));
} else if (item.types.includes('text/plain')) {
editor.insertText(await (await item.getType('text/plain')).text());
}
} catch (e) {
showMessage('Could not read the clipboard');
}
}Coller n'importe quelle image copiée (PNG, JPEG, WebP…) comme photo de profil, et distinguer une lecture refusée :
document.getElementById('paste-photo').onclick = async function () {
try {
var items = await navigator.clipboard.read();
var item = items[0];
var type = item && item.types.find(function (t) { return t.indexOf('image/') === 0; });
if (!type) { showMessage('Copy a picture first'); return; }
uploadAvatar(await item.getType(type)); // a Blob of that type
} catch (e) {
if (e.name === 'NotAllowedError') showMessage('This page cannot read the clipboard');
else showMessage('Could not paste the picture');
}
};Remarques : Android 12+ affiche son propre message « collé depuis votre presse-papiers » quand une application lit le presse-papiers.
__clipboardWrite pont#
window.WebToApk.__clipboardWrite(partsJson: String): Boolean
navigator.clipboard.write() : [partsJson] est `[{type, text}|{type, base64}]` pour un ClipboardItem : text/plain, text/html, ou une image copiée sous forme d'URI de contenu.
Exemple
Transport interne derrière navigator.clipboard.write([ClipboardItem]). Les pages utilisent l'API standard ; n'appelez jamais ceci directement - les méthodes __ peuvent changer sans préavis.
Renvoie : true quand le contenu a été placé. Nécessite : rien à activer.
Utilisez l'API publique :
canvas.toBlob(async (png) => {
await navigator.clipboard.write([new ClipboardItem({ 'image/png': png })]);
});
const [item] = await navigator.clipboard.read();
if (item && item.types.includes('image/png')) preview(await item.getType('image/png'));Copier le texte mis en forme et sa version brute dans un seul élément, pour que les éditeurs riches reçoivent le tableau et les champs simples le texte :
async function copyTable(table) {
if (!(navigator.clipboard && navigator.clipboard.write && window.ClipboardItem)) return;
try {
await navigator.clipboard.write([new ClipboardItem({
'text/html': new Blob([table.outerHTML], { type: 'text/html' }),
'text/plain': new Blob([table.innerText], { type: 'text/plain' })
})]);
showMessage('Table copied');
} catch (e) {
showMessage('Could not copy (' + e.name + ')'); // NotAllowedError when the write fails
}
}Copier une image affichée par la page, comme un code QR, pour pouvoir la coller dans une conversation :
async function copyImage(img) {
try {
var blob = await (await fetch(img.src)).blob(); // an image/* type, up to 16 MB
await navigator.clipboard.write([new ClipboardItem({ [blob.type]: blob })]);
showMessage('Image copied');
} catch (e) {
showMessage('Could not copy the image');
}
}Remarques : Texte, HTML et une image par élément. L'image est copiée sous forme d'URI de contenu via le FileProvider de l'application, ce qui permet de la coller dans WhatsApp, Gmail ou Keep.
__printHtml pont#
window.WebToApk.__printHtml(html: String, baseUrl: String, title: String)
Imprime [html] - le document sérialisé d'un iframe de même origine, envoyé par le shim `window.print()` ([PrintShim]) - via une WebView hors écran à [baseUrl], car l'adaptateur d'impression de la WebView principale ne peut imprimer que la page entière. [title] nomme la tâche d'impression (« <nom de l'application> Document » si vide).
Exemple
Transport interne derrière l'impression d'un iframe : iframe.contentWindow.print() (et le window.print() propre à la page d'un iframe) envoie ici le document de cet iframe, et l'application l'imprime via l'écran d'impression d'Android. Les pages utilisent les appels standard ; ne l'appelez jamais directement.
Retourne : rien. Nécessite : rien.
Le modèle de reçu que cela rend possible : un iframe caché rempli avec le seul reçu :
function printReceipt(order) {
var frame = document.createElement('iframe');
frame.style.display = 'none';
document.body.appendChild(frame);
var doc = frame.contentWindow.document;
doc.open();
doc.write('<html><head><title>Receipt ' + order.id + '</title>' +
'<style>body{font:14px sans-serif} td{padding:2px 8px}</style></head><body>' +
'<h2>Receipt ' + order.id + '</h2><table>' +
order.lines.map(function (l) { return '<tr><td>' + l.name + '</td><td>' + l.price + '</td></tr>'; }).join('') +
'</table></body></html>');
doc.close();
frame.contentWindow.print(); // prints the RECEIPT, not the page behind it
setTimeout(function () { frame.remove(); }, 1000);
}Une page de ticket à vous, chargée dans un iframe caché de même origine : son CSS et ses images se chargent, et son <title> nomme la tâche d'impression :
function printTicket(id) {
var frame = document.createElement('iframe');
frame.style.cssText = 'position:fixed;width:0;height:0;border:0';
frame.src = 'ticket.html?id=' + encodeURIComponent(id);
frame.onload = function () {
frame.contentWindow.print(); // prints ticket.html's DOM as it stands now
setTimeout(function () { frame.remove(); }, 1000);
};
document.body.appendChild(frame);
}Ajustez le document de l'iframe juste avant la capture avec beforeprint sur la fenêtre de l'iframe :
function printWithTimestamp(frame) {
var w = frame.contentWindow;
w.addEventListener('beforeprint', function () {
var p = w.document.createElement('p');
p.textContent = 'Printed ' + new Date().toLocaleString();
w.document.body.appendChild(p);
}, { once: true });
w.print(); // the printed copy includes the line added above
}Remarques : Les arguments sont (html, baseUrl, title) : le document sérialisé de l'iframe, l'adresse par rapport à laquelle ses liens relatifs sont résolus (l'adresse de la page elle-même pour un iframe about:blank), et le nom de la tâche d'impression (le <title> de l'iframe, sinon celui de la page). La capture est prise quand print() est appelé : les scripts qu'elle contient ne s'exécutent pas à nouveau, et beforeprint / afterprint se déclenchent sur la fenêtre de l'iframe autour d'elle. Un iframe d'origine différente ne peut pas être imprimé depuis la page.
copyToClipboard pont#
window.WebToApk.copyToClipboard(text: String): Boolean
Utilisez l'encapsulation à base de promesse : const r = await AppMint.requestReview(); // {result, openedStore} const r = await AppMint.requestReview({ openStore: true }); // fiche de l'application s'il n'y a pas de fenêtre r.result : 'shown' | 'not_from_play' | 'quota' | 'error'. Voir RatePrompt.
Décrit par son groupe, Fenêtre d'avis intégrée de Google Play, plutôt que seul.
Exemple
Copie du texte brut dans le presse-papiers du téléphone. Les pages utilisent normalement le navigator.clipboard.writeText(text) standard, que le shell redirige ici.
Renvoie : true en cas de réussite, false en cas d'échec (de façon synchrone). Nécessite : rien.
L'API standard d'abord :
document.getElementById('copy-btn').onclick = async function () {
try {
await navigator.clipboard.writeText('PROMO-2026');
showMessage('Copied');
} catch (e) {
showMessage('Could not copy');
}
};L'appel brut :
if (window.WebToApk && typeof window.WebToApk.copyToClipboard === 'function') {
var ok = window.WebToApk.copyToClipboard('PROMO-2026');
showMessage(ok ? 'Copied' : 'Could not copy');
}Un bouton « Copier » sur chaque bloc de code, en utilisant la réponse synchrone pour mettre à jour le libellé :
document.querySelectorAll('pre').forEach(function (pre) {
var btn = document.createElement('button');
btn.textContent = 'Copy';
btn.onclick = function () {
var ok = !!(window.WebToApk && typeof window.WebToApk.copyToClipboard === 'function' &&
window.WebToApk.copyToClipboard(pre.innerText));
btn.textContent = ok ? 'Copied' : 'Copy failed';
setTimeout(function () { btn.textContent = 'Copy'; }, 1500);
};
pre.parentNode.insertBefore(btn, pre);
});Remarques : Texte brut uniquement (ni images ni HTML). Android 13+ affiche son propre petit aperçu « Copié », vous n'avez donc peut-être pas besoin de votre propre message.
pdfFromHtml pont#
window.WebToApk.pdfFromHtml(html: String, optionsJson: String, callbackId: String)
Génère [html] hors écran à l'origine de l'application et l'enregistre en PDF : utilisez `AppMint.pdf.fromHtml(html, options)`.
Exemple
Documenté avec AppMint.pdf : l'exemple qui s'y trouve illustre aussi celui-ci.
Crée un vrai PDF (texte sélectionnable, graphiques vectoriels) sans boîte de dialogue d'impression : fromPage enregistre la page telle qu'elle est à l'écran, mise en page avec votre CSS @media print ; fromHtml génère le HTML que vous transmettez dans une page invisible à l'adresse de l'application, de sorte que les images, feuilles de style et polices relatives se chargent comme dans votre page, attend les polices et toutes les images, puis l'enregistre. window.print() ouvre toujours la boîte de dialogue d'impression habituelle.
Renvoie : une Promise de {ok: true, fileName, pages, bytes, saved, uri?, base64?} ou {ok: false, code, message} : code vaut busy (un seul PDF à la fois), bad-options, failed, too-large (base64 de plus de 25 Mo) ou permission-denied (stockage refusé sur Android 7-9). Nécessite : rien : toutes les compilations l'ont. L'enregistrement dans Téléchargements ne nécessite aucune autorisation sur Android 10+.
Options : fileName (« .pdf » est ajouté ; par défaut : le titre de la page), pageSize 'A4' (par défaut) | 'Letter' | 'Legal' | 'A3' | 'A5', landscape (true/false), margins en millimètres (un nombre, ou {top, right, bottom, left} ; omis = votre propre règle @page), save 'downloads' (par défaut) | 'share' | 'base64'.
Enregistrer la page actuelle dans Téléchargements :
async function saveInvoice() {
if (!(window.AppMint && AppMint.pdf)) { window.print(); return; } // in a browser
var r = await AppMint.pdf.fromPage({ fileName: 'invoice-1042', pageSize: 'A4', margins: 12 });
if (r.ok) console.log('Saved ' + r.fileName + ' (' + r.pages + ' pages)');
else alert('Could not make the PDF: ' + r.message);
}Un reçu construit en HTML, directement vers la feuille de partage (les images et polices sont chargées avant la création du PDF) :
async function shareReceipt(order) {
var html = '<style>body{font-family:sans-serif} td{padding:4px 8px}</style>' +
'<img src="img/logo.png" width="120"><h1>Receipt #' + order.id + '</h1><table>' +
order.items.map(function (i) { return '<tr><td>' + i.name + '</td><td>' + i.price + '</td></tr>'; }).join('') +
'</table><p><b>Total ' + order.total + '</b></p>';
var r = await AppMint.pdf.fromHtml(html, { fileName: 'receipt-' + order.id, pageSize: 'Letter', save: 'share' });
if (!r.ok) console.warn(r.code, r.message);
}Récupérer les octets pour les envoyer vous-même :
async function uploadReport() {
var r = await AppMint.pdf.fromPage({ landscape: true, margins: { top: 10, right: 8, bottom: 10, left: 8 }, save: 'base64' });
if (!r.ok) return;
var bin = atob(r.base64), buf = new Uint8Array(bin.length);
for (var i = 0; i < bin.length; i++) buf[i] = bin.charCodeAt(i);
await fetch('/api/reports', { method: 'POST', headers: { 'Content-Type': 'application/pdf' }, body: buf });
}Les appels bruts prennent les options sous forme de texte JSON et un identifiant de rappel ; utilisez plutôt l'assistant ci-dessus :
if (window.WebToApk && typeof window.WebToApk.pdfFromPage === 'function') {
// AppMint.pdf.fromPage wraps: WebToApk.pdfFromPage(JSON.stringify(options), callbackId)
// and AppMint.pdf.fromHtml wraps: WebToApk.pdfFromHtml(html, JSON.stringify(options), callbackId)
AppMint.pdf.fromPage({ save: 'downloads' }).then(function (r) { console.log(r); });
}Remarques : Masquez les boutons et menus du PDF avec @media print { .no-print { display: none } }. Un PDF téléchargé affiche « <name> téléchargé · Ouvrir » comme tout téléchargement. fromHtml exécute les scripts du HTML (les graphiques dessinés par script apparaissent) mais n'a aucun accès aux fonctionnalités natives de l'application. Les pages plus longues qu'une feuille sont découpées comme le ferait Chrome ; utilisez break-before: page pour contrôler où.
pdfFromPage pont#
window.WebToApk.pdfFromPage(optionsJson: String, callbackId: String)
Enregistre la page en PDF sans boîte de dialogue d'impression : utilisez `AppMint.pdf.fromPage(options)`. [optionsJson] `{fileName, pageSize, landscape, margins, save}` ; résout [callbackId].
Exemple
Documenté avec AppMint.pdf : l'exemple qui s'y trouve illustre aussi celui-ci.
Crée un vrai PDF (texte sélectionnable, graphiques vectoriels) sans boîte de dialogue d'impression : fromPage enregistre la page telle qu'elle est à l'écran, mise en page avec votre CSS @media print ; fromHtml génère le HTML que vous transmettez dans une page invisible à l'adresse de l'application, de sorte que les images, feuilles de style et polices relatives se chargent comme dans votre page, attend les polices et toutes les images, puis l'enregistre. window.print() ouvre toujours la boîte de dialogue d'impression habituelle.
Renvoie : une Promise de {ok: true, fileName, pages, bytes, saved, uri?, base64?} ou {ok: false, code, message} : code vaut busy (un seul PDF à la fois), bad-options, failed, too-large (base64 de plus de 25 Mo) ou permission-denied (stockage refusé sur Android 7-9). Nécessite : rien : toutes les compilations l'ont. L'enregistrement dans Téléchargements ne nécessite aucune autorisation sur Android 10+.
Options : fileName (« .pdf » est ajouté ; par défaut : le titre de la page), pageSize 'A4' (par défaut) | 'Letter' | 'Legal' | 'A3' | 'A5', landscape (true/false), margins en millimètres (un nombre, ou {top, right, bottom, left} ; omis = votre propre règle @page), save 'downloads' (par défaut) | 'share' | 'base64'.
Enregistrer la page actuelle dans Téléchargements :
async function saveInvoice() {
if (!(window.AppMint && AppMint.pdf)) { window.print(); return; } // in a browser
var r = await AppMint.pdf.fromPage({ fileName: 'invoice-1042', pageSize: 'A4', margins: 12 });
if (r.ok) console.log('Saved ' + r.fileName + ' (' + r.pages + ' pages)');
else alert('Could not make the PDF: ' + r.message);
}Un reçu construit en HTML, directement vers la feuille de partage (les images et polices sont chargées avant la création du PDF) :
async function shareReceipt(order) {
var html = '<style>body{font-family:sans-serif} td{padding:4px 8px}</style>' +
'<img src="img/logo.png" width="120"><h1>Receipt #' + order.id + '</h1><table>' +
order.items.map(function (i) { return '<tr><td>' + i.name + '</td><td>' + i.price + '</td></tr>'; }).join('') +
'</table><p><b>Total ' + order.total + '</b></p>';
var r = await AppMint.pdf.fromHtml(html, { fileName: 'receipt-' + order.id, pageSize: 'Letter', save: 'share' });
if (!r.ok) console.warn(r.code, r.message);
}Récupérer les octets pour les envoyer vous-même :
async function uploadReport() {
var r = await AppMint.pdf.fromPage({ landscape: true, margins: { top: 10, right: 8, bottom: 10, left: 8 }, save: 'base64' });
if (!r.ok) return;
var bin = atob(r.base64), buf = new Uint8Array(bin.length);
for (var i = 0; i < bin.length; i++) buf[i] = bin.charCodeAt(i);
await fetch('/api/reports', { method: 'POST', headers: { 'Content-Type': 'application/pdf' }, body: buf });
}Les appels bruts prennent les options sous forme de texte JSON et un identifiant de rappel ; utilisez plutôt l'assistant ci-dessus :
if (window.WebToApk && typeof window.WebToApk.pdfFromPage === 'function') {
// AppMint.pdf.fromPage wraps: WebToApk.pdfFromPage(JSON.stringify(options), callbackId)
// and AppMint.pdf.fromHtml wraps: WebToApk.pdfFromHtml(html, JSON.stringify(options), callbackId)
AppMint.pdf.fromPage({ save: 'downloads' }).then(function (r) { console.log(r); });
}Remarques : Masquez les boutons et menus du PDF avec @media print { .no-print { display: none } }. Un PDF téléchargé affiche « <name> téléchargé · Ouvrir » comme tout téléchargement. fromHtml exécute les scripts du HTML (les graphiques dessinés par script apparaissent) mais n'a aucun accès aux fonctionnalités natives de l'application. Les pages plus longues qu'une feuille sont découpées comme le ferait Chrome ; utilisez break-before: page pour contrôler où.
print pont#
window.WebToApk.print()
Transmet la page telle qu'elle est actuellement à la boîte de dialogue d'impression d'Android, qui peut imprimer sur papier ou enregistrer un PDF. Rien à configurer : la WebView génère le document.
Décrit par son groupe, Impression, plutôt que seul.
Exemple
Ouvre l'écran d'impression d'Android pour la page telle qu'elle apparaît maintenant : imprimer sur papier ou « Enregistrer au format PDF ». Les pages utilisent normalement le window.print() standard, que le shell redirige ici.
Retourne : rien. Nécessite : rien.
L'API standard d'abord :
document.getElementById('print-btn').onclick = function () {
window.print(); // in the app: the Android print screen
};L'appel brut fait la même chose :
if (window.WebToApk && typeof window.WebToApk.print === 'function') {
window.WebToApk.print();
}Imprimer une seule facture d'une liste en la marquant pour une feuille de style d'impression (laissez le marquage : l'écran d'impression met la page en forme après le retour de print()) :
// CSS: @media print { .invoice:not(.print-me), nav, button { display: none !important; } }
function printInvoice(id) {
document.querySelectorAll('.invoice.print-me').forEach(function (el) {
el.classList.remove('print-me');
});
document.getElementById('invoice-' + id).classList.add('print-me');
if (window.WebToApk && typeof window.WebToApk.print === 'function') {
window.WebToApk.print();
} else {
window.print(); // a normal browser
}
}Remarques : Elle imprime toute la WebView, c'est-à-dire la page principale. Le print() propre à un iframe de même origine imprime uniquement cet iframe (voir window.print). Utilisez une feuille de style @media print pour masquer les boutons et menus. La tâche est nommée « <nom de l'application> Document ». Les erreurs sont seulement journalisées.
readClipboard pont#
window.WebToApk.readClipboard(): String
Utilisez l'encapsulation à base de promesse : const r = await AppMint.requestReview(); // {result, openedStore} const r = await AppMint.requestReview({ openStore: true }); // fiche de l'application s'il n'y a pas de fenêtre r.result : 'shown' | 'not_from_play' | 'quota' | 'error'. Voir RatePrompt.
Décrit par son groupe, Fenêtre d'avis intégrée de Google Play, plutôt que seul.
Exemple
Lit le texte qui se trouve maintenant dans le presse-papiers du téléphone. Les pages utilisent normalement le navigator.clipboard.readText() standard, que le shell redirige ici.
Renvoie : le texte, ou "" quand le presse-papiers est vide ou illisible (de façon synchrone). Nécessite : rien.
L'API standard d'abord, par exemple pour un bouton « Coller le code » :
document.getElementById('paste-btn').onclick = async function () {
try {
var text = await navigator.clipboard.readText();
if (text) document.getElementById('code').value = text.trim();
else showMessage('The clipboard is empty');
} catch (e) {
showMessage('Could not read the clipboard');
}
};L'appel brut :
if (window.WebToApk && typeof window.WebToApk.readClipboard === 'function') {
var text = window.WebToApk.readClipboard();
if (text) document.getElementById('code').value = text;
}Un bouton « Coller le lien » qui extrait la première adresse web de ce qui a été copié :
document.getElementById('paste-link').onclick = function () {
if (!(window.WebToApk && typeof window.WebToApk.readClipboard === 'function')) return;
var text = window.WebToApk.readClipboard();
var m = /https?:\/\/\S+/.exec(text);
if (m) document.getElementById('link').value = m[0];
else showMessage('There is no link on the clipboard');
};Remarques : Seules les pages de votre propre application peuvent le lire : un site externe ouvert dans l'application obtient "". Android ne laisse l'application lire le presse-papiers que lorsqu'elle est à l'écran, et Android 12+ affiche un avis « collé depuis le presse-papiers » : lisez-le suite à une pression de l'utilisateur, pas au chargement de la page.