2017-07-05 65 views
1

我正在用PHP API構建一個Angular 4應用程序。在應用內用戶可以生成某種「雜誌」。這使得他們可以對頁面進行排序,編輯內容並添加圖片,但不是以所見即所得的方式,而是一步一步「我選擇的這個選項是我想要的」方式。使用Angular4和PHP生成自定義PDF服務器或客戶端端

因此,我最終得到了很多存儲在MySQL數據庫中的數據,用來描述最終PDF的外觀。

問題是我完全不知道如何生成PDF。我知道有些東西像pdfmake或者jsPDF作爲客戶端解決方案或者tcpdf(它似乎處於永久版本的轉換過程中!)作爲服務器端解決方案。但所有這些都是有限的。

我認爲最好的解決方案是生成一些LaTeX代碼並從中生成一些PDF,這是由於能夠使用各種LaTeX命令而不是針對jsPDF或pdfmake的有限命令。

是否有任何標準或最好的方式來管理使用角度編譯LaTeX代碼?

要走哪條路?服務器端還是客戶端?該乳膠和將要創建的PDF包含大量的圖片,和100-200頁......

回答

0

對於其他人搜索

CLSI似乎是管理它的方式。有一個仍維持開源API來編譯LaTeX文件:CLSI ShareLaTeX

由於mike42 編譯膠乳PHP ...的另一個非常有趣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."); 
} 
相關問題