2

最初の引数としてベクトルまたは入力ストリームを期待する java/scala から clojure-function を呼び出す必要があります。

これを行うと、常に次の例外が発生します。

実行例外[[UnsupportedOperationException: pdf (clj-pdf.main/-pdfが定義されていませんか?)]]

clj-pdfを使用しており、pdf-function を呼び出す必要があります

(defn pdf
  "usage:
   in can be either a vector containing the document or an input stream. If in is an input stream then the forms will be read sequentially from it.
   out can be either a string, in which case it's treated as a file name, or an output stream.
   NOTE: using the :pages option will cause the complete document to reside in memory as it will need to be post processed."
  [in out]
  (if (instance? InputStream in)
    (stream-doc in out)
    (write-doc in out)))

ソースを変更し、jarを作成しました

leiningen uberjar

cjl-pdf の project.clj への変更は、最後の 2 行で確認できます。

(defproject clj-pdf 
  "1.0.6"
  :description "PDF generation library"
  :url "https://github.com/yogthos/clj-pdf"
  :license {:name "GNU Lesser General Public License - v 3"
            :url "http://www.gnu.org/licenses/lgpl.html"
            :distribution :repo
            :comments "same as  iText and JFreeChart"}
  :dependencies [[org.clojure/clojure "1.5.0"]
                 [jfree/jfreechart "1.0.13"]                 
                 [itext-min "0.2"]]

  :aot [clj-pdf.main]
  :main clj-pdf.main)

そして追加したmain.cljで:

(ns clj-pdf.main
  (:gen-class
   ;; neither java.io.InputStream nor ArrayList work:
   :methods [#^{:static true} [pdf [java.util.ArrayList, java.io.OutputStream] void]])
  (:use clj-pdf.core))

(defn -main [& args])

次のように、scala コードから lib を使用しています。

val output = new ByteArrayOutputStream()
val list = new java.util.ArrayList[String]
list.add( """[:list {:roman true} 
             [:chunk {:style :bold} "a bold item"] "another item" "yet another item"]
             [:phrase "some text"]                                   
             [:paragraph "yet more text"]]""")

clj_pdf.main.pdf(list, output)

これを回避する方法はありますか?

4

1 に答える 1