Cat hungry.png
Здравствуйте! Собираем деньги на перевод материалов по электронике(https://www.allaboutcircuits.com/education/). Реквизиты указаны здесь.

Processing:Библиотеки/PDF Export

Материал из Онлайн справочника
Перейти к: навигация, поиск


Перевод: Максим Кузьмин (Cubewriter)
Перевел 2686 статей для сайта.

Контакты:

Проверка/Оформление/Редактирование: Мякишев Е.А.


Ambox content.png Черновик


PDF Export[1]

Эта библиотека позволяет сохранять PDF-файлы напрямую из Processing. Эти векторные графические файлы можно масштабировать под любой размер, что позволяет делать файлы очень высокого разрешения. При помощи библиотеки PDF можно «сплющить» 3D-графику в векторный 2D-файл, но для экспорта 3D-данных нужно использовать библиотеку DXF.

Исходный код библиотеки можно найти на GitHub-репозитории Processing. О багах сообщайте тут. Эта библиотека часто используется с базовой функцией языка Processing size() в сочетании с beginRecord() и endRecord() или beginRaw() и endRaw(). Вместе с ней также можно использовать функцию createGraphics(). Разные способы применения этой библиотеки смотрите ниже.

Один кадр (без использования дисплейного окна)

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

  1. import processing.pdf.*;
  2.  
  3. void setup() {
  4.   size(400, 400, PDF, "filename.pdf");
  5. }
  6.  
  7. void draw() {
  8.   // рисуем здесь что-нибудь интересное:
  9.   line(0, 0, width/2, height);
  10.  
  11.   // выходим из программы:
  12.   println("Finished.");  //  "Программа завершена."
  13.   exit();
  14. }

Несколько страниц (без использования дисплейного окна)

Библиотека PDF Export также дает возможность сохранить каждый кадр в виде новой страницы PDF-документа. Этот скетч-пример создает 100-страничный документ:

  1. import processing.pdf.*;
  2.  
  3. void setup() {
  4.   size(400, 400, PDF, "filename.pdf");
  5. }
  6.  
  7. void draw() {
  8.   // рисуем тут что-нибудь интересное:
  9.   line(0, 0, frameCount * 4, height);
  10.    
  11.   // создаем объект для рендеринга:
  12.   PGraphicsPDF pdf = (PGraphicsPDF) g;
  13.  
  14.   // закончив рисовать, выходим и сохраняем файл:
  15.   if (frameCount == 100) {
  16.     exit();
  17.   } else {
  18.     pdf.nextPage();  // переходим к следующей странице
  19.   }
  20. }

Один кадр (с использованием дисплейного окна)

Чтобы нарисовать графику на экране, попутно сохраняя ее в PDF-файл, воспользуйтесь функциями beginRecord() и endRecord(). Это медленнее, но в самый раз, когда вам нужно видеть, что именно будет сохранено в PDF-файл.

  1. import processing.pdf.*;
  2.  
  3. void setup() {
  4.   size(400, 400);
  5.   noLoop();
  6.   beginRecord(PDF, "filename.pdf");
  7. }
  8.  
  9. void draw() {
  10.   // рисуем тут что-то интересное:
  11.   line(0, 0, width/2, height);
  12.  
  13.   endRecord();
  14. }

Один кадр из анимации (с использованием дисплейного окна)

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

  1. import processing.pdf.*;
  2.  
  3. boolean record;
  4.  
  5. void setup() {
  6.   size(400, 400);
  7. }
  8.  
  9. void draw() {
  10.   if (record) {
  11.     // имейте в виду, что вместо #### будет номер кадра:
  12.     beginRecord(PDF, "frame-####.pdf");
  13.   }
  14.  
  15.   // рисуем тут что-нибудь интересное:
  16.   background(255);
  17.   line(mouseX, mouseY, width/2, height/2);
  18.  
  19.   if (record) {
  20.     endRecord();
  21.         record = false;
  22.   }
  23. }
  24.  
  25. // используем нажатия на мышку, чтобы не создавать тысячи кадров:
  26. void mousePressed() {
  27.   record = true;
  28. }

Много кадров в один файл (с использованием дисплейного окна)

Скетч-пример ниже записывает абсолютно все, что происходит во время его работы. Чтобы выйти из скетча, нажмите на клавишу «Q». В скетче вызывается функция exit(), которая необходима, чтобы при выходе из программы файл был записан как нужно.

  1. import processing.pdf.*;
  2.  
  3. void setup() {
  4.   size(400, 400);
  5.   beginRecord(PDF, "everything.pdf");
  6. }
  7.  
  8. void draw() {
  9.   // если вызвать функцию background(),
  10.   // в PDF-файл будет записан только последний кадр,
  11.   // а если обойтись без нее, в PDF-файл будет записано все,
  12.   // что происходило на экране;
  13.    
  14.   // рисуем тут что-нибудь интересное:
  15.   line(mouseX, mouseY, width/2, height/2);
  16. }
  17.  
  18. void keyPressed() {
  19.   if (key == 'q') {
  20.     endRecord();
  21.     exit();
  22.   }
  23. }

Пауза во время записи (с использованием дисплейного окна)

Библиотека PDF Export также позволяет останавливать/продолжать запись в PDF-файл прямо во время работы скетча. Скетч-пример ниже включает/выключает запись при нажатии на клавишу «R». Если нажать на «Q», это закроет скетч.

  1. import processing.pdf.*;
  2.  
  3. boolean recording;
  4. PGraphicsPDF pdf;
  5.  
  6. void setup() {
  7.   size(400, 400);
  8.   pdf = (PGraphicsPDF) createGraphics(width, height, PDF, "pause-resume.pdf");
  9. }
  10.  
  11. void draw() {
  12.   // если вызвать функцию background(),
  13.   // в PDF-файл будет записан только последний кадр,
  14.   // а если обойтись без нее, в PDF-файл будет записано все,
  15.   // что происходило на экране;
  16.    
  17.   // рисуем тут что-нибудь интересное:
  18.   if (mousePressed) {
  19.     line(pmouseX, pmouseY, mouseX, mouseY);
  20.   }
  21. }
  22.  
  23. void keyPressed() {
  24.   if (key == 'r') {
  25.     if (recording) {
  26.       endRecord();
  27.       println("Recording stopped.");  //  "Запись остановлена."
  28.       recording = false;
  29.     } else {
  30.       beginRecord(pdf);
  31.       println("Recording started.");  //  "Запись запущена."
  32.       recording = true;
  33.     }
  34.   } else if (key == 'q') {
  35.     if (recording) {
  36.       endRecord();
  37.     }
  38.     exit();
  39.   }  
  40. }

Запись 3D-графики в PDF-файл (с использованием дисплейного окна)

Для создания векторов из 3D-данных используйте функции beginRaw() и endRaw(). Они считывают данные фигур прямо перед тем, как они будут нарисованы на экране. На этой стадии вся ваша сцена представляет собой ничего более, как длинный список линий и треугольников. Это значит, что сфера, создаваемая с помощью метода sphere(), будет состоять из сотен треугольников, а не из одного объекта.

При помощи beginDraw() и endDraw() можно сохранять графику из двухмерных и трехмерных визуализаторов. К примеру, использование beginRaw() вместе с библиотекой PDF Export сохранит геометрию в виде «сплющенных» треугольников и линий.

  1. import processing.pdf.*;
  2.  
  3. boolean record;
  4.  
  5. void setup() {
  6.   size(500, 500, P3D);
  7. }
  8.  
  9. void draw() {
  10.   if (record) {
  11.     beginRaw(PDF, "output.pdf");
  12.   }
  13.  
  14.   // в этом блоке рисуем то, что нам нужно:
  15.   background(204);
  16.   translate(width/2, height/2, -200);
  17.   rotateZ(0.2);
  18.   rotateY(mouseX/500.0);
  19.   box(200);
  20.  
  21.   if (record) {
  22.     endRaw();
  23.     record = false;
  24.   }
  25. }
  26.  
  27. // при нажатии на «R» скетч сохранит один кадр:
  28. void keyPressed() {
  29.   if (key == 'r') {
  30.     record = true;
  31.   }
  32. }

Создание PDF-файла при помощи createGraphics()

Сохранить PDF-файл также можно, используя лишь функцию createGraphics() и ничего другого, но для этого на объект PGraphicsPDF нужно будет применить функцию dispose(). Это то же самое, что и exit(), но без выхода из скетча.

  1. import processing.pdf.*;
  2.  
  3. PGraphics pdf = createGraphics(300, 300, PDF, "output.pdf");
  4. pdf.beginDraw();
  5. pdf.background(128, 0, 0);
  6. pdf.line(50, 50, 250, 250);
  7. pdf.dispose();
  8. pdf.endDraw();

Примечания к использованию визуализатора PDF

  • Если вам нужны 3D-данные, используйте вместе PDF Export библиотеку DXF.
  • При помощи hint(ENABLE_DEPTH_SORT) можно улучшить качество записи 3D-графики, сохраняемой в форматы для хранения 2D-графики.
  • Изображения выглядят не очень красиво – в основном из-за разницы ожиданий между тем, как должен выглядеть PDF-файл (с масштабированным изображением и высоким разрешением), и тем, что происходит, когда графические данные сохраняются в него с плотностью 72 точки на дюйм.
  • Начиная с версии 0120, текст больше не воспринимается по умолчанию в качестве данных о контурах символов, и это значит, что вам нужно установить шрифт для просмотра созданного PDF. Благодаря этому визуализатор PDF будет рендерить картинку лучше. Чтобы текст воспринимался как данные о контурах символов, сразу после size() впишите в коде textMode(SHAPE).
  • Еще один метод рендеринга текста – использование функции createFont() вместе со шрифтом формата TrueType (возможно, подойдут и некоторые шрифты формата OpenType). Вообще, в Processing должен работать любой шрифт из списка PFont.list(), но если все же не сработал, можно добавить файл шрифта с расширением «*.ttf» в папку «data» текущего скетча, а затем вызвать в скетче createFont("названиешрифта.ttf").
  • Если вместо createFont() воспользоваться loadFont(), текст может получиться растрированным и некрасивым. В некоторых случаях ситуацию может исправить hint(ENABLE_NATIVE_FONTS), если этот шрифт уже установлен на ПК.
  • Переход на новую страницу осуществляется при помощи nextPage(). Примерно так (это продемонстрировано в одном из примеров выше):
PGraphicsPDF pdf = (PGraphicsPDF) g;
pdf.nextPage();
  • Опять же, функция exit() очень важна при использовании PDF с помощью size().

См.также

Внешние ссылки

  1. processing.org - PDF Export