Как включить CSS в сценарий JS при печати HTML?

Я пытаюсь создать серверное приложение Blazor с помощью JS-скрипта, который будет печатать из HTML.

Я пытаюсь программно включить в него изображение, поэтому наличие HTML и последующее выполнение printWindow.document.write("<img src = "${imageBinaryHere}">"); облегчили бы мне задачу.

Код, который у меня есть на данный момент, следующий:

window.printCard = function (imageBinaryHere) {
    var printWindow = window.open('', '_blank');
    printWindow.document.open();
    printWindow.document.write('<!DOCTYPE html><html> A bunch of HTML going here including <link href = "{serverUrl}/css/printStyles.css" rel = "stylesheet" /></html>')

    printWindow.document.write(`<img src = "${imageBinaryHere}">`);

    printWindow.document.close();
    printWindow.print();
    printWindow.close();
}

У меня есть 2 проблемы, которые возникают у меня:

  1. Это printStyles.css не включен в окно печати, поэтому просто отображает HTML без каких-либо стилей. Я не уверен, правильно ли я его включаю или в чем здесь проблема?
  2. Даже если я добавлю, например, встроенный CSS <body style = "background-color:red;">, он изменится не в документе предварительного просмотра, а на всей странице, например:

Есть идеи, что я делаю не так, я впервые пытаюсь реализовать печать. Имейте в виду, что сервер Blazor выполняет этот скрипт следующим образом:

protected async Task Print()
{
   await JsRuntime.InvokeVoidAsync("printCard", imageBinary);
}

Есть ли в консоли ошибки, связанные с printStyles.css?

Barmar 05.06.2024 17:00

Ваш HTML неправильно сформирован. Браузер может попытаться интерпретировать то, что вы хотите, и ошибиться. Добавьте <body> и убедитесь, что </body></html> стоит в конце.

fdomn-m 05.06.2024 17:10

В диалоговом окне предварительного просмотра печати (по крайней мере, в Chrome) нажмите «Настройки» и установите флажок [ ] Background graphics.

fdomn-m 05.06.2024 17:14
Поведение ключевого слова "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
3
58
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я решил это, выполнив следующие действия:

  1. Добавьте HTML-код, который нужно распечатать, в файл HtmlToPrint.razor. Создайте div, а затем внутри него тег body, а затем остальную часть вашего HTML.

  2. Затем добавьте файл HtmlToPrint.razor.css, который будет действовать как ограниченный CSS для этого файла HtmlToPrint.razor.

  3. При добавлении CSS оберните его в @media print {}, чтобы его можно было использовать только для печати.

  4. В файле CSS в классе .body {} добавьте -webkit-print-color-adjust: точный;

  5. В файл HtmlToPrint.razor.cs добавьте функцию для вызова печати.

    protected async Task Print()
    {
        await JsRuntime.InvokeVoidAsync("{nameOfTheJSFunctionYouAreCalling}");
    }
    
  6. В wwwroot добавьте файл /js/print.js и добавьте

    window.print = function () { window.print(); window.close(); }

  7. В основной CSS-файл вашего приложения (у меня это wwwroot/css/site.css) добавьте следующее:

.print {
    display: none;
}

@media print {
    .no-print {
        display: none;
    }

    .print {
        display: block;
    }
}
  1. На первом этапе в div-оболочку добавьте печать (она должна быть видна при печати) к другим вещам, которые вы хотите исключить (например, боковую навигацию, верхнюю навигацию, основной макет и т. д.), добавьте класс без печати.

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

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