我想使用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就足够了。
答案 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)
好吧,我能够得到
由于我是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
函数,但是您使我更进一步。