Распечатать содержимое <iframe>, превышающее одну страницу

в моем приложении для реагирования у меня есть iframe, который загружается с HTML-документом, и его содержание превышает 1 страницу. при нажатии Ctrl+p я хочу распечатать его на нескольких страницах, но предварительный просмотр показывает только одну страницу.

как это должно быть обработано, чтобы распознать, что содержание iframe составляет более одной страницы формата A4?

DOM в chrome devtool выглядит так

<div class = "article-container">
  <iframe style = "">#document
   /* hundreds of <p> tags */
  </iframe>
</div>

структура в реагирующем приложении похожа на

   <div className = "article-container">
      <FrameText content = {content} status = {!this.state.editStatus} />
   </div>

и фреймтекст

class FrameText extends React.Component<Props> {
  iframe: HTMLIFrameElement;
  compinentDidMount(){
    window.addEventListener('beforeprint',(e)=>{console.info(e);})
  }
  /* other stuff*/
  render() {
      const { status } = this.props;
      return <iframe ref = {(ref) => (this.iframe = ref!)} style = {!status ? { display: 'none' } : {}} />;
  }

поэтому здесь, когда нажимается ctrl+p, я получаю событие, и документ iframe находится в событии. Кроме того, у меня есть содержимое iframe в локальном состоянии.

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

Кроме того, css

@media print {
  .article-container {
    background-color: white;
    height: 100%;
    width: 100%;
    position: fixed;
    top: 0;
    left: 0;
    margin: 0;
    padding: 15px;
    font-size: 14px;
    line-height: 18px;
  }
}

Несколько грязный хак, но, возможно, достаточный: если вы знаете примерное количество страниц, вы можете оценить, насколько высоким должен быть iFrame в пикселях, и установить его в print-css, например, 4000px или что-то в этом роде.

niorad 10.03.2019 18:24
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
1
1
1 713
2

Ответы 2

Ваш запрос печатного носителя не будет работать с внутренним содержимым iframe, поэтому размер iframe игнорируется при печати. ​​Если вы хотите применить определенные стили печати к iframe, вам нужно ссылаться извне с помощью соответствующего метода (будь то js или html). Я пишу образец для ссылки стилей на iframe, могут существовать другие реализации для этого

let cssLink = document.createElement("link");
cssLink.href = "style.css"; 
cssLink.rel = "stylesheet"; 
cssLink.type = "text/css"; 
frames['iframe1'].document.head.appendChild(cssLink);

Привет, и спасибо за подсказку, но каким должно быть содержимое этого пользовательского js или css, которое показывает высоту/длину содержимого?

Amir-Mousavi 08.03.2019 11:02

Создайте файл css только с одним классом @media print { iframe { height: 100%; ширина: 100%; положение: фиксированное; сверху: 0; слева: 0; маржа: 0; отступ: 15 пикселей; размер шрифта: 14px; высота строки: 18px; } }

arpit sharma 10.03.2019 11:00

не совсем, если вы видите класс, он находится в теге iframe, а не в охватывающем div

arpit sharma 10.03.2019 13:07

Я смог напечатать несколько страниц в iframe, перехватив событие CTRL P, передав фокус iframe, а затем инициировав печать в iframe.

<iframe id = "iframe" name = "iframe" src = "2.html"></iframe>


<script src = "https://code.jquery.com/jquery.min.js"></script>

<script>

    $(document).bind("keyup keydown", function (e) {
        if (e.ctrlKey && e.keyCode === 80) {
            window.frames["iframe"].focus();
            window.frames["iframe"].print();
            return false;
        }
        return true;
    });

</script>

Я пробовал это и все равно, конечно, без JQuery. Я не хочу использовать JQuery из-за только одной функции

Amir-Mousavi 08.03.2019 17:32

@Amir-Mousavi Амир-Мусави, вы хотя бы пробовали это с JQuery, только для того, чтобы хотя бы посмотреть, работает ли концепция? Я попробовал это с 4-страничным iframe, и он правильно распечатал (в PDF).

imvain2 08.03.2019 17:47

нет, на самом деле то же самое можно применить, например, componentDidMount с добавлением списка событий для es6 onBeforePrint(), но поскольку я добавил других слушателей в iframe, таких как загрузка, отмена или печать, когда окно предварительного просмотра печати закрывается, эти листнеры возвращают значение null и приложение ломка поэтому я не думаю, что даже JQuery мне поможет. кроме того, это решение менеджера проекта, добавлять новую библиотеку или нет :)

Amir-Mousavi 08.03.2019 17:55

Другие вопросы по теме