CSS transform:scale() 和打印到 PDF 损坏

CSS transform:scale() and print to PDF broken

提问人:Marc Polizzi 提问时间:11/9/2023 最后编辑:Marc Polizzi 更新时间:11/18/2023 访问量:146

问:

我正在使用 Chrome 生成 PDF :一切正常,直到其中一些包含以下用于缩小其内容的 CSS 转换:divs

transform-origin: 0px 0px;
transform: scale(0.5);

此处提供了损坏页面的示例,完整代码可在本文末尾找到。

本示例创建两个页面;每页包含两个并排的页面,覆盖了每个页面的整个高度。使用 CSS 转换按比例缩小右侧的内容。在浏览器中一切看起来都不错。但是,在打印页面时(通过 Chrome 无头或通过浏览器打印功能),第一页上按比例缩小的高度是错误的(其内容已正确缩小)。LetterdivsLetterdivdiv

<html lang="en">
<head>
    <style>

        @page {
            margin: 0;
            padding: 0;
            size: Letter portrait;
        }

        body {
            overflow: auto;
            position: relative;
            margin: 0;
            padding: 0;
            border: 0;
            display: flex;
            flex-direction: column;
        }

        .page {
            overflow: hidden;
            position: relative;
            width: 8.5in;
            height: 11in;
            break-after: page;
        }

        .widget {
            position: absolute;
            left: 0px;
            top: 0px;
            width: calc(8.5in / 2);
            height: 11in;
        }

        .widgetScaled {
            opacity: 0.6;
            position: absolute;
            left: calc(8.5in / 2);
            top: 0px;
            width: calc(8.5in * 2);
            height: calc(11in * 2);
            transform-origin: 0px 0px;
            transform: scale(0.5);
        }

        .title {
            font-size: 96px;
        }

    </style>
</head>
<body>

<div class="page">
    <div class="widget" style="background-color: beige;">
        <span class="title">1</span>
    </div>
    <div class="widgetScaled" style="background-color: beige">
        <span class="title">1scaled</span>
    </div>
</div>

<div class="page">
    <div class="widget" style="background-color: lightblue;">
        <span class="title">2</span>
    </div>
    <div class="widgetScaled" style="background-color: lightblue;">
        <span class="title">2scaled</span>
    </div>
</div>

</body>
</html>

编辑:该问题仅发生在所有页面上,但最后一个页面除外,并且似乎仅与scaleY有关(scaleX似乎工作正常)。

HTML CSS Google-Chrome PDF 生成

评论


答:

0赞 Muzamil Khan 11/9/2023 #1

将位置从“widgetScaled”类更改为相对位置将解决此问题。

<html lang="en">
  <head>
    <style>
      @page {
        margin: 0;
        padding: 0;
        size: Letter portrait;
      }

      body {
        overflow: auto;
        position: relative;
        margin: 0;
        padding: 0;
        border: 0;
        display: flex;
        flex-direction: column;
      }

      .page {
        overflow: hidden;
        position: relative;
        width: 8.5in;
        height: 11in;
        break-after: page;
      }

      .widget {
        position: absolute;
        left: 0px;
        top: 0px;
        width: calc(8.5in / 2);
        height: 11in;
      }

      .widgetScaled {
        opacity: 0.6;
        position: relative;
        left: calc(8.5in / 2);
        top: 0px;
        width: calc(8.5in * 2);
        height: calc(11in * 2);
        transform-origin: 0px 0px;
        transform: scale(0.5);
      }

      .title {
        font-size: 96px;
      }
    </style>
  </head>
  <body>
    <div class="page">
      <div class="widget" style="background-color: beige">
        <span class="title">1</span>
      </div>
      <div class="widgetScaled" style="background-color: beige">
        <span class="title">1scaled</span>
      </div>
    </div>

    <div class="page">
      <div class="widget" style="background-color: lightblue">
        <span class="title">2</span>
      </div>
      <div class="widgetScaled" style="background-color: lightblue">
        <span class="title">2scaled</span>
      </div>
    </div>
    <div class="page">
      <div class="widget" style="background-color: beige">
        <span class="title">1</span>
      </div>
      <div class="widgetScaled" style="background-color: beige">
        <span class="title">1scaled</span>
      </div>
    </div>
  </body>
</html>

评论

0赞 Marc Polizzi 11/9/2023
不幸的是,小部件不能“相对”定位。
0赞 Marc Polizzi 11/18/2023 #2

根据 https://bugs.chromium.org/p/chromium/issues/detail?id=1501807 中提到的建议,以下方法解决了该问题:

.page {
   contain: size;
}