【问题标题】:cl-pdf output errorcl-pdf输出错误
【发布时间】:2010-10-19 15:29:54
【问题描述】:

我正在尝试将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") 它给了我这个错误

# 不是二进制输出流。
    [SIMPLE-TYPE-ERROR 类型的条件]

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

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

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

最后,如果我尝试

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

我得到了错误

# 不是字符输出流。
   [SIMPLE-TYPE-ERROR 类型的条件]

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

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

【问题讨论】:

  • 我在看我的东西(使用 cl-typesetting,它调用 cl-pdf 的 write-document),它看起来不错。您是否可能遇到权限问题?
  • 似乎不是权限错误;当我尝试写入与上述相同的文件时,对with-open-file 的常规调用仍然成功,并且我之前将目标目录设置为 777 只是为了检查它是否有帮助。你使用的是什么 CL 实现,你运行的是什么版本的 cl-pdf? (我从分形概念网站下载了“cl-pdf-current”压缩包,不确定它的最新程度)
  • 遗憾的是,Debian 存储库不是最新的(几乎没有 Linux 发行版的 CL 存储库,除了 Gentoo Lisp 覆盖)。我会建议获取当前的 SBCL。
  • 从他们的项目页面(即 1.0.49)试用了最新的 SBCL 二进制文件,当我尝试定义和调用 example1 时,它产生了同样的错误; this is not a binary stream。所以它不是(只是)SBCL 的版本。
  • 我正在使用 SBCL,我的 cl-pdf 和 cl-typesetting 来自 svn,日期为 2009-08-07。

标签: lisp pdf-generation common-lisp outputstream


【解决方案1】:

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

【讨论】:

  • 考虑到我得到的错误输出,这是有道理的。我想我家里的机器上还有旧版本的cl-pdf;当我离开办公室时,我会对此进行测试。
  • 原来我还没有旧版本。奇怪的是,安装了 SVN 结帐后,如果我只是 (asdf-install:uninstall 'cl-pdf),然后是 (asdf-install:install 'cl-pdf)(从 fractalconcept 下载 cl-​​pdf-current tarball),并尝试示例函数,它仍然有效。我假设asdf-install:uninstall 没有摆脱旧安装留下的状态。我今天会在干净的机器上试一试,看看会发生什么。
  • 是的,它有效。如果您使用 ASDF 安装的默认版本,只要您先评估上述内容,它就可以正常运行。奇怪的是,即使你在 config.lisp 中将 *compress-streams* 设置为 nil,你也需要这样做
【解决方案2】:

编辑 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(重点是获取文件夹的压缩包。你也可以通过GUI来完成,没有区别)

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

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-11-19
    • 1970-01-01
    • 2021-09-06
    • 1970-01-01
    • 1970-01-01
    • 2011-11-07
    • 1970-01-01
    • 2020-06-19
    相关资源
    最近更新 更多