Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Use two independent controls: set the sheet’s printable inset with @page { margin: ... }, and set spacing inside your HTML with print-only CSS such as container padding or element margin. A page background can cover the page box without moving the content. Keep those concerns separate, then verify the result in the browser and PDF workflow your users actually use.

The page model: three different kinds of whitespace

Printed HTML is laid out on a paged-media page box. The page has a content area and a surrounding margin area. CSS margins on an element are not the same thing as the page margin, and neither is the same as a background’s painted area.

  • Page margin: the inset around every printed page, controlled by @page.
  • Content spacing: local space inside or around your HTML elements, controlled by normal CSS and print media rules.
  • Background coverage: where a page or element background is painted. A background may extend across the page box, including its margins, but that does not automatically inset the HTML.

If you want every page’s content farther from the paper edge, change @page. If you want an article column separated from a title, image, or sidebar, change the content container or its children. Do not use a background margin as a substitute for either layout rule.

A minimal CSS pattern that keeps the controls separate

@page {
  size: A4;
  margin: 12mm;
}

@media print {
  /* The page margin is already supplied by @page. */
  .content {
    margin: 0;
    padding: 8mm 0;
  }

  .article-title {
    margin: 0 0 6mm;
  }

  .card {
    margin: 0 0 5mm;
    padding: 4mm;
    break-inside: avoid;
  }
}

Here, 12mm is a page-wide inset. The .content padding adds space only inside that container, while the title and cards receive their own local spacing. Remove the .content padding if you need the article to start at the page content edge without changing the page margin.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
#1 Best Overall
Sale
HTML and CSS: Design and Build Websites
  • HTML CSS Design and Build Web Sites
  • Comes with secure packaging
  • It can be a gift option

Choose units for the output

Use millimetres or inches for paper-oriented dimensions, for example 12mm or 0.5in. Relative units can be useful for typography, but fixed physical units make page geometry easier to reason about. Set the paper size explicitly when the output must be predictable:

@page {
  size: Letter portrait;
  margin: 0.5in 0.65in;
}

Put print rules in the right place

You can place the rules in an in-document media query or a print-only stylesheet:

<link rel="stylesheet" href="print.css" media="print">

Both approaches are valid. Print rules still follow normal cascade and specificity rules. A highly specific screen rule can override a less specific print rule, so inspect the computed styles in a print-preview emulation and increase specificity or reorder declarations when necessary.

Avoid accidental double margins

A common result is a large blank band because the page margin and the first element’s top margin are both contributing. Collapse or reset the first child’s margin in print:

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
@media print {
  .content > :first-child {
    margin-top: 0;
  }
}

Likewise, if a screen wrapper has a fixed width, auto margins, transforms, or a large padding value, override those properties in the print context rather than trying to compensate by changing @page.

How to get content inset without changing a full-page background

Keep the page or body background independent, then inset a wrapper:

html, body {
  background: #f3f4f6;
}

.paper {
  background: white;
}

@page {
  size: A4;
  margin: 10mm;
}

@media print {
  .paper {
    margin: 0;
    padding: 6mm;
    background: white;
  }
}

The white background can paint the page area while the wrapper’s padding controls the distance between its border and its children. If you instead need the white sheet itself to stop before the paper edge, use a page margin or an element background with deliberate dimensions; do not expect the background painting area to reposition descendants.

Browser headers and footers are a separate layer

Browser-generated headers and footers (such as the page URL, date, and title) are not authored HTML. They occupy page-margin space and are controlled by the print dialog. Turn off Headers and footers when you want only your document’s content.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

In Chrome, automatic metadata can also disappear when page margins are zero or too small to leave room, but relying on that side effect is less clear than using the dialog control. Test the exact browser and PDF destination because a browser, driver, printer, or server-side PDF generator may apply different defaults.

Authored margin content

Chrome 131 introduced CSS-generated page-margin content such as:

@page {
  @bottom-left {
    content: "My book";
  }
}

This is useful for authored headers, footers, and counters where supported. Support is implementation-dependent, so provide a fallback or verify the target browser before depending on it for production documents. Authored margin boxes do not replace the normal page margin declaration.

A reliable implementation workflow

  1. Define the paper: add @page with the required size, orientation, and page margin.
  2. Reset screen-only layout: in @media print, remove fixed heights, overflow clipping, transforms, sticky positioning, and decorative wrappers that do not belong on paper.
  3. Set content spacing: use container padding and element margins for local whitespace. Reset the first child’s top margin if it creates an unintended gap.
  4. Handle page breaks: use break-inside: avoid for cards or figures that should stay together, and use break-before or break-after for deliberate section starts.
  5. Configure the print dialog: choose the intended paper size, orientation, scale, destination, background graphics option, and header/footer setting.
  6. Inspect the actual PDF: check the first page, a middle page, the last page, long headings, tables, images, and pages containing links or footnotes.

Troubleshooting: symptom, cause, and fix

Content is still flush with the paper edge

Cause: the @page rule is missing, invalid, or overridden by the destination’s margin setting.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Fix: use a valid physical value such as @page { margin: 12mm; }, confirm the selected paper size, and inspect print preview. Some printer drivers impose a non-printable area regardless of CSS.

The gap is twice as large as expected

Cause: page margin plus wrapper padding or a first-child margin.

Fix: decide whether the space should be page-wide or local, then remove the other declaration. Reset the first printed child’s margin when needed.

The background reaches the edge but text does not

Cause: background painting and content placement are independent.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Fix: keep the page background and set the text inset with @page or wrapper padding. Do not try to move text by changing background size.

Headers or footers appear despite custom CSS

Cause: browser-generated metadata is enabled.

Fix: disable headers and footers in the print dialog. If you need authored margin content, test the target browser’s page-margin-box support separately.

Rank #4
Sale
Web Design with HTML, CSS, JavaScript and jQuery Set
  • Brand: Wiley
  • Set of 2 Volumes
  • A handy two-book set that uniquely combines related technologies Highly visual format and accessible language makes these books highly effective learning tools Perfect for beginning web designers and front-end developers

Print CSS appears to do nothing

Cause: a screen rule has greater specificity, the print stylesheet is not loaded, or the PDF service ignores author CSS.

Fix: emulate print media in developer tools, inspect the winning declaration, verify the stylesheet’s media attribute, and test the same browser or generator used in production.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Elements are clipped or overlap

Cause: fixed heights, overflow: hidden, absolute positioning, or transforms from the screen layout.

Fix: reset those properties under @media print, allow natural height, and use page-break properties instead of forcing a screen-sized canvas.

When page margins and content margins should differ

Requirement Use Reason
Keep every page’s content away from the sheet edge @page margin Applies to the page layout consistently.
Add space between a heading and paragraph Element margin Local relationship, not a paper boundary.
Create an inset panel with a colored background Container padding Moves children inside the panel without changing page geometry.
Remove browser URL/date metadata Print-dialog header/footer setting Browser-generated content is separate from author CSS.
Add a running label or page counter Page-margin boxes where supported Requires browser support and still needs testing.
Independent reader supportYour contribution helps us test, update, and keep practical guides available for everyone.Support on Ko-Fi

Or skip the browser setup

If your goal is to capture a rendered URL rather than maintain a print stylesheet, ScreenshotNeo provides a website screenshot API and MCP server. 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 cost nothing, and response headers identify the page verdict and whether it was billed. Its MCP server exposes take_screenshot, get_page_info, and capture_pdf for Claude, Cursor, and other MCP clients.

For a direct image request, see the ScreenshotNeo API documentation:

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.
curl -G "https://api.screenshotneo.com/v1/shot" -d access_key=YOUR_API_KEY --data-urlencode url=https://stripe.com -o shot.webp

Python:

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)

Node.js:

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 per month with no card. Paid plans start at $5 for 3,000 screenshots, and every feature is included on every plan. Sign up for ScreenshotNeo.

Cost, caching, and reliability considerations

For browser printing, the main variables are the browser version, print settings, fonts, and the PDF destination. Re-render the same document in the target workflow after changing page rules; a preview from one browser is not proof that another generator will paginate identically.

For ScreenshotNeo requests, caching can be configured with a TTL, and asynchronous jobs support signed webhooks. Bulk capture supports up to 100 URLs per call. These controls are useful when generating many stable documents, while cache hits are identified as non-billed responses.

FAQ

Can I use only padding and leave @page at zero?

Yes, when the inset is intentionally local to an HTML wrapper. It will not guarantee a safe distance from the physical paper edge or a printer’s non-printable area.

Special offer. See more information about Outbyte and uninstall instructions. Please review EULA and Privacy policy.

Does enabling background graphics change content placement?

No. Background printing affects whether backgrounds are rendered; it does not define the position of text or other descendants.

Will the same CSS produce identical pagination everywhere?

No. Browser engines, PDF generators, fonts, printer drivers, and dialog settings can differ. Validate the actual delivery path.

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.