使用Tcl

时间:2019-02-14 09:15:15

标签: tcl

我想使用Tcl将通过Javascript从HTML5画布检索到的base64字符串保存到PDF文件。

我通过JS从Canvas获得基本的64 SDtring: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 :(得分:1)

在解码该字符串之前,您需要去除元数据(即前缀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),但是我不确定,因为这可能是无法识别原始数据时。

答案 1 :(得分:0)

好吧,我能够得到

  1. 我的base64字符串中的PNG
  2. 然后将PNG转换为PDF
  3. 并将PDF保存为文件

由于我是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函数,但是您使我更进一步。