у меня есть див
function imprSelec(historial){
var ficha=document.getElementById(historial);
var ventimp=window.open(' ','popimpr');
ventimp.document.write(ficha.innerHTML);
ventimp.document.close();
ventimp.print();
ventimp.close();
}
<div id="historial">
<h3><center>Mi contenido</center></h3>
...
</div>
<a href="javascript:imprSelec('historial')">Imprimir</a>
И я хочу распечатать его, я пробовал так, но у меня это не работает, по сути, это ничего не делает. Но я хочу, чтобы печаталось только содержимое div, historial
сохраняя стили div.
Добавляю изображения:
И вот как это выглядит, более или менее нормально, так как я поставил стили прямо в атрибуте, хотя цвета фона меня не очень устраивают.
Попробуйте эту функцию:
И вызывая его следующим образом:
Лично я все еще ищу кросс-браузерное решение этой проблемы. По умолчанию стили не учитываются при печати в большинстве браузеров. В случае с Chrome мне даже
media="all"
не удалось сохранить стили.Я предполагаю, что в какой-то момент это будет стандартизировано, что позволит печатать с полной поддержкой CSS. Между тем, мы должны найти способы повторить эту задачу.
Один из способов добиться этого — преобразовать документ в холст, а затем в изображение (по умолчанию PNG) через файлы
HTMLCanvasElement#toDataURL
. Как только это будет сделано, все, что вам нужно сделать, это добавить изображение к тегу<img>
и распечатать документ.Основная проблема заключается в том, что нет способа запретить пользователю печатать обычным способом через меню браузера, поэтому вы должны убедиться, что вы всегда предоставляете видимую опцию для печати содержимого.
Я привожу вам пример использования библиотеки html2canvas и события
keydown
для перехвата комбинацииCtrl + p
, которая представляет собой быстрый доступ к опции печати браузера, чтобы мы могли предотвратить печать по умолчанию и вместо этого давайте сделаем свою. Bootstrap также используется для просмотра качества рендеринга.Единственное, что вам нужно сделать, это убедиться, что у вас есть разрешения для всплывающих окон. Этого можно избежать, сделав это в том же документе, перед вызовом
window#print
ставится скриншот и удаляется родительский узел, а после его вызова узел ставится снова. У него могут быть некоторые ограничения, если вы используете реактивные фреймворки, такие как React или Vue.Примечание . Очевидно, StackOverflow блокирует всплывающие окна в вашем редакторе. Я сделал ручку , чтобы вы могли увидеть ее в действии.
Поддерживать
Все браузеры, которые реализуют Canvas :
Это не идеально, но намного лучше, чем печать по умолчанию.