2010-10-19 36 views
4

J'essaie d'utiliser cl-pdf pour une génération de PDF assez basique, mais je commence à me tromper sur les exemples (ce qui est pour le moins embarrassant).cl-pdf erreur de sortie

Quand je lance le premier exemple inclus dans le package

(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))) 

en exécutant (example1 #P"/home/inaimathi/Desktop/ex1.pdf") il me donne cette erreur

#<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.

La même chose se produit quand je l'appelle (example1), ou quand je fais

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

Enfin, si j'essaye

(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))

Je reçois l'erreur

#<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.

Est-il possible de déclarer un binary character stream? Comment puis-je obtenir une sortie simple sur cl-pdf? J'utilise SBCL directement à partir des repos Debian (qui est 1.0.29, je pense), au cas où cela serait important.

+0

Je regarde mes affaires (utilise cl-composition, qui appelle le document d'écriture de cl-pdf) et ça a l'air bien. Est-il possible que vous rencontriez des problèmes de permissions? –

+0

ne semble pas être une erreur d'autorisation; les appels réguliers à 'with-open-file' réussissent toujours quand j'essaye d'écrire dans le même fichier que ci-dessus, et je place le répertoire cible au 777 plus tôt juste pour vérifier si cela aide. Quelle implémentation CL utilisez-vous et quelle version de cl-pdf utilisez-vous? (J'ai téléchargé l'archive "cl-pdf-current" du site du concept fractal, je ne sais pas à quel point il est actuel) – Inaimathi

+0

Malheureusement, les dépôts Debian ne sont pas très à jour (presque aucun référentiel CL de distribution Linux, sauf le Lisp Gentoo recouvrir). Je recommanderais d'obtenir un SBCL actuel. – Svante

Répondre

3

(setf pdf:*compress-streams* nil) devrait aider. Il essaie d'écrire des données binaires dans un flux de caractères, et bien que cela fonctionne sur LispWorks et sur d'autres systèmes, cela ne fonctionne pas partout et particulièrement pas sur SBCL.

+0

Ce qui est logique étant donné la sortie d'erreur que je recevais. Je pense que j'ai toujours l'ancienne version de 'cl-pdf' sur ma machine à la maison; Je vais tester ça quand je sortirai du bureau. – Inaimathi

+0

Il s'avère que je n'ai pas encore l'ancienne version. Bizarrement, après avoir installé le checkout SVN, si je juste '(asdf-install: désinstaller 'cl-pdf)', alors '(asdf-install: install' cl-pdf)' (qui télécharge l'archive tar cl-pdf-current de fractalconcept), et essayez la fonction exemple, cela fonctionne toujours. Je suppose qu'il y a l'état laissé de l'ancienne installation que 'asdf-install: uninstall' ne se débarrasse pas. Je vais l'essayer sur une machine propre aujourd'hui pour voir ce qui se passe. – Inaimathi

+0

Ouais, ça marche. Si vous utilisez la version par défaut installée par ASDF, elle fonctionne correctement tant que vous évaluez ce qui précède en premier. Assez curieusement, vous devez le faire même si vous définissez '* compress-streams *' à 'nil' dans config.lisp – Inaimathi

1

EDIT: C'est ce que j'ai fini par faire. La solution de xach ci-dessus fonctionnerait également. En fin de compte, j'ai dû git svn clone http://www.fractalconcept.com:8000/public/open-source/cl-pdf et l'installer.

Pour les newbs (depuis que je me souviens combien il est frustrant pour quelqu'un de nouveau à Common Lisp entendre « juste faire une caisse et l'installer »):

1.Do la caisse comme ci-dessus (je suppose que vous » avez fait dans votre répertoire à partir de maintenant)

2.Tapez dans tar -czvf ~/cl-pdf.tar.gz ~/cl-pdf (le point est d'obtenir un tarball du dossier. Vous pouvez le faire via l'interface graphique aussi, il ne fait aucune différence)

3.Hop dans votre invite SBCL et entrez

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

4.If vous avez déjà installé à l'aide cl-pdf(asdf-install:install 'cl-pdf), alors vous devrez entrer (asdf-install:uninstall 'cl-pdf)

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

Je suis une erreur de compilation tout au long de ce processus, que je viens de choisir [Accept] pour. Cela semble toujours fonctionner correctement.

Espérons que la prochaine version de quicklisp réduira le besoin de ce type de chasse de paquets.