docs: @Override
      protected void processOperator(Operator operator, List<COSBase> arguments)
              throws IOException
      {
          String operation = operator.getName();
          /*System.out.println("Operator: " + operation + ":" + arguments.size());
          if (operation.equals("sc") || operation.equals("cs"))
          {
              System.out.print("  ");
              for (int i = 0; i < arguments.size(); i++)
                  System.out.print(arguments.get(i) + " ");
              System.out.println();
          }*/
  
          //word spacing
          if (operation.equals("Tw"))
          {
              style.setWordSpacing(getLength(arguments.get(0)));
          }
  
          //letter spacing
          else if (operation.equals("Tc"))
          {
              style.setLetterSpacing(getLength(arguments.get(0)));
          }
  
          //graphics
          else if (operation.equals("m")) //move
          {
              if (!disableGraphics)
              {
                  if (arguments.size() == 2)
                  {
                      float[] pos = transformPosition(getLength(arguments.get(0)), getLength(arguments.get(1)));
                      path_x = pos[0];
                      path_y = pos[1];
                      path_start_x = pos[0];
                      path_start_y = pos[1];
                  }
              }
          }
          else if (operation.equals("l")) //line
          {
              if (!disableGraphics)
              {
                  if (arguments.size() == 2)
                  {
                      float[] pos = transformPosition(getLength(arguments.get(0)), getLength(arguments.get(1)));
                      graphicsPath.add(new PathSegment(path_x, path_y, pos[0], pos[1]));
                      path_x = pos[0];
                      path_y = pos[1];
                  }
              }
          }
          else if (operation.equals("h")) //end subpath
          {
              if (!disableGraphics)
              {
                  graphicsPath.add(new PathSegment(path_x, path_y, path_start_x, path_start_y));
              }
          }
  
          //rectangle
          else if (operation.equals("re"))
          {
              if (!disableGraphics)
              {
                  if (arguments.size() == 4)
                  {
                  	float x = getLength(arguments.get(0));
                  	float y = getLength(arguments.get(1));
                  	float width = getLength(arguments.get(2));
                  	float height = getLength(arguments.get(3));
  
                      float[] p1 = transformPosition(x, y);
                      float[] p2 = transformPosition(x + width, y + height);
  
                  	graphicsPath.add(new PathSegment(p1[0], p1[1], p2[0], p1[1]));
                      graphicsPath.add(new PathSegment(p2[0], p1[1], p2[0], p2[1]));
                      graphicsPath.add(new PathSegment(p2[0], p2[1], p1[0], p2[1]));
                      graphicsPath.add(new PathSegment(p1[0], p2[1], p1[0], p1[1]));
                  }
              }
          }
  
          //fill
          else if (operation.equals("f") || operation.equals("F") || operation.equals("f*"))
          {
              renderPath(graphicsPath, false, true);
              graphicsPath.removeAllElements();
          }
  
          //stroke
          else if (operation.equals("S"))
          {
              renderPath(graphicsPath, true, false);
              graphicsPath.removeAllElements();
          }
          else if (operation.equals("s"))
          {
              graphicsPath.add(new PathSegment(path_x, path_y, path_start_x, path_start_y));
              renderPath(graphicsPath, true, false);
              graphicsPath.removeAllElements();
          }
  
          //stroke and fill
          else if (operation.equals("B") || operation.equals("B*"))
          {
              renderPath(graphicsPath, true, true);
              graphicsPath.removeAllElements();
          }
          else if (operation.equals("b") || operation.equals("b*"))
          {
              graphicsPath.add(new PathSegment(path_x, path_y, path_start_x, path_start_y));
              renderPath(graphicsPath, true, true);
              graphicsPath.removeAllElements();
          }
  
          //cancel path
          else if (operation.equals("n"))
          {
              graphicsPath.removeAllElements();
          }
  
          //invoke named object - images
          else if (operation.equals("Do"))
          {
              if (!disableImages)
                  processImageOperation(arguments);
          }
  
          super.processOperator(operator, arguments);
      }