tobmes
Goto Top

LaTeX Dokument mit PHP erstellen

Hi Experten,

ich bastle mal wieder ein bisschen mit PHP herum. Jetzt würde ich gerne nach einem Klick auf einen Button ein Dokument (PDF) erstellen lassen. Die Daten mit der das Dokument gefüllt werden soll kommen aus einer Datenbank. Ich würde gerne LaTeX verwenden, da man dort ja sehr gute Gestaltungsmöglichkeiten hat.

Ich habe mir das grob so Vorgestellt:

protected function getData() {
  $sql="SELECT artikel,menge FROM testLager;";  
  $recordset = $this->db->query($sql);
  if(!$recordset){
    throw new Exception("Fehler bei der Abfrage",$sql);  

  }
$artikelArray = array();

  while ($item = $recordset->fetch_assoc()) {
    $artikel = $item['artikel'];  
    $menge = $item['menge'];  
    $artikelArray[$artikel] = $material;
  }
  $recordset->free();
  return $artikelArray;
}
foreach ($variable as $key => $value) {
  # code...
}
protected function generateFile() {
$artikelArray = $this->getData();
$inhalt="\\documentclass[a4paper]{article}\n  
            \usepackage{ngerman}\n
            \begin{document}\n
            foreach ($artikelArray as $key => $value) {
              # code...
            }
            \\end{document}";  
  $datei =fopen("datei.tex","w");  
  fwrite($datei, $inhalt);
  fclose($datei);
  echo "In datei geschrieben";  
  shell_exec('pdflatex datei.tex');  
}

Da stehe ich aber jetzt vor dem Problem, das ich das foreach ja nicht ausführen kann. Kennt jemand für solz ein Scenario eine gute Lösung, oder kann mir das an meinem Codebeispiel erklären.

Danke schon mal

Content-ID: 311852

Url: https://administrator.de/contentid/311852

Ausgedruckt am: 22.11.2024 um 22:11 Uhr

Cthluhu
Cthluhu 05.08.2016 um 15:44:23 Uhr
Goto Top
Hi,

Du darfst natürlich den foreach-Befehl nicht im String stehen lassen. Du hast zwei Möglichkeiten:

1) foreach dazu nutzen den String $inhalt aufzubauen. Suchbegriffe sind: Foreach String Concatenation

2) Den Aufruf von fwrite drei-teilen. Erstens: Latex header in $datei schreiben. Zweitens: foreach laufen lassen und in der Schleife fwrite aufrufen. Drittens: am ende noch einfmal ein fwrite für das "\end{document}".

mfg

Cthluhu
tobmes
tobmes 05.08.2016 um 16:27:14 Uhr
Goto Top
Hi,

vielen Dank für deine schnelle Antwort und den super Tipp. Habe es jetzt erstmal so gemacht.

protected function generateFile() {
$artikelArray = $this->getData();
$fileHead="\\documentclass[a4paper]{article}\n  
            \usepackage{ngerman}\n
            \begin{document}\n";  
$fileTail="\n \\end{document}";  
//$inhalt="Dies ist ein Test"; 
  $datei =fopen("datei.tex","w");  
  fwrite($datei, $fileHead);
  fclose($datei);


  foreach ($artikelArray as $key => $value) {
          $datei =fopen("datei.tex", "a");  
          // $artikel = $key;
          // $menge= $value;
          fwrite($datei,$key);
          fwrite($datei,$value);
          fclose($datei);

  }


  $datei =fopen("datei.tex","a");  
  fwrite($datei,$fileTail);
  fclose($datei);
  echo "In datei geschrieben";  
  shell_exec('pdflatex datei.tex');  
}

Soweit funktioniert es auch Wunderbar. Gibt es dennoch eine Möglichkeit, das ich innerhalb des LaTeX-Dokuments irgendwie steuern kann, wo die Sachen Landen? Ich würde nämlich lieber nur die Daten in das LaTeX-Dokument schmeissen, und nicht ein komplettes Dokument mit wirrem PHP-Code erstellen.
Cthluhu
Cthluhu 05.08.2016 um 16:45:39 Uhr
Goto Top
Zitat von @tobmes:
Gibt es dennoch eine Möglichkeit, das ich innerhalb des LaTeX-Dokuments irgendwie steuern kann, wo die Sachen Landen? Ich würde nämlich lieber nur die Daten in das LaTeX-Dokument schmeissen, und nicht ein komplettes Dokument mit wirrem PHP-Code erstellen.
Was geht: du machst dir ein statische *.tex Datei und mit \include bindest du dir die mit PHP dynamisch erzeugten Code-Teile ein.
Es gäbe aber da noch luatex, damit kannst du in der *.tex Datei mit lua-Skripten arbeiten. Ob jetzt der LUA- oder PHP-Code weniger wirr ist musst du selber beurteilen.
StefanKittel
StefanKittel 06.08.2016 um 11:23:06 Uhr
Goto Top
Hallo,

wir erzeugen hier Berichte aus PHP mit Latex als PDF.
Diese beinhalten ca. 20 Bereiche mit Feldern und ca. 200 wiederholende Zeilen.

Ich habe dazu Templates mit Platzhaltern. Diese Dateien lese ich ein, ersetze im String die Felder mit Echtdaten und speichere das als neue latex-Datei. z.B. [[feldname_vorname]].

Stefan
tobmes
tobmes 07.08.2016 um 13:48:41 Uhr
Goto Top
Das klingt sehr interessant. Könntest du da evtl. ein kleines Codebeispiel posten?
StefanKittel
StefanKittel 07.08.2016 um 18:04:06 Uhr
Goto Top
Hallo,

In PHP benutzt ich primär file_get_contents und str_replace.
Template in String einlesen und im String Substrings ersetzten.

Das Template mit Platzhaltern erstellen.
Dann kann man es sich vorher anschauen.

\begin{center}
  \vspace*{4.0cm}
  \includegraphics[width=0.7\textwidth]{images/LogoKreisGross.png} %70% der Textbreite
  \vspace*{2.0cm}
  Report for\\
  Tag-Chapter-0-0-Text-Name\\
  Tag-Chapter-0-0-Text-CompanyName\\
  \vspace*{1.0cm}
  Completed on Tag-Chapter-0-0-Text-Date
\end{center}

\textbf{What are the personal strengths of your friend in the personal life?}\\
%Tag-Chapter-7-4-Block-0-Start
Tag-Text\\\\
%Tag-Chapter-7-4-Block-0-End