最近做了一个在线生成PDF,适时预览并可在线打印的系统。使用了pdf-lib.js(https://pdf-lib.js.org),作为前端创建PDF的框架,虽然很方便,但遇到一个棘手的问题:如何解决中文显示。
PDF文件不同于web文件(HTML+CSS),它的字体是嵌入文件的,而由于安全性和PDF文件本身机制的问题,并不能读取本地字体文件。而国际PDF阅读器规范中的 “Standard 14 Fonts”(14 种标准字体)中并没有中文字体,这就导致了在不嵌入中文字体的情况下,出现中文就会无法渲染。
Standard 14 Fonts
内置的 14 种标准字体 这 14 种字体全部属于 拉丁字母(英文) 系列,分为四大类:
1.无衬线 (Sans Serif)字体: Helvetica, Helvetica-Bold, Helvetica-Oblique, Helvetica-BoldOblique
2.衬线 (Serif/Roman) 字体:Times-Roman, Times-Bold, Times-Italic, Times-BoldItalic
3.等宽 (Monospace)字体: Courier, Courier-Bold, Courier-Oblique, Courier-BoldOblique
4.符号 (Symbol) :Symbol, ZapfDingbats
PDF 的设计初衷是 “所见即所得” (WYSIWYG)。它的目标是:不管你把这个文件发给谁,在手机上、打印机上还是 20 年后的电脑上,看到的排版必须一模一样。
封闭性:PDF 不信任阅读者的系统。它认为:“万一对方电脑里没有微软雅黑,我的排版不就乱了吗?”
机制:为了保证绝对一致,
pdf-lib必须执行 “字体嵌入 (Embedding)”。它需要把字体文件的每一个二进制数据“缝进” PDF 文件里。结果:
pdf-lib作为一个运行在浏览器沙箱里的 JavaScript 库,它没有权限直接扫描并读取你电脑硬盘上的.ttf文件。它必须通过网络请求(字体链接)拿到数据,然后再加工进 PDF。
面临的难点:
这个系统需要兼容正体中文(繁体)和简体中文,而这种字体体量大得惊人。兼容性最好的Adobe全字符体——Super OTC 体积高达100M+,师出同门的Google Noto也差不多这个体量,如放到Web项目,简直是灾难,浏览器瞬间会被卡死。
于是只能放弃使用这种大字符集的字体,选择性地支持正体或简体。
但是单独的简体字体,体积也很大,思源Source Han Serif,单独一种字重的字体,也高达20M+,Noto也要10M-20M。如果要加载这么大的字体,配置一般的电脑尤其是内存小的电脑,会频繁出现假死的情况。
于是,只能想办法减少字体的体积。
通过万能的Gemini,终于有了解决办法:字体子集化。
说白了,就是从原字体中提取一部分字符,只要能覆盖自己常用的字符就行了。
方案:
1. 用集成工具做子集化。这是最常用的方式,工具例如,Fontmin(https://ecomfe.github.io/fontmin/)。
这种方式就是要准备“字体白名单”,也就是你要把那些你需要的字符一一列出来,让它把你需要的字符从庞大字库中“抠”出来。
可以到GitHub上下载常用中文字符3500字等整理好的字符集,导入Fontmin中。也可以自己整理用到的文字再加进去。
2.用 Python 做字体子集化。
#安装fonttools库 pip install fonttools brotli #命令执行子集化 pyftsubset original.ttf --text-file=chars.txt --output-file=sub.woff2 --flavor=woff2 ''' 其中 original.ttf:原始字体,如思源宋体 --text-file:字符白名单文件 --output-file输出字体 ''' #不指定字符白名单,只按照某个标准来子集化(如变成GB2312标准字符集) pyftsubset NotoSerifSC-Medium.ttf --unicodes="U+0020-007E,U+00A0-00FF,U+2000-206F,U+3000-303F,U+4E00-9FA5" --output-file=label_gb2312.ttf --layout-features='*'
PDF相关开发小知识:
Chrome的PDF渲染核心核心是PDFium(Google 和福昕合作开发的C / C++开源项目),Firefox使用的则是自家的PDF.js(纯 JavaScript 实现的 PDF 渲染器),开发环境下它们有一些使用上的差异:
在 PDF 官方规范中,
FitH是针对“宽度自适应”的,但在 Firefox 的pdf.js源代码里,他们对参数的映射是这样的:
view=FitH: 对应的内部指令是FitH(垂直滚动模式下对齐宽度)。
zoom=page-fit: 对应的内部指令是page-fit(强制将整个页面缩放到当前容器可视窗口内)。
Firefox中可以通过“about:config”——“pdfjs.defaultZoomValue”,将值设置为page-fit/page-width,可实现自适应窗口展示,不过这种方式只适用于用浏览器直接打开pdf文件的情况下适用(这种情况是用 Firefox 原生 PDF.js 打开的)。
今天是西安事变89年。1936年12月12日,张杨发动震惊中外的西安事变,彻底改变了中国历史的走向。当时已被宣判死刑的共党得以苟延,从此在全国浴血抗战的大背景下,却一心躲在深山和敌后扩张坐大,并与日军秘密勾结背刺血战抗日的国军,为日后全面赤化中国大陆积蓄力量。中国人的命运,陡然在13年后进入近代史最黑暗、残酷和恐怖的时期,延续至今七十多年。
大陆的历史教科书里,讲述的这个“伟大”的“爱国”政变,不过是彻头彻尾的谎言。张杨这两个妄人,也被塑造成了“爱国将领”。颠倒黑白的伪史,不过是洗脑的目的。
一. 张学良发动西安事变,本意是效仿盛世才,割据西北,根本就不是为了所谓的“抗日”
2013年3月20日,一批和西安事變有關的秘密文件在紐約邦瀚斯(Bonhams)拍卖行拍賣,这批文件的是一个叫做海岚·里昂(Hyland L. Lyon)的美国人所有,他曾擔任張學良飛機駕駛員、機械師,他於1941年離開中國後,帶著個人行李、照片,以及受張家所托儲存私密物件的保險箱回到美國。据斯坦福大学胡佛研究所研究员郭岱君说,胡佛研究所能出的最高价为十万美元,竞不过出二十多倍高價(二百多万美元)的中共陕西西安文管所,最后被后者买走。
BBC的报道原文:https://www.bbc.com/zhongwen/trad/china/2013/03/130321_xian_incident_auction
共党官网的报道原文:http://dangshi.people.com.cn/BIG5/n/2013/0321/c85037-20868868.html
重读中央研究院出版的王世杰日记,仍有很多震撼之处。多年前细读,记录了两百多条笔记,重新翻阅,仍然被其中很多内容触动。从抗战胜利到国府迁台,中国大陆的命运陡然从有无限期待的光明大道走向人间地狱。民国38年后,中国大陆从此被西伯利亚傀儡以专制、暴力、谎言、反人性的恐怖所统治。
共產主義只能產生於貧窮與愚昧
英人嘗謂共產黨是一種病菌,只能於黑暗中發育。予深韙其言。
—— 《王世杰日記》 中央研究院 中華民國101年12月版

纵观历史与现实,共产主义政权无不是在贫穷和愚昧中滋生,根植于邪恶,依赖于暴力与谎言,本质是流匪集合体,一个彻头彻尾的草台班子。
所有共产主义,无不是一个运行套路:
• 消灭和迫害知识分子。把轻易看穿他们愚蠢、让它们无地自容的人,都精神折磨和肉体消灭,使得它们的愚蠢,堂而皇之大行其道。
• 抢劫富人财富,控制一切民生资源,推行所谓的“公有制”。本质上就是控制一切生存资源,控制所有人的生存基础,让所有人都为生存不得不向流氓政权低头臣服,失去人性尊严。
• 通过杀戮和迫害制造恐怖。各种政治清洗运动层出不穷,让所有人陷入斯德哥尔摩困境。
• 垄断教育,篡改历史、进行愚民教化。把人驯化成一个人矿,把人变成一个只会劳作、不会思维的动物。、
• 控制一切媒体。宣扬赞歌、播送谎言,同时消灭一切质疑的声音。• 煽动底层互害。对内摒弃道德,树立对立,把人性中最邪恶的一面放大和加以利用,使得人与人互斗、互恨、互相提防,形成底层互害。从而,底层很难形成凝聚力来推翻此政权;对外则不断树立外部仇恨,同时进行宏大叙事,推行“想象的共同体”来愚弄民众。
从计划经济、三反五反,超英赶美大炼钢铁、“人民公社”、计划生育、到互联网围墙,各种限购、“百年大变局”、“动态清零“等等无不是令人发指的愚蠢行径。
当Google撬动互联网革命、iPhone引领移动互联网,chatGPT开启人工智能时代、星链颠覆地面基站通讯,这些人类科技巨大进步,造福了无数人,但是带给这个政权的却是无比的恐惧,它本能想到的就是尽一切可能进行封禁、阉割、篡改和破坏。
恰逢,白宫上周开启了“反共产主义周”纪念,对共产主义这个人类毒瘤,文明世界直指核心,断言其必亡。

BY THE PRESIDENT OF THE UNITED STATES OF AMERICA
A PROCLAMATION
This week, our Nation observes Anti-Communism Week, a solemn remembrance of the devastation caused by one of history’s most destructive ideologies. Across continents and generations, communism has wrought devastation upon nations and souls. More than 100 million lives have been taken by regimes that sought to erase faith, suppress freedom, and destroy prosperity earned through hard work, violating the God-given rights and dignity of those they oppressed. As we honor their memory, we renew our national promise to stand firm against communism, to uphold the cause of liberty and human worth, and to affirm once more that no system of government can ever replace the will and conscience of a free people.
For more than a century, communism has brought nothing but ruin. Wherever it spreads, it silences dissent, punishes beliefs, and demands that generations kneel before the power of the state instead of standing for freedom. Its story is written in blood and sorrow, a grim reminder that communism is nothing more than another word for servitude.
In the 34 years since the end of the Cold War, the world has witnessed both the triumph of democracy and the persistence of tyranny in new forms. New voices now repeat old lies, cloaking them in the language of “social justice” and “democratic socialism,” yet their message remains the same: give up your freedom, place your trust in the power of the government, and trade the promise of prosperity for the empty comfort of control. America rejects this evil doctrine. We remain a Nation founded on the eternal truth that liberty and opportunity are the birthrights of every person, and that no ideology, whether foreign or domestic, can extinguish them.
As we mark Anti-Communism Week, we stand united in defense of the values that define us as a free people. We honor the victims of oppression by keeping their cause alive and by ensuring that communism and every system that denies the rights to life, liberty, and the pursuit of happiness will find their place, once and for all, on the ash heap of history.
NOW, THEREFORE, I, DONALD J. TRUMP, President of the United States of America, by virtue of the authority vested in me by the Constitution and the laws of the United States, do hereby proclaim the week of November 2 through November 8, 2025, as Anti-Communism Week.
IN WITNESS WHEREOF, I have hereunto set my hand this seventh day of November, in the year of our Lord two thousand twenty-five, and of the Independence of the United States of America the two hundred and fiftieth.
DONALD J. TRUMP
https://www.whitehouse.gov/presidential-actions/2025/11/anti-communism-week-2025/
本周,我们的国家纪念“反共周”(Anti-Communism Week),这是对一种历史上最具破坏性的意识形态所造成的毁灭性后果的庄严回忆。跨越大洲、历经数代,共产主义给国家与灵魂带来了巨大破坏。超过 1 亿人的生命被那些试图抹除信仰、压制自由、摧毁靠辛勤劳动所获得的繁荣的政权夺去,他们侵犯了被压迫者的、上帝赋予的权利与尊严。我们在纪念他们的时候,也重申我们的国家承诺:坚定反对共产主义,维护自由与人的价值,并再次断言:没有任何一种政府制度能够取代自由人民的意志与良知。
在超过一个世纪的时间里,共产主义只带来了毁灭。无论它蔓延至何处,它都让异议噤声、惩罚信仰、要求世代人在国家权力面前跪下,而不是为自由而站起。它的历史写满鲜血与悲痛,这严酷地提醒我们:共产主义不过是“另一种奴役”的代名词。
自冷战结束已 34 年,世界既见证了民主的胜利,也见证了暴政以新的形式持续存在。如今新的声音重复旧谎言,以“社会正义”“民主社会主义”的语言披上外衣,但其信息依旧是:放弃你的自由,将信任交给政府的权力,用对繁荣的承诺换取控制的空洞安慰。美国拒绝这一邪恶教条。我们仍然是一片以永恒真理为根基的国家:自由与机会是每个人的天赋权利,没有任何意识形态,无论来自外部还是内部,能够将其扑灭。
当我们标记“反共周”之时,我们团结起来,为定义我们为自由人民的价值进行守卫。我们通过使他们的事业得以延续来纪念被压迫者,并确保共产主义及任何否认生命、自由与追求幸福权利的制度,最终被置于历史的灰烬堆上,一劳永逸。
因此,我,唐纳德·J·特朗普通过美国宪法及法律所赋予的权威,特此宣布 2025 年 11 月 2 日至 11 月 8 日为“反共周”。
兹此证明,我于主历2025.11.7日,于美利坚合众国独立二百五十周年之年,签署此公告。
— 唐纳德·J·特朗普
https://www.whitehouse.gov/presidential-actions/2025/11/anti-communism-week-2025/
曾担任蒋公秘书的楚崧秋在他2014年出版的《台海沧桑七十年》中,开篇第一部分——《老蔣先生的畢生志節——讓歷史出來講話》就高度概括蒋公的最大特点,其中一段这样写:
愛國反共徹始徹終
他是一個毫不妥協的反共主義者。他一生反共,若謂輿黨派權力之爭全然無關,很多人是難以相信的。然他自民國十二年在廣東站在反共陣營至在台去世之日,以愛國救民為職志,則屬斑斑可考。他深信共產主義違反人性,否定人權,終必敗亡,我們不必一定稱頌他是反共先知,但他充滿信心的預言和實踐,卻得到了歷史的印證。
这种深刻认知,是一般人难以企及的,也道出了蒋公一生的清醒和远见。
无论个人还是组织,在追求改变、进步、提升的过程中,要想取得实质性和长期的成功,大都需要从小到大、从慢到快、从局部到整体逐步地改变,也就是一点一滴、循序渐进的方式推进,从而最终达成目标。这就是进步的“进化论原则”,它是一个生物学规律,也是一个社会学定律。
其本质思想,是无论生物体生理,还是人的心理、社会文化、群体行为,都是具有惯性的,而要改变这种惯性,需要持续长时间的微小变化积累。正如矫正牙齿、骨骼的方式,需要长时间持续给予微小的力量来改变,若强力扭转,只会折断折损,而达不到矫正的目的。
一个人要想减脂成功,不是一下子严控饮食,突增运动量,突击能够达成;而是,每天形成一定的热量缺口,慢慢递进式的增加,到了一定程度,再调整方案,使得身体适应节奏,不会报复性反弹,从而稳步到达目的。
改变一个拖延的习惯,是通过把事情拆解为一般事务性和深度事务,从一般性事务的立即行动,自然过渡到需要深度思考的缓步行动,曾风靡全球的畅销书《原子习惯》说的即是这个道理。
占据经济学中重要位置的边际思想或边际分析理论,也是进化论原则的体现:
… 第四个概念是“边际”。边际就是一小步一小步的试错。经济学不相信一口能吃个胖子,也不期待有一个超级英雄从天而降拯救受苦受难的老百姓。经济学家相信社会要靠人们自己一步一步地改进。因为他们不相信突然有一天有一个理想社会降临,他们也就不会因它没有降临而失望。他们脚踏实地,更相信通过他们一小步一小步的前进,能够一点儿一点儿地改进这个社会,他们也会在每一小步的改进中充满成就感。
—— 《在庆祝茅于轼老师 90 寿辰午宴上的讲话》—— 盛洪 2019-1-26 《中评周刊》
一项社会改革能实现,必定是一个一个具体问题的解决,制度柔性的过渡,慢慢达成的;所有激进的方式,只会带来动荡、割裂和反弹。台湾土地改革,是世界公认的学习典范,与大陆共党残暴血腥的方式不同,国民政府在台湾的土地改革——“三七五减租”、“公地放领”、“耕者有其田”循序漸進的三部曲,是温和渐进式的改良,照顾到了各方利益,整个过程没有杀人流血,成功实现了和谐与蓬勃发展的良性结果,成为世界土地政策的学习榜样。已经灭亡和可预见必将灭亡共产主义国家,以及南美阿根廷、委内瑞拉等国的统治者,都企图以简单粗暴共产乌托邦思维改造社会,最后都是血流成河、贫困遍地、饥荒与仇恨交加的结局。
就在五十年前,新竹一帶的佃租率仍高達七○%,也就是說,農民一年的辛勤收穫,有七成要繳給地主。台北、台中、台南等七縣市,佃租率平均也高達五七%。
直到陳誠來到台灣。
一九四八年,國共內戰正在生死關頭,陳誠被任命為台灣省主席。
懷著「民有、民治、民享」社會公平的夢想,看見當時貧富差距如此懸殊的台灣農村,陳誠決意重新分配土地所有權。
但陳誠的改革,不同於其他第三世界國家,雖然也引起一些大地主不滿,但始終沒有造成血淚抗爭。最主要的原因是,他以循序漸進的三部曲:三七五減租、公地放領、耕者有其田,來完成改革大計,每一步都是溫和理性的財富重分配。
這些改革使台灣農業生產力大增,糧食比前一年增產三成,佃農收益比前一年增加四三%。不僅農村貧富差距縮小,台灣也自此有了邁向工業化的厚實基礎。—— 《土地改革第一波 陳誠》《天下雜誌》200期 游常山 (2012-06-25)
年轻时,没明白这个道理,后来读了很多历史巨人的思想,结合实际的经验,方悟出其中的真谛。
宋美龄:推动社会的进步,只能一致渐进方式才能达到——
因復語張曰:「爾性太急切,且易衝動。爾當知世上有許多事,皆非躁急之舉動可以成功者,唯步驟一致漸進之行動,乃可得真正之進步;換言之,即全國人民程度進至適當之水平線後,仍將感效果之遲緩。然余之經驗告余,躁急者百分之力量,祇能得一分之收穫;而徒求快意一時之舉動,決不能致中國於富強,惟堅忍卓絕之苦幹,始能得理想中之成功。」 張聞言,頗感動,誠摯言日:「夫人,余已覺悟此舉…
——《西安事變回憶錄 》 宋美齡著 中華民國二十六年一月 中正文教基金會
胡适:所有伟大的变革,都是从解决一个个具体问题开始的,进步是点滴积累的结果,没有这种思维,人就永远陷入悲观中——
…社會是種種勢力造成的,改造社會須要改造社會的種種勢力。這種改造一定是零碎的改造,——一點一滴的改造,一尺一步的改造。無論你的志願如何宏大,理想如何徹底,計劃如何偉大,你總不能攏統的改造,你總不能不做這種「得寸進寸,得尺進尺」的工夫。所以我說:社會的改造是這種制度那種制度的改造,是這種思想那種思想的改造,是這個家庭那個家庭的改造,是這個學堂那個學堂的改造。
—— 《非個人主義的新生活》胡適 1920年1月15日上海《時事新報》
—— 《青年不要悲觀》胡適 1946年 发表于《現代文叢》
流沙河:鲁迅式的暴戾迎合了人的本能,真正能推动社会进步,是胡适式的温和、理性和渐进——
南都周刊:国文到了高中学什么?
流沙河:《庄子》、《孟子》、《荀子》,曾国藩的文章,桐城派的文章,全部要背诵。古文的第一要义就是背。哪怕你完全不懂,背上了也会终生受益。你会用一辈子来消化它,一辈子慢慢懂得它。背古文,能让一个人的内在气质发生质的改变,包括人格上的改变。
南都周刊:会形成什么样的人格?
流沙河:形成文化性的人格。能背上这些古文,就有了祖先的灵魂居住在你的头脑里,在观察事物的时候,祖先的灵魂会指导你。真假、美丑、善恶,都有了文化上的取舍。这就是最成功的国文教育啊,真正塑造人的灵魂。不像现在,教你组词,教你找错别字,完全技术化,与古人脱节,与灵魂脱节,违反教育的艺术性,违反文化性,完全失败。
南都周刊:你16岁对新文学产生兴趣,当时怎么看待鲁迅和胡适?
流沙河:我那时候喜欢读鲁迅,不喜欢胡适。喜欢鲁迅愤怒激烈,不喜欢胡适婆婆妈妈。当时的高中生,大部分和我一样。
南都周刊:这个认识后来有过改变吗?
流沙河:改变了,彻底改变了。四十年代后期,社会动荡不安,我们学生多次上街抗议国民政府。我后来想,如果鲁迅先生在,他会站在队伍后面说上“上去!”,而胡适会挡在队伍前面,说你们的要求啊,有合理性,但是大家要一步一步来,不是街上游行、喊喊口号就能实现的,你们更要从自身做起。胡适会这样说的。但是年轻人,他肯定愿意听鲁迅让大家去战斗的话。
只有一个人成熟了,知道生活的艰难,知道变化的艰难,知道维持一个正常社会的珍贵和不容易,尤其是如果他自己经历了那种可怕的疯狂—他才会懂得胡适说的话。鲁迅的方法,投合了人们心中暴戾愤怒的本能。而胡适开的药方,虽然一时也治不了中国的病,但从长远看来,一定需要他那一套,温和的、理性的、建立秩序的。
—— 南都周刊流沙河专访 《南都周刊》 2011年33期
马英九:一步登天的激进主张,往往能诱惑人的不理性,带来的往往是灾难——
——《原鄉精神:台灣的典範故事》 馬英九著 天下遠見出版公司 2007年
项目中使用Firebase JWT库做Token验证,确实很好用,减少了很多繁琐的判断,不过要使用它自带的验证方法,命名就必须符合它的标准。
如,起始时间,过期时间等都需要按照它的标准命名:
$tokenData = [ 'iat' => $issuedAt, //Token核发时间,标准写法,名称固定为 iat 'exp' => $expirationTime, //Token过期时间 ,标准写法,名称固定为 exp ];
验证非常方便,只需要调用相应的异常结果就可以了,不必自己拆解出来做复杂的判断。
try {
$decoded = JWT::decode($token, new Key($this->secretKey, 'HS256'));
$decodeToken = (array)$decoded;
} catch (ExpiredException $e) {//过期异常
$message = 'Token has expired';
$outData = ['code' => 401, 'message' => $message];
return json($outData);
} catch (SignatureInvalidException $e) { //签名不正确,被篡改
$message = 'Invalid token signature';
$outData = ['code' => 401, 'message' => $message];
return json($outData);
} catch (Exception $e) { //格式不符或者被篡改
$message = 'Token validation failed';
$message = 'Verify Fail: permission denied';
$outData = ['code' => 401, 'message' => $message];
return json($outData);
}
最近项目中使用Fabric.js做图像动态标记,被有些小问题缠住,花了很多时间去琢磨,有些甚至弄了一两天才理明白,特此记录。
1.canvas的width、height与style.width、style.height须一致,否则画出图形会变形或只显示图像的一部分。
canvasRef.value.width = img.naturalWidth; canvasRef.value.height = img.naturalHeight; canvasRef.value.style.width = img.naturalWidth + 'px'; canvasRef.value.style.height = img.naturalHeight + 'px';
看资料,fabric的画布实际上有三层(下图来自:jb51)

2.可以创建离屏/静态画布,不必在页面中显示,整体绘制完毕后再通过图像对象输出。
const canvas = new fabric.StaticCanvas(null, {
width: originWidth,
height: originHeight
});
离屏画布的节点引用设置为null,一样可以设置宽高。
3. 如果有背景图片,所有创建的元素都需要在创建背景图片的函数体内完成,不能在函数体外创建,否则导出的图片将背景不可见。就是这个问题,我困扰了两天,开始以为是跨域问题,背景图片格式的问题等等,后来发现原因在此。
nextTick(
() => {
canvasRef.value.width = img.naturalWidth;
canvasRef.value.height = img.naturalHeight;
canvasRef.value.style.width = img.naturalWidth + 'px';
canvasRef.value.style.height = img.naturalHeight + 'px';
let currentCanvas = new fabric.Canvas(canvasRef.value, {
selectionColor: '#4fb8d3',
selectionLineWidth: 0
});
fabric.Image.fromURL(imgUrl, (img) => { //必须将绘制的文本和图形放到这个背景图函数体内,否则无法显示背景图
currentCanvas.setBackgroundImage(
img,
currentCanvas.renderAll.bind(currentCanvas)
);
currentCanvas.backgroundImage.scaleToWidth(currentCanvas.width);
currentCanvas.backgroundImage.scaleToHeight(currentCanvas.height);
for (let key in LocationObj) {
let locationNum = LocationObj[key][0].bbox;
let arr = locationNum.split(',');
let numberArray = arr.map(Number);
let rect = new fabric.Rect({
left: numberArray[0],
top: numberArray[1],
width: numberArray[2] - numberArray[0],
height: numberArray[3] - numberArray[1],
fill: 'transparent',
stroke: 'rgb(235,64,64,0.9)',
strokeWidth: 3,
strokeDashArray: [5, 5]
});
let text = new fabric.Text(
' ' +
messageMap.value[key] +
' - ' +
Number(LocationObj[key][0].conf) * 100 +
'%' +
' ',
{
left: numberArray[0], // 文本的X坐标
top: numberArray[1] - 22,
fontSize: 22, // 字体大小
textBackgroundColor: '#eb4040', // 文字背景颜色
textBackgroundColor: 'rgb(235,64,64,0.8)',
hasControls: false, // 不显示控件
hasBorders: false, // 不显示边框
fontWeight: 'normal',
fill: 'white',
padding: 20,
lineHeight: 3,
textAlign: 'right',
fontFamily: 'Arial,Microsoft YaHei'
}
);
currentCanvas.add(rect);
currentCanvas.add(text);
currentCanvas.renderAll();
// rect.set('selectable', false);
// text.set('selectable', false);
}
downURL.value = currentCanvas.toDataURL({
format: 'png',
quality: 0.9
});
downLink.value.download = 'X_RayImg.png';
});
},
{ crossOrigin: 'Anonymous' }
);