Использование pdflatex.exe для преобразования TeX в PDF в приложении C#/WPF

Кто-нибудь когда-нибудь создавал PDF-документ из документа TeX с помощью pdflatex.exe в своем приложении C#/WPF? У меня есть документ TeX, и я хочу преобразовать его в PDF и отобразить в приложении, однако я не знаю, как это сделать, и практически ничего не могу найти в Интернете о том, как сделать что-то подобное. Кто-нибудь знает, как лучше всего сделать что-то подобное (преобразовать документ TeX в PDF через pdflatex.exe в приложении С#)?

Большое спасибо!


person JToland    schedule 04.05.2011    source источник


Ответы (2)


Вот код, который я использовал. Предполагается, что источник находится в той же папке, что и исполняемый файл, и включает запуск BibTeX, если вам это нужно (просто исключите второй процесс, если это необходимо).

string filename = "<your LaTeX source file>.tex";
Process p1 = new Process();
p1.StartInfo.FileName = "<your path to>\pdflatex.exe";
p1.StartInfo.Arguments = filename;
p1.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
p1.StartInfo.RedirectStandardOutput = true;
p1.StartInfo.UseShellExecute = false;

Process p2 = new Process();
p2.StartInfo.FileName = "<your path to>\bibtex.exe";
p2.StartInfo.Arguments = Path.GetFileNameWithoutExtension(filename);
p2.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
p2.StartInfo.RedirectStandardOutput = true;
p2.StartInfo.UseShellExecute = false;

p1.Start();
var output = p1.StandardOutput.ReadToEnd();
p1.WaitForExit();

p2.Start();
output = p2.StandardOutput.ReadToEnd();
p2.WaitForExit();

p1.Start();
output = p1.StandardOutput.ReadToEnd();
p1.WaitForExit();

p1.Start();
output = p1.StandardOutput.ReadToEnd();
p1.WaitForExit();

Да, это можно было бы немного почистить, и, конечно же, без вызова BibTeX можно было бы просто вызвать его в цикле (рекомендуется 3 раза, чтобы убедиться, что все ссылки верны). Кроме того, нет обработки исключений, поэтому вы можете добавить блоки try/catch вокруг вызовов процессов и т. д.

person Darren Oster    schedule 23.05.2011

Я никогда этого не делал, но это вполне возможно. Вам потребуется использовать System.Diagnostics.Process. класс для запуска pdflatex.exe

Остальное касается выбора способа, которым это должно работать. У вас, вероятно, есть несколько вариантов здесь:

Если pdflatex поддерживает запись вывода в «стандартный вывод», вы можете перехватить это и делать с содержимым все, что хотите.

Другой вариант — использовать какую-либо временную папку для записи файла и подписаться на уведомления об изменении папки (асинхронно, вы можете запускать несколько экземпляров pdflatex) или просто ждать завершения процесса (синхронно, вы можете запускать только один экземпляр pdflatex в время).

person kubal5003    schedule 04.05.2011
comment
pdflatex не записывает в стандартный вывод, но временная папка работоспособна и часто используется - person Matthew Leingang; 04.05.2011