title: How to print nodes to thermal printer - JavaFX
body: <p>I want to print nodes with their content (<code>ImageView</code>, <code>Label</code>, <code>VBox</code> etc)  to a thermal printer.
  I already have the nodes ready and set to fit the size of an 80mm paper.</p>
  
  <p>The problem is when I try to create a custom paper size to fit the 80mm paper size of my thermal printer I get all the content shifted to the right.</p>
  
  <p>However, that only happens when I change the <code>height</code> of the paper.</p>
  
  <p>This is my printing code</p>
  
  <pre><code>public void printImage(Node node) {
  
          PrinterJob job = PrinterJob.createPrinterJob();
  
          Paper paper = PrintHelper.createPaper("Roll80", 80, 270, Units.MM);
          PageLayout pageLayout = job.getPrinter().createPageLayout(paper, PageOrientation.PORTRAIT, 0, 0, 0, 0);
  
          double scale = 0.791;
  
          node.getTransforms().add(new Scale(scale, scale));
  
          if (job != null) {
              boolean success = printerJob.printPage(pageLayout, node);
              if (success) {
                  job.endJob();
                  System.exit(0);
              }
          }
      }
  </code></pre>
  
  <p>ٌResults when I set the paper height to less than 310 or more than 340
  Example: <code>Paper paper = PrintHelper.createPaper("Roll80", 80, 270, Units.MM);</code>
  <a href="https://i.stack.imgur.com/pBOhh.png" rel="nofollow noreferrer">results1</a></p>
  
  <p>ٌResults when I set the paper height to 310 or 340 or more than 560
  Example: <code>Paper paper = PrintHelper.createPaper("Roll80", 80, 590, Units.MM);</code>
  <a href="https://i.stack.imgur.com/ujwkD.png" rel="nofollow noreferrer">results2</a> *Img is much hiegher than captured.</p>
  
  <p>Note: 
  When I adjust the width to more than 100 I still can get the height to less than 230 with no problems but still, I want my page width to be 80mm and the height to the same height of my receipt(Nodes).</p>
  
  <p>PrintHelper method:</p>
  
  <pre><code>package com.sun.javafx.print;
  
  import javafx.print.JobSettings;
  import javafx.print.Paper;
  import javafx.print.PaperSource;
  import javafx.print.PrintResolution;
  import javafx.print.Printer;
  
  /**
   * An internal class which provides a way for implementation code to
   * access to package level protected constructors (etc).
   * All entry points to the printing API need to ensure this class is
   * loaded and initialized.
   */
  public class PrintHelper {
      private static PrintAccessor printAccessor;
  
      static {
          forceInit(Printer.class);
      }
  
      private PrintHelper() {
      }
  
      public static PrintResolution createPrintResolution(int fr, int cfr) {
          return printAccessor.createPrintResolution(fr, cfr);
      }
  
      public static Paper createPaper(String paperName,
                               double paperWidth,
                               double paperHeight,
                               Units units) {
          return printAccessor.createPaper(paperName, paperWidth, paperHeight, units);
      }
  
      public static PaperSource createPaperSource(String name) {
          return printAccessor.createPaperSource(name);
      }
  
      public static JobSettings createJobSettings(Printer printer) {
          return printAccessor.createJobSettings(printer);
      }
  
      public static Printer createPrinter(PrinterImpl impl) {
          return printAccessor.createPrinter(impl);
      }
  
      public static PrinterImpl getPrinterImpl(Printer printer) {
          return printAccessor.getPrinterImpl(printer);
      }
  
      public static void setPrintAccessor(final PrintAccessor newAccessor) {
          if (printAccessor != null) {
              throw new IllegalStateException();
          }
  
          printAccessor = newAccessor;
      }
  
      public interface PrintAccessor {
          PrintResolution createPrintResolution(int fr, int cfr);
  
          Paper createPaper(String paperName,
                                            double paperWidth,
                                            double paperHeight,
                                            Units units);
  
          PaperSource createPaperSource(String name);
  
          JobSettings createJobSettings(Printer printer);
  
          Printer createPrinter(PrinterImpl impl);
  
          PrinterImpl getPrinterImpl(Printer printer);
      }
  
      private static void forceInit(final Class&lt;?&gt; classToInit) {
          try {
              Class.forName(classToInit.getName(), true,
                            classToInit.getClassLoader());
          } catch (final ClassNotFoundException e) {
              throw new AssertionError(e);  // Can't happen
          }
      }
  }
  </code></pre>