php.de

Zurück   php.de > Webentwicklung > Software-Design

Software-Design Diskussionen auf Profi-Niveau: PHP Lösungen auf konzeptioneller Ebene

Antwort
 
LinkBack Themen-Optionen Thema bewerten
Alt 03.06.2009, 12:45  
Neuer Benutzer
 
Registriert seit: 03.06.2009
Beiträge: 3
sman befindet sich auf einem aufstrebenden Ast
Standard DOCX-Datei mit PHP generieren

Hallo,

ich versuche seit Tagen verzweifelt, einen Auftrag umzusetzen. Mein bisher bestehendes PHP-Interface dient dazu, aus einer Datenbank eine lange und wohlformatierte Liste an Publikationen zu generieren und als schöne HTML-Seite auszugeben. Auf das wesentliche reduziert handelt es sich dabei um Tabellen, Auflistungen und viel Text.

Schon bei der Übersetzung dessen in PDF hatte ich große Probleme, habe kein vernünftiges PHP-Modul gefunden dass mir eine PDF-Datei daraus generiert. Das Problem konnte damit umgangen werden, dass man mit einem Virtual Printer die HTML Seite einfach als PDF druckt.

Nun habe ich den Auftrag die HTML Seite in DOCX umzuwandeln, damit man es in Word-Dokumente einfach einlesen kann. Auchhier habe ich tagelang gesucht und kein Modul gefunden. Zumal DOCX so ein komsiches gezipptes Format ist aus XML-Dateien. Unformatiertes XML selbst zu generieren ist kein großes Problem, aber wie dort Tabellen und Formatierungen einbinden? Und ein fertiges PHP-Modul dafür habe ich nicht gefunden. Bisher umgehe ich das Problem damit, mit Word schlicht die HTML-Seite einzubinden, aber langfristig sol wirklich direkt eine DOCX erstellt werden.

Kann mir jemand helfen wie man soetwas macht? Dieses DocxLive Project von Zend Frameworks ist mir zu riesig und kompliziert, und beim genaueren Betrachten scheint es auch nur zum Lesen von Docx zu gebrauhen zu sein, nicht jeoch zum Schreiben...

Viele verzeifelte Grüße
Martin
sman ist offline   Mit Zitat antworten
Sponsor Mitteilung
PHP Code Flüsterer

Registriert seit: 21.08.2005
Beiträge: 4682
PHP-Kenntnisse:
Fortgeschritten

Alt 03.06.2009, 12:56  
Moderator
 
Registriert seit: 06.06.2008
Beiträge: 4.945
PHP-Kenntnisse:
Fortgeschritten
Wolla ist ein wunderbarer AnblickWolla ist ein wunderbarer AnblickWolla ist ein wunderbarer AnblickWolla ist ein wunderbarer AnblickWolla ist ein wunderbarer AnblickWolla ist ein wunderbarer AnblickWolla ist ein wunderbarer Anblick
Wolla eine Nachricht über ICQ schicken
Standard

Brief introduction to phpLiveDocx | phpLiveDocx

Wieso hast du kein pdf hinbekommen? fpdf macht doch so gut wie alles.
Wolla ist offline   Mit Zitat antworten
Alt 03.06.2009, 16:18  
Neuer Benutzer
 
Registriert seit: 03.06.2009
Beiträge: 3
sman befindet sich auf einem aufstrebenden Ast
Standard phplivedocx

Den Link kenne ich bereits. Ich sehe dort aber überhaupt nicht durch, zumal ich keine Stelle finde, wo das Erstellen eine docx-Datei vernünftig dokumentiert ist. Nichteinmal in der Manual. Kein Beispiel, keine Dokumentation, was soll ich also damit?

Übrigens: Der Server auf dem ich das zum Laufen bekommen möchte läuft auf Linux und hat selbst keine Word-Applikation, ist das eventuell ein zusätzliches Problem?

FPDF: Danke für den Tip mit fpdf , das muss ich bei der recherche damals irgendwie übersehen haben, wusste also nicht dass es soetwas gibt, ich werde mich mal ransetzen (hier gibt es wie ich aufd den ersten Blick sehe wenigstens ein brauchbares Tutorial)
sman ist offline   Mit Zitat antworten
Alt 03.06.2009, 17:03  
Moderator
 
Registriert seit: 06.06.2008
Beiträge: 4.945
PHP-Kenntnisse:
Fortgeschritten
Wolla ist ein wunderbarer AnblickWolla ist ein wunderbarer AnblickWolla ist ein wunderbarer AnblickWolla ist ein wunderbarer AnblickWolla ist ein wunderbarer AnblickWolla ist ein wunderbarer AnblickWolla ist ein wunderbarer Anblick
Wolla eine Nachricht über ICQ schicken
Standard

Du klickst auf meinen Link, dann oben auf Downloads, dann hast du zwei ladelinks. Ich habe aber grade erst gesehen, dass das auf dem Zend Framework 1.8 aufsetzt.
Wolla ist offline   Mit Zitat antworten
Alt 03.06.2009, 22:07  
Moderator
 
Benutzerbild von robo47
 
Registriert seit: 03.09.2004
Beiträge: 11.792
PHP-Kenntnisse:
Fortgeschritten
robo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz seinrobo47 kann auf vieles stolz sein
Standard

für html2pdf fand ich als reine php-lösung dompdf - Google Code recht nett, kann auch schon etwas css und so
robo47 ist offline   Mit Zitat antworten
Alt 03.06.2009, 22:46  
Moderator
 
Benutzerbild von Chriz
 
Registriert seit: 11.05.2008
Beiträge: 6.269
Chriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer Anblick
Standard

Hallo sman,

DOCX sieht nur auf den ersten Blick schwierig aus, auf den zweiten ist es genial, beim dritten Blick ist es wie der ganze HTML/CSS-Käse: stressig. Ich schreibe selbst grad eine PHPWord-Klasse, in Anlehnung an die geniale Klasse PHPExcel. Sie ist leider noch nicht fertig und noch nicht OpenSource, ob es das wird muss ich mit meinen Chefs abklären.

Um dir das Format etwas zu erklären:
DOCX ist gezippt. Du kannst es einfach in *.zip umbenennen und entpacken. Darin findest du xml-Dateien, mal so benannt, mal als *.rels Dateien benannt. Diese definieren die Beziehungen untereinander. Mit dem MSIE oder DOMDocument -> loadXml () -> formatOutput -> saveXML kannst du sie "beautifien".

Wichtig sind die Dateien word/document.xml und word/styles.xml. Deine Formatierungen kannst du entweder als Style in die styles.xml speichern oder direkt word/document.xml. Wie du es im HTML auch machst, CSS entweder auslagern oder direkt rein schreiben. Vor- und Nachteile liegen auf der Hand.

Einen klitzekleinen Codeschnipsel HTML2DOCX kann ich dir posten, er wandelt HTML-Code in WordprocessingML, auf Basis von PHP's DOM. Mittlerweile habe ich meine Klasse allerdings umgebaut, da ich primär Word-Dateien erstellen will, nicht HTML in DOCX umwandeln.

PHP-Code:
<?php
     
// $this->_nodeBody ist <w:document><w:body> des word/document.xml im DOCX Package
     
$nodeHtml   $this->_prepareHtml("<p><b>Tolles We<u><i>tt</i></u>er heute</b></p>");
     
$this->_appendHtml($this->_nodeBody$this->_nodeBody$nodeHtml);

    
// ..

    
protected function _prepareHtml($html$allowableTags null)
    {
        if (
null === $allowableTags) {
            
$allowableTags $this->_getHtmlDefaultAllowableTags();
        }
        
$html strip_tags($html$allowableTags); // <ul><ol><li>
        
$html str_replace(array("\r\n""\r""\n"), ""$html); // nl2br(), but additional remove of the new line
        
$dom  = new DOMDocument("1.0""UTF-8");
        
$html "<html><body>$html</body></html>";

        
$html mb_convert_encoding($html"HTML-ENTITIES""UTF-8");
        
$dom->loadHtml($html);

        
$body $dom->documentElement->firstChild;
        return 
$body;
    }

    
// ..
 
    
protected function _appendHtml(DOMElement $nodeRootDOMElement $nodeParentDOMNode $nodeHtmlAIS_Document_OpenXml_Word_Styles_Style $style nullAIS_Document_OpenXml_Word_Styles_Style $styleInline null)
    {
        
$isNodeRoot $nodeRoot->isSameNode($nodeParent);
        
$isHtmlElem $nodeHtml instanceof DOMElement;
        
$isHtmlText $nodeHtml instanceof DOMText;
        
$isHtmlHead $isHtmlElem && in_array($nodeHtml->tagName, array("h1""h2""h3""h4""h5""h6"));
        
$isHtmlPara $isHtmlElem && ($isHtmlHead || in_array($nodeHtml->tagName, array("p""hr""center")));
        
$isNodePara $nodeParent->tagName == "w:p";

        if (
$isNodeRoot || $isHtmlPara) {
            
#if ($isNodePara && $isHtmlPara) {
            
if (!$isNodeRoot && !$nodeParent->hasChildNodes()) {
                
$nodeParent->parentNode->removeChild($nodeParent);
            }
            
$nodeParent AIS_DOMHelper::appendElement($nodeRoot"w:p");
            
#}
            
if ($isHtmlPara) {
                
$styles $this->_word->getStyles();
                
$style  $style === null
                        
$styles->getTagStyle($nodeHtml->tagName)
                        : 
$styles->getStyleMerged($style$styles->getTagStyle($nodeHtml->tagName));
                if (
$nodeHtml->hasAttribute("class")) {
                    
$classes array_filter(explode(" "$nodeHtml->getAttribute("class")),
                                            
create_function('$class''return !empty($class);'));
                    foreach (
$classes as $class) {
                        
$style $styles->getStyleMerged($style$styles->getStyle($class));
                    }
                }
            }
            if (
$style !== null && $style->hasStyles()) {
                
$nodeParaProps AIS_DOMHelper::appendElement($nodeParent"w:pPr");
                
AIS_DOMHelper::appendElement($nodeParaProps"w:pStyle", array(
                    
"w:val" => $style->getId()));
            }
        }

        if (
$isHtmlText) {
            if (
$nodeParent->tagName != "w:p") {
                
$nodeParent AIS_DOMHelper::appendElement($nodeParent"w:p");
            }
            
$nodeRun AIS_DOMHelper::appendElement($nodeParent"w:r");
            if (
$styleInline !== null && $styleInline->hasStyles()) {
                
$nodeRunProps AIS_DOMHelper::appendElement($nodeRun"w:rPr");
                if (
$styleInline->isBold()) {
                    
AIS_DOMHelper::appendElement($nodeRunProps"w:b");
                }
                if (
$styleInline->isItalic()) {
                    
AIS_DOMHelper::appendElement($nodeRunProps"w:i");
                }
                if (
$styleInline->isUnderlined()) {
                    
AIS_DOMHelper::appendElement($nodeRunProps"w:u", array(
                        
"w:val" => "single"));
                }
                if (
$styleInline->hasTextAlign()) {
                    
AIS_DOMHelper::appendElement($nodeRunProps"w:jc", array(
                        
"w:val" => $styleInline->getTextAlign()));
                }
            }
            
$nodeText AIS_DOMHelper::appendElement($nodeRun"w:t"null$nodeHtml->wholeText);
        } else {
            if (
$nodeHtml->tagName == "br") {
                if (
$nodeParent->tagName != "w:p") {
                    
$nodeParent AIS_DOMHelper::appendElement($nodeParent"w:p");
                }
                
$nodeRun AIS_DOMHelper::appendElement($nodeParent"w:r");
                if (
$nodeHtml->hasAttribute("class") && $nodeHtml->getAttribute("class") == "pageBreak") {
                    
AIS_DOMHelper::appendElement($nodeRun"w:br", array("w:type" => "page"));
                } else {
                    
AIS_DOMHelper::appendElement($nodeRun"w:cr");
                }
            } else {
                
$performChildNodes $nodeHtml->hasChildNodes();
                
$styleInline = (null === $styleInline)
                             ? new 
AIS_Document_OpenXml_Word_Styles_Style($this->_word->getStyles(), "inline")
                             : clone 
$styleInline;
                switch (
$nodeHtml->tagName) {
                    case 
"b":
                        
$styleInline->setBold();
                        break;
                    case 
"i":
                        
$styleInline->setItalic();
                        break;
                    case 
"u":
                        
$styleInline->setUnderlined();
                        break;
                    case 
"a":
                        if (
$nodeHtml->hasAttribute("rel") && $nodeHtml->getAttribute("rel") == "footnote") {
                            
$performChildNodes false;
                            
$this->_appendFootnote($nodeParent$nodeHtml);
                        }
                        break;
                    case 
"var":
                        
$performChildNodes false;
                        
$this->_appendInstruction($nodeParent$nodeHtml);
                        break;
                    default:
                        break;
                }
                if (
$performChildNodes) {
                    if (
$isHtmlHead) {
                        list(
$bookmarkId$bookmarkName) = $this->_appendBookmarkStart($nodeParent"_Toc");
                        
$this->_addHeadline($nodeHtml$bookmarkName);
                    }

                    foreach (
$nodeHtml->childNodes as $nodeChild) {
                        
$nodeParent $this->_appendHtml($nodeRoot$nodeParent$nodeChild$style$styleInline);
                    }
                    if (
$isHtmlPara) {
                        if (
$isHtmlHead) {
                            
$this->_appendBookmarkEnd($bookmarkId$bookmarkName);
                        }
                        
$nodeParent $nodeRoot;
                    }
                }
            }
        }
        return 
$nodeParent;
    }
?>
Dieser Teil parset dir ein verschachteltest DOM-HTML Dokument bzw. den <body> Teil in WordprocessingML. Das Ergebnis sieht dann etwa so aus:

(<p><b>Tolles We<u><i>tt</i></u>er heute</b></p>)
Code:
<w:body>
  <w:p>
    <w:r>
      <w:rPr>
        <w:b/>
      </w:rPr>
      <w:t>Tolles We</w:t>
    </w:r>
    <w:r>
      <w:rPr>
        <w:b/>
        <w:u type="single"/>
        <w:i/>
      </w:rPr>
      <w:t>tt</w:t>
    </w:r>
    <w:r>
      <w:rPr>
        <w:b/>
      </w:rPr>
      <w:t>er heute</w:t>
    </w:r>
  </w:p>
</w:body>
AIS_DOMHelper::appendElement() ist lediglich eine Abkürzung für DOMDocument's createElement() + appendChild() für Attribute und Werte zugleich.

Hoffe das hat etwas geholfen. Ein gutes Howto findest du hier:
OpenXML Developer : Open XML Explained e-book -> Attachment(s): Open XML Explained.pdf

Das Zippen an sich ist übrigens garnicht schwierig (der nächste Codeschnipsel):
PHP-Code:
<?php
        
if ($tempFilename === null) {
            
$tempFilename tempnam(sys_get_temp_dir(), "DOC");
        }
        
$zip = new ZipArchive();
        if (!
$zip->open($tempFilenameZIPARCHIVE::CREATE) === true) {
            throw new 
AIS_Document_OpenXml_Exception("can not create file"); // FIXME better exception handling, append causing values
        
}
        foreach (
$this->_archives as $archive) {
            
$zip->addFromString($archive->getArchiveFilename(), $archive->getArchiveContent());
        }
        
$zip->close();
        return 
file_get_contents($tempFilename);
?>
In $this->_archives liegen die jeweiligen XML-Dateien, an dessen Code du ja mit $DOMDocument->saveXml() herankommst.


Vielleicht nochmal als Nachtrag und Erklärung zu _appendHtml(). Du übergibst also vom Ziel-Dokument (word/document.xml) den Wurzelknoten (w:body) und aktuellen Knoten (nodeParent), sowie von der HTML-Quelle den aktuellen HTML-Element und zwei Styles. Du durchläufst dann alle Kindknoten des HTML-Elementes, erstellst bei "Paragraph"-Knoten (h1, h2, p, div, hr, ..) einen neuen DOCX-Paragraph (w) im Wurzelknoten, nimmst dem HTML also die Tiefe, aber merkst dir im Inline-Style noch alle einfachen Tags (b, u, i, center, ..), alle anderen Tags haben einen Style-Repräsentant, sprich man kann einem <p> Tag beispielsweise einen Formatvorlage zuweisen. Die Style Idee war also, dass sich aus HTML-Tags und dem class-Attribut (<p class="xy") jeweils DOCX-Style-Klassen (Formatvorlagen) generieren. Schwierig, da es in HTML-CSS Vererbung gibt, in DOCX nach meinem bisherigen Verständnis nicht (gemischte Formatvorlagen wären ja seltsam). Eine gesunde Lösung kam nicht heraus, weil ich mich zu sehr auf HTML konzentriert habe. Vielleicht hilft es dir ja trotzdem als Ansatz um HTML in DOCX umzuwandeln. Ich dachte es wäre auch die einfachste Lösung, aber ich generiere die DOCX von MySQL-Seite, das heißt ich brauche den Klotz am Fuß namens HTML eigentlich nicht, auch wenn es zu Beginn naheliegend erschien.
__________________
"Nuschel ich?" - "Was?"

Geändert von Chriz (03.06.2009 um 23:15 Uhr).
Chriz ist gerade online   Mit Zitat antworten
Alt 03.06.2009, 23:41  
Neuer Benutzer
 
Registriert seit: 03.06.2009
Beiträge: 3
sman befindet sich auf einem aufstrebenden Ast
Standard

Hallo,

vielen tausend Dank für die ausführliche Antwort, das sieht sehr sehr hilfreich aus und ich werde es mir morgen mal in Ruhe zu Gemüte führen.

Übrigens ist mein Anliegen tatsächlich auch, DOCX direkt aus php heraus zu erstellen, ich will also nicht konkret HTML in DOCX umwandeln. Ich habe nur für meine Daten aus einer Datenbank schon ein HTML-Design gefunden, also mit CSS Style, und möchte dass es so ähnlich auch in Word aussieht. Aber dabei genügt es auch selbstverständlich, aus den Daten direkt eine DOCX zu machen ohne über HTML zu gehen.

Viele dankbare Grüße!
Maritn
sman ist offline   Mit Zitat antworten
Alt 03.06.2009, 23:54  
Moderator
 
Benutzerbild von Chriz
 
Registriert seit: 11.05.2008
Beiträge: 6.269
Chriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer Anblick
Standard

Lies dich mal in das PDF ein, das ist sehr gut erklärt. Dann ein paar Blicke in ein von Word erstelltes DOCX und man kann sich das fast schon selbst beibringen. Bin jetzt soweit dass Header/Footer, Fußnoten, Überschriften, rudimentär Inhaltsverzeichnis funktioniert. Bilder sind kein Problem, Problem sind vielmehr Tabellen, die ich als XLSX einbinden wollte (von eben jener PHPExcel), leider wird als Platzhalter ein Bild von der Tabelle verwendet, was ich nur schwer generieren kann (XLSX2GIF ) Die normalen WordprocessingML Tabellen unterscheiden sich aber auch nicht stark von HTML-Tabellen. Wenn man schnell zu Ergebnissen kommen will, kann man da in ein paar Tagen schon sehr viel erreichen.
__________________
"Nuschel ich?" - "Was?"
Chriz ist gerade online   Mit Zitat antworten
Alt 10.07.2009, 10:35  
Neuer Benutzer
 
Registriert seit: 10.07.2009
Beiträge: 4
PHP-Kenntnisse:
Fortgeschritten
sirius6 befindet sich auf einem aufstrebenden Ast
Standard

Hi,

hier sind ja auch einige da die sich mit docX befassen, eventuell hat jemand schon festgestellt was passiert wenn man eine docX auf dem Server entpackt, Inhalte ersetzt, die Datei document.xml speichert und dann wieder packt....?!

Es kommt eine Fehlermeldung in Word?! Den einzigen Unterschied den ich sehen kann(DocX Word generiert und PHP generiert) ist das Änderungsdatum der Dateien, also touch() auf den 1.1.1980 00:00 Uhr gestellt, immer noch dieselbe Fehlermeldung.

Nun noch das experiment ohne Änderung einfach wieder zippen..... datei trotzdem defekt?!

Für sachdienliche Hinweise wäre ich sehr sehr sehr sehr dankbar!

gruss
sirius6
sirius6 ist offline   Mit Zitat antworten
Alt 10.07.2009, 11:24  
Moderator
 
Benutzerbild von Chriz
 
Registriert seit: 11.05.2008
Beiträge: 6.269
Chriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer AnblickChriz ist ein wunderbarer Anblick
Standard

Zitat:
Zitat von sirius6 Beitrag anzeigen
wenn man eine docX auf dem Server entpackt, Inhalte ersetzt, die Datei document.xml speichert und dann wieder packt
[..]
Den einzigen Unterschied den ich sehen kann [..] ist das Änderungsdatum der Dateien
Verstehe ich nicht, wenn du die Datei änderst, und sie danach defekt ist, hast du eben einen Fehler beim Bearbeiten gemacht.
Schau dir die Datei doch mal an, lad sie runter, entpack sie und vergleich die XML-Dateien mit einem TextDiff-Programm.

Defekt und nicht zu öffnen deutet erfahrungsgemäß auf falsche Relationen (*.rels), komplett falsche XML-Knoten oder eine ungültige Datei/Ordner-Struktur im ZIP selbst hin. Eventuell packst du die Dateien also falsch, in dem du z.B. den Ordner, in dem die erste DOCX-XML-Ebene liegt, mit in das ZIP packst.

Sprich, Soll.zip / Soll.docx:
Code:
_rels
docProps
word
[Content_Types].xml
Ist.zip / Ist.docx:
Code:
mein-dokument
  _rels
  docProps
  word
  [Content_Types].xml
__________________
"Nuschel ich?" - "Was?"

Geändert von Chriz (10.07.2009 um 11:28 Uhr).
Chriz ist gerade online   Mit Zitat antworten
Antwort


Themen-Optionen
Thema bewerten
Thema bewerten:

Forumregeln
Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are an
Gehe zu

Ähnliche Themen
Thema Autor Forum Antworten Letzter Beitrag
Wert in externer Datei speichern Abakay PHP Tipps 2008 6 04.12.2008 18:56
Datei per Buttonklick runterladen... go1denboy PHP Tipps 2008 7 14.06.2008 20:25
Großer Baum -> Große Datei -> Hohe Ladezeit :( PsychoEagle PHP Tipps 2008 7 22.09.2007 12:44
.gz Datei entpacken und mit dem Inhalt weiterarbeiten R4v3r PHP Tipps 2007 8 02.02.2007 14:49
Powerpoint Datei generieren tomson PHP-Fortgeschrittene 0 14.09.2006 14:43
String als Datei speichern Zangelo PHP Tipps 2006 23 25.08.2006 14:13
Datei durchsuchen Wöllchen Beitragsarchiv 3 02.03.2006 22:23
Datei auf FTP-Server ändern ohne lokal abzuspeichern faux PHP-Fortgeschrittene 11 02.09.2005 11:54
Datei mehrmals öffnen und schließen in einem Skript PHP Tipps 2005-2 14 14.07.2005 18:12
Ordner Struktur auslesen bestimmte datei finden .... silverghost PHP Tipps 2005 3 24.05.2005 13:55
Includete Datei nicht gleich ausgeben Madden PHP-Fortgeschrittene 1 12.05.2005 00:19
xfdf Datei mit PHP an eMail senden Problem: Leere Datei PHP Tipps 2004-2 1 07.12.2004 12:25
[Erledigt] TTF für pdf datei generieren PHP-Fortgeschrittene 3 15.09.2004 15:33
[Erledigt] datei editieren PHP Tipps 2004 1 10.09.2004 20:33
(ich schonwieder) Link seite automatisch imported_DJ Nuno PHP Tipps 2004 14 19.08.2004 17:42

Besucher kamen über folgende Suchanfragen bei Google auf diese Seite
php docx, docx php, docx erstellen, php docx erstellen, php docx erzeugen, xml html tags text docx, php create docx, phpdocx, docx xml einlesen php, docx datei erstellen, php docx generieren, docx entpacken, zend php docx, docx erzeugen, php generate docx, docx mit php, docx mit php erstellen, docx erstellen php, docx generieren, php to docx

Alle Zeitangaben in WEZ +2. Es ist jetzt 00:34 Uhr.




Powered by vBulletin® Version 3.7.2 (Deutsch)
Copyright ©2000 - 2012, Jelsoft Enterprises Ltd.
Search Engine Optimization by vBSEO 3.2.0
Aprilia-Forum, Aquaristik-Forum, Liebeskummer-Forum, Zierfisch-Forum, Geizkragen-Forum