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)