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

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


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



PDF Export[1]

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

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

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

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

import processing.pdf.*;

void setup() {
  size(400, 400, PDF, "filename.pdf");
}

void draw() {
  // рисуем здесь что-нибудь интересное:
  line(0, 0, width/2, height);

  // выходим из программы: 
  println("Finished.");  //  "Программа завершена."
  exit();
}

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

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

import processing.pdf.*;

void setup() {
  size(400, 400, PDF, "filename.pdf");
}

void draw() {
  // рисуем тут что-нибудь интересное:
  line(0, 0, frameCount * 4, height);
    
  // создаем объект для рендеринга: 
  PGraphicsPDF pdf = (PGraphicsPDF) g;

  // закончив рисовать, выходим и сохраняем файл:
  if (frameCount == 100) {
    exit();
  } else {
    pdf.nextPage();  // переходим к следующей странице 
  }
}

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

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

import processing.pdf.*;

void setup() {
  size(400, 400);
  noLoop();
  beginRecord(PDF, "filename.pdf"); 
}

void draw() {
  // рисуем тут что-то интересное:
  line(0, 0, width/2, height);

  endRecord();
}

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

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

import processing.pdf.*;

boolean record;

void setup() {
  size(400, 400);
}

void draw() {
  if (record) {
    // имейте в виду, что вместо #### будет номер кадра:
    beginRecord(PDF, "frame-####.pdf"); 
  }

  // рисуем тут что-нибудь интересное:
  background(255);
  line(mouseX, mouseY, width/2, height/2);

  if (record) {
    endRecord();
	record = false;
  }
}

// используем нажатия на мышку, чтобы не создавать тысячи кадров:
void mousePressed() {
  record = true;
}

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

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

import processing.pdf.*;

void setup() {
  size(400, 400);
  beginRecord(PDF, "everything.pdf");
}

void draw() {
  // если вызвать функцию background(),
  // в PDF-файл будет записан только последний кадр,
  // а если обойтись без нее, в PDF-файл будет записано все,
  // что происходило на экране;
   
  // рисуем тут что-нибудь интересное:
  line(mouseX, mouseY, width/2, height/2);
}

void keyPressed() {
  if (key == 'q') {
    endRecord();
    exit();
  }
}

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

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

import processing.pdf.*;

boolean recording;
PGraphicsPDF pdf;
 
void setup() {
  size(400, 400);
  pdf = (PGraphicsPDF) createGraphics(width, height, PDF, "pause-resume.pdf");
}
 
void draw() {
  // если вызвать функцию background(), 
  // в PDF-файл будет записан только последний кадр,
  // а если обойтись без нее, в PDF-файл будет записано все,
  // что происходило на экране;
   
  // рисуем тут что-нибудь интересное:
  if (mousePressed) {
    line(pmouseX, pmouseY, mouseX, mouseY);
  }
}
 
void keyPressed() {
  if (key == 'r') {
    if (recording) {
      endRecord();
      println("Recording stopped.");  //  "Запись остановлена."
      recording = false;
    } else {
      beginRecord(pdf);
      println("Recording started.");  //  "Запись запущена."
      recording = true;
    }
  } else if (key == 'q') {
    if (recording) {
      endRecord();
    }
    exit();
  }  
}

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

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

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

import processing.pdf.*;

boolean record;

void setup() {
  size(500, 500, P3D);
}

void draw() {
  if (record) {
    beginRaw(PDF, "output.pdf");
  }

  // в этом блоке рисуем то, что нам нужно:
  background(204);
  translate(width/2, height/2, -200);
  rotateZ(0.2);
  rotateY(mouseX/500.0);
  box(200);

  if (record) {
    endRaw();
    record = false;
  }
}

// при нажатии на «R» скетч сохранит один кадр:
void keyPressed() {
  if (key == 'r') {
    record = true;
  }
}

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

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

import processing.pdf.*;

PGraphics pdf = createGraphics(300, 300, PDF, "output.pdf");
pdf.beginDraw();
pdf.background(128, 0, 0);
pdf.line(50, 50, 250, 250);
pdf.dispose();
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().

См.также

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