如何在Clojure中将字符串发送到默认系统打印机

时间:2017-10-03 02:41:51

标签: java clojure

首先,我是Clojure的新手。我想知道如何将字符串打印到打印机。据我所知,我需要使用Java互操作。我搜索了Java代码并找到了这些代码行:

import java.awt.*;
import java.awt.print.*;

public class foo implements Printable {
  private static Font sFont = new Font("Serif", Font.PLAIN , 64);

  public int print(Graphics g, PageFormat Pf, int pageIndex)
      throws PrinterException {
    if (pageIndex > 0) return NO_SUCH_PAGE;
    Graphics2D g2 = (Graphics2D)g;
    g2.setFont(sFont);
    g2.setPaint(Color.black);
    g2.drawString("Save a tree!", 96, 144);
    return PAGE_EXISTS;
  }

  public static void main(String[] args) {
    PrinterJob job = PrinterJob.getPrinterJob( );
    job.setPrintable(new foo( ));
    if (job.printDialog( )) {
      try {
        job.print( );
      }
      catch (PrinterException e) {}
    }
    System.exit(0);
  }
}

我了解我需要使用Printable加载proxy界面 之后创建PrinterJob并将其设置为可打印,但我感到困惑 当我试图把它翻译成Clojure时。 到目前为止我的尝试是:

    (ns controller.core
      (:gen-class)
      (:require [clj-http.client :as client]
                [cheshire.core :refer :all]
                [clojure.edn :as edn]
                [clojure.java.io :as io]
                [clojure.string :as str]
)
      (:import [java.awt.print PrinterJob Printable PrinterException]
               [java.awt Graphics2D Color]      
               )
      )
    (defn make-page []
      (proxy [Printable] []
        (print
          [graphics page-format page-index]
          (if (> page-index 0)
            Printable/NO_SUCH_PAGE
            (let [g2 graphics]
              (.drawstring g2 ("foooooooo" 96 144))
              Printable/PAGE_EXISTS

          ))
      )

    (defn prnt []
      (let [print-j (PrinterJob/getPrinterJob)]
        (.setPrintable print-j (make-page))
        (.print print-j)))

    (defn -main
      [& args]
      (prnt)
      )

同样在第一个示例代码中,当Graphics类传递给Graphics2D时,如何将其转换为clojure以及为什么会发生,我的意思是我可以通过图形吗?另外如果我没有设置Color类和Font它们会是一些默认值吗?如果有人能解释我会感激不尽!

1 个答案:

答案 0 :(得分:0)

Clojure默认设置Color或Font没什么特别之处。我不熟悉AWT,但是你可能没有看到任何东西,因为Color / Font默认值不正确?您可以在命名空间中定义字体,即

(def sfont (Font. "Serif" Font.Plain 64)

,您可以从make-page内部引用。

或者,您可以使用reify匿名定义字体,如下所示:

(defn make-page []
  (let [sfont (.Font "Serif", Font.PLAIN , 64)]
    (reify Printable
      (print [graphics page-format page-index]
        ;; .. rest of code 
        ))))