Показаны сообщения с ярлыком cl-pdf. Показать все сообщения
Показаны сообщения с ярлыком cl-pdf. Показать все сообщения

среда, 24 ноября 2010 г.

Переделал свой форк cl-pdf

Форк cl-pdf я сделал довольно давно и тогда я ещё плохо ориентировался как в CL, так и в git, в итоге форк был оформлен очень топорно, без истории изменений. Сейчас дошли руки полностью его переделать используя git svn, так что в него попала полная история изменения. Все свои изменения также внёс одно за другим. Так что стало намного лучше и можно теперь нормально синхронизироваться с основным репозиторием, если там вдруг будут изменения, а они там бывают, хоть и реже чем раз в год.

От оригинальной версии мой форк отличается следующим:
  • Почищен разный мусор, типа каких-то левых патчей для поддержки CMUCL, различных вариаций на тему zlib и т.п., которые предлагалось как-то загружать руками
  • Для сжатия используется salza2 и только она.
  • Поддерживается загрузка и использования ttf шрифтов с помощью zpb-ttf
  • У функций draw-centered-text, draw-left-text и draw-right-text имеется дополнительный опциональный параметр max-height (параметр max-width уже был в оригинальной версии)
  • Добавлена функция append-child-ouline, а также экспортируется функция outline-root
Вообще надо немного привести в порядок код для генерации PDF, который я использую на работе, а также код для генерации PDF-версии PCL, который используется на lisper.ru и в соответствии с этим также внести ряд небольших изменений.

Плюс, есть желание выкинуть из cl-pdf код для парсинга PNG-файлов и использовать для этого библиотеку png-read (которую я обнаружил на днях) и сделать возможным использование PNG-изображений с прозрачностью (сейчас мне приходиться насильственно добавлять к таким изображениям фон).

среда, 29 апреля 2009 г.

cl-pdf и кирилица в структуре документа

PDF как формат я полюбил ещё до знакомства с lisp, ну а после перехода на CL открыл для себя замечательную библиотеку cl-pdf. Библиотека и правда замечательная, но с самого начала у меня не получалось с её помощью создавать структуру документа (закладки), содержащую русские названия. Тогда в CL я разбирался ещё совсем плохо и поэтому на проблему просто забил. Но вот теперь захотелось для одного генерируемого документа сделать всё красиво, ибо он большой и нужны нормальные средства навигации. Начал разбираться и нашёл проблему в функции pdf-string, причём, видимо, эта проблема проявляется только в sbcl: код этой фукнции подразумевает, что, например, (code-char 254) имеет тип base-char, но в sbcl это extended-char. В итоге родился небольшой патч, решающий эту проблему:
diff --git a/pdf.lisp b/pdf.lisp
index 16d8f6f..b54b5a6 100644
--- a/pdf.lisp
+++ b/pdf.lisp
@@ -235,21 +235,20 @@
(setq unicode (notevery #+lispworks #'lw:base-char-p
#-lispworks (lambda (char) (<= (char-code char) 255))
string)))
- (with-output-to-string (stream nil :element-type 'base-char)
- (write-char #\( stream)
- (when unicode ; write the Unicode byte order marker U+FEFF
- (write-char #.(code-char 254) stream) (write-char #.(code-char 255) stream))
+ (with-output-to-string (stream nil :element-type 'base-char)
+ (if unicode
+ (write-string "<FEFF" stream)
+ (write-char #\( stream))
(loop for char across string
for code = (char-code char)
if unicode
- do (write-char (code-char (ldb (byte 8 8) code)) stream) ; hi
- (write-char (code-char (ldb (byte 8 0) code)) stream) ; lo
+ do (format stream "~4,'0x" code)
else if (> code 255)
do (write-char (code-char (ldb (byte 8 0) code)) stream) ; lo
else do (case char ((#\( #\) #\\)
(write-char #\\ stream)))
(write-char char stream))
- (write-char #\) stream))))
+ (write-char (if unicode #\> #\)) stream))))

(defmacro with-outline-level ((title ref-name) &body body)
`(unwind-protect