使用Angular4和PHP生成自定义PDF服务器或客户端

时间:2017-07-05 19:54:32

标签: php angular pdf

我正在使用PHP API构建一个Angular 4应用程序。在应用程序内,用户可以生成某种“杂志”。这允许他们对页面进行排序,编辑内容和添加图像,但不是以所见即所得的方式,而是逐步“我选择的这个选项是我想要的”方式。

所以我最终将大量存储在MySQL数据库中的数据“描述”最终PDF应该是什么样子。

问题是我完全不知道如何生成PDF。我知道像pdfmake或jsPDF这样的客户端解决方案或者tcpdf(它似乎永远都是版本转换?!)作为服务器端解决方案。但所有这些都是有限的。

我认为最好的解决方案是生成一些LaTeX代码并从中生成一些PDF,因为能够使用各种LaTeX命令而不是jsPDF或pdfmake的有限命令。

使用angular管理编译LaTeX代码是否有任何标准或最佳方法?

走哪条路?服务器端还是客户端?将要创建的LaTeX和PDF包含大量图像,大约100-200页......

1 个答案:

答案 0 :(得分:0)

为其他人搜索

CLSI似乎是一种管理它的方式。还有一个用于编译LaTeX文件的开源API:CLSI ShareLaTeX

感谢mike42 使用PHP编译LaTeX的另一个非常有趣的example ...实际上是我的方法...是生成一个.tex文件,它是一个有效的LaTeX文件和一个有效的PHP文件这样代码最终就是这样:

% This file is a valid PHP file and also a valid LaTeX file
% When processed with LaTeX, it will generate a blank template
% Loading with PHP will fill it with details

\documentclass{article}
% Required for proper escaping
\usepackage{textcomp} % Symbols
\usepackage[T1]{fontenc} % Input format

% Because Unicode etc.
\usepackage{fontspec} % For loading fonts
\setmainfont{Liberation Serif} % Has a lot more symbols than Computer Modern

% Make placeholders visible
\newcommand{\placeholder}[1]{\textbf{$<$ #1 $>$}}

% Defaults for each variable
\newcommand{\test}{\placeholder{Data here}}

% Fill in
% <?php echo "\n" . "\\renewcommand{\\test}{" . LatexTemplate::escape($data['test']) . "}\n"; ?>

\begin{document}
    \section{Data From PHP}
    \test{}
\end{document}

如果禁用了PHP安全模式并且服务器安装了xelatex / pdflatex,则直接在文件上执行命令...

首先,填写 LaTeX代码需要通过以下方式存储在临时文件中:

/**
 * Generate a PDF file using xelatex and pass it to the user
 */
public static function download($data, $template_file, $outp_file) {
    // Pre-flight checks
    if(!file_exists($template_file)) {
        throw new Exception("Could not open template");
    }
    if(($f = tempnam(sys_get_temp_dir(), 'tex-')) === false) {
        throw new Exception("Failed to create temporary file");
    }

    $tex_f = $f . ".tex";
    $aux_f = $f . ".aux";
    $log_f = $f . ".log";
    $pdf_f = $f . ".pdf";

    // Perform substitution of variables
    ob_start();
    include($template_file);
    file_put_contents($tex_f, ob_get_clean());
}

之后,应执行选择的引擎以生成输出文件:

// Run xelatex (Used because of native unicode and TTF font support)
$cmd = sprintf("xelatex -interaction nonstopmode -halt-on-error %s",
        escapeshellarg($tex_f));
chdir(sys_get_temp_dir());
exec($cmd, $foo, $ret);

// No need for these files anymore
@unlink($tex_f);
@unlink($aux_f);
@unlink($log_f);

// Test here
if(!file_exists($pdf_f)) {
    @unlink($f);
    throw new Exception("Output was not generated and latex returned: $ret.");
}