Подтвердить что ты не робот

JsPDF не может получить какой-либо стиль для работы

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

У меня есть очень простая страница, на которой я просто пытаюсь заставить CSS работать: JS:

<script src="//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
<script type="text/javascript" src="jspdf.js"></script>
<script type="text/javascript" src="./libs/FileSaver.js/FileSaver.js"></script>
<script type="text/javascript" src="./libs/Blob.js/BlobBuilder.js"></script>
<script type="text/javascript" src="jspdf.plugin.standard_fonts_metrics.js"></script> 
<script type="text/javascript" src="jspdf.plugin.split_text_to_size.js"></script>               
<script type="text/javascript" src="jspdf.plugin.from_html.js"></script>
<script>
    $(document).ready(function(){
        $('#dl').click(function(){
        var specialElementHandlers = {
            '#editor': function(element, renderer){
                return true;
            }
        };
        var doc = new jsPDF('landscape');
        doc.fromHTML($('body').get(0), 15, 15, {'width': 170,   'elementHandlers': specialElementHandlers});
        doc.output('save');
        });
    });
</script>

HTML:

<body>
    <div id="dl">Download Maybe?</div>
    <div id="testcase">
        <h1>  
            We support special element handlers. Register them with jQuery-style 
        </h1>
    </div>
</body>

И, наконец, таблица стилей, которая является внешней:

h1{
    color: red;
}
div{
    color: red;
}

Я уверен, что все включено правильно, и что ошибок нет, уже все это проверили. Есть ли какая-то дополнительная функция, которую мне нужно вызвать, чтобы заставить css работать? Дай мне знать, пожалуйста! Большое спасибо! Любые другие советы, которые вы можете получить, также оценены!

EDIT: Это точная веб-страница:

<html>
    <head>
        <link rel="stylesheet" href="print.css" type="text/css" media="print"/>
        <script src="//ajax.googleapis.com/ajax/libs/jquery/1.10.2/jquery.min.js"></script>
        <script type="text/javascript" src="jspdf.js"></script>
        <script type="text/javascript" src="./libs/FileSaver.js/FileSaver.js"></script>
        <script type="text/javascript" src="./libs/Blob.js/BlobBuilder.js"></script>
        <script type="text/javascript" src="jspdf.plugin.standard_fonts_metrics.js"></script>
        <script type="text/javascript" src="jspdf.plugin.split_text_to_size.js"></script>               
        <script type="text/javascript" src="jspdf.plugin.from_html.js"></script>
        <script>
            $(document).ready(function(){
                $('#dl').click(function(){
                var specialElementHandlers = {
                    '#editor': function(element, renderer){
                        return true;
                    }
                };
                var doc = new jsPDF('landscape');
                doc.fromHTML($('body').get(0), 15, 15, {'width': 170,   'elementHandlers': specialElementHandlers});
                doc.output('save');
                });
            });
        </script>
    </head>
    <body>
        <div id="dl">Download Maybe?</div>
        <div id="testcase">
            <h1>  
                We support special element handlers. Register them with jQuery-style 
            </h1>
        </div>
    </body>
</html>
4b9b3361

Ответ 1

Я думаю, что проблема в том, что вы используете media="print" вместо media="screen". Попробуйте создать два отдельных файла, один для печати и один для экрана:

<link rel="stylesheet" href="print.css" type="text/css" media="print"/>
<link rel="stylesheet" href="screen.css" type="text/css" media="screen"/>

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

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

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

doc.setFontSize(22);
doc.setTextColor(255, 0, 0);
doc.text(20, 20, 'This is a title');

doc.setFontSize(16);
doc.setTextColor(0, 255, 0);
doc.text(20, 30, 'This is some normal sized text underneath.');

Поместите этот код прямо под var doc = new jsPDF('landscape'); в вашем сценарии.

Ответ 2

вы можете попробовать этот вариант, который использует библиотеки jsPDF, html2canvas и html2pdf

из README:

включить эти файлы:

<script src="jspdf.min.js"></script>
<script src="html2canvas.min.js"></script>
<script src="html2pdf.js"></script>

а затем вы можете создать свой pdf файл, выполнив:

html2pdf($('body').get(0), {
   margin:       1,
   filename:     'myfile.pdf',
   image:        { type: 'jpeg', quality: 0.98 },
   html2canvas:  { dpi: 192, letterRendering: true },
   jsPDF:        { unit: 'in', format: 'letter', orientation: 'portrait' }
});

Ответ 3

Вы можете сделать снимок экрана с помощью jsPDF, но вам также понадобится html2canvas. Используйте html2canvas для преобразования html в холст и захвата содержимого изображения. Создайте пустой pdf файл с помощью jsPDF и добавьте содержимое html-изображения в pdf файл и сохраните:

html2canvas(*html*, {
  onrendered: function(canvas) {
    const contentDataURL = canvas.toDataURL('image/png')
    let pdf = new jsPDF()
    pdf.addImage(contentDataURL, 'JPEG', 20, 20)
    pdf.save('form.pdf')
  }
})

Это сохранит все CSS, но качество будет немного (размыто).

Ответ 4

@samuraiseoul Мы можем сделать сложный рендеринг HTML с domtoimage

private async generatePDF(elemToPrint: HTMLElement): Promise<void> {
 this.printSection = document.createElement('div');
 this.printSection.id = 'printSection';
 document.body.appendChild(this.printSection);
 const dataUrl = await domtoimage.toPng(elemToPrint, {width: elemToPrint.clientWidth, height: elemToPrint.clientHeight});
 const img = document.createElement('img');
 img.src = dataUrl;
 img.alt = 'The Image';
 this.printSection.appendChild(img);
 setTimeout(() => window.print(), 500); //Just give some time to render stuff while playing with @media print css stuff  
}

Вот с CSS

@media screen {
 #printSection { 
  display: none;
 }
}
@media print {
  #printSection , #printSection *{
   display: block; // We need the * because only if we display all the items inside the printSection to display as block. then only our mighty firefox will render the second page. :) Hey, that a bug from FF.
  }
}