API jembatan JavaScript
Bagikan, papan klip, dan cetak
Lembar berbagi Android, papan klip sistem, teks yang dibagikan aplikasi lain ke aplikasi Anda, dan dialog cetak.
AppMint.pdf helper#
AppMint.pdf.fromPage(options) / fromHtml(html, options)
Contoh
Membuat PDF asli (teks dapat dipilih, grafik vektor) tanpa dialog cetak: fromPage menyimpan halaman seperti tampil di layar, ditata dengan CSS @media print Anda; fromHtml merender HTML yang Anda berikan di halaman tak terlihat pada alamat aplikasi itu sendiri - sehingga gambar, stylesheet, dan font relatif dimuat seperti di halaman Anda - menunggu font dan setiap gambar, lalu menyimpannya. window.print() tetap membuka dialog cetak biasa.
Hasil: Promise berisi {ok: true, fileName, pages, bytes, saved, uri?, base64?} atau {ok: false, code, message} - code adalah busy (satu PDF dalam satu waktu), bad-options, failed, too-large (base64 lebih dari 25 MB) atau permission-denied (penyimpanan ditolak di Android 7-9). Membutuhkan: tidak ada - setiap build memilikinya. Menyimpan ke Downloads tidak membutuhkan izin di Android 10+.
Opsi: fileName (".pdf" ditambahkan; bawaan: judul halaman), pageSize 'A4' (bawaan) | 'Letter' | 'Legal' | 'A3' | 'A5', landscape (true/false), margins dalam milimeter (satu angka, atau {top, right, bottom, left}; jika dihilangkan = aturan @page Anda sendiri), save 'downloads' (bawaan) | 'share' | 'base64'.
Simpan halaman saat ini ke Downloads:
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);
}Struk yang dibuat dari HTML, langsung ke lembar berbagi (gambar dan font dimuat sebelum PDF dibuat):
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);
}Ambil kembali byte-nya untuk Anda unggah sendiri:
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 });
}Panggilan mentah menerima opsi sebagai teks JSON dan id callback; gunakan helper di atas sebagai gantinya:
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); });
}Catatan: Sembunyikan tombol dan menu dari PDF dengan @media print { .no-print { display: none } }. PDF yang diunduh menampilkan "Downloaded <name> · Open" seperti unduhan lainnya. fromHtml menjalankan skrip HTML (grafik yang digambar skrip tampil) tetapi tidak punya akses ke fitur native aplikasi. Halaman yang lebih panjang dari satu lembar dipecah seperti yang dilakukan Chrome; gunakan break-before: page untuk mengatur tempatnya.
window.print standar web#
window.print()
Contoh
Panggilan cetak standar, dibuat berfungsi di dalam aplikasi: membuka layar cetak Android, tempat pengguna mencetak di kertas atau menyimpan PDF.
Mengembalikan: tidak ada. Membutuhkan: tidak ada.
document.getElementById('print-receipt').onclick = function () {
window.print();
};Sembunyikan kontrol aplikasi di atas kertas dengan stylesheet cetak:
<style>
@media print {
nav, .toolbar, button { display: none !important; }
body { background: #fff; color: #000; }
}
</style>Cetak label pengiriman tanpa halaman di sekitarnya - iframe srcdoc dengan origin yang sama hanya mencetak dokumennya sendiri:
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);
}Catatan: window.print() mencetak halaman utama seperti yang tergambar saat ini. <iframe> dengan origin yang sama - iframe tersembunyi yang diisi pustaka cetak dengan struk lalu dipanggil iframe.contentWindow.print(), atau halaman iframe yang memanggil window.print() miliknya sendiri - mencetak dokumen iframe ITU (lihat __printHtml). Iframe lintas origin tidak bisa dicetak dari halaman. Penggantinya sudah ada sebelum skrip pertama halaman. beforeprint tidak bisa dibatalkan (di browser mana pun).
__clipboardRead jembatan#
window.WebToApk.__clipboardRead(): String
navigator.clipboard.read(): `{parts:[{type, text|base64}]}`. Jangkauannya sama dengan readClipboard() di shell ini (yang tidak punya gerbang origin).
Contoh
Transport internal di balik navigator.clipboard.read(). Halaman memakai API standar; jangan pernah memanggil ini langsung - metode __ dapat berubah tanpa pemberitahuan.
Hasil: {parts:[{type, text|base64}]} - jangkauannya sama dengan readClipboard() di aplikasi ini. Membutuhkan: tidak ada yang perlu diaktifkan.
Gunakan API publik:
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'));Tempel teks berformat ke editor, mempertahankan format bila papan klip berisi 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');
}
}Tempel gambar apa pun yang disalin (PNG, JPEG, WebP...) sebagai foto profil, dan bedakan pembacaan yang ditolak:
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');
}
};Catatan: Android 12+ menampilkan pesan "ditempel dari papan klip Anda" sendiri saat aplikasi membaca papan klip.
__clipboardWrite jembatan#
window.WebToApk.__clipboardWrite(partsJson: String): Boolean
navigator.clipboard.write(): [partsJson] adalah `[{type, text}|{type, base64}]` untuk satu ClipboardItem - text/plain, text/html, atau gambar yang disalin sebagai content URI.
Contoh
Transport internal di balik navigator.clipboard.write([ClipboardItem]). Halaman memakai API standar; jangan pernah memanggil ini langsung - metode __ dapat berubah tanpa pemberitahuan.
Hasil: true bila klip berhasil ditempatkan. Membutuhkan: tidak ada yang perlu diaktifkan.
Gunakan API publik:
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'));Salin teks berformat dan versi biasanya dalam satu item, agar editor kaya mendapat tabelnya dan kolom biasa mendapat teksnya:
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
}
}Salin gambar yang ditampilkan halaman, seperti kode QR, agar bisa ditempel ke obrolan:
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');
}
}Catatan: Teks, HTML, dan satu gambar per item. Gambar disalin sebagai content URI melalui FileProvider aplikasi, sehingga bisa ditempel ke WhatsApp, Gmail, atau Keep.
__printHtml jembatan#
window.WebToApk.__printHtml(html: String, baseUrl: String, title: String)
Mencetak [html] - dokumen serial dari iframe dengan origin yang sama, dikirim oleh shim `window.print()` ([PrintShim]) - melalui WebView di luar layar pada [baseUrl], karena adaptor cetak WebView utama hanya bisa mencetak seluruh halaman. [title] menamai pekerjaan cetak ("<App name> Document" bila kosong).
Contoh
Transport internal di balik pencetakan iframe: iframe.contentWindow.print() (dan window.print() milik halaman iframe) mengirim dokumen iframe itu ke sini, dan aplikasi mencetaknya lewat layar cetak Android. Halaman memakai panggilan standar; jangan panggil ini secara langsung.
Mengembalikan: tidak ada. Membutuhkan: tidak ada.
Pola struk yang dimungkinkan ini - iframe tersembunyi yang hanya diisi struk:
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);
}Halaman tiket Anda sendiri, dimuat ke iframe tersembunyi dari origin yang sama - CSS dan gambarnya dimuat, dan <title> menamai pekerjaan cetak:
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);
}Sesuaikan dokumen iframe tepat sebelum snapshot dengan beforeprint pada window 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
}Catatan: Argumennya (html, baseUrl, title): dokumen serial iframe, alamat tempat tautan relatifnya diselesaikan (alamat halaman itu sendiri untuk iframe about:blank), dan nama pekerjaan cetak (<title> iframe, atau judul halaman). Snapshot diambil saat print() dipanggil - skrip di dalamnya tidak berjalan lagi - dan beforeprint / afterprint terpicu di window iframe di sekitarnya. Iframe lintas origin tidak bisa dicetak dari halaman.
copyToClipboard jembatan#
window.WebToApk.copyToClipboard(text: String): Boolean
Gunakan wrapper promise: const r = await AppMint.requestReview(); // {result, openedStore} const r = await AppMint.requestReview({ openStore: true }); // listing jika tidak ada sheet r.result: 'shown' | 'not_from_play' | 'quota' | 'error'. Lihat RatePrompt.
Dijelaskan oleh kelompoknya, Lembar ulasan dalam aplikasi Google Play, bukan sendiri-sendiri.
Contoh
Menyalin teks biasa ke papan klip ponsel. Halaman biasanya memakai navigator.clipboard.writeText(text) standar, yang diarahkan shell ke sini.
Hasil: true bila berhasil, false bila gagal (sinkron). Membutuhkan: tidak ada.
API standar lebih dulu:
document.getElementById('copy-btn').onclick = async function () {
try {
await navigator.clipboard.writeText('PROMO-2026');
showMessage('Copied');
} catch (e) {
showMessage('Could not copy');
}
};Panggilan mentah:
if (window.WebToApk && typeof window.WebToApk.copyToClipboard === 'function') {
var ok = window.WebToApk.copyToClipboard('PROMO-2026');
showMessage(ok ? 'Copied' : 'Could not copy');
}Tombol "Salin" di setiap blok kode, memakai jawaban sinkron untuk memperbarui labelnya:
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);
});Catatan: Hanya teks biasa (tanpa gambar atau HTML). Android 13+ menampilkan pratinjau "Tersalin" kecil sendiri, jadi Anda mungkin tidak perlu pesan sendiri di sana.
pdfFromHtml jembatan#
window.WebToApk.pdfFromHtml(html: String, optionsJson: String, callbackId: String)
Merender [html] di luar layar pada origin aplikasi dan menyimpannya sebagai PDF - gunakan `AppMint.pdf.fromHtml(html, options)`.
Contoh
Didokumentasikan bersama AppMint.pdf - contoh di sana menunjukkan yang ini juga.
Membuat PDF asli (teks dapat dipilih, grafik vektor) tanpa dialog cetak: fromPage menyimpan halaman seperti tampil di layar, ditata dengan CSS @media print Anda; fromHtml merender HTML yang Anda berikan di halaman tak terlihat pada alamat aplikasi itu sendiri - sehingga gambar, stylesheet, dan font relatif dimuat seperti di halaman Anda - menunggu font dan setiap gambar, lalu menyimpannya. window.print() tetap membuka dialog cetak biasa.
Hasil: Promise berisi {ok: true, fileName, pages, bytes, saved, uri?, base64?} atau {ok: false, code, message} - code adalah busy (satu PDF dalam satu waktu), bad-options, failed, too-large (base64 lebih dari 25 MB) atau permission-denied (penyimpanan ditolak di Android 7-9). Membutuhkan: tidak ada - setiap build memilikinya. Menyimpan ke Downloads tidak membutuhkan izin di Android 10+.
Opsi: fileName (".pdf" ditambahkan; bawaan: judul halaman), pageSize 'A4' (bawaan) | 'Letter' | 'Legal' | 'A3' | 'A5', landscape (true/false), margins dalam milimeter (satu angka, atau {top, right, bottom, left}; jika dihilangkan = aturan @page Anda sendiri), save 'downloads' (bawaan) | 'share' | 'base64'.
Simpan halaman saat ini ke Downloads:
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);
}Struk yang dibuat dari HTML, langsung ke lembar berbagi (gambar dan font dimuat sebelum PDF dibuat):
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);
}Ambil kembali byte-nya untuk Anda unggah sendiri:
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 });
}Panggilan mentah menerima opsi sebagai teks JSON dan id callback; gunakan helper di atas sebagai gantinya:
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); });
}Catatan: Sembunyikan tombol dan menu dari PDF dengan @media print { .no-print { display: none } }. PDF yang diunduh menampilkan "Downloaded <name> · Open" seperti unduhan lainnya. fromHtml menjalankan skrip HTML (grafik yang digambar skrip tampil) tetapi tidak punya akses ke fitur native aplikasi. Halaman yang lebih panjang dari satu lembar dipecah seperti yang dilakukan Chrome; gunakan break-before: page untuk mengatur tempatnya.
pdfFromPage jembatan#
window.WebToApk.pdfFromPage(optionsJson: String, callbackId: String)
Menyimpan halaman sebagai PDF tanpa dialog cetak - gunakan `AppMint.pdf.fromPage(options)`. [optionsJson] `{fileName, pageSize, landscape, margins, save}`; menyelesaikan [callbackId].
Contoh
Didokumentasikan bersama AppMint.pdf - contoh di sana menunjukkan yang ini juga.
Membuat PDF asli (teks dapat dipilih, grafik vektor) tanpa dialog cetak: fromPage menyimpan halaman seperti tampil di layar, ditata dengan CSS @media print Anda; fromHtml merender HTML yang Anda berikan di halaman tak terlihat pada alamat aplikasi itu sendiri - sehingga gambar, stylesheet, dan font relatif dimuat seperti di halaman Anda - menunggu font dan setiap gambar, lalu menyimpannya. window.print() tetap membuka dialog cetak biasa.
Hasil: Promise berisi {ok: true, fileName, pages, bytes, saved, uri?, base64?} atau {ok: false, code, message} - code adalah busy (satu PDF dalam satu waktu), bad-options, failed, too-large (base64 lebih dari 25 MB) atau permission-denied (penyimpanan ditolak di Android 7-9). Membutuhkan: tidak ada - setiap build memilikinya. Menyimpan ke Downloads tidak membutuhkan izin di Android 10+.
Opsi: fileName (".pdf" ditambahkan; bawaan: judul halaman), pageSize 'A4' (bawaan) | 'Letter' | 'Legal' | 'A3' | 'A5', landscape (true/false), margins dalam milimeter (satu angka, atau {top, right, bottom, left}; jika dihilangkan = aturan @page Anda sendiri), save 'downloads' (bawaan) | 'share' | 'base64'.
Simpan halaman saat ini ke Downloads:
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);
}Struk yang dibuat dari HTML, langsung ke lembar berbagi (gambar dan font dimuat sebelum PDF dibuat):
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);
}Ambil kembali byte-nya untuk Anda unggah sendiri:
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 });
}Panggilan mentah menerima opsi sebagai teks JSON dan id callback; gunakan helper di atas sebagai gantinya:
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); });
}Catatan: Sembunyikan tombol dan menu dari PDF dengan @media print { .no-print { display: none } }. PDF yang diunduh menampilkan "Downloaded <name> · Open" seperti unduhan lainnya. fromHtml menjalankan skrip HTML (grafik yang digambar skrip tampil) tetapi tidak punya akses ke fitur native aplikasi. Halaman yang lebih panjang dari satu lembar dipecah seperti yang dilakukan Chrome; gunakan break-before: page untuk mengatur tempatnya.
print jembatan#
window.WebToApk.print()
Menyerahkan halaman sebagaimana adanya saat ini ke dialog cetak Android, yang dapat mencetak di kertas atau menyimpan PDF. Tidak ada yang perlu diatur - WebView merender dokumennya.
Dijelaskan oleh grupnya, Pencetakan, bukan secara terpisah.
Contoh
Membuka layar cetak Android untuk halaman seperti tampilannya sekarang - cetak di kertas atau "Simpan sebagai PDF". Halaman biasanya memakai window.print() standar, yang diarahkan shell ke sini.
Mengembalikan: tidak ada. Membutuhkan: tidak ada.
API standar lebih dulu:
document.getElementById('print-btn').onclick = function () {
window.print(); // in the app: the Android print screen
};Panggilan mentah melakukan hal yang sama:
if (window.WebToApk && typeof window.WebToApk.print === 'function') {
window.WebToApk.print();
}Cetak satu faktur dari daftar dengan menandainya untuk stylesheet cetak (biarkan tandanya - layar cetak menata halaman setelah print() selesai):
// 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
}
}Catatan: Mencetak seluruh WebView - halaman utama. print() milik iframe dengan origin yang sama hanya mencetak iframe itu (lihat window.print). Gunakan stylesheet @media print untuk menyembunyikan tombol dan menu. Pekerjaan dinamai "<App name> Document". Kesalahan hanya dicatat di log.
readClipboard jembatan#
window.WebToApk.readClipboard(): String
Gunakan wrapper promise: const r = await AppMint.requestReview(); // {result, openedStore} const r = await AppMint.requestReview({ openStore: true }); // listing jika tidak ada sheet r.result: 'shown' | 'not_from_play' | 'quota' | 'error'. Lihat RatePrompt.
Dijelaskan oleh kelompoknya, Lembar ulasan dalam aplikasi Google Play, bukan sendiri-sendiri.
Contoh
Membaca teks yang ada di papan klip ponsel saat ini. Halaman biasanya memakai navigator.clipboard.readText() standar, yang diarahkan shell ke sini.
Hasil: teksnya, atau "" bila papan klip kosong atau tidak bisa dibaca (sinkron). Membutuhkan: tidak ada.
API standar lebih dulu - misalnya tombol "Tempel kode":
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');
}
};Panggilan mentah:
if (window.WebToApk && typeof window.WebToApk.readClipboard === 'function') {
var text = window.WebToApk.readClipboard();
if (text) document.getElementById('code').value = text;
}Tombol "Tempel tautan" yang mengambil alamat web pertama dari apa pun yang disalin:
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');
};Catatan: Hanya halaman aplikasi Anda sendiri yang dapat membacanya: situs asing yang dibuka di dalam aplikasi mendapat "". Android hanya mengizinkan aplikasi membaca papan klip saat aplikasi ada di layar, dan Android 12+ menampilkan pemberitahuan "ditempel dari papan klip" - bacalah dengan ketukan pengguna, bukan saat halaman dimuat.