[英]Library to convert latex to png in Java
什么是最好的图书馆?
我很惊讶这个问题以前没有被问过。 这不可能吗? 那也是令人惊讶的。
谢谢你的帮助。
我粗略地说你的选择是:
编辑
正如Stephen C所说,这些仅适用于Latex的碎片。 如果要转换完整的Latex文档,则需要完整的Latex实现 - 以上都不是。 那些需要有点大而复杂,因为它们是通过编写Latex代码来排版文档的完整“开发环境”。 如果这是你需要的,你没有太多的选择,只能通过exec使用标准的Latex发行版之一(如果Latex解释器报告Latex代码中的错误,我想优雅地失败)。
也就是说,至少有几次尝试将Latex移植到Java(包括两个名为“JavaTex”)。 很可能这些都不适合你 - 但是看看最近一些自己判断的尝试总结:
http://www.monperrus.net/martin/running+tex+on+a+java+virtual+machine
另一个解决方案是从Java调用mimetex.cgi(可从http://www.forkosh.com/mimetex.html获得 )。
我并不假装这个解决方案比之前给出的解决方案“更好”,特别是使用JLatexMath。 目的只是提供替代方案。
结果示例:
导致此结果的代码:
import java.awt.*;
import java.io.*;
import java.util.ArrayList;
import javax.swing.*;
public class Exemple106_MimetexInterface {
private static String MIMETEX_EXE = "c:\\Program Files (x86)\\mimetex\\mimetex.cgi";
final private static int BUFFER_SIZE = 1024;
/**
* Convert LaTeX code to GIF
*
* @param latexString LaTeX code
* @return GIF image, under byte[] format
*/
public static byte[] getLaTeXImage(String latexString) {
byte[] imageData = null;
try {
// mimetex is asked (on the command line) to convert
// the LaTeX expression to .gif on standard output:
Process proc = Runtime.getRuntime().exec(MIMETEX_EXE + " -d \"" + latexString + "\"");
// get the output stream of the process:
BufferedInputStream bis = (BufferedInputStream) proc.getInputStream();
// read output process by bytes blocks (size: BUFFER_SIZE)
// and stores the result in a byte[] Arraylist:
int bytesRead;
byte[] buffer = new byte[BUFFER_SIZE];
ArrayList<byte[]> al = new ArrayList<byte[]>();
while ((bytesRead = bis.read(buffer)) != -1) {
al.add(buffer.clone());
}
// convert the Arraylist in an unique array:
int nbOfArrays = al.size();
if (nbOfArrays == 1) {
imageData = buffer;
} else {
imageData = new byte[BUFFER_SIZE * nbOfArrays];
byte[] temp;
for (int k = 0; k < nbOfArrays; k++) {
temp = al.get(k);
for (int i = 0; i < BUFFER_SIZE; i++) {
imageData[BUFFER_SIZE * k + i] = temp[i];
}
}
}
bis.close();
proc.destroy();
} catch (IOException e) {
e.printStackTrace();
}
return imageData;
}
/**
* demonstration main
*
* @param args command line arguments
*/
public static void main(String[] args) {
JFrame jframe = new JFrame();
jframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jframe.setLayout(new BorderLayout());
String LATEX_EXPRESSION_1 = "4$A=\\(\\array{3,c.cccBCCC$&1&2&3\\\\\\hdash~1&a_{11}&a_{12}&a_{13}\\\\2&a_{21}&a_{22}&a_{23}\\\\3&a_{31}&a_{32}&a_{33}}\\) ";
byte[] imageData1 = getLaTeXImage(LATEX_EXPRESSION_1);
JLabel button1 = new JLabel(new ImageIcon(imageData1));
jframe.add(button1, BorderLayout.NORTH);
String LATEX_EXPRESSION_2 = "4$\\array{rccclBCB$&f&\\longr[75]^{\\alpha:{-1$f\\rightar~g}}&g\\\\3$\\gamma&\\longd[50]&&\\longd[50]&3$\\gamma\\\\&u&\\longr[75]_\\beta&v}";
byte[] imageData2 = getLaTeXImage(LATEX_EXPRESSION_2);
JLabel button2 = new JLabel(new ImageIcon(imageData2));
jframe.add(button2, BorderLayout.CENTER);
String LATEX_EXPRESSION_3 = "4$\\hspace{5}\\unitlength{1}\\picture(175,100){~(50,50){\\circle(100)}(1,50){\\overbrace{\\line(46)}^{4$\\;\\;a}}(52,50) {\\line(125)}~(50,52;115;2){\\mid}~(52,55){\\longleftar[60]}(130,56){\\longrightar[35]}~(116,58){r}~(c85,50;80;2){\\bullet} (c85,36){3$-q}~(c165,36){3$q}(42,30){\\underbrace{\\line(32)}_{1$a^2/r\\;\\;\\;}}~}";
byte[] imageData3 = getLaTeXImage(LATEX_EXPRESSION_3);
JLabel button3 = new JLabel(new ImageIcon(imageData3));
jframe.add(button3, BorderLayout.SOUTH);
jframe.pack();
jframe.setLocationRelativeTo(null);
jframe.setVisible(true);
}
}
萨科
另一种从LaTeX创建PNG图像的解决方案是,计算机上安装了LaTeX(例如:MiKTeX) ......
LaTeX独立包允许创建PNG输出文件,其大小完全对应于公式或文本的大小。
所以,我们只需要从Java调用LaTeX,并获取PNG输出文件。
1.先决条件
a)LaTeX应安装在计算机上
...包含公式所需的所有包(在下面的示例中:amsfonts和amsmath)
...使用独立包
应安装GhostScript(独立包必需)
包含gswin32c.exe的目录应添加到PATH中。
在我的计算机上:C:\\ Program Files(x86)\\ gs \\ gs9.10 \\ bin
应安装ImageMagick(独立包需要)
convert.exe应重命名为imgconvert.exe
包含imgconvert.exe的目录应添加到PATH中。
在我的电脑上:C:\\ Program Files(x86)\\ ImageMagick-6.8.8-9
2.检查LaTeX(带有独立包)是否成功生成PNG文件(此阶段没有Java)。
参考: https : //tex.stackexchange.com/questions/11866/compile-a-latex-document-into-a-png-image-thats-as-short-as-possible
LaTeX文件,名为New21.tex(例如):
\documentclass[border=0.50001bp,convert={convertexe={imgconvert},outext=.png}]{standalone}
\usepackage{amsfonts}
\usepackage{amsmath}
\begin{document}
$\begin{array}{l}
\forall\varepsilon\in\mathbb{R}_+^*\ \exists\eta>0\ |x-x_0|\leq\eta\Longrightarrow|f(x)-f(x_0)|\leq\varepsilon\\
\det\begin{bmatrix}a_{11}&a_{12}&\cdots&a_{1n}\\a_{21}&\ddots&&\vdots\\\vdots&&\ddots&\vdots\\a_{n1}&\cdots&\cdots&a_{nn}\end{bmatrix}\overset{\mathrm{def}}{=}\sum_{\sigma\in\mathfrak{S}_n}\varepsilon(\sigma)\prod_{k=1}^n a_{k\sigma(k)}\\
{\sideset{_\alpha^\beta}{_\gamma^\delta}{\mathop{\begin{pmatrix}a&b\\c&d\end{pmatrix}}}}\\
\int_0^\infty{x^{2n} e^{-a x^2}\,dx} = \frac{2n-1}{2a} \int_0^\infty{x^{2(n-1)} e^{-a x^2}\,dx} = \frac{(2n-1)!!}{2^{n+1}} \sqrt{\frac{\pi}{a^{2n+1}}}\\
\int_a^b{f(x)\,dx} = (b - a) \sum\limits_{n = 1}^\infty {\sum\limits_{m = 1}^{2^n - 1} {\left( { - 1} \right)^{m + 1} } } 2^{ - n} f(a + m\left( {b - a} \right)2^{-n} )\\
\int_{-\pi}^{\pi} \sin(\alpha x) \sin^n(\beta x) dx = \textstyle{\left \{ \begin{array}{cc} (-1)^{(n+1)/2} (-1)^m \frac{2 \pi}{2^n} \binom{n}{m} & n \mbox{ odd},\ \alpha = \beta (2m-n) \\ 0 & \mbox{otherwise} \\ \end{array} \right .}\\
L = \int_a^b \sqrt{ \left|\sum_{i,j=1}^ng_{ij}(\gamma(t))\left(\frac{d}{dt}x^i\circ\gamma(t)\right)\left(\frac{d}{dt}x^j\circ\gamma(t)\right)\right|}\,dt\\
\begin{array}{rl} s &= \int_a^b\left\|\frac{d}{dt}\vec{r}\,(u(t),v(t))\right\|\,dt \\ &= \int_a^b \sqrt{u'(t)^2\,\vec{r}_u\cdot\vec{r}_u + 2u'(t)v'(t)\, \vec{r}_u\cdot\vec{r}_v+ v'(t)^2\,\vec{r}_v\cdot\vec{r}_v}\,\,\, dt. \end{array}\\
\end{array}$
\end{document}
命令行:
pdflatex -shell-escape New21.tex
这应生成一个包含以下图片的New21.png文件:
3.通过调用LaTeX从Java生成PNG文件
码:
import java.awt.FlowLayout;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
class StreamPrinter implements Runnable {
// Source: http://labs.excilys.com/2012/06/26/runtime-exec-pour-les-nuls-et-processbuilder/
private final InputStream inputStream;
private boolean print;
StreamPrinter(InputStream inputStream, boolean print) {
this.inputStream = inputStream;
this.print = print;
}
private BufferedReader getBufferedReader(InputStream is) {
return new BufferedReader(new InputStreamReader(is));
}
@Override
public void run() {
BufferedReader br = getBufferedReader(inputStream);
String ligne = "";
try {
while ((ligne = br.readLine()) != null) {
if (print) {
System.out.println(ligne);
}
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
public class Exemple141_LaTeX_to_PNG_using_installed_LaTeX_distribution {
public static void main(String[] args) {
String TEMP_DIRECTORY = "D:\\_tmp";
String TEMP_TEX_FILE_NAME = "New22"; // for New22.tex
// 1. Prepare the .tex file
String newLineWithSeparation = System.getProperty("line.separator")+System.getProperty("line.separator");
String math = "";
math += "\\documentclass[border=0.50001bp,convert={convertexe={imgconvert},outext=.png}]{standalone}" + newLineWithSeparation;
math += "\\usepackage{amsfonts}" + newLineWithSeparation;
math += "\\usepackage{amsmath}" + newLineWithSeparation;
math += "\\begin{document}" + newLineWithSeparation;
math += "$\\begin{array}{l}" + newLineWithSeparation;
math += "\\forall\\varepsilon\\in\\mathbb{R}_+^*\\ \\exists\\eta>0\\ |x-x_0|\\leq\\eta\\Longrightarrow|f(x)-f(x_0)|\\leq\\varepsilon\\\\" + newLineWithSeparation;
math += "\\det\\begin{bmatrix}a_{11}&a_{12}&\\cdots&a_{1n}\\\\a_{21}&\\ddots&&\\vdots\\\\\\vdots&&\\ddots&\\vdots\\\\a_{n1}&\\cdots&\\cdots&a_{nn}\\end{bmatrix}\\overset{\\mathrm{def}}{=}\\sum_{\\sigma\\in\\mathfrak{S}_n}\\varepsilon(\\sigma)\\prod_{k=1}^n a_{k\\sigma(k)}\\\\" + newLineWithSeparation;
math += "{\\sideset{_\\alpha^\\beta}{_\\gamma^\\delta}{\\mathop{\\begin{pmatrix}a&b\\\\c&d\\end{pmatrix}}}}\\\\" + newLineWithSeparation;
math += "\\int_0^\\infty{x^{2n} e^{-a x^2}\\,dx} = \\frac{2n-1}{2a} \\int_0^\\infty{x^{2(n-1)} e^{-a x^2}\\,dx} = \\frac{(2n-1)!!}{2^{n+1}} \\sqrt{\\frac{\\pi}{a^{2n+1}}}\\\\" + newLineWithSeparation;
math += "\\int_a^b{f(x)\\,dx} = (b - a) \\sum\\limits_{n = 1}^\\infty {\\sum\\limits_{m = 1}^{2^n - 1} {\\left( { - 1} \\right)^{m + 1} } } 2^{ - n} f(a + m\\left( {b - a} \\right)2^{-n} )\\\\" + newLineWithSeparation;
math += "\\int_{-\\pi}^{\\pi} \\sin(\\alpha x) \\sin^n(\\beta x) dx = \\textstyle{\\left \\{ \\begin{array}{cc} (-1)^{(n+1)/2} (-1)^m \\frac{2 \\pi}{2^n} \\binom{n}{m} & n \\mbox{ odd},\\ \\alpha = \\beta (2m-n) \\\\ 0 & \\mbox{otherwise} \\\\ \\end{array} \\right .}\\\\" + newLineWithSeparation;
math += "L = \\int_a^b \\sqrt{ \\left|\\sum_{i,j=1}^ng_{ij}(\\gamma(t))\\left(\\frac{d}{dt}x^i\\circ\\gamma(t)\\right)\\left(\\frac{d}{dt}x^j\\circ\\gamma(t)\\right)\\right|}\\,dt\\\\" + newLineWithSeparation;
math += "\\begin{array}{rl} s &= \\int_a^b\\left\\|\\frac{d}{dt}\\vec{r}\\,(u(t),v(t))\\right\\|\\,dt \\\\ &= \\int_a^b \\sqrt{u'(t)^2\\,\\vec{r}_u\\cdot\\vec{r}_u + 2u'(t)v'(t)\\, \\vec{r}_u\\cdot\\vec{r}_v+ v'(t)^2\\,\\vec{r}_v\\cdot\\vec{r}_v}\\,\\,\\, dt. \\end{array}\\\\" + newLineWithSeparation;
math += "\\end{array}$" + newLineWithSeparation;
math += "\\end{document}";
// 2. Create the .tex file
FileWriter writer = null;
try {
writer = new FileWriter(TEMP_DIRECTORY + "\\" + TEMP_TEX_FILE_NAME + ".tex", false);
writer.write(math, 0, math.length());
writer.close();
} catch (IOException ex) {
ex.printStackTrace();
}
// 3. Execute LaTeX from command line to generate picture
ProcessBuilder pb = new ProcessBuilder("pdflatex", "-shell-escape", TEMP_TEX_FILE_NAME + ".tex");
pb.directory(new File(TEMP_DIRECTORY));
try {
Process p = pb.start();
StreamPrinter fluxSortie = new StreamPrinter(p.getInputStream(), false);
StreamPrinter fluxErreur = new StreamPrinter(p.getErrorStream(), false);
new Thread(fluxSortie).start();
new Thread(fluxErreur).start();
p.waitFor();
} catch (IOException | InterruptedException ex) {
ex.printStackTrace();
}
// 4. Display picture
JFrame maFrame = new JFrame();
maFrame.setResizable(false);
maFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
maFrame.setSize(400, 400);
maFrame.getContentPane().setLayout(new FlowLayout());
maFrame.getContentPane().add(new JLabel(new ImageIcon(TEMP_DIRECTORY + "\\" + TEMP_TEX_FILE_NAME + ".png")));
maFrame.pack();
maFrame.setVisible(true);
// 5. Delete files
for (File file : (new File(TEMP_DIRECTORY).listFiles())) {
if (file.getName().startsWith(TEMP_TEX_FILE_NAME + ".")) {
file.delete();
}
}
}
}
上面的代码应该创建以下框架:
萨科
这样做并非不可能。 (Java是图灵完成的......)。 但是(IMO)不太可能找到一个现有的库来处理Java中的TeX / LaTeX,并且你自己实现它是不切实际的。
我会寻找将TeX / LaTeX转换为某些内容的命令行应用程序(例如pdf或postscript),然后查找png页面图像的内容。 然后我将创建一个包装器脚本,根据需要组合应用程序,并使用Process.exec(...)
来运行脚本。
编辑
如果您只想渲染LaTeX 数学方程式 ,请尝试由@ RD1链接的答案建议的选项。
也许这个? 我自己没用过。
http://forge.scilab.org/index.php/p/jlatexmath/
这里简要的示例代码:
http://forge.scilab.org/index.php/p/jlatexmath/page/ServerUsage/
编辑:
哎呀,对不起,注意到这个库包含在上面的链接帖子中,认为不是。 没关系。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.