Processing:Библиотеки/PDF Export
Содержание | Среда разработки Processing | Справочник языка Processing | Библиотеки | Примеры | Режимы программирования |
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().
См.также
Внешние ссылки
Примеры на Processing | |
---|---|
Основы |
|
Продвинутые графические эффекты |
|
Примеры из сторонних библиотек |