Преобразование холста HTML5 в PDF с использованием Tcl - PullRequest
0 голосов
/ 14 февраля 2019

Я хочу сохранить строку base64, извлеченную из холста HTML5 через Javascript, в файл PDF с помощью Tcl.

Я получаю SDR строки base 64 из Canvas через JS: let data = chart.getImage('stream').data; Тем временем я сохранил эту base64Данные в файле для тестирования.В моем скрипте Tcl я загружаю этот файл и пытаюсь преобразовать его с помощью пакета pdf4tcl .

#! /bin/env tclsh

# import Tcl (optional) but makes script more portable
package require Tcl

# import pdf4tcl
lappend auto_path "C:/Users/ - deleted for privacy ^^ -"
package require pdf4tcl

# Read demo File (contains base64 encoded canvas)
set fp [open "singerGraph.txt" r]
set canvas_data [read $fp]
close $fp


# create a pdf object
pdf4tcl::new mypdf -paper a4 -margin 15mm
mypdf startPage

# this command doesnt work
# mypdf putRawImage $image_data 60 20 -height 40

# write pdf to a file
mypdf write -file mypdf.pdf
mypdf destroy

Метод putRawImage дает

 instead
    while executing
"binary format H* $row"
    (class "::pdf4tcl::pdf4tcl" method "putRawImage" line 88)
    invoked from within
"mypdf putRawImage $canvas_data 60 20 -height 40"
    (file "base64ToPdf.tcl" line 28)

Но я думаю, что этов любом случае это неправильная команда ...

Для простого теста этой базы 64 может быть достаточно

data =  "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAIAAAACDbGyAAAAAXNSR0IArs4c6QAAAAlwSFlzAAALEwAACxMBAJqcGAAAAAd0SU1FB9oMCRUiMrIBQVkAAAAZdEVYdENvbW1lbnQAQ3JlYXRlZCB3aXRoIEdJTVBXgQ4XAAAADElEQVQI12NgoC4AAABQAAEiE+h1AAAAAElFTkSuQmCC";

Однако мои Данные начинаются с: data:application/octet-stream;base64,, но я не знаю,это важно или нет.Тестовые данные слишком длинные, чтобы вставить их сюда.

Может ли кто-нибудь привести меня в правильном направлении.Так что я могу преобразовать эти данные в PDF или даже PNG будет достаточно на данный момент.

Ответы [ 2 ]

0 голосов
/ 14 февраля 2019

Что ж, я смог получить

  1. PNG из моей строки base64
  2. , затем передать этот PNG в PDF
  3. и сохранить PDF какfile

Так как я очень плохо знаком с Tcl, этот код может быть ужасным, но сейчас это хорошая отправная точка.

#! /bin/env tclsh

package require base64
package require Img

# import pdf4tcl
lappend auto_path "C:/Users/ *username* /Documents/Tcl-TK"
package require pdf4tcl

# Read demo File   (with removed prefix: [data:application/octet-stream;base64,])
set fp [open "singerGraph.txt" r]
set canvas_data [read $fp]
close $fp

# Create PNG Image
set data [binary decode base64 $canvas_data]
set img [image create photo imgobj -data $data -format PNG]

# Display Image
puts $img
pack [label .myLabel]
.myLabel configure -image imgobj 

# create a pdf object
pdf4tcl::new mypdf -paper a4 -margin 15mm
mypdf startPage

# add Image to PDF 
set img_handle [mypdf addRawImage [imgobj data]]
mypdf putImage $img_handle 15 15 -width 210

# write pdf to a file
mypdf write -file heureka.pdf
mypdf destroy

@ DonalFellows Спасибо за вашу помощь.Мне нужно настроить эту функцию decodeImage для своих нужд, но вы сделали еще один шаг вперед.

0 голосов
/ 14 февраля 2019

Вам необходимо удалить метаданные (то есть префикс data:image/png;base64,) перед декодированием этой строки.

Вот процедура, которая делает это:

proc decodeImage {string} {
    if {[regexp {^data:image/(\w+);base64,(.*)$} $string type data]} {
        # DEBUG: puts "we have image data of type $type"
        return [binary decode base64 $data]
    } elseif {[regexp {^data:image/(\w+),(.*)} $string type data]} {
        # DEBUG: puts "we have image data of type $type"
        return $data
    } elseif {[regexp {^[0-9a-fA-F]+$} $string]} {
        # Looks like hexadecimal data...
        return [binary decode hex $string]
    }
    # It's in some other format. There's like a zillion of them so…
    error "unrecognised format"
}

Я подозреваю, что этого недостаточнои что встраиваемые данные должны быть закодированы в шестнадцатеричном формате (из-за этого binary format), но я не знаю наверняка, поскольку это может быть запасным вариантом, когда он не распознает необработанные данные.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...