印刷中に最後に余分な空白ページを避ける方法は?


88

CSSプロパティを使用していますが、

使用する場合page-break-after: always;=>前に余分な空白ページを印刷します

page-break-before: always;=>を使用すると、後に余分な空白ページが印刷されます。これを回避する方法は?

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
<style type="text/css">
.print{
    page-break-after: always;

}
</style>
<script type="text/javascript">
window.print();
</script>
</head>
<body>
<div class="print">fd</div>
<div class="print">fdfd</div>
</body>
</html>

印刷クラスの高さはどれくらいですか?
juankysmith 2011年

1
これは請求書の場合であるため、アイテムの数に応じて高さが動的になります。
アンジェリンナダール2011年

4
これが私たちが冷戦でそれをした方法です:<div>This page intentionally left blank.</div>
ボブスタイン

回答:


72

あなたは多分追加することができます

.print:last-child {
     page-break-after: auto;
}

したがって、最後のprint要素は余分な改ページを取得しません。

ブラウザーのその惨めさをターゲットにしている場合、IE8では:last-childセレクターはサポートされていないことに注意してください。


88
「IEではサポートされていません」としては、IEのdafault機能です
Angelin Nadar

他の読者にとっては、これは私にはうまくいきませんでしたが、HTMLとbody要素に自動高さを設定するという以下の答えは魅力のように機能しました。
コーディ

101

これを試しましたか?

@media print {
    html, body {
        height: 99%;    
    }
}

2
私が働いたのは:@media print {html {height:99%; }}、作成されたドキュメントの本文が大きかった
Gustavo

10
私の場合、ZurbFoundationはhtmlとbodyをに設定していましたheight: 100%。私はこれを次のようにオーバーライドすることができましたheight: auto
zacharydl 2014年

4
@zacharydlのコメントが私にとって有効でheight: auto;あり、それよりもエレガントであることを確認するheight: 99%;
jontsai 2015年

スクロールバーを常に表示するようにHTMLの高さを101%に設定していたため、この問題が発生しました。(ページ間のジャンプを排除します)-そうです、印刷スタイルの100%の高さはおいしい修正です!-乾杯。
rob_james 2016年

@rob_jamesは、101%の使用を避けるために、overflow-yを設定できます:scroll; 常にスクロールバーを表示するには
user161592 2016

46

ここで説明されている解決策は私を助けました(webarchiveリンク)。

まず、すべての要素に境界線を追加して、新しいページが追加される原因を確認できます(余白、パディングなど)。

div { border: 1px solid black;}

そして、解決策自体は、次のスタイルを追加することでした。

html, body { height: auto; }

9
うわー、これは私の古いブログでした!私は同じ問題を抱えていて、これは一度修正したと思っていました^^小さな世界
Miguel Stevens

3
プラス1はdivボーダーを追加します。
iftikhar Ali Ansari 2017

ボーダーを追加するのはとても素晴らしいアイデアでした!ページラッパーに最小の高さが設定されていて、余分なページが表示されていることに気づきました。私はしばらくの間これに頭をぶつけていました。どうもありがとうございます!
erichunt

33

これらのどれも機能しない場合は、これを試してください

@media print {

    html, body {
      height:100vh; 
      margin: 0 !important; 
      padding: 0 !important;
      overflow: hidden;
    }

}

100vhであることを確認してください


4
高さを100vhに設定すると、問題が解決しました。ありがとう
user2398069 2018

1
「@mediaprint {* {overflow:hidden!important;}}」は私にとって非常に重要です。
shinriyo

1
最後に、あいまいな問題への答え!OSX上のSafariは完全に空白のページを表示していましたが、Chrome、FF Edgeはすべてプレビューに適しています。どうもありがとう!
ポップ

高さを100vhに設定すると、複数のページが読み込まれないように見えるため、ドキュメントに複数のページがある場合、プレビューでは最初のページのみが読み込まれます
Filipe


5

CSSを使用したいだけで改ページを避けたい場合は、

.print{
    page-break-after: avoid;

}

ページングされたメディアを見てください

pageBreakBeforeとpageBreakAfterに相当するスクリプトを使用して、それらの値を動的に割り当てることができます。たとえば、訪問者にカスタム改ページを強制する代わりに、これをオプションにするスクリプトを作成できます。ここでは、ヘッダーでのページのスライス(h2)とプリンター独自の裁量(デフォルト)を切り替えるチェックボックスを作成します。

<form name="myform">
<input type="checkbox" name="mybox" onClick="breakeveryheader()">
</form>

<script type="text/javascript">
 function breakeveryheader(){
 var thestyle=(document.forms.myform.mybox.checked)? "always" : "auto"
 for (i=0; i<document.getElementsByTagName("H2").length; i++)
 document.getElementsByTagName("H2")[i].style.pageBreakBefore=thestyle
 }

クリックしてここにこれを使用しています例えば。スクリプト内のH2を、PやDIVなどの別のタグに置き換えることができます。

http://www.javascriptkit.com/dhtmltutors/pagebreak.shtml


4

(今のところ)理由はわかりませんが、これは役に立ちました:

   @media print {
        html, body {
            border: 1px solid white;
            height: 99%;
            page-break-after: avoid;
            page-break-before: avoid;
        }
    }

問題と戦っている間誰かが彼の髪を救うことを願っています...;)


4

考えられる原因はたくさんあるようですが、おそらくテーマは、bodyタグの高さがw / eの理由で高すぎると見なされることです。

私の原因:min-height: 100%基本スタイルシート。

私の解決策:min-height: auto@media printディレクティブ。

autoPhpStormによると、正しい値ではないようであることに注意してください。ただし、最小の高さに関するMozillaのドキュメントによると正しいです:

auto
フレックスアイテムのデフォルトの最小サイズ。他のレイアウトでは0よりも妥当なデフォルトを提供します。


'min-height:initial!important;'を入力します。そしてそれは私のために働いた。
Siby Thomas 2016

@SibyThomas可能な限り、!important宣言は避けます。プロパティをオーバーライドするのが難しくなります。initial動的なサイズの要素では問題があると思っていたので、考慮すらしませんでした。初期値は0なので、それでもauto一般的にはもっと便利だと思います。
ジョージ・

3

display:none印刷用ではない他のすべての要素に設定されます。設定visibility:hiddenはそれらを隠しておきますが、それらはすべてまだそこにあり、それらのためにスペースを取りました。空のページはそれらの隠された要素のためのものです。


3

私の場合、すべてのdivに幅を設定すると次のようになりました。

.page-content div {
    width: auto !important;
    max-width: 99%;
}


3

同様の問題が発生しましたが、原因はページの下部に40pxの余白があったためでした。そのため、最後のページにスペースがあったとしても、最後の行は常に折り返されていました。どんな種類のpage-break-*cssコマンドのためでもありません。印刷の余白を削除して修正しましたが、問題なく動作しました。他の誰かが似たようなものを持っている場合に備えて、私のソリューションを追加したかっただけです!


2

さまざまな改ページの設定と高さ、およびbodyタグの数百万のさまざまなCSSルールに苦労した後、1年以上後にようやく解決しました。

印刷するページに唯一のものと思われるdivがありますが、その後にいくつかの空白ページが表示されていました。私のbodyタグはに設定されてvisibility:hidden;いますが、それだけでは不十分でした。垂直方向に高いページ要素は依然として「スペース」を占めます。そこで、これを印刷CSSルールに追加しました。

#header, #menu, #sidebar{ height:1px; display:none;}

背の高いページレイアウト要素を含むIDで特定のdivをターゲットにします。高さを小さくしてから、レイアウトから削除しました。空白のページはもうありません。数年後、私はそれをクラックしたことをクライアントに伝えてうれしいです。これが誰かを助けることを願っています。


はい、使用visibility: hidden;する場合でもスペースを占有します。使用display: none;するとスペースが削除されます。その時点で、高さを具体的に設定する必要はありません。参考までに。
チャペルジュース2016年

2

Chromeにはバグがあるようで、特定の状況では、display:noneでロード後に要素を非表示にすると、多くの余分なスペースが残ります。ドキュメントのレンダリングが完了する前に、ドキュメントの高さを計算していると思います。Chromeは2つのメディア変更イベントも発生し、onbeforeprintなどをサポートしていません。これらは基本的に印刷の対象です。これが私の回避策です:

@media print {
    body {
        display: none;
    }
}

body.printing {
    display: block;
}

docreadyでbodyclass = "printing"を指定すると、印刷スタイルが有効になります。このシステムでは、印刷スタイルのモジュール化とブラウザ内の印刷プレビューが可能です。


1

このcssを同じページに追加して、cssファイルを拡張します。

<style type="text/css">
   <!--
   html, body {
    height: 95%; 
    margin: 0 0 0 0;
     }
   -->
</style>

1

私はすべての解決策を試しました、これは私のために働きます:

<style>
    @page {
        size: A4;
        margin: 1cm;
    }

    .print {
        display: none;
    }

    @media print {
        div.fix-break-print-page {
            page-break-inside: avoid;
        }

        .print {
            display: block;
        }
    }

    .print:last-child {
        page-break-after: auto;
    }
</style>

1

から変更するケースに遭遇しました

    </div>
    <script src="addressofjavascriptfile.js"></script>
</body>
</html>

        <script src="addressofjavascriptfile.js"></script>
    </div>
</body>
</html>

この問題を修正しました。


1
.print:last-child{
    page-break-after: avoid;
    page-break-inside: avoid;
    margin-bottom: 0px;
}

これは私のために働いた。


1

不思議なことに透明な境界線を設定すると、これが解決しました。

@media print {
  div {
    border: 1px solid rgba(0,0,0,0)
  }
}

たぶん、コンテナ要素に境界線を設定するだけで十分でしょう。<-Untestet。


0

いずれの回答もうまくいきませんでしたが、すべてを読んだ後、印刷したいHTMLページが1つあるのに、余分な白い空白ページが印刷されていた場合の問題がわかりました。レポートのページを印刷するためにAdminLTEブートストラップ3テーマを使用しており、その中にこのテキストをページの右下に配置したいフッタータグを使用しています。

誰かさんが印刷

以前の「著作権」フッターの代わりにjqueryを使用してそのテキストを配置しました

$("footer").html("Printed by Mr. Someone");

デフォルトでは、テーマのタグフッターは、属性を持つクラス.main-footerを使用します。

padding: 15px;
border-top: 1px solid 

それは余分な空白を引き起こしたので、問題を知った後、私はさまざまなオプションを持っていました、そして最良のオプションは使用することでした

$( "footer" ).removeClass( "main-footer" );

その特定のページだけで


0

必要なものをdivのページに配置し、そのdivでpage-break-inside:avoidを使用します。divは1ページに留まり、必要に応じて2ページ目または3ページ目に移動しますが、次のdivは、改ページを行う必要がある場合は、次のページから開始する必要があります。


0

下部のhtmlタグの後に空白がないか確認してください。下の空白を削除してください

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.