Google 크롬 인쇄 페이지 나누기


110

페이지 나누기를 할 수 있도록 Google 크롬을 얻으려고합니다.

나는 page-break-after: always;크롬에서 유효한 많은 웹 사이트를 통해 들었지만 아주 간단한 예제로도 작동하지 않는 것 같습니다. 크롬으로 인쇄 할 때 강제로 페이지를 나누는 방법이 있습니까?


이 비교적 최근 (2014 년 2 월)이있는 웹킷 버그 트래커에 (오래된 2005 버그 티켓에) 논의 된 것으로 보인다 bugs.webkit.org/show_bug.cgi?id=5097
알렉스 KeySmith

답변:


134

Chrome을 포함한 모든 주요 브라우저에서 다음 접근 방식을 성공적으로 사용했습니다.

<!DOCTYPE html>

<html>
  <head>
    <meta http-equiv="content-type" content="text/html;charset=UTF-8" />
    <title>Paginated HTML</title>
    <style type="text/css" media="print">
      div.page
      {
        page-break-after: always;
        page-break-inside: avoid;
      }
    </style>
  </head>
  <body>
    <div class="page">
      <h1>This is Page 1</h1>
    </div>
    <div class="page">
      <h1>This is Page 2</h1>
    </div>
    <div class="page">
      <h1>This is Page 3</h1>
    </div>
  </body>
</html>

이것은 단순화 된 예입니다. 실제 코드에서 각 페이지 div에는 더 많은 요소가 포함됩니다.


4
아 내 생각 엔 내 문제가 보인다. <br/> 태그와 함께 사용하려고했습니다
Mike Valstar

@Mike 문제에 답 해주셔서 감사합니다. br이 작동하지 않고 div가 작동하는 이유는 확실하지 않지만 그럼에도 불구하고 쉽게 변경됩니다.
Jeff Davis

이것은 부모 페이지에서 사용하려고 할 때 작동하지만 iframe에서 인쇄 할 때는 작동하지 않습니다 (물론 크롬에서).
VJ 2014

또한 아래 @peter의 답변을 읽으십시오. 그는 또한에 대해 좋은 지적을했다 position: relative.
doub1ejack 2014 년

6
스펙에 따르면 break-afterbreak-before에만 적용 block-level elements, table row groups, table rows (but see prose): drafts.csswg.org/css-break-3/#break-between - 수단이없고 수레 또는 공상 위치 트릭.
Mikko Rantalainen

34

실제로 (Phil Ross에서) 수락 된 것으로 선택된 답변에서 하나의 세부 사항이 누락되었습니다 ....

그것은 합니까 크롬에서 일을하고, 해결책은 정말 바보 !

페이지 구분을 제어하려는 부모와 요소는 모두 다음과 같이 선언되어야합니다.

position: relative

이 바이올린을 확인하십시오 : http://jsfiddle.net/petersphilo/QCvA5/5/show/

다음의 경우에 해당됩니다.

page-break-before
page-break-after
page-break-inside

그러나 Safari에서 페이지 나누기 내부 제어가 작동하지 않습니다 (최소한 5.1.7에서).

이게 도움이 되길 바란다!!!

추신 : 아래의 질문은 최신 버전의 Chrome이 더 이상이를 존중하지 않는다는 사실을 제기했습니다. 장난. 그러나 그들은 다음을 존중하는 것 같습니다.

-webkit-region-break-inside: avoid;

이 바이올린 참조 : http://jsfiddle.net/petersphilo/QCvA5/23/show

그래서 지금 추가해야 할 것 같아요 ...

도움이 되었기를 바랍니다!


Chrome에서 작동하는지 여부에 따라 사용되는 WebKit 버전에 따라 다릅니다. 당신은 사파리 5.1.7에서 작동하지 않는다고 말 했으므로 전혀 어리석은 것 같지 않습니다. 테스트 한 WK 버전은 테스트 한 버전과 다를 수 있습니다.
Joel Peltonen 2012 년

이 페이지는 Chrome 26.0.1410.65에서 작동하지 않습니다. 3 페이지가 나오고 마지막 페이지에는 한 단어 만 있습니다.) 또한 규칙을 적용하려는 요소와 부모가 내 페이지에서 position : relative를 가지고 있는지 확인했지만 인쇄 할 때 페이지 나누기를 추가하지 않습니다. 그렇다면 이것이 Chrome에서 제공되는 기능입니까?
Joe Dyndale

맞아요 .... 최신 버전의 크롬에서는 작동하지 않는 것 같습니다. 그러나 다음으로 대체 할 수 있습니다. -webkit-region-break-inside : avoid; (참조 : jsfiddle.net/QCvA5/22/show )
Peter

@Peter 여기에 업데이트가 있습니까? 나는 내가 사용하는 상황을 해결하기 위해 현상금과 함께 SO 질문게시했습니다page-break-inside . 도움이 필요하세요?
Zach Saucier

1
이것은 한 가지 이상한 점으로 나를 위해 일했습니다-스타일을 인라인으로 넣을 때만 작동하며 별도의 CSS 파일에는 없습니다. h7 요소에서 사용하고 있습니다. Chrome 버전은 38.0.2125.111m입니다. <h7 class="page-breaker" style="display: block;position: relative;page-break-before:always">Grade <?php echo $grade;?></h7>
Gavin Simpson

16

Chrome은 플로팅 된 div의 page-break- * css 설정도 무시한다는 점에 유의하고 싶었습니다.

나는 CSS 사양 어딘가에 이것에 대한 타당한 정당성이 있다고 생각하지만 언젠가 누군가에게 도움이 될 것이라고 생각했습니다 ;-)

또 다른 참고 사항 : IE7은 이전 블록 요소에 대한 명시적인 높이없이 페이지 나누기 설정을 인식 할 수 없습니다.

http://social.msdn.microsoft.com/forums/en-US/iewebdevelopment/thread/fe523ec6-2f01-41df-a31d-9ba93f21787b/


2
요소를 플로팅하면 절대 위치 지정과 동일한 방식으로 요소를 문서 흐름에서 제거하기 때문일 수 있습니다. position : absolute가있는 요소는 page-break- *에서 작동하지 않습니다.
Joe Dyndale

1
또한 페이지 나누기 스타일을 사용하는 요소의 모든 부모 사이에 부동 또는 절대 위치 요소가 있어서는 안됩니다. 부트 스트랩 "col-xs-12"부모가 있었는데 "float : none"을 명시 적으로 설정했을 때 페이지 나누기가 작동하기 시작했습니다!
Stalinko

12

이와 비슷한 문제가 있었지만 결국 해결책을 찾았습니다. 나는 overflow-x : 숨김; <html> 태그에 적용되었으므로 DOM에서 아래에서 무엇을하든 페이지 나누기를 허용하지 않습니다. overflow-x 로 되 돌리면 : visible; 잘 작동했습니다.

바라건대 이것은 누군가를 도울 것입니다.


특정 오버플로 속성이있는 모든 부모 요소가이 문제를 일으킬 수 있습니다. 방금 규칙을 추가했습니다 * { overflow-x: visible }.
Garrett

10

이 문제를 직접 겪고 있습니다. 내 페이지 나누기는 Chrome을 제외한 모든 브라우저에서 작동하며 테이블 셀 내부에있는 페이지 나누기 이후 요소로 격리 할 수있었습니다. (CMS의 이전, 상속 된 템플릿)

분명히 Chrome은 테이블 셀 내부의 page-break-before 또는 page-break-after 속성을 존중하지 않으므로이 수정 된 버전의 Phil 예제에서는 동일한 페이지에 두 번째 및 세 번째 헤드 라인을 넣습니다.

<!DOCTYPE html>

<html>
  <head>
    <meta http-equiv="content-type" content="text/html;charset=UTF-8" />
    <title>Paginated HTML</title>
    <style type="text/css" media="print">
      div.page
      {
        page-break-after: always;
        page-break-inside: avoid;
      }
    </style>
  </head>
  <body>
    <div class="page">
      <h1>This is Page 1</h1>
    </div>

    <table>
    <tr>
        <td>
            <div class="page">
              <h1>This is Page 2</h1>
            </div>
            <div class="page">
              <h1>This is, sadly, still Page 2</h1>
            </div>
        </td>
    </tr>
    </table>
  </body>
</html>

CSS 사양을 고려할 때 Chrome의 구현은 (의심스럽게도) 허용됩니다. 자세한 내용은 http://www.google.com/support/forum/p/Chrome/thread?tid=32f9d9629d6f6789&hl=ko에서 확인할 수 있습니다.


이것은 내 문제였습니다. SharePoint 2007의 레이아웃에 표 셀을 사용하도록 강요했기 때문에 Chrome은 인쇄 스타일 시트 레이아웃 선언을 따르고있었습니다 :(
Dexter

8

CSS주의 : display:inline-block인쇄 할 때.

내 테이블이 스타일이있는 div 내부에 있으면 다음 페이지로 이동할 CCS 속성이 Chrome 및 Firefox에서 작동하지 않습니다. display:inline-block

예를 들어 다음은 작동하지 않습니다.

<div style='display:inline-block'>
  <table style='page-break-before:always'>
    ...
  </table>
  <table style='page-break-before:always'>
    ...
  </table>
</div>

그러나 다음 작업 :

<div>
  <table style='page-break-before:always'>
    ...
  </table>
  <table style='page-break-before:always'>
    ...
  </table>
</div>

1
그리고 "float"도 마찬가지입니다. 부모 요소에는 "float"속성이 없어야합니다.
짐바 타망

2
동일display: flex
Michael Schmid

4

나는 전에 크롬 에서이 문제에 직면했고 그 원인은 div가 최소 높이를 값으로 설정했기 때문입니다. 해결책은 다음과 같이 인쇄하는 동안 최소 높이를 재설정하는 것이 었습니다.

@media print {
    .wizard-content{
        min-height: 0;
    }
}

3

2016 업데이트 :

글쎄, 나는이 문제가 생겼습니다.

overflow:hidden

내 div.

내가 만든 후

@media print {
   div {
      overflow:initial !important
   }
}

모든 것이 잘되고 완벽 해졌습니다.


1
이것은 다른 조치가 없었을 때 문제를 해결했습니다. 감사!
bstory

1

Bootstrap Css와 함께 Chrome을 사용하는 경우 격자 레이아웃을 제어하는 ​​클래스 (예 : col-xs-12 등)는 "float : left"를 사용하여 다른 사람들이 지적했듯이 페이지 나누기를 망칩니다. 인쇄를 위해 페이지에서 제거하십시오. 그것은 나를 위해 일했습니다. (Chrome 버전 = 49.0.2623.87)


0

그 문제가 있습니다. 너무 오랜 시간이 지남 ... 페이지의 사이드 필드가 없으면 정상적인 중단이지만 필드가 나타나면 페이지와 "페이지 나누기 공간"이 확장됩니다. 따라서 문서 내에서 일반 필드의 경우 잘못 표시되었습니다. 세트로 고정

    width:100%

그리고 사용

div.page
  {
    page-break-before: always;
    page-break-inside: avoid;
  }

첫 번째 줄에 사용하십시오.


0

내가 아는 한 Google 크롬을 사용하여 테이블에서 올바른 페이지 나누기를 얻는 유일한 방법은 요소 <tr>에 속성 display : inline-table (또는 display : inline-block하지만 테이블이 아닌 다른 경우에 더 적합 함)을 제공하는 것입니다. ). 또한 "page-break-after : always; page-break-inside : avoid;"속성을 사용해야합니다. @Phil Ross 작성

<table>
  <tr style="display:inline-table;page-break-after: always; page-break-inside: avoid;">
    <td></td>
    <td></td>
    ...
  </tr>
</table>

1
tds 내부의 여백 / 패딩을 깨지 않기 위해 이것을 얻는 힌트가 있습니까?
joeforker

@joeforker "padding : 0; margin : 0;"과 함께 <tr>을 사용해야합니다. 그 안에 포함 된 요소에 여백 속성을 부여합니다.
Codekraft

-2

패딩을 사용할 때 다음과 같이 작동했습니다.

<div style="padding-top :200px;page-break-inside:avoid;">
   <div>My content</div>
</div>

이것은 페이지 나누기 때문이 아니라 패딩 때문에 작동했습니다
Char
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.