4

我正在尝试使用cl-pdf一些相当基本的 PDF 生成,但我被示例绊倒了(至少可以说这很尴尬)。

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

(defun example1 (&optional (file #P"/tmp/ex1.pdf"))
  (pdf:with-document ()
    (pdf:with-page ()
      (pdf:with-outline-level ("示例" (pdf:register-page-reference))
        (让 ((helvetica (pdf:get-font "Helvetica")))
          (pdf:文本模式
           (pdf:set-font helvetica 36.0)
           (pdf:移动文本 100 800)
           (pdf:draw-text "cl-pdf: Example 1"))
          (pdf:翻译 230 500)
          (循环重复 150
         对于 i = 0.67 那么 (* i 1.045)
         做 (pdf:in-text-mode
             (pdf:set-font helvetica i)
             (pdf:set-rgb-fill (/ (随机 255) 255.0)
                               (/ (随机 255) 255.0)
                               (/ (随机 255) 255.0))
             (pdf:移动文本 (* i 3) 0)
             (pdf:show-text "cl-typesetting"))
           (pdf:旋转 13)))))
    (pdf:write-document 文件)))

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

#<SB-SYS:FD-STREAM 用于“文件 /home/inaimathi/Desktop/test.pdf”
{CF9D931}> 不是二进制输出流。
    [SIMPLE-TYPE-ERROR 类型的条件]

重启:
 0:[ABORT] 退出调试器,返回顶层。

当我打电话(example1)或打电话时也会发生同样的事情

(带打开文件
     (测试文件#P“/home/inaimathi/Desktop/ex1.pdf”
     :direction :output :if-does-not-exist :create)
   (example1 测试文件))

最后,如果我尝试

(带打开文件
     (测试文件#P“/home/inaimathi/Desktop/ex1.pdf”
     :direction :output :if-does-not-exist :create
     :element-type '(无符号字节 8))
   (example1 测试文件))

我得到错误

#<SB-SYS:FD-STREAM 用于“文件 /home/inaimathi/Desktop/test.pdf”
{D197C99}> 不是字符输出流。
   [SIMPLE-TYPE-ERROR 类型的条件]

重启:
 0:[ABORT] 退出调试器,返回顶层。

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

4

2 回答 2

4

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

于 2010-10-20T13:56:08.930 回答
1

编辑 2:asdf-install 未维护且已弃用。 最好使用Quicklisp。要安装 Quicklisp,您需要下载它:

$ curl -O https://beta.quicklisp.org/quicklisp.lisp

然后添加cl-pdf到您的 lisp 安装中:

$ sbcl --load quicklisp.lisp
* (quicklisp-quickstart:install)
* (ql:quickload "vecto")
* (ql:add-to-init-file)
* (exit)

现在您需要做的就是添加

(load "~/quicklisp/setup.lisp") ; if it installed in the default location

到您的.lisp文件中,然后您可以添加

(ql:quickload "cl-pdf")

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

最后我不得不wget http://www.fractalconcept.com/download/cl-pdf-current.tgz安装它。

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

1.按上述方式进行结帐(我假设您从现在开始在您的主目录中完成此操作)

2.输入tar xvzf cl-pdf-current.tgz(重点是获取文件夹的tarball。您也可以通过GUI执行此操作,没有区别)

3.跳到你的SBCL提示符并输入

(需要'asdf)
(需要'asdf-install)

4.如果你已经安装了cl-pdf(asdf-install:install 'cl-pdf)那么你需要输入(asdf-install:uninstall 'cl-pdf)

5.类型(asdf-install:install "/home/[your home folder name]/cl-pdf-current.tgz")

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

希望即将发布的quicklisp将减少对这种包搜索的需求。

于 2010-10-19T23:10:43.510 回答