Do these 3 things before closing this tab:
1Clear out junk files and repair common Windows errors2Fix the driver behind crashes, sound loss and screen glitches3Repair Windows errors before they cause bigger problemsSome links on this page are affiliate links: if you buy through them we may earn a commission, at no extra cost to you.
First decide whether you need one tall raster image or a document. Apple’s WKWebView offers an asynchronous native-image snapshot API and a separate PDF export API. Android’s older full-document method, WebView.capturePicture(), has been deprecated since API 19; current Android guidance separates bitmap drawing from PDF printing. Neither platform reference establishes a universal recipe that captures every off-screen pixel on every page, so validate your page types, supported OS versions and output limits.
Choose an image or a PDF before writing code
A PNG, JPEG or WebP is useful for sharing, visual regression tests and image pipelines. A PDF is usually better for very long documents because it remains a paginated document rather than one potentially enormous bitmap. The APIs are different:
| # | Preview | Product | Price | |
|---|---|---|---|---|
| 1 |
|
Apple iPhone 14, 128GB, Midnight - Unlocked (Renewed) | $300.00 | Buy on Amazon |
| 2 |
|
Apple iPhone 16, 128GB, Pink - Unlocked (Renewed) | $599.99 | Buy on Amazon |
| 3 |
|
Apple iPhone 15, 128GB, Black - Unlocked (Renewed) | $414.99 | Buy on Amazon |
| 4 |
|
Apple iPhone 13, 128GB, Midnight - Unlocked (Renewed) | $262.00 | Buy on Amazon |
| 5 |
|
Apple iPhone 16e, 128GB, Black - Unlocked (Renewed) | $389.00 | Buy on Amazon |
| Platform | Raster path | Document path | Important qualification |
|---|---|---|---|
| Apple | WKWebView.takeSnapshot(with:completionHandler:) (and its async form) |
WKWebView.createPDF(configuration:) |
The snapshot configuration selects the portion of the view; the API is asynchronous and returns an image or error. The reference does not guarantee a document-sized bitmap recipe. |
| Android | onDraw(Canvas) for a bitmap snapshot |
createPrintDocumentAdapter(String) |
capturePicture() describes a full displayed document but is deprecated since API 19. PDF conversion should use a dedicated off-screen WebView. |
Think of “full page” as a requirement to verify, not a promise implied by a method name. Long pages, lazy content, fixed or sticky elements, nested scrolling containers, cross-origin frames, image decoding and memory pressure can all change the result.
iOS: snapshot a WKWebView
What Apple’s API does
Apple documents takeSnapshot as generating a platform-native image from WebView contents. A WKSnapshotConfiguration specifies the portion of the WebView to capture and other capture behavior. Completion is asynchronous, so inspect both the returned image and the error.
Swift async implementation
import WebKit
func snapshot(webView: WKWebView) async throws -> UIImage {
let configuration = WKSnapshotConfiguration()
// Set configuration.rect only when you have a verified capture rectangle.
return try await webView.takeSnapshot(configuration: configuration)
}
The default configuration is intentionally shown without an invented “entire document” rectangle. If your application calculates a document-sized rectangle, test that calculation against the OS versions you support; the cited API description alone does not establish that off-screen content is always included.
#1 Best Overall
- This phone is unlocked and compatible with any carrier of choice on GSM and CDMA networks (e.g. AT&T, T-Mobile, Sprint, Verizon, US Cellular, Cricket, Metro, Tracfone, Mint Mobile, etc.).
- Please check with your carrier to verify compatibility.
- The device does not come with headphones or a SIM card. It does include a generic (Mfi certified) charging cable.
- Tested for battery health and guaranteed to have a minimum battery capacity of 80%.
Completion-handler form
let configuration = WKSnapshotConfiguration()
webView.takeSnapshot(with: configuration) { image, error in
if let error = error {
print("Snapshot failed: (error)")
return
}
guard let image = image else {
print("Snapshot returned no image")
return
}
// Persist or process image on the appropriate queue for your app.
}
Make the page ready first
- Wait for navigation to finish and for your own application-level “content ready” signal.
- If JavaScript inserts content after navigation, wait for that insertion rather than assuming
didFinishmeans every image is decoded. - Record the viewport, scale and intended output dimensions so a later change is detectable.
- Exercise pages with lazy images, sticky headers, nested scroll regions and cross-origin frames; the API summary does not define their exact outcomes.
iOS: export WebView contents as PDF
When a PDF is acceptable, use Apple’s separate createPDF(configuration:) API. It produces PDF data from WebView contents; it is not a raster screenshot API.
import WebKit
func makePDF(webView: WKWebView) async throws -> Data {
let configuration = WKPDFConfiguration()
return try await webView.createPDF(configuration: configuration)
}
// Example use:
Task {
do {
let data = try await makePDF(webView: webView)
try data.write(to: outputURL, options: .atomic)
} catch {
print("PDF export failed: (error)")
}
}
Choose PDF when a page may exceed practical bitmap dimensions or when users need printing and text selection. Confirm paper size, pagination and dynamic-content behavior in your target OS versions.
PC Slower Than It Used to Be?
A free scan shows the junk files, broken settings and background clutter dragging Windows down - then fixes them in one click.Free scan · Windows 10 & 11Outdated Drivers Are Slowing You Down
One free scan finds every outdated or missing driver and matches the right update for your exact hardware.Free scan · exact hardware matchAndroid: understand the WebView capture choices
Why capturePicture is legacy
The Android reference marks capturePicture() deprecated in API 19. Its historical description says it captures the entire displayed document, but also records limitations for fixed-position elements and scrollable divs on older Honeycomb through Ice Cream Sandwich releases. It must run on the UI thread, and the returned picture was intended to be drawn into a bitmap-backed Canvas from Jelly Bean MR1 onward. Treat this as legacy context, not a modern implementation.
Bitmap snapshots with onDraw
Android’s reference points to onDraw(Canvas) to obtain a bitmap snapshot. The excerpt does not specify an off-screen, full-document configuration, so do not present it as a guaranteed tall-page capture. A basic visible-view bitmap looks like this:
Rank #2
- 6.1" Super Retina XDR OLED, HDR10, Dolby Vision, 1000nits (typ), 2000nits (HBM), 2556x1179px at 460ppi, 3561mAh Battery
- 128GB 8GB RAM, Apple A18 (3nm), Hexa-core (2x4.04 GHz + 4x2.20 GHz), Apple GPU 5-core, 16‑core Neural Engine
- Rear camera: 48MP, f/1.6, wide + 12MP, f/2.2, ultrawide, Front Camera: 12MP, f/1.9, wide, iOS 18, upgradable to iOS 18.5
- 4G LTE: 1/2/3/4/5/7/8/12/13/14/17/18/19/20/25/26/28/29/30/32/34/38/39/40/41/42/48/53/66/71, 5G: n1/2/3/5/7/8/12/14/20/25/26/28/29/30/38/40/41/48/53/66/70/71/75/76/77/78/79 - Dual eSIM
- Unlocked for freedom to choose your carrier. Compatible with both GSM & CDMA networks. The phone is unlocked to work with all GSM Carriers & CDMA Carriers Including AT&T, T-Mobile, Verizon, Sprint., Etc.
fun drawWebViewToBitmap(webView: WebView): Bitmap {
check(Looper.myLooper() == Looper.getMainLooper()) {
"Call on the UI thread"
}
val width = webView.width
val height = webView.height
require(width > 0 && height > 0) { "WebView has no laid-out size" }
val bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_8888)
val canvas = Canvas(bitmap)
webView.draw(canvas)
return bitmap
}
This captures the WebView’s laid-out view. If you need a document-wide image, you must establish and test a document-height strategy for your app; do not infer one from the deprecated method’s wording.
PDF with createPrintDocumentAdapter
createPrintDocumentAdapter(String) converts WebView contents to a PDF stream. Android recommends a dedicated off-screen WebView for printing, and the WebView cannot be drawn during conversion. Keep this path separate from bitmap capture.
val printAdapter = webView.createPrintDocumentAdapter("webview-document")
// Pass printAdapter to Android's PrintManager or your PrintDocumentAdapter
// implementation, which writes the resulting PDF stream.
Build the print flow around Android’s print callbacks and file descriptor handling. Use a dedicated WebView so printing does not compete with the interactive screen, and wait for your content-ready condition before creating the adapter.
Cross-platform implementation checklist
- Define output. Specify image format, pixel dimensions and alpha requirements, or PDF paper size and pagination.
- Define readiness. Wait for navigation plus application-specific rendering, lazy-load completion and font/image readiness where your page can observe them.
- Capture on the correct thread. WKWebView completion is asynchronous; Android view drawing and legacy
capturePicture()belong on the UI thread. - Control the capture surface. Record viewport, device scale, orientation, dark-mode setting, timezone, locale and any authenticated state.
- Handle failure explicitly. Surface navigation, snapshot, PDF and file-write errors instead of returning an empty artifact.
- Test hostile pages. Include very tall documents, lazy images, fixed and sticky controls, nested scrolling, iframes, animation, failed resources and offline states.
- Measure memory. A single tall ARGB bitmap consumes roughly width × height × 4 bytes before framework overhead; set practical limits and prefer PDF for extreme lengths.
Common failure modes and fixes
The image contains only the viewport
A viewport snapshot is the expected result when the configured or drawn surface is only the visible WebView. Revisit your definition of “full page”; on Android, onDraw is documented as a bitmap snapshot but not as a document-height recipe. On Apple, verify the snapshot rectangle and OS behavior rather than assuming every off-screen pixel is included.
Rank #3
- 6.1inch Super Retina XDR display. Aluminum with color-infused glass back. Ring/Silent switch
- Dynamic Island. A magical way to interact with iPhone. A16 Bionic chip with 5-core GPU
- Advanced dual-camera system. 48MP Main | Ultra Wide. Super-high-resolution photos (24MP and 48MP). Next-generation portraits with Focus and Depth Control. 4X optical zoom range
- Emergency SOS via satellite. Crash Detection. Roadside Assistance via satellite
- Up to 26 hours video playback. USB C, Supports USB 2. Face ID
Late images or blank sections
Capture may have run before JavaScript, lazy loading or image decoding completed. Add an application-level readiness signal, wait for the relevant selector or content state, and test on slower networks. The platform references do not guarantee lazy-load handling.
Sticky or fixed elements repeat unexpectedly
Different rendering paths handle fixed-position elements differently, and Android’s historical capturePicture() notes explicitly mention limitations. Decide whether the element should appear once, at its viewport position or not at all, then validate on each supported OS.
Out-of-memory or failed file writes
Reduce pixel dimensions or scale, split work into smaller artifacts, or choose PDF. Release temporary bitmaps promptly and check available storage before writing. Do not treat an oversized bitmap as a reliable archival format.
Cross-origin frame content is missing
Frame rendering can depend on page security and platform behavior. Test the actual origins and authentication model; neither cited reference promises universal cross-origin inclusion.
Rank #4
- This pre-owned product is not Apple certified, but has been professionally inspected, tested and cleaned by Amazon-qualified suppliers.
- There will be no visible cosmetic imperfections when held at an arm’s length.
- This product is eligible for a replacement or refund within 90 days of receipt if you are not satisfied.
- Product may come in generic Box.
Android code behaves differently across releases
Do not build new production code around deprecated capturePicture(). Prefer the documented drawing or printing paths, then verify exact full-page requirements on every API level you support.
Performance, reliability and cost decisions
When raster is the right format
Use a raster image for thumbnails, pixel comparisons and APIs that require an image. Keep dimensions bounded, select an appropriate color format and avoid retaining multiple tall bitmaps simultaneously.
When PDF is safer
PDF is usually the more practical output for long articles, invoices and print workflows. It avoids one enormous raster surface, but pagination, fonts and print CSS still require validation.
Make captures reproducible
Freeze the inputs that affect rendering: URL and route, viewport, scale, orientation, theme, locale, timezone, cookies, authentication, network fixtures and readiness condition. Store OS and app versions with each artifact so a visual difference can be explained.
Best Value
- 6.1" Super Retina XDR OLED, HDR10, 800 nits (HBM), 1200 nits (peak), 2532x1170px at 460ppi, 4005mAh Battery
- 8GB RAM, Apple A18 6-core CPU (2 performance + 4 efficiency cores), Apple GPU 4-core, 16‑core Neural Engine
- Rear camera: 48MP, f/1.6, wide, Front Camera: 12MP, f/1.9, wide, iOS 18.3.1, upgradable to iOS 18.5
- Connectivity: Global 4G LTE, Sub-6 GHz 5G, LTE, Wi-Fi 6, Bluetooth 5.3, NFC, USB-C, Wireless Charging (7.5W). (does not have mmWave 5G or MagSafe or physical SIM card) - Dual eSIM Only
- Unlocked for freedom to choose your carrier. Compatible with both GSM & CDMA networks. The phone is unlocked to work with all GSM Carriers & CDMA Carriers Including AT&T, T-Mobile, Verizon, Straight Talk., Etc.
Or skip the browser setup
ScreenshotNeo provides a website screenshot API and MCP server. A single GET request returns PNG, JPEG, WebP or PDF, which can be useful when the page can be captured outside an embedded WebView. It accepts consent banners before capture and removes more than 60 known consent platforms, newsletter popups and chat widgets; each step can be disabled. Bot checks, CAPTCHAs, blank pages, timeouts, failed loads and cache hits are not billed, and response headers identify the page verdict and billing result.
It also offers an MCP server for Claude, Cursor and other MCP clients, with take_screenshot, get_page_info and capture_pdf. Options include full-page capture with lazy images loaded, CSS-element capture, device presets and custom viewports, retina scale, PDF paper and page ranges, custom CSS/JavaScript, click and hide actions, selector/delay/network-idle waits, request blocking, headers/cookies/user agents, timezone and geolocation, transparent backgrounds, resizing, TTL caching, signed links, asynchronous webhooks, bulk capture of up to 100 URLs per call, usage reporting and an OpenAPI specification. Parameter names used by other screenshot APIs are accepted to ease migration.
Quick wins for a faster PC:
Fix the driver behind crashes, sound loss and screen glitchesFind Drivers →Clear out junk files and repair common Windows errorsFree Scan →Scan for outdated or missing drivers - takes under a minuteDriver Scan →One-call examples
See the ScreenshotNeo documentation for the complete option reference.
curl -G "https://api.screenshotneo.com/v1/shot" -d access_key=YOUR_API_KEY --data-urlencode url=https://stripe.com -o shot.webp
import requests
r = requests.get("https://api.screenshotneo.com/v1/shot", params={"access_key": "YOUR_API_KEY", "url": "https://stripe.com"}, timeout=90)
open("shot.webp", "wb").write(r.content)
const q = new URLSearchParams({ access_key: 'YOUR_API_KEY', url: 'https://stripe.com' });
const res = await fetch(`https://api.screenshotneo.com/v1/shot?${q}`);
The Free plan includes 1,000 screenshots each month with no card. Paid plans start at $5 for 3,000 shots; every feature is on every plan. Create a free ScreenshotNeo account.
FAQ
Does WKWebView takeSnapshot always capture the entire HTML document?
No universal guarantee is established by the API description. The configuration selects a capture portion, so verify your document-sized configuration and supported OS versions.
Can capturePicture be used in a new Android app?
It is deprecated since API 19. Use the documented drawing path for a bitmap or the print adapter for PDF, and validate any full-page requirement.
What’s actually slowing this PC down?
Pick the symptom - the matching free tool is one click away.
Should I use an image or PDF for an extremely long page?
Prefer PDF when pagination is acceptable; a single raster image can exceed practical memory and dimension limits.
Quick Recap
Product prices and availability are accurate as of the date/time indicated and are subject to change. Any price and availability information displayed on Amazon at the time of purchase will apply.

