cl-pdf输出错误

时间:2010-10-19 15:29:55

标签: lisp pdf-generation common-lisp outputstream

我正在尝试使用cl-pdf进行一些相当基本的PDF生成,但是我正在惹恼这些例子(至少可以说是尴尬)。

当我运行包中包含的第一个例子时

(defun example1 (&optional (file #P"/tmp/ex1.pdf"))
  (pdf:with-document ()
    (pdf:with-page ()
      (pdf:with-outline-level ("Example" (pdf:register-page-reference))
        (let ((helvetica (pdf:get-font "Helvetica")))
          (pdf:in-text-mode
           (pdf:set-font helvetica 36.0)
           (pdf:move-text 100 800)
           (pdf:draw-text "cl-pdf: Example 1"))
          (pdf:translate 230 500)
          (loop repeat 150
         for i = 0.67 then (* i 1.045)
         do (pdf:in-text-mode
             (pdf:set-font helvetica i)
             (pdf:set-rgb-fill (/ (random 255) 255.0)
                               (/ (random 255) 255.0)
                               (/ (random 255) 255.0))
             (pdf:move-text (* i 3) 0)
             (pdf:show-text "cl-typesetting"))
           (pdf:rotate 13)))))
    (pdf:write-document file)))

通过运行(example1 #P"/home/inaimathi/Desktop/ex1.pdf"),它给了我这个错误

#<SB-SYS:FD-STREAM for "file /home/inaimathi/Desktop/test.pdf" 
{CF9D931}> is not a binary output stream. 
    [Condition of type SIMPLE-TYPE-ERROR]

Restarts:
 0: [ABORT] Exit debugger, returning to top level.

当我打电话给(example1)或我做

时,会发生同样的事情
(with-open-file 
     (test-file #P"/home/inaimathi/Desktop/ex1.pdf" 
     :direction :output :if-does-not-exist :create) 
   (example1 test-file))

最后,如果我尝试

(with-open-file 
     (test-file #P"/home/inaimathi/Desktop/ex1.pdf" 
     :direction :output :if-does-not-exist :create 
     :element-type '(unsigned-byte 8)) 
   (example1 test-file))

我收到错误

#<SB-SYS:FD-STREAM for "file /home/inaimathi/Desktop/test.pdf" 
{D197C99}> is not a character output stream.
   [Condition of type SIMPLE-TYPE-ERROR]

Restarts:
 0: [ABORT] Exit debugger, returning to top level.

有没有办法申报binary character stream?如何从cl-pdf中获得简单的输出?我正在使用SBCL直接从debian回购(我认为是1.0.29),以防万一。

2 个答案:

答案 0 :(得分:3)

(setf pdf:*compress-streams* nil)应该有所帮助。它试图将二进制数据写入字符流,虽然它适用于LispWorks和其他一些系统,但它并不适用于所有地方,特别是在SBCL上无法使用。

答案 1 :(得分:1)

编辑:这就是我最终要做的事情。上面的xach解决方案也可行。

最后我不得不git svn clone http://www.fractalconcept.com:8000/public/open-source/cl-pdf安装它。

对于newbs(因为我记得Common Lisp的新手听到“只是做结帐并安装它”是多么令人沮丧):

1.如上所述结帐(我假设您从现在开始在您的主目录中完成此操作)

2.在tar -czvf ~/cl-pdf.tar.gz ~/cl-pdf中键入(关键是要获取文件夹的tarball。你也可以通过GUI完成这一点,它没有任何区别)

3.点击您的SBCL提示并输入

(require 'asdf)
(require 'asdf-install)

4.如果您已使用cl-pdf安装了(asdf-install:install 'cl-pdf),则需要输入(asdf-install:uninstall 'cl-pdf)

5.Type (asdf-install:install "/home/[your home folder name]/cl-pdf.tar.gz")

我在整个过程中遇到了一个编译错误,我刚刚选择了[Accept] for。它似乎仍然可以正常工作。

希望即将发布的quicklisp将减少对此类打包的需求。