Загрузите эскиз холста p5.js в формате PDF с помощью jsPDF addImage JPEG

Попытка запустить минимальный скрипт для загрузки элемента холста эскиза p5.js в формате PDF с использованием jsPDF - в частности, метода jsPDF addImage, после преобразования холста в JPEG с использованием метода JS toDataURL.

Я могу заставить p5.js рисовать на холсте и jsPDF для загрузки PDF-файла после запуска страницы, но PDF-файл пустой (черный с JPEG, белый с PNG, предположительно b/c альфа-канал). Я предполагаю, что это из-за того, где у меня в скрипте есть код jsPDF, но в любом другом месте загрузка не работает.

Любой совет?

(Кстати, я попробовал решение этой проблемы: Фон JsPDF addImage jpeg черный, но в итоге я получаю полностью белый PDF-файл, например, когда я использую PNG вместо JPEG)

<!DOCTYPE html>
<html lang = "en">
  <head>
    <meta charset = "utf-8" />
    <meta name = "viewport" content = "width=device-width, initial-scale=1.0">

    <title>Page 0</title>

    <link rel = "stylesheet" type = "text/css" href = "style.css">

    <script src = "https://cdnjs.cloudflare.com/ajax/libs/jspdf/1.5.3/jspdf.debug.js" integrity = "sha384-NaWTHo/8YCBYJ59830LTz/P4aQZK1sS0SneOgAvhsIl3zBu8r9RevNg5lHCHAuQ/" crossorigin = "anonymous"></script>
    <script src = "libraries/p5.min.js"></script>
    <script src = "libraries/p5.sound.min.js"></script>
  </head>

  <body>
    <script src = "page0.js"></script>
  </body>
</html>
function  setup() {

  let     the_canvas  =     createCanvas(792, 612, P2D);

                            noLoop();

  let     doc         = new jsPDF("l", "pt", [792, 612]);

  let     the_img     =     the_canvas.elt.toDataURL("image/JPEG", 1.0);
                            doc.addImage(the_img, "JPEG", 0, 0, 792, 612);

                            doc.save("page0.pdf");
                          
}

function  draw() {

                            background(43);

                            stroke(200);
                            fill(200);
                            textSize(100);
                            text("Test", 500, 500);

}
html, body {
  margin: 0;
  padding: 0;
}

canvas {
  display: block;
}
Поведение ключевого слова "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) для оценки ваших знаний,...
2
0
62
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

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

Попробуйте рисовать и писать, а затем сохраните PDF-файл на последнем этапе:

<!doctype html>
<html lang = "en">
<head>
<meta charset = "utf-8" />
<meta name = "viewport" content = "width=device-width, initial-scale=1.0" />
<title>Page 0</title>
<style>
html,
body {
  margin: 0;
  padding: 0;
}

canvas {
  display: block;
}
</style>
<script
  src = "https://cdnjs.cloudflare.com/ajax/libs/jspdf/1.5.3/jspdf.debug.js"
  integrity = "sha384-NaWTHo/8YCBYJ59830LTz/P4aQZK1sS0SneOgAvhsIl3zBu8r9RevNg5lHCHAuQ/"
  crossorigin = "anonymous"
></script>
<script src = "https://cdnjs.cloudflare.com/ajax/libs/p5.js/1.9.0/p5.js"></script>
</head>
<body>
<script>
let canvas;

function setup() {
  canvas = createCanvas(792, 612, P2D);
  noLoop();
}

function draw() {
  background(43);
  stroke(200);
  fill(200);
  textSize(100);
  text("Test", 500, 500);
  const doc = new jsPDF("l", "pt", [792, 612]);
  const img = canvas.elt.toDataURL("image/JPEG", 1.0);
  doc.addImage(img, "JPEG", 0, 0, 792, 612);
  doc.save("page0.pdf");
}
</script>
</body>
</html>

Обратите внимание, что разделение функций setup и draw, как показано выше, не является строго необходимым, поскольку вы выполняете одноразовую операцию. Вы можете поместить весь код в setup или весь код в draw (с помощью noLoop() он запускается только один раз).

Спасибо! Это работает в веб-редакторе p5.js. Я попробовал это обновление в своей локальной среде с тем же разбивкой файлов, что и в исходном сообщении, но оно все равно не работало. Итак, мне нужно кое-что выяснить с моей средой, но, по крайней мере, теперь у меня есть это решение в качестве модели. Очень признателен.

user25090379 17.05.2024 16:35

Кстати, работал в моей локальной среде, когда я объединил функции setup() и draw().

user25090379 17.05.2024 17:50

В этом нет необходимости. Должно быть, какая-то проблема с вашей локальной средой, например, устаревшая версия p5 или что-то в этом роде. Я запускал этот точный код локально в Ubuntu 22.04 и Firefox, и он работал нормально.

ggorlen 17.05.2024 18:06

Хм, я продолжу расследование. Похоже, у меня тоже версия 1.9.0, но я использую расширение VS Code, специфичное для p5. Мне также пришлось сохранить первую функцию с именем setup(), чтобы она работала, что, вероятно, также не является необходимым.

user25090379 17.05.2024 20:06
setup и draw — это специальные функции, которые p5 вызывает при загрузке после заполнения глобальных переменных. Таким образом, вы не можете их переименовывать, но поскольку вы используете noLoop(), не имеет значения, в какой (или обеих) функциях находится код, главное, чтобы порядок отрисовки, а затем PDF-файлов был правильным.
ggorlen 17.05.2024 20:18

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