热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

基于texlive定制chemfig化学式转换Python服务镜像

chemfig据别人介绍,在绘制平面分子式,乃至化学反应式、机理图时,大家使用的基本都是ChemDraw。当然ChemDraw是一款强大的软件,无论是平面的还是立体的分子结构式都

基于texlive定制chemfig化学式转换Python服务镜像

chemfig

据别人介绍,在绘制平面分子式,乃至化学反应式、机理图时,大家使用的基本都是ChemDraw。当然ChemDraw是一款强大的软件,无论是平面的还是立体的分子结构式都能毫不费力地绘制出来。当然这份强大是要钱的,对于平面的分子式或反应式,不要钱而且还可行的方案大致也就LaTeX语言中的Chemfig宏包。
Chemfig是法国学者开发的宏包,εTeX,pdfLaTeX等TeX编译器都能正常使用,并且相对来说开发是比较活跃的。

texlive

TeX Live 是 TUG (TeX User Group) 发布并维护的的 TeX 系统,可以称得上是TeX的官方系统。对于任何阶段的TeX用户,都可以使用TeX Live, 以保持在跨操作系统、跨用户的TeX文件一致性。

texlive Docker镜像及服务化改造

texlive的安装B站有很多教程,目标是需要提供绘制chemfig化学方程式转换的服务,而texlive软件本身并不提供相关的api服务,需要对其进行服务化改造,因为考虑容器化部署,需要将texlive封装成docker镜像

话不多说,我们选择的基础镜像是 texlive:2020 ,使用Python对外提供服务,关于texlive相关的介绍可以参考博客:chemfig化学式转换为pdf

拉取镜像并运行

docker pull texlive:2020

docker run --name texlive -d texlive:2020

docker ps -a | grep  live
dda1561ae866  texlive:2020   "tail -f /dev/null" 8 seconds ago  Up 2  texlive

docker exec -it dda1561ae866 bash

安装python,制作texlive-python镜像

# texlive是基于Alpine Linux,目前主流
cat /etc/issue
Welcome to Alpine Linux 3.12

# 修改apk镜像源
vi etc/apk/repositories

替换文件内容为阿里源:
http://mirrors.aliyun.com/alpine/v3.8/main/
http://mirrors.aliyun.com/alpine/v3.8/community/

# 更新软件库
apk update
fetch http://mirrors.aliyun.com/alpine/v3.8/main/x86_64/APKINDEX.tar.gz
fetch http://mirrors.aliyun.com/alpine/v3.8/community/x86_64/APKINDEX.tar.gz
v3.8.5-67-gf94de196ca [http://mirrors.aliyun.com/alpine/v3.8/main/]
v3.8.5-66-gccbd6a8ae7 [http://mirrors.aliyun.com/alpine/v3.8/community/]
OK: 9578 distinct packages available

# 安装python3
apk add --no-cache python3 python3-dev py-pip

# 验证安装
python3 -V
Python 3.6.9
bash-4.4# pip3 -V
pip 18.1 from /usr/lib/python3.6/site-packages/pip (python 3.6)

保存镜像

docker commit dda1561ae866 textlive-python

至此,我们的拥有python环境texlive镜像就已经制作好了

服务化改造

python脚本

from flask import Flask, abort, request, jsonify
import os
import subprocess
import uuid
import base64

app = Flask(__name__)


@app.route("/texlive/translate/", methods=["POST"])
def translate():
    if not request.json or "chemfig" not in request.json:
        abort(400)
    chem_fig = request.json["chemfig"]
    # 由于不好测算化学方程式图形的大小,这里支持配置纸张大小,我们这里默认a5paper
    if "paper" in request.json:
        paper = request.json["paper"]
    else:
        paper = "a5paper"
    tempFile = open("template.tex")
    lines = tempFile.readlines()
    lines[2] = lines[2].replace("a5paper", paper)
    lines[15] = chem_fig + "
"
    uuidStr = str(uuid.uuid1())
    new_file_name = uuidStr + ".tex"
    newFile = open(new_file_name, "a+")
    for line in lines:
        newFile.write(line)
    newFile.flush()
    newFile.close()
    try:
        # 这里使用subprocess比较稳定,os.system经常会出现莫名问题,至少这个pdflatex命令用os.system会报错
        subprocess.run(["pdflatex", "-interaction=nonstopmode", new_file_name])
        pdf_string = open(uuidStr + ".pdf", "rb").read()
        encoded = base64.b64encode(pdf_string)
        pdf_link = "data:application/pdf;base64,{}".format(encoded)
        pdf_link = pdf_link.replace("b"", "").replace(""", "")
    except:
        remove_file(uuidStr)
    else:
        remove_file(uuidStr)

    return jsonify({"image": pdf_link})


def remove_file(uuid_str):
    os.system("rm " + uuid_str + ".tex")
    os.system("rm " + uuid_str + ".log")
    os.system("rm " + uuid_str + ".pdf")
    os.system("rm " + uuid_str + ".aux")


if __name__ == "__main__":
    app.run(host="0.0.0.0", port=8080, debug=False)

Latex模板

template.tex

documentclass{minimal}
usepackage{xcolor, mol2chemfig}
usepackage[a5paper, margin=10px, total={6in, 8in}]{geometry}

usepackage[helvet]{sfmath}
setcrambond{2.5pt}{0.4pt}{1.0pt}
setbondoffset{1pt}
setdoublesep{2pt}
setatomsep{%(atomsep)spt}

enewcommand{printatom}[1]{fontsize{8pt}{10pt}selectfont{ensuremath{mathsf{#1}}}}

setlength{parindent}{0pt}
setlength{fboxsep}{0pt}
egin{document}

chemfig{H_3C-[:30]N**6(-(=O)-(**5(-N(-CH_3)--N-))--N(-CH_3)-(=O)-)}

end{document}

mol2chemfig.sty

requirements.txt

Flask

startup.sh

python3 ./main.py

DockerFile

FROM texlive-python:2020
COPY main.py /home
COPY mol2chemfig.sty /home
COPY template.tex /home
COPY requirements.txt /home
COPY startup.sh /home
WORKDIR /home
EXPOSE 8080
RUN pip3 install -r requirements.txt && ls
CMD ["bash", "startup.sh"]

服务镜像制作

构建 texlive-python-api

# dockerfile构建
docker build -t texlive-python-api .
# 打tag
docker tag texlive-python-api xxx.xxx.com/xxx/texlive-python-api:2020
# 推送远程镜像仓库
docker push xxx.xxx.com/xxx/texlive-python-api:2020

跑一个试试

docker run -p 8080:8080 -d --name texlive-python-api texlive-python-api

请求body

{"paper":"a6paper",
"chemfig":"\chemfig{CH_3-[:108,,1]N-[:54](-[:180,0.85,,,draw=none]\mcfcringle{1.03})%
-[:126]N-[:198]-[:270](-[:342]\phantom{N})-[:210](=[:270]O)-[:150]N(%
-[:210,,,2]H_3C)-[:90](=[:150]O)-[:30]N(-[:330])-[:90,,,1]CH_3}

\bigskip

\chemfig{CH_3-[:108,,1]N-[:54](-[:180,0.85,,,draw=none]\mcfcringle{1.03})%
-[:126]N-[:198]-[:270](-[:342]\phantom{N})-[:210](=[:270]O)-[:150]N(%
-[:210,,,2]H_3C)-[:90](=[:150]O)-[:30]N(-[:330])-[:90,,,1]CH_3}"}

postman

拷贝出来放在浏览器就可以直接访问了,这个是a6纸张的渲染效果,可以根据图的大小动态的传入纸张规格

再来个大的

{"paper":"a3paper",
"chemfig":"\chemfig{CH_3-[:108,,1]N-[:54](-[:180,0.85,,,draw=none]\mcfcringle{1.03})%
-[:126]N-[:198]-[:270](-[:342]\phantom{N})-[:210](=[:270]O)-[:150]N(%
-[:210,,,2]H_3C)-[:90](=[:150]O)-[:30]N(-[:330])-[:90,,,1]CH_3}

\bigskip

\chemfig{
O%5
=[:270]%3
(
-[:210]%2
(
<[:150]%4
-[:90.4,2.094]%115
-[:18]%109
-[:330]%110
-[:30,,,,dlh]%111
-[:90]%112
-[:150,,,,dlh]%107
-[:210]%108
(
-[:162]\mcfabove{N}{H}%113
-[:234]%114
-[:306,,,,dbl={73}{73}]%->115
)
-[:270,,,,dlh]%->109
)
-[:270,,,2]HN%1
-[:330,,2]%93
(
-[:270]%95
-[:210]%96
-[:270]%97
-[:330]%98
-[:30]%99
-[:330]%100
-[:270]%101
-[:210]%102
-[:270]%103
)
=[:30]O%94
)
-[:330]\mcfbelow{N}{H}%6
-[:30]%7
(
<:[:90]%9
-[:30]%10
(
-[:330,,,1]NH_2%12
)
=[:90]O%11
)
-[:330]%8
(
=[:270]O%15
)
-[:30]\mcfabove{N}{H}%13
-[:330]%14
(
<:[:270]%16
-[:330]%19
(
=[:270]O%21
)
-[:30,,,1]OH%20
)
-[:30]%17
(
=[:90]O%22
)
-[:330]\mcfbelow{N}{H}%18
-[:30]%23
<:[:90]%24
(
=[:150]O%26
)
-[:30,,,1]NH%25
-[:90,,1]%27
-[:30]%28
(
=[:90]O%29
)
-[:330]\mcfbelow{N}{H}%30
-[:30]%31
(
-[:90]%33
-[:30]%34
-[:90]%35
-[:30,,,1]NH_2%36
)
-[:330]%32
(
=[:270]O%37
)
-[:30]\mcfabove{N}{H}%38
-[:330]%39
(
<:[:270]%43
-[:330]%44
(
-[:30,,,1]OH%46
)
=[:270]O%45
)
-[:30]%40
(
=[:90]O%42
)
-[:330]\mcfbelow{N}{H}%41
-[:30]%47
(
<:[:90]%49
)
-[:330]%48
(
=[:30]O%51
)
-[:270,,,2]HN%50
-[:330,,2]%52
(
<[:30]%54
-[:330]%55
(
-[:270,,,1]OH%57
)
=[:30]O%56
)
-[:270]%53
(
=[:330]O%58
)
-[:210,,,2]HN%59
-[:270,,2]%60
-[:210]%61
(
=[:270]O%62
)
-[:150]\mcfabove{N}{H}%63
-[:210]%64
(
<:[:270]%104
-[:330,,,1]OH%105
)
-[:180,1.732]%91
(
-[:150,,,,dlhs]O%92
)
-[:270,,,1]NH%90
-[:210,,1]%82
(
<[:270]%84
(
-[:330]%86
-[:270]%87
(
-[:210,,,2]HO%89
)
=[:330]O%88
)
-[:210]%85
)
-[:150]%81
(
=[:90]O%83
)
-[:210]\mcfbelow{N}{H}%71
-[:150]%69
(
-[:90]%68
(
=[:30]O%70
)
-[:150]O%67
-[:90]%65
(
<[:30]%66
)
-[:150]%->23
)
<[:210]%72
-[:270]%73
(
=[:330]O%75
)
-[:210]%74
-[:270,,,,drh]%80
(
-[:330,,,1]NH_2%106
)
-[:210]%79
-[:150,,,,drh]%78
-[:90]%77
-[:30,,,,drh]%76
(
-[:330]%->74
)
}
"}

PS:LaTeX是一种基于ΤΕΧ的排版系统,不光是化学方程式,其他latex语法都可以通过本镜像渲染,template.tex是模板文件,对latex排版有要求的可以自行定制

参考链接

chemfig化学式转换为pdf:https://www.cnblogs.com/xiaoqi/p/chemfig.html
mol2chemfig:http://chimpsky.uwaterloo.ca/mol2chemfig/index
Chemfig中文手册:https://chemfig.man.huzheyang.cn/index.html
用latex绘制有机化学分子式:http://static.latexstudio.net/wp-content/uploads/2016/09/chemfig.pdf


推荐阅读
  • Linux如何安装Mongodb的详细步骤和注意事项
    本文介绍了Linux如何安装Mongodb的详细步骤和注意事项,同时介绍了Mongodb的特点和优势。Mongodb是一个开源的数据库,适用于各种规模的企业和各类应用程序。它具有灵活的数据模式和高性能的数据读写操作,能够提高企业的敏捷性和可扩展性。文章还提供了Mongodb的下载安装包地址。 ... [详细]
  • 通过Anaconda安装tensorflow,并安装运行spyder编译器的完整教程
    本文提供了一个完整的教程,介绍了如何通过Anaconda安装tensorflow,并安装运行spyder编译器。文章详细介绍了安装Anaconda、创建tensorflow环境、安装GPU版本tensorflow、安装和运行Spyder编译器以及安装OpenCV等步骤。该教程适用于Windows 8操作系统,并提供了相关的网址供参考。通过本教程,读者可以轻松地安装和配置tensorflow环境,以及运行spyder编译器进行开发。 ... [详细]
  • 如何使用PLEX播放组播、抓取信号源以及设置路由器
    本文介绍了如何使用PLEX播放组播、抓取信号源以及设置路由器。通过使用xTeve软件和M3U源,用户可以在PLEX上实现直播功能,并且可以自动匹配EPG信息和定时录制节目。同时,本文还提供了从华为itv盒子提取组播地址的方法以及如何在ASUS固件路由器上设置IPTV。在使用PLEX之前,建议先使用VLC测试是否可以正常播放UDPXY转发的iptv流。最后,本文还介绍了docker版xTeve的设置方法。 ... [详细]
  • x86 linux的进程调度,x86体系结构下Linux2.6.26的进程调度和切换
    进程调度相关数据结构task_structtask_struct是进程在内核中对应的数据结构,它标识了进程的状态等各项信息。其中有一项thread_struct结构的 ... [详细]
  • 随着我司的应用都开始容器化,相应的ETL流程也需要迁移到容器中。常规的SQL和shell脚本迁移之后执行基本没有问题,主要的问题在于数据接入使用kettle的场景下,kettle启 ... [详细]
  • systemd-nspawn可以创建最轻量级的容器(ns的意思就是namespace),本文的实验平台是Ubuntu16.04,x86_64机器。本文的目的是:在Ubuntu中用syst ... [详细]
  • docker安装到基本使用
    记录docker概念,安装及入门日常使用Docker安装查看官方文档,在&quot;Debian上安装Docker&quot;,其他平台在&quot;这里查 ... [详细]
  • 在Docker中,将主机目录挂载到容器中作为volume使用时,常常会遇到文件权限问题。这是因为容器内外的UID不同所导致的。本文介绍了解决这个问题的方法,包括使用gosu和suexec工具以及在Dockerfile中配置volume的权限。通过这些方法,可以避免在使用Docker时出现无写权限的情况。 ... [详细]
  • 本文介绍了在Mac上搭建php环境后无法使用localhost连接mysql的问题,并通过将localhost替换为127.0.0.1或本机IP解决了该问题。文章解释了localhost和127.0.0.1的区别,指出了使用socket方式连接导致连接失败的原因。此外,还提供了相关链接供读者深入了解。 ... [详细]
  • Webmin远程命令执行漏洞复现及防护方法
    本文介绍了Webmin远程命令执行漏洞CVE-2019-15107的漏洞详情和复现方法,同时提供了防护方法。漏洞存在于Webmin的找回密码页面中,攻击者无需权限即可注入命令并执行任意系统命令。文章还提供了相关参考链接和搭建靶场的步骤。此外,还指出了参考链接中的数据包不准确的问题,并解释了漏洞触发的条件。最后,给出了防护方法以避免受到该漏洞的攻击。 ... [详细]
  • Apache Shiro 身份验证绕过漏洞 (CVE202011989) 详细解析及防范措施
    本文详细解析了Apache Shiro 身份验证绕过漏洞 (CVE202011989) 的原理和影响,并提供了相应的防范措施。Apache Shiro 是一个强大且易用的Java安全框架,常用于执行身份验证、授权、密码和会话管理。在Apache Shiro 1.5.3之前的版本中,与Spring控制器一起使用时,存在特制请求可能导致身份验证绕过的漏洞。本文还介绍了该漏洞的具体细节,并给出了防范该漏洞的建议措施。 ... [详细]
  • PG12新增的VACUUM命令的SKIP_LOCKED选项
    PG12版本的VACUUM命令新增了SKIP_LOCKED选项,该选项使得vacuum命令在遇到被lock住的table时可以跳过并被视为成功执行。之前的版本中,vacuum命令会一直处于等待状态。本文还提到了PostgreSQL 12.1版本的相关信息。 ... [详细]
  • 本文介绍了使用readlink命令获取文件的完整路径的简单方法,并提供了一个示例命令来打印文件的完整路径。共有28种解决方案可供选择。 ... [详细]
  • top命令使用方法及解读
    本文介绍了top命令的使用方法和解读,包括查看进程信息、系统负载、内存状态、CPU占用等内容。通过top命令可以持续观察系统上运行的进程,并了解系统负载情况,及时关闭一些进程以减轻系统负担。同时,还介绍了top命令的快捷键和安全模式启动方法。通过本文的学习,读者可以更好地使用top命令来管理系统进程。 ... [详细]
  • 本文主要介绍关于linux文件描述符设置,centos7设置文件句柄数,centos7查看进程数的知识点,对【Linux之进程数和句柄数】和【linux句柄数含义】有兴趣的朋友可以看下由【东城绝神】投 ... [详细]
author-avatar
谦谦骄子_458
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有