Skip to content
Advertisement

Issues exporting Processing sketch to PDF: sketch gets cropped

I am trying to export my sketch to pdf. The issue that I have is that for some reason only a portion of my sketch is exported to pdf, as if the original sketch was cropped! When I run my sketch, 64 lines show up (as intended) and indeed when I save it to png all the 64 lines are there and sketch looks just the same as when I run it.

When I export the sketch to pdf though, only 16 line show up, as if the pdf was cropping my sketch and only the cropped portion was being exported.

This is the png showing what the sketch is supposed to look like: enter image description here

This is what the pdf has exported: enter image description here

And this is my code:

import processing.pdf.*;
import java.util.Random;


int cols, rows;
int videoScale = 100;
boolean recordPDF = false;


void setup() {
  size(800,800);
  pixelDensity(2);
  frameRate(0.5);

  cols = width/videoScale;
  rows = height/videoScale;

}

void draw() {
  if (recordPDF) {
      beginRecord(PDF, "pdfs/" + str(random(1000)) + ".pdf");
  }

  background(255);
  strokeWeight(1.5);
  drawLines(); 

  if (recordPDF) {
      endRecord();
      recordPDF = false;
      println("Printed pdf.");
  }
}

void keyPressed() {
    if (key == 'p') {
        recordPDF = true;
    }
    if (key == 's') {
        saveFrame("img.png");
    }
}


void drawLines() {
    // Begin loop for columns
    for (int i = 0; i < cols; i++) {
    // Begin loop for rows
        for (int j = 0; j < rows; j++) {
            int x = i*videoScale;
            int y = j*videoScale;
            line(x,y,x+30,y+30);
        }
    }
}

I have looked into the relevant documentation on PDF exports but could not find a solution to this. Any help would be greatly appreciated!

Advertisement

Answer

Remove pixelDensity(2) from the setup() to fix. PixelDensity of 2 was designed to allow retina monitors to use all of the pixels. If you must use it, then you would need to write a separate drawLines() for the pdf file (example follows). Note that for the pdf drawLines() the videoScale is cut in half and the second set of x,y coordinates for each line is +15 instead of +30. You will also have to change the path for each file saved to be correct for your system. I used a different method for creating a pdf from pGraphics, which should be irrelevant.

/*
 If pixelDensity(2) is used, need to modify second drawLines() for pdf.
 Change file paths to suit your system.
*/

import processing.pdf.*;
import java.util.Random;

int cols, rows;
int videoScale = 100;

void drawLines() {
  for (int i = 0; i < cols; i++) {
    for (int j = 0; j < rows; j++) {
      int x = i*videoScale;
      int y = j*videoScale;
      strokeWeight(1.5);
      line(x, y, x+30, y+30);
    }
  }
}

void setup() {
  size(800, 800);
  background(255);
  pixelDensity(2);
  // frameRate(0.5);
  cols = width/videoScale;
  rows = height/videoScale;   
  drawLines();
}

void draw() {
}

void keyPressed() {
  if (key == 'p') {
    PGraphics pdf = createGraphics(width, height, PDF, "/Users/me/Desktop/output.pdf"); // change this
    videoScale = 50;  // cut in half
    pdf.beginDraw();  
    for (int i = 0; i < cols; i++) {
      for (int j = 0; j < rows; j++) {
        int x = i*videoScale;
        int y = j*videoScale;
        pdf.line(x, y, x+15, y+15); // +15 instead of +30 for second x,y coordinates
      }
    }
    pdf.dispose();
    pdf.endDraw();
    println("Printed pdf.");
  }
  if (key == 's') {
    saveFrame("/Users/me/Desktop/img.png"); // change this
    println("Image saved.");
  }
}

Advertisement