HTML'den yatay baskı


244

Birçok sütun nedeniyle yatay yazdırılması gereken bir HTML rapor var. Kullanıcının belge ayarlarını değiştirmek zorunda kalmadan bunu yapmanın bir yolu var mı?

Ve tarayıcılar arasındaki seçenekler nelerdir.

Yanıtlar:


379

CSS'nizde @page özelliğini aşağıda gösterildiği gibi ayarlayabilirsiniz.

@media print{@page {size: landscape}}

@ Sayfası, CSS 2.1 spesifikasyonunun bir parçasıdır ancak bu size, @Page {size: landscape} modası geçmiş mi? Sorusunun cevabı ile vurgulanmamıştır. :

CSS 2.1 artık boyut niteliğini belirtmiyor. CSS3 Sayfalı Ortam modülü için geçerli çalışma taslağı bunu belirtir (ancak bu standart veya kabul edilmez).

Belirtildiği gibi, boyut seçeneği CSS 3 Taslak Spesifikasyonundan gelir . Teorik olarak, örneklemde boyut atlanmasına rağmen, hem sayfa boyutuna hem de yönüne ayarlanabilir.

Firefox'ta dosyalamaya başlayan bir hata raporu ile destek çok karışık , çoğu tarayıcı bunu desteklemiyor.

IE7'de çalışıyor gibi görünebilir, ancak bunun nedeni IE7'nin kullanıcıların baskı önizlemesinde son yatay veya dikey seçimini hatırlayacağıdır (sadece tarayıcı yeniden başlatılır).

Bu makalede , ideal olmamasına ve tarayıcıların güvenlik ayarlarını değiştirmesine rağmen, kullanıcıların tarayıcısına anahtarlar gönderen JavaScript veya ActiveX kullanarak önerilen bazı çalışmalar vardır.

Alternatif olarak, sayfa yönü yerine içeriği döndürebilirsiniz. Bu, bir stil oluşturarak ve bu iki satırı içeren gövdeye uygulayarak yapılabilir, ancak bunun aynı zamanda birçok hizalama ve düzen sorunu yaratan geri çekimleri vardır.

<style type="text/css" media="print">
    .page
    {
     -webkit-transform: rotate(-90deg); 
     -moz-transform:rotate(-90deg);
     filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=3);
    }
</style>

Bulduğum son alternatif, PDF'de bir yatay sürüm oluşturmaktır. Kullanıcı yazdırmayı seçtiğinde PDF'yi yazdırır. Ancak bunu IE7 otomatik yazdırma çalışması için alamadım.

<link media="print" rel="Alternate" href="print.pdf">

Sonuç olarak, bazı tarayıcılarda @sayfa boyutu seçeneğini kullanmak görelilik kolaydır, ancak birçok tarayıcıda kesin bir yol yoktur ve içeriğinize ve ortamınıza bağlı olacaktır. Bu nedenle, Google Dokümanlar yazdırma seçildiğinde bir PDF oluşturur ve kullanıcının bunu açıp yazdırmasına izin verir.


28
'boyut'un' aslında bir 'yönelim' olduğu zaman peyzaj olabileceğini söylemesi tuhaf.
Magnus Smith

1
@page sizeTüm modern tarayıcılarda çalışmıyor gibi görünüyor, sadece Firefox. Chrome ve Opera, gördüğüm kadarıyla bunu görmezden geliyorlar.
Justin808

2
size: landscapeolduğu DEĞİL rağmen CSS2.1 parçası @pagekurallardır. Bununla birlikte, CSS3'ün bir parçasıdır. Onaylamak için W3C CSS Doğrulayıcı'yı kullanmayı deneyin @page {size: landscape}ve sonuçları 3. seviyeye kıyasla seviye 2.1'e ayarlanmış "Profil" ile girin ve karşılaştırın.
daiscog

1
Sayfanın 100 genişliğini veya yüksekliğini kaplayan bir div varsa, döndürme div'in bir dikey sayfanın alanını kaplamasını değil, bir yatay görüntüyü döndürmesini sağlar. Div'in bazı bölümleri sayfa dışına çıkar.
Oliver

6
@AbeerSul - CSS konusunda, dürüst olmak gerekirse ne yapar IE işi;)
Tony

27

Çözümüm:

<style type="text/css" media="print">
    @page { 
        size: landscape;
    }
    body { 
        writing-mode: tb-rl;
    }
</style>

Bu çalışır IE, FirefoxveChrome


1
Belirli bir classdiv öğesinin sayfanın tamamında değil manzarada olmasını istersem ne olur ?
SearchForKnowledge

2
@SearchForKnowledge - bu css3'ün dönüşümü olurdu: rotate (90deg).
ToolmakerSteve

Neyi yanlış yaptığımı anlamadım, ancak bu tüm sayfayı kromda kırıyor. @Media print {@page {size: portrait;} body {write-mode: tb-rl;}}
X-HuMan

Benim için sadece bu @page {size: landscape; } İşler.
Kumar M

1
2018'de hala standart WebBrowers bileşenleri ile harika çalışıyor. Teşekkürler.
Ken Bekov

14

Yalnızca sayfa içeriğini döndürmek yeterli değildir. İşte en çok tarayıcıda (Chrome, Firefox, IE9 +) çalışan doğru bir CSS.

İlk önce gövdeyi margin0 olarak ayarlayın , aksi takdirde sayfa kenar boşlukları yazdırma iletişim kutusunda ayarladığınızdan daha büyük olacaktır. Ayrıca backgroundsayfaları görselleştirmek için renk ayarlayın .

body {
  margin: 0;
  background: #CCCCCC;
}

margin, borderve backgroundsayfaları görselleştirmek için gereklidir.

paddinggerekli yazdırma kenar boşluğuna ayarlanmalıdır. Yazdır iletişim kutusunda aynı kenar boşluklarını ayarlamanız gerekir (bu örnekte 10 mm).

div.portrait, div.landscape {
  margin: 10px auto;
  padding: 10mm;
  border: solid 1px black;
  overflow: hidden;
  page-break-after: always;
  background: white;
}

A4 sayfasının boyutu 210mm x 297mm'dir. Yazdırma kenar boşluklarını boyuttan çıkarmanız gerekir. Ve sayfa içeriğinin boyutunu ayarlayın:

div.portrait {
  width: 190mm;
  height: 276mm;
}
div.landscape {
  width: 276mm;
  height: 190mm;
}

Farklı tarayıcılar sayfaları biraz farklı ölçeklendirdiğinden, 277 mm yerine 276 mm kullanıyorum. Bazıları 277 mm yüksekliğinde içeriği iki sayfaya yazdıracak. İkinci sayfa boş olacaktır. 276mm kullanmak daha güvenlidir.

Biz herhangi bir ihtiyacımız yok margin, border, padding, backgroundböylece bunları kaldırmak, yazdırılan sayfada:

@media print {
  body {
    background: none;
    -ms-zoom: 1.665;
  }
  div.portrait, div.landscape {
    margin: 0;
    padding: 0;
    border: none;
    background: none;
  }
  div.landscape {
    transform: rotate(270deg) translate(-276mm, 0);
    transform-origin: 0 0;
  }
}

Dönüşümün kökeni olduğunu unutmayın 0 0! Ayrıca yatay sayfaların içeriği 276 mm aşağı kaydırılmalıdır!

Ayrıca portre ve peyzaj sayfalarının bir karışımı varsa IE sayfaları uzaklaştırır. -ms-zoom1.665 olarak ayarlayarak düzeltiyoruz. 1.6666 veya bunun gibi bir şeye ayarlarsanız, sayfa içeriğinin sağ kenarlığı bazen kırpılabilir.

Eğer IE8- gerek ya da diğer eski tarayıcıları kullanabilirsiniz desteklerse -webkit-transform, -moz-transform,filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=3) . Ancak yeterince modern tarayıcılar için gerekli değildir.

İşte bir test sayfası:

<!DOCTYPE HTML>
<html>
  <head>
    <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
    <style>
      ...Copy all styles here...
    </style>
  </head>
  <body>
    <div class="portrait">A portrait page</div>
    <div class="landscape">A landscape page</div>
  </body>
</html>

Çok teşekkür ederim, hem manzara hem de portre modlarının bir karışımından oluşan web sayfaları ile bir cazibe (kullanılan krom) gibi çalışır.
zcahfg2

Div.portrait, div.landscape nereden geliyor?
zcahfg2

Bu IE 11'de herkes için çalıştı mı? Tüm elemanlar kapalı görünüyor.
mzonerz

1
@mzonerz IE 11'de test ettim, iyi çalışıyor. Cevabın sonuna bir test html ekledim. Yazdırma ayarlarında sayfa kenar boşluklarını 10 mm olarak ayarlamanız gerektiğini lütfen unutmayın. Farklı bir sayfa kenar boşluklarına ihtiyacınız varsa, aşağıdaki değerleri güncellemeniz gerekir: dolgu: 10mm; genişlik: 190mm; yükseklik: 190mm;
Denis

@Denis Çabalarınız için teşekkür ederim .. Aslında bu benim için şimdiye kadar çalışan tek çözüm .. güzel !!, Bu çözümü sharepoint Intranet sitelerine entegre eden kişilerin Uyumluluk Görünümü Ayarlarını kapatmaları gerekebilir.
mzonerz

13

Alıntı sahibi CSS-Discuss Wiki

@Page kuralı, kapsam olarak CSS2'den CSS2.1'e düşürüldü. Tam CSS2 @ sayfası kuralının yalnızca Opera'da (ve o zaman bile buggily) uygulandığı bildirildi. Kendi testlerim IE ve Firefox'un @ sayfasını hiç desteklemediğini gösteriyor. Şimdi eskimiş olan CSS2 spec bölüm 13.2.2'ye göre, kullanıcının Manzara'daki yönelim ayarını ve (örneğin) baskı baskısını geçersiz kılmak mümkündür, ancak ilgili "boyut" özelliği, gerçeğe uygun olarak CSS2.1'den çıkarılmıştır. mevcut tarayıcının desteklemediğini. CSS3 Paged Media modülüne eski haline getirildi, ancak bunun sadece bir Çalışma Taslağı olduğuna dikkat edin (Temmuz 2009'da olduğu gibi).

Sonuç: şu an için @sayfayı unutun. Belgenizin Yatay yönde yazdırılması gerektiğini düşünüyorsanız, tasarımınızı daha akıcı hale getirip getiremeyeceğinizi kendinize sorun. Gerçekten yapamıyorsanız (örneğin, belgede çok sayıda sütun içeren veri tabloları bulunduğundan), kullanıcıya yönlendirmeyi Yatay olarak ayarlamasını ve belki de en yaygın tarayıcılarda nasıl yapılacağını ana hatlarıyla bildirmeniz gerekir. Tabii ki, bazı tarayıcılarda bir baskı sığdır (sığdır-küçült) özelliği vardır (örneğin Opera, Firefox, IE7), ancak bu tesise sahip olan veya açık olan kullanıcılara güvenmek tavsiye edilmez.


4
Bu "Wikipedia" değil, "CSS-Tartışma Wiki'si" dir.
jball

12

Bunu CSS'nizi eklemeyi deneyin:

@page {
  size: landscape;
}

2
Bu, herhangi bir tarayıcıda işe yaradı mı? IE8 ve Firefox3.5 ile baskı önizlemesinde herhangi bir fark yaratmadı.
Daniel Ballinger

Baskı önizleme maalesef tüm CSS özelliklerine uymuyor. Ancak bu, mevcut tüm tarayıcılarda çalışmalıdır.
gizmo

Bunu takip ettiğiniz için teşekkürler. Gerçek baskı ile benim için çalışmıyor gibi görünüyor. Bir şey kaçırdım mı? Test dosyam aşağıdaki gibidir: (Paragraf içeriğini yorum kutusuna sığacak şekilde kısaltmak zorunda kaldım) <html> <head> <title> Yatay test Sayfası </title> <style> @Page {size: landscape; } </style> </head> <body> <p> Lorem ipsum dolor sit amet, ... </p> </body> </html>
Daniel Ballinger

Bu sayfada ve diğer sitelerden gösterilen @Page kuralının her kombinasyonunu ve O'Reilly'nin HTML / XHTML: The Definitive Guide, Fifth Edition'daki örneği denedim. Bunu IE8, Firefox 3.6 veya Chrome 7.0'da çalıştıramadım.
Paul Keister

Ben onun 2012 biliyorum ... ama bu cevap bana ... IE8 için manzara seçeneğini desteklemek için yardımcı oldu ... teşekkürler
Vikram

11

sizeÖzelliği belirtildiği gibi peşindeler şeydir. Yazdırırken sayfanızın yönünü ve boyutunu ayarlamak için aşağıdakileri kullanabilirsiniz:

/* ISO Paper Size */
@page {
  size: A4 landscape;
}

/* Size in mm */    
@page {
  size: 100mm 200mm landscape;
}

/* Size in inches */    
@page {
  size: 4in 6in landscape;
}

İşte @page belgelerine bir bağlantı .


Önyükleme ile kullanıldığında, bu bildirimin ayrı bir .cssdosyada saklanması gerekir ya da satır içi ise, varsayılan boostrap bildirimi ( size: a3) öncelikli olur.
caram


5

Standart olmayan yalnızca IE için css niteliği yazma modunu da kullanabilirsiniz

div.page    { 
   writing-mode: tb-rl;
}

1
Bu, sayfa içeriğini yeniden yönlendirir, ancak sayfa düzenini gerçekten yatay olarak değiştirmez. Yani üstbilgiler ve altbilgiler yine de sayfa dikeymiş gibi eklenecektir.
Daniel Ballinger

2
-webkit-transform: rotate(-90deg); -moz-transform:rotate(-90deg);
     filter:progid:DXImageTransform.Microsoft.BasicImage(rotation=3);

Firefox 16.0.2'de çalışmıyor ancak Chrome'da çalışıyor


2

Yatay ayarlı boş bir MS Belgesi oluşturdum ve sonra not defterinde açtım. Aşağıdaki kopyalandı ve html sayfama yapıştırıldı

<style type="text/css" media="print">
   @page Section1
    {size:11 8.5in;
    margin:.5in 13.6pt 0in 13.6pt;
    mso-header-margin:.5in;
    mso-footer-margin:.5in;
    mso-paper-source:4;}
div.Section1
    {page:Section1;}
</style>



<div class="Section1"> put  text / images / other stuff  </div>

Baskı önizleme sayfaları yatay boyutta gösterir. Bu FF üzerinde test edilmemiş IE ve Chrome'da iyi çalışıyor gibi görünüyor.


1

Bu sorunu bir kez çözmeye çalıştım, ancak tüm araştırmalarım beni ActiveX denetimlerine / eklentilerine yönlendirdi. Tarayıcıların (3 yıl önce zaten) herhangi bir yazdırma ayarını (kopya sayısı, kağıt boyutu) değiştirmesine izin verdiği bir hile yoktur.

Çabaları tarayıcı yazdırma iletişim kutusu görüntülendiğinde "manzara" seçmeleri gerektiğini dikkatle uyarıyorum. Ayrıca, IE6'nın yaptığından çok daha iyi çalışan bir "baskı önizleme" sayfası oluşturdum! Uygulamamız bazı raporlarda çok geniş veri tablolarına sahipti ve baskı önizlemesi, tablonun kağıdın sağ kenarından ne zaman döküleceğini (IE6 ya da 2 kağıda yazdırma ile başa çıkamadığından) kullanıcılara açıkça gösterdi.

Ve evet, insanlar şu an bile IE6 kullanıyor.


1
<style type="text/css" media="print">
.landscape { 
    width: 100%; 
    height: 100%; 
    margin: 0% 0% 0% 0%; filter: progid:DXImageTransform.Microsoft.BasicImage(Rotation=1); 
} 
</style>

Bu stilin bir tabloya uygulanmasını istiyorsanız, bu stil sınıfıyla bir div etiketi oluşturun ve bu div etiketine tablo etiketini ekleyin ve sonunda div etiketini kapatın.

Bu tablo yalnızca yatay olarak yazdırılır ve diğer tüm sayfalar yalnızca dikey modda yazdırılır. Ancak sorun, tablo boyutu sayfa genişliğinden fazlaysa, bazı satırları kaybedebiliriz ve bazen üstbilgiler de kaçırılır. Dikkatli ol.

İyi günler.

Teşekkürler, Naveen Mettapally.


1
Bu, ekranın içeriğini 90 derece döndürür, ancak çıktı yine de protrait biçiminde çıkar. Her iki dünyanın da en kötüsü, en azından ie8.
arame3333

1

Denis'in cevabını denedim ve bazı sorunlara çarptım (yatay sayfalar gittikten sonra portre sayfaları düzgün yazdırılmadı), işte benim çözümüm:

body {
  margin: 0;
  background: #CCCCCC;
}

div.page {
  margin: 10px auto;
  border: solid 1px black;
  display: block;
  page-break-after: always;
  width: 209mm;
  height: 296mm;
  overflow: hidden;
  background: white;
}

div.landscape-parent {
  width: 296mm;
  height: 209mm;
}

div.landscape {
  width: 296mm;
  height: 209mm;
}

div.content {
  padding: 10mm;
}

body,
div,
td {
  font-size: 13px;
  font-family: Verdana;
}

@media print {
  body {
    background: none;
  }
  div.page {
    width: 209mm;
    height: 296mm;
  }
  div.landscape {
    transform: rotate(270deg) translate(-296mm, 0);
    transform-origin: 0 0;
  }
  div.portrait,
  div.landscape,
  div.page {
    margin: 0;
    padding: 0;
    border: none;
    background: none;
  }
}
<div class="page">
  <div class="content">
    First page in Portrait mode
  </div>
</div>
<div class="page landscape-parent">
  <div class="landscape">
    <div class="content">
      Second page in Landscape mode (correctly shows horizontally in browser and prints rotated in printer)
    </div>
  </div>
</div>
<div class="page">
  <div class="content">
    Third page in Portrait mode
  </div>
</div>



0

Yazdırmadan önce ekranda manzarayı görmek ve yazdırmak istiyorsanız, css'nizde genişliği 900 piksel ve yüksekliği 612 piksel olarak ayarlayabilirsiniz.

OP A4 boyutundan bahsetmedi. Yukarıdaki rakamlarımda bunun Letter boyutunda olduğunu düşünüyorum.


-1

Aşağıdakileri deneyebilirsiniz:

@page {
    size: auto
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.