Как использовать HTML для печати верхнего и нижнего колонтитула на каждой печатной странице документа?

Можно ли распечатать HTML-страницы с настраиваемыми верхними и нижними колонтитулами на каждой печатной странице?

Я хотел бы добавить слово «НЕКЛАССИФИЦИРОВАННОЕ» красным цветом, Arial, размером 16 пунктов вверху и внизу каждой напечатанной страницы, независимо от содержания.

Чтобы уточнить, если документ был напечатан на 5 страницах, каждая страница должна иметь настраиваемые верхний и нижний колонтитулы.

Кто-нибудь знает, возможно ли это с помощью HTML / CSS?


person Community    schedule 01.09.2009    source источник
comment
См. Вопросы и ответы Зачем использовать XSL-FO вместо CSS2 для преобразования HTML в хороший PDF?   -  person Peter Krauss    schedule 26.07.2012
comment
Это вопрос, на который я давно пытаюсь ответить. Похоже, ключом к проблеме будут элементы css, такие как page, top-center, content, position: running (..). Как это могло бы выглядеть, если бы браузеры полностью поддерживали @page: techrepublic.com/blog/webmaster/ alistapart.com/articles/boom alistapart.com / article / building-books-with-css3 Некоторые нерешенные вопросы: code.google.com/p/chromium/issues/detail?id=47277 bugs.webkit.org/show_bug.cgi?id=15548   -  person Daniel    schedule 29.11.2012
comment
Я опубликовал решение, совместимое с Chrome, здесь , который добавит бегущий заголовок к документам, не содержащим слишком больших участков текста. Однако для нижних колонтитулов все еще нет решения.   -  person DoctorDestructo    schedule 17.09.2014
comment
Комбинированное решение: методы pisition: fixed и thead tbody tfoot имеют недостатки, поэтому вам следует комбинировать их, подробнее см. здесь .   -  person Muhammad Musavi    schedule 15.04.2019
comment
@MohammadMusavi сразу после нескольких часов спотыкания. Я нашел эту статью (medium.com/@Idan_Co/), который подробно объясняет это и работает как шарм! Кому-то стоит подумать о том, чтобы написать на него ответ   -  person Hatzen    schedule 14.06.2020


Ответы (19)


Если вы возьмете элемент, который хотите сделать нижним колонтитулом, и установите для него position: fixed и bottom: 0, когда страница распечатывается, он будет повторять этот элемент внизу каждой напечатанной страницы. То же самое будет работать для элемента заголовка, просто установите вместо него top: 0.

Например:

<div class="divFooter">UNCLASSIFIED</div>

CSS:

@media screen {
  div.divFooter {
    display: none;
  }
}
@media print {
  div.divFooter {
    position: fixed;
    bottom: 0;
  }
}
person Infotekka    schedule 08.11.2010
comment
Кажется, не работает, если у вас есть элемент, который занимает две страницы (в моем случае pre) - нижний колонтитул будет перезаписан на нем. - person Benjol; 13.04.2011
comment
Да, к сожалению, это правда, поскольку вы используете фиксированное позиционирование для элемента нижнего колонтитула, он будет перекрывать любые элементы, которые работают под ним. Возможно, вам удастся немного настроить поля и попытаться расположить нижний колонтитул за пределами поля области содержимого, в которой находится ваша предварительная версия. - person Infotekka; 13.04.2011
comment
Похоже, что браузеры webkit не поддерживают это должным образом. Поправьте меня, если я ошибаюсь! - person Gregg Lind; 10.08.2011
comment
Кажется, это не повторяется на каждой странице. - person Tyson of the Northwest; 19.08.2011
comment
@ Тайсон это повторяется для меня в простом тесте. Какая у вас среда? Вы обязательно объявляете доктайп? - person Infotekka; 22.08.2011
comment
Каким типом документа я должен его объявить? Что-нибудь кроме ‹! DOCTYPE html›? - person Tyson of the Northwest; 25.08.2011
comment
Это должно быть хорошо. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> - это то, что у меня есть на моей тестовой странице. - person Infotekka; 26.08.2011
comment
я сделал заголовок, и он повторился. но он перекрывается с контентом из-за фиксированного положения. я могу настроить только содержимое первой страницы, но следующие по-прежнему перекрываются .. любое решение? - person Elliot Yap; 24.10.2011
comment
У меня это не сработало, я использую Chrome 15.0. Все, что он делает, это печатает элемент там, где он должен быть на экране, например. в середине страницы, если я прокрутил туда. Конечно, он не печатается на каждой странице. - person chharvey; 06.12.2011
comment
У меня тоже не сработало. У меня возникла та же идея, но она не сработала ни в одном браузере, который я пробовал: / - person Tokimon; 26.04.2012
comment
Я тестировал его в Firefox и Chrome. В Firefox это решение работает, в Chrome - нет. - person Jaro; 29.05.2013
comment
bugs.webkit.org/show_bug.cgi?id=17205 Открыт с 2008 год ... без прогресса. - person mspisars; 09.04.2014
comment
Все, кто комментирует, что это не сработало, как насчет того, чтобы предоставить версию браузера или дополнительную информацию о том, что вы сделали? - person WW.; 04.11.2015
comment
@Skelly, не могли бы вы упомянуть среду, она не работает для меня, либо у меня firefox 43.0.1 и chrome 47 - person Aamir Shahzad; 20.12.2015
comment
Повторение заголовков таблиц на печатных страницах было исправлено в Chrome в июне. 5, 2016. У меня версия 51.0.2704.103 на Mac OS X, и она работает. - person Ricardo; 05.07.2016
comment
@Infotekka На странице, над которой я работал, не было DOCTYPE, и добавление этого (с position: fixed и top: 0) дало мне желаемое поведение. Теперь мне просто нужно выяснить, как сделать так, чтобы он не перекрывал другие элементы на странице. - person JoeTron; 13.09.2016
comment
это не будет появляться на каждой странице. но всего один! - person pixparker; 01.11.2016
comment
Верхний и нижний колонтитулы отображаются не на каждой странице. Я хочу, чтобы это было на каждой странице. любое решение? - person Narayan; 24.07.2017
comment
У меня работает в последних версиях Chrome и Firefox, но не в IE / Edge (как удивительно). - person Samuil Petrov; 02.04.2018
comment
это сработало для меня, но проблема в том, что если за ним есть текст, он будет накладываться, а не подталкивать текст вниз - person dizad87; 25.09.2018
comment
@TysonoftheNorthwest вам также необходимо добавить позицию: относительно родителя нижнего колонтитула. - person aldobsom; 06.01.2020
comment
Тем, кто жаловался на перекрытие нижнего колонтитула содержимого: поместите div вокруг содержимого и добавьте margin-bottom, чтобы зарезервировать место для нижнего колонтитула. (Надеюсь, у вашего нижнего колонтитула фиксированная высота - если нет, вам не повезло ...) - person mindplay.dk; 08.09.2020

Я считаю, что правильный ответ заключается в том, что HTML 5 и CSS3 не поддерживают печать верхнего и нижнего колонтитулов страницы на print носителях.

И хотя вы могли бы смоделировать это с помощью:

  • столы
  • блоки с фиксированным положением

в каждом из них есть ошибки, которые не позволяют им быть идеальным общим решением.

person Ian Boyd    schedule 25.08.2011
comment
Не верьте другим ответам. Они могут работать в особых случаях, но в целом просто ужасно ломаются. Не существует надежного решения, пока поля @page не будут реализованы в основных браузерах. См .: en.wikipedia.org/wiki/ - person user2847643; 05.12.2014
comment
К сожалению, я должен проголосовать за это. Несмотря на то, что у нас 2018 год ... почему они не дают нам @footer с content:"stuff" или что-то подобное. - person Avatar; 14.01.2018
comment
Фактически на W3C разрабатывается спецификация для рассмотрения этих сценариев. - person Mendy; 15.01.2019
comment
Думаю, это лучший ответ. Проблема в производителях браузеров. Вы можете создавать красивые PDF-файлы вне браузера с помощью CSS Paged Media с помощью таких коммерческих инструментов (и есть другие): Antenna House antennahouse.com/formatter, Prince princexml.com. - person markg; 09.09.2019
comment
Я делаю это как комментарий, а не как ответ, поэтому, пожалуйста, не ударяйте меня OP не спрашивал .... Одна из возможностей - использовать генератор PDF, который позволяет вам устанавливать фиксированные верхние и нижние колонтитулы и отображать ваши просматривать в этом формате, когда пользователь решает, что ему нужен настоящий предварительный просмотр или распечатанный документ. HTML предназначен для рендеринга экрана, а экраны не имеют понятия страниц. PDF также может означать формат печатного документа (я знаю, что это не так), и это метод, в котором актуальны верхние и нижние колонтитулы страниц. NReco.PdfGenerator очень доступен для деловых целей или бесплатен. - person Newclique; 18.02.2020

Я просто потратил лучшую половину своего дня на поиск решения, которое действительно сработало для меня, и думал, что поделюсь тем, что сделал. Проблема с решениями выше, которые у меня были, заключалась в том, что все мои элементы абзаца перекрывались с нижним колонтитулом, который я хотел внизу страницы. Чтобы обойти это, я использовал следующий CSS:

footer {
  font-size: 9px;
  color: #f00;
  text-align: center;
}

@page {
  size: A4;
  margin: 11mm 17mm 17mm 17mm;
}

@media print {
  footer {
    position: fixed;
    bottom: 0;
  }

  .content-block, p {
    page-break-inside: avoid;
  }

  html, body {
    width: 210mm;
    height: 297mm;
  }
}

page-break-inside для p и content-block имел для меня решающее значение. Каждый раз, когда у меня есть p, следующий за h*, я оборачиваю их обоих в div class = "content-block">, чтобы они оставались вместе и не ломались.

Я надеюсь, что кто-то сочтет это полезным, потому что мне потребовалось около 3 часов, чтобы понять (я тоже новичок в CSS / HTML, так что вот это ...)

РЕДАКТИРОВАТЬ

По запросу в комментариях я добавляю пример HTML-документа. Вы захотите скопировать это в HTML-файл, открыть его и затем распечатать страницу. Предварительный просмотр должен показать, что это работает. На моей стороне он работал в Firefox и IE, но Chrome сделал шрифт достаточно маленьким, чтобы поместиться на одной странице, поэтому там он не работал.

footer {
  font-size: 9px;
  color: #f00;
  text-align: center;
}

@page {
  size: A4;
  margin: 11mm 17mm 17mm 17mm;
}

@media print {
  footer {
    position: fixed;
    bottom: 0;
  }

  .content-block, p {
    page-break-inside: avoid;
  }

  html, body {
    width: 210mm;
    height: 297mm;
  }
}
<!DOCTYPE html>
<html>
  <head></head>
  <body>
    <h1>
      Example Document
    </h1>
    <div>
      <p>
        This is an example document that shows how to have a footer that repeats at the bottom of every page, but also isn't covered up by paragraph text.
      </p>
    </div>
    <div>
      <h3>
        Example Section I
      </h3>
      <p>
        Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc vestibulum metus sit amet urna lobortis sollicitudin. Nulla mattis purus porta lorem tempor, a cursus tellus facilisis. Aliquam pretium nibh vitae elit placerat vestibulum. Duis felis ipsum, consectetur id pellentesque in, porta sit amet sapien. Ut tristique enim sem, laoreet bibendum nisl fermentum vitae. Ut aliquet sem ac lorem malesuada sodales. Fusce iaculis ipsum ex, in mollis dolor dapibus sit amet. In convallis felis in orci fermentum gravida a vel orci. Sed tincidunt porta nibh sit amet varius. Donec et odio eget odio tempus auctor ac eget ex.
        
        Pellentesque vitae augue sed purus dictum ultricies at eu neque. Nullam ut mauris a purus tristique euismod. Sed elementum, leo id placerat congue, leo tellus pharetra orci, eget ultricies odio quam sit amet ipsum. Praesent feugiat, lorem at commodo egestas, felis ligula pharetra sapien, in placerat mauris nisi aliquet tortor. Quisque nibh lectus, laoreet vel mollis a, tincidunt vel ipsum. Sed blandit vehicula sollicitudin. Donec et sapien justo. Ut fermentum ipsum imperdiet diam condimentum, eget varius sapien dictum. Sed sed elit egestas libero maximus finibus eu eget massa.
        
        Duis finibus vestibulum finibus. Nunc lobortis lacus ut libero mattis tempor. Nulla a nunc at nisl elementum congue. Nunc eu consectetur mauris. Etiam non placerat massa. Etiam eu urna in metus tempus molestie sed eget diam. Nunc sem velit, elementum sit amet fringilla in, dictum sit amet sem. Quisque convallis faucibus purus dignissim dictum. Sed semper, mi vel accumsan sollicitudin, massa massa pellentesque justo, eget auctor sapien enim ac elit.
        
        Nullam turpis augue, lacinia ut libero ac, rhoncus bibendum ligula. Mauris ullamcorper maximus turpis, a consequat turpis bibendum sit amet. Nam vitae dui nec velit hendrerit faucibus. Vivamus nunc diam, porta tristique augue nec, dignissim venenatis felis. Proin mattis id risus in feugiat. Etiam cursus faucibus nisi. In in nisi ullamcorper, convallis lectus et, ornare nulla. Cras tristique nulla eros, non maximus odio imperdiet eu. Nullam egestas dignissim est, et fringilla odio pretium eleifend. Nullam tincidunt sapien fermentum, rhoncus risus ac, ullamcorper libero. Vestibulum bibendum molestie dui nec tincidunt. Mauris tempus, orci ut congue vulputate, erat orci aliquam orci, sed eleifend orci dui sed tellus. Pellentesque pellentesque massa vulputate urna pretium, consectetur pulvinar orci pulvinar.
        
        Donec aliquet imperdiet ex, et tincidunt risus convallis eget. Etiam eu fermentum lectus, molestie eleifend nisi. Orci varius natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Nullam dignissim, erat vitae congue molestie, ante urna sagittis est, et sagittis lacus risus vitae est. Sed elementum ipsum et pellentesque dignissim. Sed vehicula feugiat pretium. Donec ex lacus, dictum faucibus lectus sit amet, tempus hendrerit ante. Ut sollicitudin sodales metus, at placerat risus viverra ut.
        
        Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc vestibulum metus sit amet urna lobortis sollicitudin. Nulla mattis purus porta lorem tempor, a cursus tellus facilisis. Aliquam pretium nibh vitae elit placerat vestibulum. Duis felis ipsum, consectetur id pellentesque in, porta sit amet sapien. Ut tristique enim sem, laoreet bibendum nisl fermentum vitae. Ut aliquet sem ac lorem malesuada sodales. Fusce iaculis ipsum ex, in mollis dolor dapibus sit amet. In convallis felis in orci fermentum gravida a vel orci. Sed tincidunt porta nibh sit amet varius. Donec et odio eget odio tempus auctor ac eget ex.
        
        Duis finibus vestibulum finibus. Nunc lobortis lacus ut libero mattis tempor. Nulla a nunc at nisl elementum congue. Nunc eu consectetur mauris. Etiam non placerat massa. Etiam eu urna in metus tempus molestie sed eget diam. Nunc sem velit, elementum sit amet fringilla in, dictum sit amet sem. Quisque convallis faucibus purus dignissim dictum. Sed semper, mi vel accumsan sollicitudin, massa massa pellentesque justo, eget auctor sapien enim ac elit.
        
        Nullam turpis augue, lacinia ut libero ac, rhoncus bibendum ligula. Mauris ullamcorper maximus turpis, a consequat turpis bibendum sit amet. Nam vitae dui nec velit hendrerit faucibus. Vivamus nunc diam, porta tristique augue nec, dignissim venenatis felis. Proin mattis id risus in feugiat. Etiam cursus faucibus nisi. In in nisi ullamcorper, convallis lectus et, ornare nulla. Cras tristique nulla eros, non maximus odio imperdiet eu. Nullam egestas dignissim est, et fringilla odio pretium eleifend. Nullam tincidunt sapien fermentum, rhoncus risus ac, ullamcorper libero.
      </p>
    </div>
    <div class="content-block">
      <h3>Example Section II</h3>
      <p>
        Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc vestibulum metus sit amet urna lobortis sollicitudin. Nulla mattis purus porta lorem tempor, a cursus tellus facilisis. Aliquam pretium nibh vitae elit placerat vestibulum. Duis felis ipsum, consectetur id pellentesque in, porta sit amet sapien. Ut tristique enim sem, laoreet bibendum nisl fermentum vitae. Ut aliquet sem ac lorem malesuada sodales. Fusce iaculis ipsum ex, in mollis dolor dapibus sit amet. In convallis felis in orci fermentum gravida a vel orci. Sed tincidunt porta nibh sit amet varius. Donec et odio eget odio tempus auctor ac eget ex.
        
        Pellentesque vitae augue sed purus dictum ultricies at eu neque. Nullam ut mauris a purus tristique euismod. Sed elementum, leo id placerat congue, leo tellus pharetra orci, eget ultricies odio quam sit amet ipsum. Praesent feugiat, lorem at commodo egestas, felis ligula pharetra sapien, in placerat mauris nisi aliquet tortor. Quisque nibh lectus, laoreet vel mollis a, tincidunt vel ipsum. Sed blandit vehicula sollicitudin. Donec et sapien justo. Ut fermentum ipsum imperdiet diam condimentum, eget varius sapien dictum. Sed sed elit egestas libero maximus finibus eu eget massa.
      </p>
    </div>
    <footer>
      This is the text that goes at the bottom of every page.
    </footer>
  </body>
</html>

person tblznbits    schedule 26.02.2016
comment
Спасибо за это, я бы только хотел, чтобы в ответе был образец HTML-документа, чтобы упростить задачу. - person Eric Kigathi; 14.04.2017
comment
@EricKigathi Отметил. Я постараюсь изо всех сил дойти до этого в эти выходные и отредактировать свой ответ. - person tblznbits; 14.04.2017
comment
@EricKigathi Пропустил крайний срок моих выходных, но я добавил пример HTML-кода. Надеюсь, это поможет! - person tblznbits; 19.04.2017
comment
Спасибо @brittenb - очень признателен, вы прощены за несоблюдение срока; ) - person Eric Kigathi; 19.04.2017
comment
не работает для второй страницы для шапки. все еще перекрываются - person Fei Xue - MSFT; 04.05.2018
comment
@Fei Xue - к сожалению, предоставленное решение касается только нижнего колонтитула, а не верхнего колонтитула. Вам придется немного подправить код, чтобы он соответствовал вашим потребностям. - person tblznbits; 04.05.2018
comment
Насколько я могу судить, этот подход не работает в Safari (11.1.1). В PDF-файле красный нижний колонтитул отображается только один раз в середине второй страницы, перезаписываясь поверх основного текста. - person Quuxplusone; 25.06.2018
comment
спасибо, невероятно полезно для печати в приложениях Electron, так как функция печати в pdf теперь лишена параметров верхнего и нижнего колонтитула - person RDev; 02.08.2018
comment
Здравствуйте, у меня проблема с заголовком. На странице 2 и далее содержимое заголовка перекрывается. Любое предложение, пожалуйста ?? - person Dexterslab; 08.09.2018
comment
@Dexterslab, как указано в предыдущих комментариях, этот код имеет дело конкретно с нижним колонтитулом, о чем свидетельствует тот факт, что header никогда не упоминается в CSS. Вам нужно будет изменить его для обработки заголовка. - person tblznbits; 10.09.2018
comment
Да, я изменил его, но проблема не исчезла. Мне было интересно, может ли кто-нибудь предложить решение для заголовка, если они заставили его работать с заголовком, пожалуйста? - person Dexterslab; 10.09.2018
comment
Это решение работает в моей системе в Chrome, Explorer, Edge и Firefox. Если это не работает для вас, это потому, что вы не добавили <link rel="stylesheet" href="layout.css">, где layout.css - это путь к вашей таблице стилей. HTML-код brittenb не связывает их. - person Altimus Prime; 04.09.2019
comment
К сожалению, если есть длинный элемент, первая страница будет пустой, а нижний колонтитул следующей страницы будет перекрываться. - person Johnny; 24.01.2020
comment
Это не работает для однострочных элементов ‹p›. Если ваш однострочный абзац окажется внизу страницы, он все равно будет перезаписан нижним колонтитулом. Особенно плохо для контрактов. - person Chloe; 16.10.2020
comment
@ FeiXue-MSFT нашли ли вы какое-либо подходящее решение проблемы перекрытия заголовков на второй странице, я столкнулся с аналогичной проблемой! - person Nikhil Singh; 26.06.2021

волшебное решение действительно помещает все в одну таблицу.

  • thead: это повторяющийся заголовок.

  • tfoot: повторяющийся нижний колонтитул.

  • tbody: содержание.

и сделайте один tr, td и поместите все в div

КОД ::

<table class="report-container">
   <thead class="report-header">
     <tr>
        <th class="report-header-cell">
           <div class="header-info">
            ...
           </div>
         </th>
      </tr>
    </thead>
    <tfoot class="report-footer">
      <tr>
         <td class="report-footer-cell">
           <div class="footer-info">
           ...
           </div>
          </td>
      </tr>
    </tfoot>
    <tbody class="report-content">
      <tr>
         <td class="report-content-cell">
            <div class="main">
            ...
            </div>
          </td>
       </tr>
     </tbody>
</table>

table.report-container {
    page-break-after:always;
}
thead.report-header {
    display:table-header-group;
}
tfoot.report-footer {
    display:table-footer-group;
} 

дополнительно: для предотвращения дублирования нескольких страниц. нравиться:

<div class="main">
    <div class="article">
        ...
  </div>
    <div class="article">
        ...
  </div>
    <div class="article">
        ...
  </div>
  ...
  ...
  ...
</div>

что приводит к переполнению, которое приведет к перекрытию заголовка в разрывах страницы.

так что ›› используйте: page-break-inside: avoid !important; с этим классом article.

table.report-container div.article {
    page-break-inside: avoid;
}

довольно просто, надеюсь, это даст вам наилучший результат, которого вы желаете.

с уважением. ;)

person Biskrem Muhammad    schedule 16.07.2018
comment
Лучшее решение здесь. Несколько примечаний: Flexbox может вызывать непредвиденное поведение. Если вы хотите, чтобы нижний колонтитул на странице lsat был внизу, вам понадобится это решение и решение от @Infotekka вместе. - person Arseniy-II; 09.09.2019

Я много лет искал решение и нашел этот пост на как напечатать нижний колонтитул, который работает на нескольких страницах, не перекрывая содержание страниц.

Моим требованием был IE8, пока я обнаружил, что это не работает в Chrome. [обновление] С 1 марта 2018 г. он также работает в Chrome.

В этом примере используются таблицы и элемент tfoot путем установки стиля css:

tfoot {display: table-footer-group;}
person rweavere    schedule 24.07.2013
comment
это работает во всех браузерах и в asp (у которого есть сумасшедшая проблема с нижними колонтитулами страниц) Используйте это, я говорю. - person DWolf; 24.07.2013
comment
@DWolf Первый комментарий вселил в меня огромную надежду. И сразу после этого ты уничтожишь меня одним предложением. - person C0ZEN; 24.02.2016
comment
У меня действительно была эта работа в Chrome. У меня этого не было в очень старой версии Chromium на базе Linux, но Chrome работал просто великолепно. - person njfife; 24.10.2016

Комментарий Мухаммада Мусави - лучший ответ, поэтому здесь он представлен как фактический ответ:

thead/tfoot автоматически повторяются вверху и внизу каждой страницы. Однако tfoot не прикрепляется к нижней части последней страницы.

position: fixed в печати будет повторяться на каждой странице, а нижний колонтитул будет прикрепляться к нижней части всех страниц, включая последнюю, но это не будет создавать пространство для его содержимого.

Совместите их:

HTML:

<header>(repeated header)</header>

<table class=paging><thead><tr><td>&nbsp;</td></tr></thead><tbody><tr><td>

(content goes here)

</td></tr></tbody><tfoot><tr><td>&nbsp;</td></tr></tfoot></table>

<footer>(repeated footer)</footer>

CSS:

@page {
    size: letter;
    margin: .5in;
}

@media print {
    table.paging thead td, table.paging tfoot td {
        height: .5in;
    }
}

header, footer {
    width: 100%; height: .5in;
}

header {
    position: absolute;
    top: 0;
}

@media print {
    header, footer {
        position: fixed;
    }
    
    footer {
        bottom: 0;
    }
}

Здесь вы можете добавить множество тонкостей, но я намеренно сократил это до минимума, чтобы получить чистый верхний и нижний колонтитулы, появляющиеся один раз на экране и вверху и внизу каждой печатной страницы.

https://medium.com/@Idan_Co/the-ultimate-print-html-template-with-header-footer-568f415f6d2a

person Chris Moschini    schedule 29.10.2020
comment
Да! Кроме того, отличная работа со статьей и демонстрацией, спасибо @Chris! - person Barney Szabolcs; 20.02.2021
comment
Ничего себе, на то, чтобы найти это, потребовалось время, но оно золотое ????! Мне жаль, что у меня не было еще 400 голосов, чтобы добавить к этому, чтобы поднять его на вершину. Прокрутка вниз к этому ответу принесла свои плоды. Спасибо ???? - person chevin99; 12.03.2021
comment
Большое вам спасибо, это сработало просто отлично. Статья и прилагаемая демо очень помогли. - person Nikhil Singh; 28.04.2021
comment
СПАСИБО СПАСИБО СПАСИБО СПАСИБО СПАСИБО - person Mike Wright; 08.06.2021
comment
Любое решение, если высота thead больше 250 пикселей? Заголовок перестает повторяться, если мы пересекаем высоту 250 пикселей. - person Nikhil Singh; 24.06.2021
comment
Это действительно здорово работает для меня (спасибо!). Единственная проблема, с которой я столкнулся, заключается в том, что размер верхнего и нижнего колонтитула слишком мал на каждой странице, кроме первой страницы, что приводит к перекрытию содержимого, есть идеи, что там делать? Кроме того, мне интересно узнать, почему вы разделили стиль между несколькими @media print{} действиями? - person Andrew Fox; 26.06.2021

Используйте разрывы страниц для определения стилей в CSS:

@media all
  {
  #page-one, .footer, .page-break { display:none; }
  }

@media print
  {
  #page-one, .footer, .page-break   
    { 
    display: block;
    color:red; 
    font-family:Arial; 
    font-size: 16px; 
    text-transform: uppercase; 
    }
  .page-break
    {
    page-break-before:always;
    } 
}

Затем добавьте разметку в документ в соответствующих местах:

<h2 id="page-one">unclassified</h2>
<!-- content block -->
<h2 class="footer">unclassified</h2>
<h2 class="page-break">unclassified</h2>
<!-- content block -->
<h2 class="footer">unclassified</h2>
<h2 class="page-break">unclassified</h2>
<!-- content block -->
<h2 class="footer">unclassified</h2>
<h2 class="page-break">unclassified</h2>
<!-- content block -->
<h2 class="footer">unclassified</h2>
<h2 class="page-break">unclassified</h2>

Ссылки

person Paul Sweatte    schedule 24.06.2012
comment
При этом не печатаются верхний и нижний колонтитулы на каждой странице. Он определяет много страниц с наилучшим предположением. Если вы не знаете высоту вашего документа (количество страниц), это бесполезно. - person rainabba; 18.01.2014
comment
@rainabba if the document was printed onto 5 pages - person Paul Sweatte; 21.01.2014
comment
это был просто пример. не следует использовать для точного руководства вашим ответом .. обходной путь. - person igorsantos07; 06.10.2016
comment
@ igorsantos07 should не означает don't. If (просто пример) слово if (просто пример) используется OP, и if (просто пример) OP больше не активен, лучше дать конкретный ответ if (просто пример) есть уже общие ответы и if (просто пример) языки (HTML / CSS) и спецификации, о которых идет речь, разработаны, чтобы избежать косвенного обращения и упростить документация? If (просто пример) так почему? А иначе почему бы и нет? - person Paul Sweatte; 06.10.2016

Из этого вопроса - добавьте следующие стили в таблицу стилей только для печати. Это решение будет работать в IE и Firefox, но не в Chrome (начиная с версии 21):

#header {
  display: table-header-group;
}

#main {
  display: table-row-group;
}

#footer {
  display: table-footer-group;
}
person Blazemonger    schedule 24.09.2012
comment
Я нашел это решение только работающим. Не тестировал все браузеры, но он работает в Firefox! - person Primoz Rome; 14.02.2013
comment
2017 и по-прежнему не работает в Chrome! но работает в Firefox - person Mehdi Dehghani; 16.01.2017
comment
@MehdiDehghani: моя плохая ... снятие комментария - person Fr0zenFyr; 26.05.2017

Я пытался бороться с этой бесполезной битвой, комбинируя правила tfoot и css, но это сработало только в Firefox :(. При использовании простого css содержимое перетекает через нижний колонтитул. При использовании tfoot нижний колонтитул на последней странице не остается хорошо внизу . Это потому, что нижние колонтитулы предназначены для таблиц, а не для физических страниц. Протестировано в Chrome 16, Opera 11, Firefox 3 и 6 и IE6.

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1">
<title>Header & Footer test</title>

<style>

  @media screen {
    div#footer_wrapper {
      display: none;
    }
  }

  @media print {
    tfoot { visibility: hidden; }

    div#footer_wrapper {
      margin: 0px 2px 0px 7px;
      position: fixed;
      bottom: 0;
    }

    div#footer_content {
      font-weight: bold;
    }
  }

</style>
</head>

<body>

<div id="footer_wrapper">
  <div id="footer_content">
    Total 4923
  </div>
</div>


<TABLE CELLPADDING=6>

<THEAD>
<TR> <TH>Weekday</TH> <TH>Date</TH> <TH>Manager</TH> <TH>Qty</TH> </TR>
</THEAD>

<TBODY>
<TR> <TD>Mon</TD> <TD>09/11</TD> <TD>Kelsey</TD>  <TD>639</TD>  </TR>
<TR> <TD>Tue</TD> <TD>09/12</TD> <TD>Lindsey</TD> <TD>596</TD>  </TR>
<TR> <TD>Wed</TD> <TD>09/13</TD> <TD>Randy</TD>   <TD>1135</TD> </TR>
<TR> <TD>Thu</TD> <TD>09/14</TD> <TD>Susan</TD>   <TD>1002</TD> </TR>
<TR> <TD>Fri</TD> <TD>09/15</TD> <TD>Randy</TD>   <TD>908</TD>  </TR>
<TR> <TD>Sat</TD> <TD>09/16</TD> <TD>Lindsey</TD> <TD>371</TD>  </TR>
<TR> <TD>Sun</TD> <TD>09/17</TD> <TD>Susan</TD>   <TD>272</TD>  </TR>
<TR> <TD>Mon</TD> <TD>09/11</TD> <TD>Kelsey</TD>  <TD>639</TD>  </TR>
<TR> <TD>Tue</TD> <TD>09/12</TD> <TD>Lindsey</TD> <TD>596</TD>  </TR>
<TR> <TD>Wed</TD> <TD>09/13</TD> <TD>Randy</TD>   <TD>1135</TD> </TR>
<TR> <TD>Thu</TD> <TD>09/14</TD> <TD>Susan</TD>   <TD>1002</TD> </TR>
<TR> <TD>Fri</TD> <TD>09/15</TD> <TD>Randy</TD>   <TD>908</TD>  </TR>
<TR> <TD>Sat</TD> <TD>09/16</TD> <TD>Lindsey</TD> <TD>371</TD>  </TR>
<TR> <TD>Sun</TD> <TD>09/17</TD> <TD>Susan</TD>   <TD>272</TD>  </TR>
<TR> <TD>Mon</TD> <TD>09/11</TD> <TD>Kelsey</TD>  <TD>639</TD>  </TR>
<TR> <TD>Tue</TD> <TD>09/12</TD> <TD>Lindsey</TD> <TD>596</TD>  </TR>
<TR> <TD>Wed</TD> <TD>09/13</TD> <TD>Randy</TD>   <TD>1135</TD> </TR>
<TR> <TD>Thu</TD> <TD>09/14</TD> <TD>Susan</TD>   <TD>1002</TD> </TR>
<TR> <TD>Fri</TD> <TD>09/15</TD> <TD>Randy</TD>   <TD>908</TD>  </TR>
<TR> <TD>Sat</TD> <TD>09/16</TD> <TD>Lindsey</TD> <TD>371</TD>  </TR>
<TR> <TD>Sun</TD> <TD>09/17</TD> <TD>Susan</TD>   <TD>272</TD>  </TR>
<TR> <TD>Mon</TD> <TD>09/11</TD> <TD>Kelsey</TD>  <TD>639</TD>  </TR>
<TR> <TD>Tue</TD> <TD>09/12</TD> <TD>Lindsey</TD> <TD>596</TD>  </TR>
<TR> <TD>Wed</TD> <TD>09/13</TD> <TD>Randy</TD>   <TD>1135</TD> </TR>
<TR> <TD>Thu</TD> <TD>09/14</TD> <TD>Susan</TD>   <TD>1002</TD> </TR>
<TR> <TD>Fri</TD> <TD>09/15</TD> <TD>Randy</TD>   <TD>908</TD>  </TR>
<TR> <TD>Sat</TD> <TD>09/16</TD> <TD>Lindsey</TD> <TD>371</TD>  </TR>
<TR> <TD>Sun</TD> <TD>09/17</TD> <TD>Susan</TD>   <TD>272</TD>  </TR>
<TR> <TD>Mon</TD> <TD>09/11</TD> <TD>Kelsey</TD>  <TD>639</TD>  </TR>
<TR> <TD>Tue</TD> <TD>09/12</TD> <TD>Lindsey</TD> <TD>596</TD>  </TR>
<TR> <TD>Wed</TD> <TD>09/13</TD> <TD>Randy</TD>   <TD>1135</TD> </TR>
<TR> <TD>Thu</TD> <TD>09/14</TD> <TD>Susan</TD>   <TD>1002</TD> </TR>
<TR> <TD>Fri</TD> <TD>09/15</TD> <TD>Randy</TD>   <TD>908</TD>  </TR>
<TR> <TD>Sat</TD> <TD>09/16</TD> <TD>Lindsey</TD> <TD>371</TD>  </TR>
<TR> <TD>Sun</TD> <TD>09/17</TD> <TD>Susan</TD>   <TD>272</TD>  </TR>
<TR> <TD>Mon</TD> <TD>09/11</TD> <TD>Kelsey</TD>  <TD>639</TD>  </TR>
<TR> <TD>Tue</TD> <TD>09/12</TD> <TD>Lindsey</TD> <TD>596</TD>  </TR>
<TR> <TD>Wed</TD> <TD>09/13</TD> <TD>Randy</TD>   <TD>1135</TD> </TR>
<TR> <TD>Thu</TD> <TD>09/14</TD> <TD>Susan</TD>   <TD>1002</TD> </TR>
<TR> <TD>Fri</TD> <TD>09/15</TD> <TD>Randy</TD>   <TD>908</TD>  </TR>
<TR> <TD>Sat</TD> <TD>09/16</TD> <TD>Lindsey</TD> <TD>371</TD>  </TR>
<TR> <TD>Sun</TD> <TD>09/17</TD> <TD>Susan</TD>   <TD>272</TD>  </TR>
<TR> <TD>Mon</TD> <TD>09/11</TD> <TD>Kelsey</TD>  <TD>639</TD>  </TR>
<TR> <TD>Tue</TD> <TD>09/12</TD> <TD>Lindsey</TD> <TD>596</TD>  </TR>
<TR> <TD>Wed</TD> <TD>09/13</TD> <TD>Randy</TD>   <TD>1135</TD> </TR>
<TR> <TD>Thu</TD> <TD>09/14</TD> <TD>Susan</TD>   <TD>1002</TD> </TR>
<TR> <TD>Fri</TD> <TD>09/15</TD> <TD>Randy</TD>   <TD>908</TD>  </TR>
<TR> <TD>Sat</TD> <TD>09/16</TD> <TD>Lindsey</TD> <TD>371</TD>  </TR>
<TR> <TD>Sun</TD> <TD>09/17</TD> <TD>Susan</TD>   <TD>272</TD>  </TR>
</TBODY>

<TFOOT id="table_footer">
<TR> <TH ALIGN=LEFT COLSPAN=3>Total</TH> <TH>4923</TH> </TR>
</TFOOT>

</TABLE>

</body>
</html>
person jous    schedule 31.01.2012

Один из подходов, который работает только для добавления заголовков на каждую страницу, заключается в том, чтобы обернуть ваш контент в <table>, а затем поместить содержимое заголовка в тег <thead>, а ваше содержимое в тег <tbody>, например:

<table>
  <thead>
    <tr>
      <th>This content appears on every page</th>
    </tr>
   </thead>
   <tbody>
     <tr>
       <td>Put all your content here, it can span multiple pages and your header will show up at the top of each page</td>
     </tr>
   </tbody>
 </table>

Это работает в Chrome, но не уверен на 100% в других браузерах.

person Dana Woodman    schedule 16.01.2017
comment
это работает, пока у наших thead и tfoot не так много строк ‹tr›, похоже, что thead и tfoot имеют максимальную высоту, в моем случае у меня было 9 строк ‹tr› в thead, когда я уменьшил их до 3 или 5 это работает - person Sundara Prabu; 01.03.2018
comment
Отличный трюк! Thead работает как шарм, но tfoot - нет. Есть идеи, как заставить его работать? - person Irikos; 15.11.2018
comment
Tfoot работает в браузерах, но не в MS Word. Thead работает в обоих. - person Irikos; 15.11.2018

Если вы можете использовать javascipt, попросите дескриптор клиента выкладывать содержимое с помощью javascript для размещения элементов на основе доступного пространства.

Вы можете использовать плагин jquery columnizer для динамического размещения вашего контента в блоках фиксированного размера и размещения ваших верхних и нижних колонтитулов как части процедуры рендеринга. http://welcome.totheinter.net/columnizer-jquery-plugin/

См. Пример 10 http://welcome.totheinter.net/autocolumn/sample10.html

Браузер по-прежнему будет добавлять свои собственные верхние или нижние колонтитулы, если они включены в операционной системе. Для согласованного макета на разных платформах и в браузерах, скорее всего, потребуется условный CSS.

person sparkalow    schedule 03.04.2013
comment
Предоставленная демонстрация даже не работает (страницы не ломаются, не перетекают друг в друга и т. Д.), Не говоря уже о более универсальном контенте. - person rainabba; 18.01.2014
comment
Я должен был уточнить. Предоставленные ссылки являются примерами библиотеки javascript для размещения контента по контейнерам и не настроены для печати. Эта ссылка должна была быть примером использования js для размещения содержимого в определенных границах. Я использовал js в качестве движка рендеринга с wkhtmltopdf для создания кулинарных книг из содержимого базы данных. - person sparkalow; 13.03.2014
comment
Вопрос в печати. - person Greg Blass; 13.09.2017

Я удивлен и не впечатлен тем, что в Chrome такая ужасная поддержка печати CSS.

Моя задача требовала показа на каждой странице немного другого нижнего колонтитула. В простейшем случае просто увеличивающийся номер главы и страницы. В более сложных случаях - больше текста в нижнем колонтитуле - например, несколько сносок - которые могут увеличить его в размере, в результате чего содержимое области содержимого этой страницы будет сжато, а часть его переместится на следующую страницу.

Печать с помощью CSS не может решить эту проблему, по крайней мере, при плохой поддержке браузеров сегодня. Но, выходя за рамки печати, CSS3 может сделать большую часть тяжелой работы:

https://jsfiddle.net/b9chris/moctxd2a/29/

<div class=page>
  <header></header>
  <div class=content>Content</div>
  <footer></footer>
</div>

SCSS:

body {
  @media screen {
    width: 7.5in;
    margin: 0 auto;
  }
}

div.page {
  display: flex;
  height: 10in;    
  flex-flow: column nowrap;
  justify-content: space-between;
  align-content: stretch;
}

div.content {
  flex-grow: 1;
}

@media print {
  @page {
    size: letter;  // US 8.5in x 11in
    margin: .5in;
  }

  footer {
    page-break-after: always;
  }
}

В примере есть еще немного кода, в том числе Cat Ipsum; но используемый js предназначен только для того, чтобы продемонстрировать, насколько может изменяться верхний / нижний колонтитулы без нарушения разбивки на страницы. Ключ на самом деле состоит в том, чтобы взять трюк с приклеиванием нижнего столбца из CSS Flexbox, а затем применить его к странице известной фиксированной высоты - в данном случае к листу американской бумаги размером 8,5 x 11 дюймов с толщиной 0,5. "отступы, оставляющие width: 7.5in и height: 10in точно. Как только гибкому контейнеру CSS сообщены его точные размеры (div.page), легко заставить верхний и нижний колонтитулы расширяться и сжиматься, как в обычной типографике.

Что остается, это перетекать содержимое страницы, когда нижний колонтитул, например, увеличивается до 8 сносок, а не до 3. В моем случае содержимое достаточно фиксировано, и мне не нужно об этом беспокоиться, но я уверен, что есть способ сделать это. Один из подходов, который приходит на ум, - превратить верхний и нижний колонтитулы в плавающие элементы шириной 100%, а затем разместить их с помощью Javascript. Браузер автоматически обработает прерывания обычного потока контента.

person Chris Moschini    schedule 30.10.2019

Попробуйте, у меня он работает в Chrome, Firefox и Safari. Вы получите верхний и нижний колонтитулы, закрепленные на каждой странице, без перекрытия содержимого страницы.

CSS

<style>
  @page {
    margin: 10mm;
  }

  body {
    font: 9pt sans-serif;
    line-height: 1.3;

    /* Avoid fixed header and footer to overlap page content */
    margin-top: 100px;
    margin-bottom: 50px;
  }

  #header {
    position: fixed;
    top: 0;
    width: 100%;
    height: 100px;
    /* For testing */
    background: yellow; 
    opacity: 0.5;
  }

  #footer {
    position: fixed;
    bottom: 0;
    width: 100%;
    height: 50px;
    font-size: 6pt;
    color: #777;
    /* For testing */
    background: red; 
    opacity: 0.5;
  }

  /* Print progressive page numbers */
  .page-number:before {
    /* counter-increment: page; */
    content: "Pagina " counter(page);
  }

</style>

HTML

<body>

  <header id="header">Header</header>

  <footer id="footer">footer</footer>

  <div id="content">
    Here your long long content...
    <p style="page-break-inside: avoid;">This text will not be broken between the pages</p>
  </div>

</body>
person Fred K    schedule 27.09.2019
comment
Будет ли это решение работать для заголовка высотой более. 250 пикселей. Значения динамической высоты / автоматическая высота - person Sebastian; 11.02.2021
comment
@Sebastian имеет аналогичные проблемы с перекрывающимся заголовком выше 250 пикселей, есть ли у вас решение? - person Nikhil Singh; 23.06.2021
comment
@NikhilSingh Нет решений. Ограничение по высоте в 250 пикселей - это общепринятое ограничение thead. - person Sebastian; 23.06.2021
comment
Спасибо за ответ @Sebastian, вы нашли другой способ печати головки и нижнего колонтитула на каждой странице? С немного большей гибкостью в контексте того, как <div> сжимается или расширяется с учетом поля страницы - person Nikhil Singh; 23.06.2021
comment
Я закончил с решением повторения верхнего и нижнего колонтитула для всех страниц с использованием параметров разрыва страницы CSS.Также использовал некоторые алгоритмы, чтобы решить, сколько элементов в таблице может позволить каждая страница. - person Sebastian; 23.06.2021

лучшее решение пришло от бискрем мухаммада.

но с его ответом есть небольшая проблема. когда количество страниц больше 1, нижний колонтитул не находится в нижнем колонтитуле последней страницы.

добавьте этот маленький CSS в свой элемент, свернутый с помощью информации о нижнем колонтитуле

position: fixed;
bottom: 0;
person nadir    schedule 17.10.2020

Если вы используете механизм шаблонов, такой как Asp.net Razor Engine или Angular, я думаю, вы должны повторно сгенерировать свою страницу и разделить страницу на несколько страниц, а затем вы можете свободно размечать каждую страницу и помещать верхний и нижний колонтитулы в тему. один пример может быть таким, как показано ниже:

@page {
  size: A4;  
   margin: .9cm;
}


@media print {

   body.print-paper-a4 {
    width: 210mm;
    height: 297mm;
  }

   body {
       background: white;
       margin: 0;
       padding: 0;
   }

   .print-stage,
   .no-print {
       display: none;
   }


   body.print-paper.a4 .print-paper {
      width: 210mm;
        height: 297mm;
    }

   .print-paper {
       page-break-after: always;
       margin: 0;
       padding: .8cm;
       border:none;
       overflow: hidden;
   }

}





.print-papers {
    display: block;
    z-index: 2000;
    margin: auto;

}


body.print-paper-a4 .print-paper {
    width: 21cm;
    height:27cm;
}


.print-paper {
    margin: auto;
    background: white;
    border: 1px dotted black;
    box-sizing: border-box;
    margin: 1cm auto;
    padding: .8cm;
       overflow: hidden;   
}


body.print-mode .no-print-preview {
    display: none;
}

body.print-mode .print-preview {
    display: block;
}
<body class="print-mode print-paper-a4">
        
        <div class="print-papers print-preview">
            <div class="print-paper">
                <div style="font-size: 5cm">
                    HELLO
                </div>

            </div>
            <div class="print-paper">
              <div class="page-header">
                </div>
              
              
            </div>
            <div class="print-paper">
                
                

            </div>            
        </div>
  </body>

person pixparker    schedule 07.05.2015

Я нашел одно решение. Основная идея состоит в том, чтобы создать таблицу и в разделе thead поместить данные заголовка в tr и с помощью css force показать, что tr только в печати, а не на экране, тогда ваш обычный заголовок должен быть принудительно отображен только на экране, а не в печати. 100% работаю над многостраничной печатью. пример кода здесь

<style> 
    @media screen {
        .only_print{
            display:none;
        }
    }
    @media print {
        .no-print {
            display: none !important;
        }
    }
    TABLE{border-collapse: collapse;}
    TH, TD {border:1px solid grey;}
</style>
<div class="no-print">  <!-- This is header for screen and will not be printed -->
    <div>COMPANY NAME FOR SCREEN</div>
    <div>DESCRIPTION FOR SCREEN</div>
</div>

<table>
    <thead>
        <tr class="only_print"> <!-- This is header for print and will not be shown on screen -->
            <td colspan="100" style="border: 0px;">
                <div>COMPANY NAME FOR PRINT</div>
                <div>DESCRIPTION FOR PRINT</div>
            </td>
        </tr>
        <!-- From here Actual Data of table start -->
        <tr>
            <th>Column 1</th>
            <th>Column 2</th>
            <th>Column 3</th>
        </tr>
    </thead>
    <tbody>
        <tr>
            <td>1-1</td>
            <td>1-2</td>
            <td>1-3</td>
        </tr>
        <tr>
            <td>2-1</td>
            <td>2-2</td>
            <td>2-3</td>
        </tr>
    </tbody>
</table>
person A.Z. Soft    schedule 29.08.2018

Это то, что вы хотите только для печати? Вы можете добавить его на каждую страницу своего сайта и использовать CSS для определения тега как носителя только для печати.

В качестве примера это может быть пример заголовка:

<span class="printspan">UNCLASSIFIED</span>

И в вашем CSS сделайте что-то вроде этого:

<style type="text/css" media="screen">
    .printspan
    {
        display: none;
    }
</style>
<style type="text/css" media="print">
    .printspan
    {
        display: inline;
        font-family: Arial, sans-serif;
        font-size: 16 pt;
        color: red;
    }
</style>

Наконец, чтобы включить верхний / нижний колонтитул на каждую страницу, вы можете использовать включения на стороне сервера или, если у вас есть страницы, созданные с помощью PHP или ASP, вы можете просто закодировать их в общий файл.

Изменить:

Этот ответ предназначен для того, чтобы предоставить способ показать что-то на физической печатной версии документа, не показывая это в противном случае. Однако, как следует из комментариев, это не решает проблему наличия нижнего колонтитула на нескольких печатных страницах при переполнении содержимого.

Я оставляю его здесь на случай, если он тем не менее поможет.

person JYelton    schedule 01.09.2009
comment
+1 за использование отображения, а не видимости - visibility: hidden оставляет зарезервированное пространство, тогда как display: none уничтожает пробелы, экономит бумагу и заставляет планету Земля выжить дольше. - person Fenton; 01.09.2009
comment
-1: хотя и является хорошим примером таблицы стилей печати, она не решает проблему переполнения страницы содержимым. Как есть, это будет отображать только нижний колонтитул на последней странице. - person NotMe; 24.09.2010

@Daniel прокомментировал вопрос 2012 года об отсутствии поддержки функций CSS3: top-center & bottom-center.

Что ж, в Chrome 73+ работает следующий фрагмент, где header и footer - это элементы <header></header> и <footer></footer>, определенные на странице.

@page {
    @top-center { content: element(header) }
}
@page { 
    @bottom-center { content: element(footer) }
}
person Zze    schedule 11.08.2020
comment
Есть ли известная вам ссылка, подтверждающая это утверждение? Я не сомневаюсь в вас ... Я просто хочу узнать, что еще в стандарте css-page-3 поддерживает Chrome. - person Jonathan B.; 14.08.2020
comment
@JonathanB. У меня нет ресурса, которым можно поделиться. Я просто пытался что-то найти и не мог. Единственная причина, по которой я упомянул Chrome73 + в сообщении, заключается в том, что это браузер, в котором я тестировал ... - person Zze; 14.08.2020
comment
Это не работает ни в одном браузере, и, по крайней мере, в Chrome не было никаких усилий или заинтересованности в его поддержке, несмотря на ошибку, зарегистрированную в 2012 году, 8 лет назад. caniuse.com/mdn-css_at-rules_page_page-margin-boxes bugs.webkit.org/show_bug.cgi?id=85062 - person Chris Moschini; 29.10.2020

Основываясь на каком-то сообщении, я думаю, что position: fixed работает для меня.

body {
  background: #eaeaed;
  -webkit-print-color-adjust: exact;
}

.my-footer {
  background: #2db34a;
  bottom: 0;
  left: 0;
  position: fixed;
  right: 0;
}

.my-header {
  background: red;
  top: 0;
  left: 0;
  position: fixed;
  right: 0;
}
<html>

<head>
  <meta charset=utf-8 />
  <title>Header & Footer</title>

</head>

<body>
  <div>
    <div class="my-header">Fixed Header</div>
    <div class="my-footer">Fixed Footer</div>
    <table>
      <thead>
        <tr>
          <th>TH 1</th>
          <th>TH 2</th>
        </tr>
      </thead>
      <tbody>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
        <tr>
          <td>TD 1</td>
          <td>TD 2</td>
        </tr>
      </tbody>
    </table>
  </div>
</body>

</html>

Нажмите Ctrl + P в Chrome, чтобы увидеть текст верхнего и нижнего колонтитула на каждой странице. Надеюсь, это поможет

person Justin Patel    schedule 02.02.2017
comment
Да, верхние и нижние колонтитулы печатаются на каждой странице, но они перекрывают содержимое страницы. - person Tony; 04.03.2017