Lisp cl pdf输出错误

Lisp cl pdf输出错误,lisp,pdf-generation,common-lisp,outputstream,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)) (le

我试图使用
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))) 当我调用
(示例1)
,或者当我调用时,也会发生同样的事情

(with-open-file (test-file #P"/home/inaimathi/Desktop/ex1.pdf" :direction :output :if-does-not-exist :create) (example1 test-file)) (已打开文件) (测试文件#P)/home/inaimathi/Desktop/ex1.pdf” :方向:输出:如果不存在:创建) (示例1测试文件) 最后,如果我尝试

(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)) (已打开文件) (测试文件#P)/home/inaimathi/Desktop/ex1.pdf” :方向:输出:如果不存在:创建 :元素类型(无符号字节8)) (示例1测试文件) 我得到了错误

#<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. #不是字符输出流。 [类型SIMPLE-type-ERROR的条件] 重新启动: 0:[中止]退出调试器,返回顶层。
是否有方法声明二进制字符流?如何从
cl pdf
中获得简单输出?我使用的是debian repos中的SBCL(我认为是1.0.29),以防万一。

编辑2:asdf安装未维护且已弃用。最好使用。要安装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)
现在,您只需添加

(加载“~/quicklisp/setup.lisp”);如果它安装在默认位置
添加到
.lisp
文件中,然后可以添加

(ql:quickload "cl-pdf")

编辑:这就是我最后要做的。上述xach的解决方案也会起作用

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

对于新手(因为我记得对于刚接触Common Lisp的人来说,听到“只需签出并安装它”是多么令人沮丧):

1.按照上面的方法进行签出(我假设从现在起,您已经在主目录中完成了此操作)

2.输入
tar xvzf cl pdf current.tgz
(要点是获取文件夹的tarball。您也可以通过GUI来完成,这没有什么区别)

3.跳入SBCL提示符并输入

(require 'asdf) (require 'asdf-install) (需要“asdf”) (需要“asdf安装”) 4.如果您已经使用
(asdf安装:安装'cl-pdf)
安装了
cl-pdf
,则需要输入
(asdf安装:卸载'cl-pdf)

5.键入
(asdf安装:安装“/home/[您的主文件夹名称]/cl pdf current.tgz”)

在整个过程中,我遇到了一个编译错误,我刚刚选择了[Accept]。它似乎仍然运作良好


希望即将发布的将减少这种软件包搜索的需要。

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

我正在查看我的东西(使用cl排版,称为cl pdf的写入文档),它看起来很好。您是否可能遇到权限问题?似乎不是权限错误;当我尝试像上面那样写入同一个文件时,使用open file对
的常规调用仍然成功,我在前面将目标目录设置为777只是为了检查它是否有用。您使用的是什么CL实现,您运行的是什么版本的CL pdf?(我从fractal concept网站下载了“cl pdf current”tarball,不知道它有多流行)遗憾的是,Debian存储库不是非常最新(除了Gentoo Lisp overlay,几乎没有Linux发行版的cl存储库是最新的)。我建议获取当前的SBCL。从他们的项目页面(即1.0.49)尝试了最新的SBCL二进制文件,当我尝试定义和调用
example1
时,它生成了相同的错误<代码>这不是二进制流
。因此,这不仅仅是SBCL的版本。我使用的是SBCL,我的cl pdf和cl排版来自svn,日期为2009-08-07。考虑到我得到的错误输出,这是有道理的。我想我在家里的机器上仍然有旧版本的
clpdf
;当我离开办公室时,我会测试这个。结果我还没有旧版本。奇怪的是,安装了SVN checkout后,如果我只是
(asdf install:uninstall'cl pdf)
,然后
(asdf install:install'cl pdf)
(从fractalconcept下载cl pdf当前tarball)并尝试示例函数,它仍然可以工作。我假设旧安装中遗留了
asdf install:uninstall
无法摆脱的状态。今天我要在干净的机器上试一下,看看会发生什么。是的,它很管用。如果您使用ASDF安装的默认版本,只要您首先评估上述内容,它就会正常运行。奇怪的是,即使在config.lisp中将
*compress streams*
设置为
nil
,也需要这样做 (require 'asdf) (require 'asdf-install)