downloads | documentation | faq | getting help | mailing lists | licenses | wiki | reporting bugs | php.net sites | links | conferences | my php.net

search for in the

PDF_activate_item> <preg_split
[edit] Last updated: Mon, 01 Nov 2010

view this page in

CXIX. PDF-Funktionen

Einführung

PDF-Dateien lassen sich in PHP mithilfe der PDFlib-Bibliothek erzeugen. Die PDFlib-Bibliothek stammt ursprünglich von Thomas Merz und wurde dann von der » PDFlib GmbH übernommen.

Die vorliegende Beschreibung gibt nur eine kurze Übersicht über die in PDFlib verfügbaren Funktionen. Eine ausführliche Behandlung der einzelnen Funktionen finden Sie im PDFlib-Referenzhandbuch, das in allen PDFlib-Paketen der PDFlib GmbH enthalten ist. Das PDFlib-Referenzhandbuch liefert nicht nur eine detaillierte Übersicht über alle Eigenschaften von PDFlib, sondern auch eine stets aktuelle Beschreibung aller Funktionen.

Zum schnellen Einstieg sollten Sie sich unbedingt die Code-Beispiele ansehen, die in jedem PDFlib-Paket enthalten sind. Die Code-Beispiele zeigen die elementare Ausgabe von Text, Vektorgrafik und Rasterbildern sowie weiterführende Funktionen, z.B. zum PDF-Import (PDI).

Alle Funktionen haben in PDFlib und im PHP-Modul identische Funktionsnamen und -parameter. Sofern nicht anders konfiguriert, werden Längen- und Koordinatenangaben in PostScript-Punkten gemessen. Ein Zoll hat normalerweise 72 PostScript-Punkte, dies hängt jedoch von der Auflösung der Ausgabe ab. Eine ausführliche Beschreibung des Koordinatensystems finden Sie im PDFlib-Referenzhandbuch, das in der PDFlib-Distribution enthalten ist.

Ab Version 6 bietet PDFlib zusätzlich zum funktionsorientierten API für PHP 4 ein ein objektorientiertes API für PHP 5. Die Verwendung unterscheidet sich im wesentlichen in folgenden Punkten:

In PHP 4 müssen Sie sich zunächst eine PDF-Ressource besorgen, zum Beispiel mit folgenden Funktionsaufruf:

$p = PDF_new().

Die erhaltene PDF-Ressource verwenden Sie dann als ersten Parameter in allen weiteren Funktionsaufrufen, so zum Beipiel in:

PDF_begin_document($p, "", "").

In PHP 5 dagegen wird mit folgendem Funktionsaufruf ein PDFlib-Objekt erzeugt:

$p = new PDFlib().

Dieses Objekt enthält alle PDFlib-API-Funktionen als Methoden, zum Beispiel:

$p->begin_document("", "").

Zudem wurden in PHP 5 Exceptions eingeführt. Diese werden von PDFlib ab Version 6 ebenfalls unterstützt.

Weitere Informationen finden Sie in den Beispielen weiter unten.

Anmerkung: Wenn Sie an weiterer frei verfügbarer Software zur PDF-Erzeugung interessiert sind, die keine externe PDF-Bibliothek verwendet, können Sie sich in dieser FAQ informieren.

Anforderungen

PDFlib Lite ist als Open Source verfügbar. Die Lizenz von PDFlib Lite erlaubt den kostenlosen Einsatz aber nur unter bestimmten Bedingungen. PDFlib Lite unterstützt eine Teilmenge von PDFlib angebotenen Funktionen; Einzelheiten hierzu finden Sie auf der PDFlib-Website. Die PDFlib-Vollversion kann von » http://www.pdflib.com/products/pdflib-family/ heruntergeladen werden. Zum kommerziellen Einsatz müssen Sie jedoch eine Lizenz erwerben.

Anmerkungen zu älteren PDFlib-Versionen

PDFlib vor Version 3 wird von PHP 4 nach 9. März 2000 nicht mehr unterstützt.

PDFlib ab Version 4 wird von PHP ab Version 4.3 unterstützt.

Installation

Diese » PECL Erweiterung ist nicht Teil von PHP. Zusätzliche Informationen, wie neue Releases, Downloads Quelldateien, Maintainerinformation und ein CHANGELOG finden Sie hier: » http://pecl.php.net/package/pdflib.

Um diese Funktionen in PHP < 4.3.9 zu nutzen, müssen Sie PHP mit --with-pdflib[=DIR] kompilieren. DIR ist das PDFlib-Installationsverzeichnis, standardmäßig /usr/local.

Ab PHP 4.3.9 müssen Sie diese Erweiterung über » PEAR mit folgendem Befehl installieren: pear install pdflib.

Resource Typen

Diese Erweiterung definiert keine Resource-Typen.

Anmerkungen zu veralteten PDF-Funktionen

Seit PHP 4.0.5 wird die PHP-Erweiterung für PDFlib von der PDFlib GmbH offiziell unterstützt. Das bedeutet, dass alle im PDFlib-Referenzhandbuch beschriebenen Funktionen von PHP 4 mit den beschriebenen Parametern und der beschriebenen Funktionalität unterstützt werden. Seit PDFlib Version 5.0.4 müssen alle Parameter auch übergeben werden. Zur Kompatibilität unterstützt PDFlib weiterhin die meisten der inzwischen veralteten Funktionen, diese sollten jedoch durch entsprechende neue Funktionen ersetzt werden. PDFlib GmbH bietet keinerlei Unterstützung bei Problemen mit veralteten Funktionen. Die vorliegende Beschreibung kennzeichnet veraltete Funktionen und gibt die stattdessen zu verwendenden Funktionen an.

Beispiele

Die meisten Funktionen sind einfach zu verwenden. Sobald Sie ein PDF-Dokument erstellt haben, ist die schwierigste Aufgabe schon erledigt. Das folgende Code-Beispiel soll Ihnen den Einstieg erleichtern. Es wurde für PHP 4 entwickelt und erstellt eine einseitige Datei namens hello.pdf. Das Beispiel definiert den Inhalt einiger Dokumentinfofelder, lädt die Schrift Helvetica-Bold und gibt den Text "Hello world! (says PHP)" aus.

Beispiel 1453. Beispiel "Hello World" der PDFlib-Distribution für PHP 4

<?php
$p
= PDF_new();

/*  open new PDF file; insert a file name to create the PDF on disk */
if (PDF_begin_document($p, "", "") == 0) {
    die(
"Error: " . PDF_get_errmsg($p));
}

PDF_set_info($p, "Creator", "hello.php");
PDF_set_info($p, "Author", "Rainer Schaaf");
PDF_set_info($p, "Title", "Hello world (PHP)!");

PDF_begin_page_ext($p, 595, 842, "");

$font = PDF_load_font($p, "Helvetica-Bold", "winansi", "");

PDF_setfont($p, $font, 24.0);
PDF_set_text_pos($p, 50, 700);
PDF_show($p, "Hello world!");
PDF_continue_text($p, "(says PHP)");
PDF_end_page_ext($p, "");

PDF_end_document($p, "");

$buf = PDF_get_buffer($p);
$len = strlen($buf);

header("Content-type: application/pdf");
header("Content-Length: $len");
header("Content-Disposition: inline; filename=hello.pdf");
print
$buf;

PDF_delete($p);
?>

Das folgende Code-Beispiel ist in der PDFlib-Distribution für PHP 5 enthalten. Es verwendet die in PHP 5 erstmalig verfügbare Funktionalität zur Ausnahmebehandlung und Objektkapselung. Das Beispiel erstellt eine einseitige Datei namens hello.pdf. Es definiert den Inhalt einiger Dokumentinfofelder, lädt die Schrift Helvetica-Bold und gibt den Text "Hello world! (says PHP)" aus.

Beispiel 1454. Beispiel "Hello World" der PDFlib-Distribution für PHP 5

<?php

try {
   
$p = new PDFlib();

   
/*  open new PDF file; insert a file name to create the PDF on disk */
   
if ($p->begin_document("", "") == 0) {
        die(
"Error: " . $p->get_errmsg());
    }

   
$p->set_info("Creator", "hello.php");
   
$p->set_info("Author", "Rainer Schaaf");
   
$p->set_info("Title", "Hello world (PHP)!");

   
$p->begin_page_ext(595, 842, "");

   
$font = $p->load_font("Helvetica-Bold", "winansi", "");

   
$p->setfont($font, 24.0);
   
$p->set_text_pos(50, 700);
   
$p->show("Hello world!");
   
$p->continue_text("(says PHP)");
   
$p->end_page_ext("");

   
$p->end_document("");

   
$buf = $p->get_buffer();
   
$len = strlen($buf);

   
header("Content-type: application/pdf");
   
header("Content-Length: $len");
   
header("Content-Disposition: inline; filename=hello.pdf");
    print
$buf;
}
catch (
PDFlibException $e) {
    die(
"PDFlib exception occurred in hello sample:\n" .
   
"[" . $e->get_errnum() . "] " . $e->get_apiname() . ": " .
   
$e->get_errmsg() . "\n");
}
catch (
Exception $e) {
    die(
$e);
}
$p = 0;
?>

Inhaltsverzeichnis

PDF_activate_item — Aktiviert Strukturelement oder anderen Dokumentbestandteil
PDF_add_annotation — Fügt Notiz hinzu [veraltet]
PDF_add_bookmark — Fügt Lesezeichen für aktuelle Seite ein [veraltet]
PDF_add_launchlink — Fügt Webverknüpfung auf aktueller Seite ein [veraltet]
PDF_add_locallink — Fügt Verknüpfung auf aktueller Seite ein [veraltet]
PDF_add_nameddest — Erzeugt benanntes Ziel
PDF_add_note — Fügt Notiz auf aktueller Seite ein [veraltet]
PDF_add_outline — Fügt Lesezeichen für aktuelle Seite ein [veraltet]
PDF_add_pdflink — Fügt Dateiverknüpfung auf aktueller Seite ein [veraltet]
PDF_add_thumbnail — Fügt Piktogramm für aktuelle Seite ein
PDF_add_weblink — Fügt Web-Verknüpfung auf aktueller Seite ein [veraltet]
PDF_arc — Zeichnet Kreissegment gegen Uhrzeigersinn
PDF_arcn — Zeichnet Kreissegment im Uhrzeigersinn
PDF_attach_file — Fügt Dateianhang auf aktueller Seite ein [veraltet]
PDF_begin_document — Erstellt neue PDF-Datei
PDF_begin_font — Beginnt Definition einer Type-3-Schrift
PDF_begin_glyph — Beginnt Type-3-Glyphendefinition
PDF_begin_item — Öffnet Strukturelement oder anderen Dokumentbestandteil
PDF_begin_layer — Beginnt Ebene
PDF_begin_page_ext — Beginnt neue Seite
PDF_begin_page — Beginnt neue Seite [veraltet]
PDF_begin_pattern — Beginnt Definition eines Füllmusters
PDF_begin_template — Beginnt Template-Definition
PDF_circle — Zeichnet Kreis
PDF_clip — Verwendet aktuellen Pfad als Clipping-Pfad
PDF_close_image — Schließt Bild
PDF_close_pdi_page — Schließt Seiten-Handle
PDF_close_pdi — Schließt PDF-Importdokument
PDF_close — Schließt PDF-Ressource [veraltet]
PDF_closepath_fill_stroke — Schließt, zeichnet und füllt Pfad
PDF_closepath_stroke — Schließt und zeichnet Pfad
PDF_closepath — Schließt aktuellen Pfad
PDF_concat — Konkateniert Matrix zur Transformationsmatrix
PDF_continue_text — Gibt Text in nächster Zeile aus
PDF_create_action — Erzeugt Aktion für Objekte und Events
PDF_create_annotation — Erzeugt rechteckige Anmerkung
PDF_create_bookmark — Erstellt Lesezeichen
PDF_create_field — Erstellt Formularfeld
PDF_create_fieldgroup — Erstellt Formularfeldgruppe
PDF_create_gstate — Erzeugt Grafikzustandsobjekt
PDF_create_pvf — Erzeugt virtuelle PDFlib-Datei
PDF_create_textflow — Erzeugt Textflussobjekt
PDF_curveto — Zeichnet Bézier-Kurve
PDF_define_layer — Erzeugt Ebenendefinition
PDF_delete_pvf — Löscht virtuelle PDFlib-Datei
PDF_delete_textflow — Löscht Textflussobjekt
PDF_delete — Löscht PDF-Objekt
PDF_encoding_set_char — Fügt Glyphennamen und/oder Unicode-Wert hinzu
PDF_end_document — Schließt PDF-Dokument
PDF_end_font — Beendet Type-3-Schriftdefinition
PDF_end_glyph — Beendet Type-3-Glyphendefinition
PDF_end_item — Schließt Strukturelement oder anderen Dokumentbestandteil
PDF_end_layer — Deaktiviert alle aktiven Layer
PDF_end_page_ext — Beendet Seite
PDF_end_page — Unterbricht Seitenausgabe
PDF_end_pattern — Beendet Füllmusterdefinition
PDF_end_template — Beendet Template-Definition
PDF_endpath — Beendet Pfad
PDF_fill_imageblock — Füllt Image-Block mit variablen Daten
PDF_fill_pdfblock — Füllt PDF-Block mit variablen Daten
PDF_fill_stroke — Zeichnet und füllt Pfad
PDF_fill_textblock — Füllt Text-Block mit variablen Daten
PDF_fill — Füllt Pfad
PDF_findfont — Bereitet Schrift vor [veraltet]
PDF_fit_image — Platziert Bild oder Template
PDF_fit_pdi_page — Platziert importierte PDF-Seite
PDF_fit_textflow — Passt Textfluss in rechteckigen Bereich ein
PDF_fit_textline — Platziert einzelne Textzeile
PDF_get_apiname — Ermittelt Namen von gescheiterter API-Funktion
PDF_get_buffer — Holt PDF-Ausgabepuffer
PDF_get_errmsg — Ermittelt Fehlertext
PDF_get_errnum — Ermittelt Fehlernummer
PDF_get_font — Ermittelt Schrift [veraltet]
PDF_get_fontname — Ermittelt Schriftnamen [veraltet]
PDF_get_fontsize — Schriftbehandlung [veraltet]
PDF_get_image_height — Ermittelt Bildhöhe [veraltet]
PDF_get_image_width — Ermittelt Bildbreite [veraltet]
PDF_get_majorversion — Ermittelt Major-Versionsnummer [veraltet]
PDF_get_minorversion — Ermittelt Minor-Versionsnummer [veraltet]
PDF_get_parameter — Ermittelt String-Parameter
PDF_get_pdi_parameter — Ermittelt String-PDI-Dokumentparameter
PDF_get_pdi_value — Ermittelt numerischen PDI-Dokumentparameter
PDF_get_value — Ermittelt numerischen Parameter
PDF_info_textflow — Ermittelt Zustand eines Textflusses
PDF_initgraphics — Setzt Grafikzustand zurück
PDF_lineto — Zeichnet Linie
PDF_load_font — Sucht und bereitet Schrift vor
PDF_load_iccprofile — Sucht und bereitet ICC-Profil vor
PDF_load_image — Öffnet Bilddatei
PDF_makespotcolor — Erstellt Schmuckfarbe
PDF_moveto — Setzt aktuelle Position
PDF_new — Erzeugt PDFlib-Objekt
PDF_open_ccitt — Öffnet CCITT-Rasterbild [veraltet]
PDF_open_file — Erzeugt PDF-Datei [veraltet]
PDF_open_gif — Öffnet GIF-Rasterbild [veraltet]
PDF_open_image_file — Öffnet Bilddatei [veraltet]
PDF_open_image — Ermittelt Bilddaten [veraltet]
PDF_open_jpeg — Öffnet JPEG-Bild [veraltet]
PDF_open_memory_image — Öffnet mit PHP-Bildfunktionen erzeugtes Bild [nicht unterstützt]
PDF_open_pdi_page — Bereitet Seite vor
PDF_open_pdi — Öffnet PDF-Dokument
PDF_open_tiff — Öffnet TIFF-Bild [veraltet]
PDF_place_image — Platziert Bild [veraltet]
PDF_place_pdi_page — Platziert PDF-Seite [veraltet]
PDF_process_pdi — Verarbeitet importiertes PDF-Dokument
PDF_rect — Zeichnet Rechteck
PDF_restore — Stellt Grafikzustand wieder her
PDF_resume_page — Nimmt Seitenausgabe wieder auf
PDF_rotate — Dreht Koordinatensystem
PDF_save — Speichert aktuellen Grafikzustand
PDF_scale — Skaliert Koordinatensystem
PDF_set_border_color — Setzt Randfarbe von Anmerkungen [veraltet]
PDF_set_border_dash — Setzt Strichmuster für Rand von Anmerkungen [veraltet]
PDF_set_border_style — Setzt Randstil von Anmerkungen [veraltet]
PDF_set_char_spacing — Bestimmt den Zeichenabstand [veraltet]
PDF_set_duration — Setzt Anzeigedauer von Seiten [veraltet]
PDF_set_gstate — Aktiviert Grafikzustandsobjekt
PDF_set_horiz_scaling — Setzt horizontalen Textabstand [veraltet]
PDF_set_info_author — Füllt Dokumentinfofeld für Verfasser [veraltet]
PDF_set_info_creator — Füllt Dokumentinfofeld für Anwendung [veraltet]
PDF_set_info_keywords — Füllt Dokumentinfofeld für Stichwörter [veraltet]
PDF_set_info_subject — Füllt Dokumentinfofeld für Thema [veraltet]
PDF_set_info_title — Füllt Dokumentinfofeld für Titel [veraltet]
PDF_set_info — Füllt Dokumentinfofeld
PDF_set_layer_dependency — Definiert Beziehungen zwischen Ebenen
PDF_set_leading — Bestimmt Zeilenabstand [veraltet]
PDF_set_parameter — Setzt PDFlib-Parameter vom Typ String
PDF_set_text_matrix — Setzt Textmatrix [veraltet]
PDF_set_text_pos — Setzt aktuelle Textposition
PDF_set_text_rendering — Bestimmt Darstellungsmodus für Text [veraltet]
PDF_set_text_rise — Bestimmt vertikalen Textversatz [veraltet]
PDF_set_value — Setzt numerischen PDFlib-Parameter
PDF_set_word_spacing — Setzt Wortabstand [veraltet]
PDF_setcolor — Setzt Zeichen- und Füllfarbe
PDF_setdash — Setzt einfaches Strichmuster
PDF_setdashpattern — Setzt komplexes Strichmuster
PDF_setflat — Setzt Flatness-Parameter
PDF_setfont — Setzt aktuelle Schrift
PDF_setgray_fill — Setzt Füllfarbe auf Grauwert [veraltet]
PDF_setgray_stroke — Setzt Zeichenfarbe auf Grauwert [veraltet]
PDF_setgray — Setzt Farbe auf Grauwert [veraltet]
PDF_setlinecap — Setzt linecap-Parameter
PDF_setlinejoin — Setzt linejoin-Parameter
PDF_setlinewidth — Setzt aktuelle Strichstärke
PDF_setmatrix — Setzt aktuelle Transformationsmatrix
PDF_setmiterlimit — Setzt miterlimit-Parameter
PDF_setpolydash — Setzt komplexes Strichmuster [veraltet]
PDF_setrgbcolor_fill — Setzt Füllfarbe in RGB [veraltet]
PDF_setrgbcolor_stroke — Setzt Zeichenfarbe in RGB [veraltet]
PDF_setrgbcolor — Setzt Füll- und Zeichenfarbe in RGB [veraltet]
PDF_shading_pattern — Definiert Farbverlaufsmuster
PDF_shading — Definiert Farbverlauf
PDF_shfill — Füllt Bereich mit Farbverlauf
PDF_show_boxed — Gibt Text in eine Box aus [veraltet]
PDF_show_xy — Gibt Text an festgelegter Position aus
PDF_show — Gibt Text an aktueller Textposition aus
PDF_skew — Schert Koordinatensystem
PDF_stringwidth — Return width of text
PDF_stroke — Zeichnet Pfad
PDF_suspend_page — Unterbricht Ausgabe der Seite
PDF_translate — Verschiebt Ursprung des Koordinatensystems
PDF_utf16_to_utf8 — Konvertiert String von UTF-16 nach UTF-8
PDF_utf8_to_utf16 — Konvertiert String von UTF-8 nach UTF-16


PDF_activate_item> <preg_split
[edit] Last updated: Mon, 01 Nov 2010
 
add a note add a note User Contributed Notes PDF-Funktionen
sander at alternet dot nl 23-Aug-2010 02:42
Took me some time to find how to add a centered aligned footer, here's how:

<?php
// place footer line, centered. 297.5 is exactly half the width of a A4 page
$p->fit_textline($textline, 297.5, 35, " position=center");
?>
Janvarev from GMail.com 08-Aug-2009 02:38
Hi,
there is some more fix from luc pdf2text function. It really works at my tasks.

Two fixes:
1) Different platforms set different characters after start "stream" text, for example: "stream\n", "stream\r", "stream\r\n". So, we detect it first.
2) Some non-text blocks are detected as text, so we added a function "FilterNonText".

<?php
function handleV2($data){

   
// try detecting \n, \r or \r\n variation
   
$tmp = strpos($data, "stream");
   
$end_stream_delimiter = substr($data, $tmp+6, 2);

    if(
$end_stream_delimiter != "\r\n") {
      
$end_stream_delimiter = substr($end_stream_delimiter, 0, 1);
    }
   
//echo bin2hex($end_stream_delimiter); // - debug information

    // grab objects and then grab their contents (chunks)
   
$a_obj = getDataArray($data,"obj","endobj");

    foreach(
$a_obj as $obj){

       
$a_filter = getDataArray($obj,"<<",">>");

        if (
is_array($a_filter)){
           
$j++;
           
$a_chunks[$j]["filter"] = $a_filter[0];

           
$a_data = getDataArray($obj,"stream".
$end_stream_delimiter,"endstream");
            if (
is_array($a_data)){
               
$a_chunks[$j]["data"] = substr($a_data[0],
       
strlen("stream".$end_stream_delimiter),
       
strlen($a_data[0])-
strlen("stream".$end_stream_delimiter)-strlen("endstream"));
            }
        }
    }

   
// decode the chunks
   
foreach($a_chunks as $chunk){

       
// look at each chunk and decide how to decode it - by looking at the contents of the filter
       
$a_filter = split("/",$chunk["filter"]);

        if (
$chunk["data"]!=""){
           
// look at the filter to find out which encoding has been used
           
if (substr($chunk["filter"],"FlateDecode")!==false){
               
$data =@ gzuncompress($chunk["data"]);
                if (
trim($data)!=""){
           
// CHANGED HERE, before: $result_data .= ps2txt($data);
                   
$result_data .= FilterNonText(PS2Text_New($data));
                } else {

                   
//$result_data .= "x";
               
}
            }
        }
    }
    return
$result_data;
}

function
FilterNonText($data) {
  for(
$i=1;$i<9;$i++) {
      if(
strpos($data, chr($i)) !== false) {
         return
""; // not text, something strange
     
}
  }
  return
$data;
}
?>

Warning: this is only a patch to "luc at phpt dot org" code. You must use his solution first, then replace function with this patch.
bolyde at gmail dot com 12-Apr-2009 12:27
Hi,
To find the page number of a PDF File, i find this :

<?php
public function getNumPagesInPDF(array $arguments = array())
{
@list(
$PDFPath) = $arguments;
$stream = @fopen($PDFPath, "r");
$PDFContent = @fread ($stream, filesize($PDFPath));
if(!
$stream || !$PDFContent)
    return
false;
   
$firstValue = 0;
$secondValue = 0;
if(
preg_match("/\/N\s+([0-9]+)/", $PDFContent, $matches)) {
   
$firstValue = $matches[1];
}
 
if(
preg_match_all("/\/Count\s+([0-9]+)/s", $PDFContent, $matches))
{
   
$secondValue = max($matches[1]);
}
return ((
$secondValue != 0) ? $secondValue : max($firstValue, $secondValue));
}
?>
bondo2 at bondo2 dot info 09-Oct-2008 02:20
<?php

//getting new instance
$pdfFile = new_pdf();

PDF_open_file($pdfFile, " ");

//document info
pdf_set_info($pdfFile, "Auther", "Ahmed Elbshry");
pdf_set_info($pdfFile, "Creator", "Ahmed Elbshry");
pdf_set_info($pdfFile, "Title", "PDFlib");
pdf_set_info($pdfFile, "Subject", "Using PDFlib");

//starting our page and define the width and highet of the document
pdf_begin_page($pdfFile, 595, 842);

//check if Arial font is found, or exit
if($font = PDF_findfont($pdfFile, "Arial", "winansi", 1)) {
   
PDF_setfont($pdfFile, $font, 12);
} else {
    echo (
"Font Not Found!");
   
PDF_end_page($pdfFile);
   
PDF_close($pdfFile);
   
PDF_delete($pdfFile);
    exit();
}

//start writing from the point 50,780
PDF_show_xy($pdfFile, "This Text In Arial Font", 50, 780);
PDF_end_page($pdfFile);
PDF_close($pdfFile);

//store the pdf document in $pdf
$pdf = PDF_get_buffer($pdfFile);
//get  the len to tell the browser about it
$pdflen = strlen($pdfFile);

//telling the browser about the pdf document
header("Content-type: application/pdf");
header("Content-length: $pdflen");
header("Content-Disposition: inline; filename=phpMade.pdf");
//output the document
print($pdf);
//delete the object
PDF_delete($pdfFile);
?>
SID TRIVEDI 20-Jan-2008 06:16
/*
Folks, There is an excellent tutorial from Rasmus Lerdorf available at (It does not support I.E.)

http://talks.php.net/show/osconpdf/

Where PHP Mastermind Guru (Father) explained nicely about text, fonts, images and their attributes with working snippets.

Another tutorial can be found at

www.devshed.com/c/a/PHP/Building-PDF-Documents-with-PHP-5

Hence following is the various size of PDF Document.

Origin is at the lower left and the basic unit is the DTP pt.

1 pt = 1/72 inch = 0.35277777778 mm

Some common page sizes

Format          Width   Height
US-Letter      612      792
US-Legal       612      1008
US-Ledger     1224     792
11x17           792      1224
A0                2380    3368
A1                1684    2380
A2                1190    1684
A3                842      1190
A4                595      842
A5                421      595
A6                297      421
B5                501      709

*/
info at tecnick dot com 10-Jan-2008 12:54
For those of us that do not want to pay for a commercial license to use PDFlib I suggest TCPDF:

http://tcpdf.sf.net

TCPDF is an Open Source PHP class for generating PDF files on-the-fly without requiring external extensions. This class is already adopted by a large number of php projects such as phpMyAdmin, Drupal, Joomla, Xoops, TCExam, etc. 

Starting from 2.1 version TCPDF supports UTF-8 Unicode and bidirectional languages such as Arabic and Hebrew.
Ken McColl 21-Nov-2007 05:06
To get this to work on Windows do not use escapeshellcmd()

From online help:
Following characters are preceded by a backslash: #&;`|*?~<>^()[]{}$\, \x0A and \xFF. ' and " are escaped only if they are not paired. In Windows, all these characters plus % are replaced by a space instead.

So you are probably passing duff paths to pdf2text.exe

Removing escapeshellcmd worked for me. Just make darned sure you are in control of what is being passed through to your system call.
kangaroo232002 at yahoo dot co dot uk 18-Nov-2007 12:25
To extend alex's example earlier, you can use a couple of switches inside the pdf doc to give you the total number of pages, without using any ext. I would have added the whole code, however the site keeps on saying "line is too long... yadayada".

Open the doc using fopen("$file", "rb"); (for reading)

Test the first approx 1000b for the following regex
<?php
if(preg_match("/\/N\s+([0-9]+)/", $contents, $found)) {
    return
$found[1];
}
?>

If that doesn't return anything, you have to read the rest of the file:

<?php

preg_match_all
("/\/Type\s*\/Pages\s*\/Kids\s+
\[.*?\]\s*\/Count\s+([0-9]+)/"
);

?>

This may return more than one, so look through for the highest value, which is the total number of pages in your doc.
Jonathon Hibbard 05-Nov-2007 03:37
The other issue with DOMpdf is that it has some pretty painful flaws.

You have to supply full paths to everything (images, includes, javascript files, etc).  And boy, do i mean everything.

Even then, it is not 100% sound.  If you have complex sites, it cannot handle it.  It instead breaks the design and only provides you with about a million broken images.

Don't get me wrong, it's GREAT for use with lower-end more simple sites, but if you have a site that say, has a javascript navigation, flash, and a bunch of container divs, it's really not going to do the job.

The above library seems to be the best fit, as about the only way to get high-end sites to work is just to manually write it out yourself using the functions above.

Sorry to bust anyone's bubble.  Good luck.
taufiq at simplybuzz dot com 23-Oct-2007 01:13
There is XPDF Win32 binary package at SourceForge for pdftotext purpose that works.

I've tried php codes below but didn't work.
praokean at yahoo dot com 22-Aug-2007 05:08
domPDF is not so great PDF creator becouse don't support foreign charachters.
Sam from dogmaConsult.de 15-Aug-2007 02:00
I seriously tried to get PDF parsing to work to use it in the indexing for fulltext search for a document management. But none of the pdf2text functions below worked for my test cases (among them an openoffice generated pdf file and a file generated by fpdf).

But I found a REALLY WORKING SOLUTION! On linux systems, install the XPDF package. It comes with a tool called pdftotext. Use php code similar to the following to get the text content of your pdf files:

<?php
    $file
= "test.pdf";
   
$outpath = preg_replace("/\.pdf$/", "", $file).".txt";
   
   
system("pdftotext ".escapeshellcmd($file), $ret);
    if (
$ret == 0)
    {
       
$value = file_get_contents($outpath);
       
unlink($outpath);
        print
$value;
    }
    if (
$ret == 127)
        print
"Could not find pdftotext tool.";
    if (
$ret == 1)
        print
"Could not find pdf file.";
?>

The solution works on all test cases and is much more powerful than any of the previous pure php functions posted here, although only available on linux.
tatlar at yahoo dot com 14-Aug-2007 04:49
http://www.digitaljunkies.ca/dompdf/index.php

PHP5 class that converts HTML to PDF. From the website:
"At its heart, dompdf is (mostly) CSS2.1 compliant HTML layout and rendering engine written in PHP. It is a style-driven renderer: it will download and read external stylesheets, inline style tags, and the style attributes of individual HTML elements. It also supports most presentational HTML attributes."
david at metabin 19-Jul-2007 04:19
Easiest way to get the text of a pdf is to install xpdf (on redhat yum -y install xpdf)

then run xpdftotext your.pdf - which will then generate your.txt.
jkndrkn at gmail dot com 03-May-2007 10:51
For those of us that do not want to pay for a commercial license to use PDFlib in a closed-source project, there are at least two good alternatives: FPDF and TCPDF

http://www.fpdf.org/
PHP4 and PHP5 support

http://sourceforge.net/projects/pdf-php
PHP5 support only
luc at phpt dot org 29-Mar-2007 09:09
I am trying to extract the text from PDF files and use it to feed a search engine (Intranet tool). I tried several functions "PDF2TXT" posted below, but not they do not produce the expected result. At least, all words need to be separated by spaces (then used as keywords), and the "junk" codes removed (for example: binary data, pictures...). I start modifying the interesting function posted by Swen, and here is the my current version that starts to work quite well (with PDF version 1.2). Sorry for having a quite different style of programming. Luc

<?php
// Patch for pdf2txt() posted Sven Schuberth
// Add/replace following code (cannot post full program, size limitation)

// handles the verson 1.2
// New version of handleV2($data), only one line changed
function handleV2($data){
       
   
// grab objects and then grab their contents (chunks)
   
$a_obj = getDataArray($data,"obj","endobj");
   
    foreach(
$a_obj as $obj){
       
       
$a_filter = getDataArray($obj,"<<",">>");
   
        if (
is_array($a_filter)){
           
$j++;
           
$a_chunks[$j]["filter"] = $a_filter[0];

           
$a_data = getDataArray($obj,"stream\r\n","endstream");
            if (
is_array($a_data)){
               
$a_chunks[$j]["data"] = substr($a_data[0],
       
strlen("stream\r\n"),
       
strlen($a_data[0])-strlen("stream\r\n")-strlen("endstream"));
            }
        }
    }

   
// decode the chunks
   
foreach($a_chunks as $chunk){

       
// look at each chunk and decide how to decode it - by looking at the contents of the filter
       
$a_filter = split("/",$chunk["filter"]);
       
        if (
$chunk["data"]!=""){
           
// look at the filter to find out which encoding has been used           
           
if (substr($chunk["filter"],"FlateDecode")!==false){
               
$data =@ gzuncompress($chunk["data"]);
                if (
trim($data)!=""){
           
// CHANGED HERE, before: $result_data .= ps2txt($data);   
                   
$result_data .= PS2Text_New($data);
                } else {
               
                   
//$result_data .= "x";
               
}
            }
        }
    }
    return
$result_data;
}

// New function - Extract text from PS codes
function ExtractPSTextElement($SourceString)
{
$CurStartPos = 0;
while ((
$CurStartText = strpos($SourceString, '(', $CurStartPos)) !== FALSE)
    {
   
// New text element found
   
if ($CurStartText - $CurStartPos > 8) $Spacing = ' ';
    else    {
       
$SpacingSize = substr($SourceString, $CurStartPos, $CurStartText - $CurStartPos);
        if (
$SpacingSize < -25) $Spacing = ' '; else $Spacing = '';
        }
   
$CurStartText++;

   
$StartSearchEnd = $CurStartText;
    while ((
$CurStartPos = strpos($SourceString, ')', $StartSearchEnd)) !== FALSE)
        {
        if (
substr($SourceString, $CurStartPos - 1, 1) != '\\') break;
       
$StartSearchEnd = $CurStartPos + 1;
        }
    if (
$CurStartPos === FALSE) break; // something wrong happened
   
    // Remove ending '-'
   
if (substr($Result, -1, 1) == '-')
        {
       
$Spacing = '';
       
$Result = substr($Result, 0, -1);
        }

   
// Add to result
   
$Result .= $Spacing . substr($SourceString, $CurStartText, $CurStartPos - $CurStartText);
   
$CurStartPos++;
    }
// Add line breaks (otherwise, result is one big line...)
return $Result . "\n";
}

// Global table for codes replacement
$TCodeReplace = array ('\(' => '(', '\)' => ')');

// New function, replacing old "pd2txt" function
function PS2Text_New($PS_Data)
{
global
$TCodeReplace;

// Catch up some codes
if (ord($PS_Data[0]) < 10) return '';
if (
substr($PS_Data, 0, 8) == '/CIDInit') return '';

// Some text inside (...) can be found outside the [...] sets, then ignored
// => disable the processing of [...] is the easiest solution

$Result = ExtractPSTextElement($PS_Data);

// echo "Code=$PS_Data\nRES=$Result\n\n";

// Remove/translate some codes
return strtr($Result, $TCodeReplace);
}

?>
Sven.Schuberth(at)gmx.de 28-Mar-2007 10:38
I've improved the codesnipped for the pdf2txt version 1.2.
Now its possible the translate pdf version >1.2 into plain text.

Sven

<?php
// Function    : pdf2txt()
// Arguments   : $filename - Filename of the PDF you want to extract
// Description : Reads a pdf file, extracts data streams, and manages
//               their translation to plain text - returning the plain
//               text at the end
// Authors      : Jonathan Beckett, 2005-05-02
//                            : Sven Schuberth, 2007-03-29

function pdf2txt($filename){

   
$data = getFileData($filename);
   
   
$s=strpos($data,"%")+1;
   
   
$version=substr($data,$s,strpos($data,"%",$s)-1);
    if(
substr_count($version,"PDF-1.2")==0)
        return
handleV3($data);
    else
        return
handleV2($data);

   
}
// handles the verson 1.2
function handleV2($data){
       
   
// grab objects and then grab their contents (chunks)
   
$a_obj = getDataArray($data,"obj","endobj");
   
    foreach(
$a_obj as $obj){
       
       
$a_filter = getDataArray($obj,"<<",">>");
   
        if (
is_array($a_filter)){
           
$j++;
           
$a_chunks[$j]["filter"] = $a_filter[0];

           
$a_data = getDataArray($obj,"stream\r\n","endstream");
            if (
is_array($a_data)){
               
$a_chunks[$j]["data"] = substr($a_data[0],
strlen("stream\r\n"),
strlen($a_data[0])-strlen("stream\r\n")-strlen("endstream"));
            }
        }
    }

   
// decode the chunks
   
foreach($a_chunks as $chunk){

       
// look at each chunk and decide how to decode it - by looking at the contents of the filter
       
$a_filter = split("/",$chunk["filter"]);
       
        if (
$chunk["data"]!=""){
           
// look at the filter to find out which encoding has been used           
           
if (substr($chunk["filter"],"FlateDecode")!==false){
               
$data =@ gzuncompress($chunk["data"]);
                if (
trim($data)!=""){
                   
$result_data .= ps2txt($data);
                } else {
               
                   
//$result_data .= "x";
               
}
            }
        }
    }
   
    return
$result_data;
}

//handles versions >1.2
function handleV3($data){
   
// grab objects and then grab their contents (chunks)
   
$a_obj = getDataArray($data,"obj","endobj");
   
$result_data="";
    foreach(
$a_obj as $obj){
       
//check if it a string
       
if(substr_count($obj,"/GS1")>0){
           
//the strings are between ( and )
           
preg_match_all("|\((.*?)\)|",$obj,$field,PREG_SET_ORDER);
            if(
is_array($field))
                foreach(
$field as $data)
                   
$result_data.=$data[1];
        }
    }
    return
$result_data;
}

function
ps2txt($ps_data){
   
$result = "";
   
$a_data = getDataArray($ps_data,"[","]");
    if (
is_array($a_data)){
        foreach (
$a_data as $ps_text){
           
$a_text = getDataArray($ps_text,"(",")");
            if (
is_array($a_text)){
                foreach (
$a_text as $text){
                   
$result .= substr($text,1,strlen($text)-2);
                }
            }
        }
    } else {
       
// the data may just be in raw format (outside of [] tags)
       
$a_text = getDataArray($ps_data,"(",")");
        if (
is_array($a_text)){
            foreach (
$a_text as $text){
               
$result .= substr($text,1,strlen($text)-2);
            }
        }
    }
    return
$result;
}

function
getFileData($filename){
   
$handle = fopen($filename,"rb");
   
$data = fread($handle, filesize($filename));
   
fclose($handle);
    return
$data;
}

function
getDataArray($data,$start_word,$end_word){

   
$start = 0;
   
$end = 0;
    unset(
$a_result);
   
    while (
$start!==false && $end!==false){
       
$start = strpos($data,$start_word,$end);
        if (
$start!==false){
           
$end = strpos($data,$end_word,$start);
            if (
$end!==false){
               
// data is between start and end
               
$a_result[] = substr($data,$start,$end-$start+strlen($end_word));
            }
        }
    }
    return
$a_result;
}
?>
brendandonhue at comcast dot net 22-Aug-2006 08:35
Here is a function to test whether a file is a PDF without using any external library.
<?php
define
('PDF_MAGIC', "\\x25\\x50\\x44\\x46\\x2D");
function
is_pdf($filename) {
  return (
file_get_contents($filename, false, null, 0, strlen(PDF_MAGIC)) === PDF_MAGIC) ? true : false;
}
?>
It's not checking if the whole file is valid, just if the correct header is present at the beginning of the file.
MAGnUm at magnumhome dot servehttp.com 17-Jul-2006 02:01
domPDF is also a great PDF creation interface. it basically converts your code to CSS and then builds the PDF from that with the absolute positions, and what not...
spingary at yahoo dot com 12-Jan-2006 12:55
I was having trouble with streaming inline PDf's using PHP 5.0.2, Apache 2.0.54.

This is my code:

<?
header
("Pragma: public");
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
header("Cache-Control: must-revalidate");
header("Content-type: application/pdf");
header("Content-Length: ".filesize($file));
header("Content-disposition: inline; filename=$file");
header("Accept-Ranges: ".filesize($file));
readfile($file);
exit();
?>
It would work fine in Mozilla Firefox (1.0.7) but with IE (6.0.2800.1106) it would not bring up the Adobe Reader plugin and instead ask me to save it or open it as a PHP file.

Oddly enough, I turned off ZLib.compression and it started working.  I guess the compression is confusing IE.  I tried leaving out the content-length header thinking maybe it was unmatched filesize (uncompressed number vs actual received compressed size), but then without it it screws up Firefox too. 

What I ended up doing was disabling Zlib compression for the PDF output pages using ini_set:

<?
ini_set
('zlib.output_compression','Off');
?>

Maybe this will help someone. Will post over in the PDF section as well.
ontwerp AT zonnet.nl 03-Nov-2005 11:01
I was searching for a lowcost/opensource option for combining static html files [as templates] and dynamic output from perl or php routines etc. And the sooner or later I found out that this was the most stable, 'speedest' and customizeable way to produce usable pdf 's with nice formatting :

1] create html page output [perl-> html output, direct html output from any app or php echo's etc. [sort these html files locally]

2] parse all html [inluding webimages links, tables font formatting etc] to [E]PS files with the perl app : html2ps [as mentioned beneath]
http://user.it.uu.se/~jan/html2ps.html [sort all ps files by future pdf page positions]

3] use the free ps2pdf/ps2pdfwr linux application
http://www.ps2pdf.com/convert/index.htm [uses gostscript, ghostview libs and so on etc]
Has great formatting options like headers, footers, numbering etc
[sort pdf files]

4] convert all pdf files to 1 pdf file with : pdftk [pdftoolkit], deliveres optional compressions/encryption, background stamps etc

One should ask why using different scripts :
- combination perl/php is great : perl is speedier at some issues like conversion to ps files in my experience
- ps to pdf is quickier then direct php to pdf [in my exp.!]
- I have total control over every files whenever i change html files as a template I use only editors or other app. for it [online or offline].

p.s. I had to make a opensource solution for creating simpel report analyses that's based on things like :
- first page [name / title / #/ date]
- some static info [like introduction, copyrights etc]
- some dynamic info [outputted from php->dbase queries] combined
with html tags/images etc.

And this all mixed [so seperated in files for transparancy]. Also the 3 way manner : data-> html, html->ps, ps->pdf, is easier and quickier to program or adjust in every step.

Correct me if i'm wrong [mail me to]

ing. Valentijn Langendorff
Design & Technologist
ragnar at deulos dot com 07-Oct-2005 07:30
After one hole day understanding how pdflib works i got the conclusion that its enough hard to draw just with words to furthermore for drawing a line maybe you will need something like four lines of code, so i did my own functions to do the life easier and the code more understable to modify and draw. I also made a function that will draw a rect with the corners round and the posibility even to fill it ;)

You can get it from http://www.deulos.com/pdf_php.php

feel free to make suggestions or whatever u like ;o)
17-Sep-2005 11:26
some code that can be very helpful for starters.

<?php

   
// Declare PDF File

   
$pdf = pdf_new();
   
PDF_open_file($pdf);

   
// Set Document Properties

   
PDF_set_info($pdf, "author", "Alexander Pas");
   
PDF_set_info($pdf, "title", "PDF by PHP Example");
   
PDF_set_info($pdf, "creator", "Alexander Pas");
   
PDF_set_info($pdf, "subject", "Testing Code");

   
// Get fonts to use

   
pdf_set_parameter($pdf, "FontOutline", "Arial=arial.ttf"); // get a custom font
   
$font1 = PDF_findfont($pdf, "Helvetica-Bold""winansi", 0); // declare default font
   
$font2 = PDF_findfont($pdf, "Arial""winansi", 1); // declare custom font & embed into file

    /*
    You can use the following Fontypes 14 safely (the default fonts)
    Courier, Courier-Bold, Courier-Oblique, Courier-BoldOblique
    Helvetica, Helvetica-Bold, Helvetica-Oblique, Helvetica-BoldOblique
    Times-Roman, Times-Bold, Times-Italic, Times-BoldItalic
    Symbol, ZapfDingbats
    */

    // make the images

   
$image1 = PDF_open_image_file($pdf, "gif", "image.gif"); //supported filetypes are: jpeg, tiff, gif, png.

    //Make First Page

   
PDF_begin_page($pdf, 450, 450); // page width and height.
   
$bookmark = PDF_add_bookmark($pdf, "Front"); // add a top level bookmark.
   
PDF_setfont($pdf, $font1, 12); // use this font from now on.
   
PDF_show_xy($pdf, "First Page!", 5, 225); // show this text measured from the left top.
   
pdf_place_image($pdf, $image1, 255, 5, 1); // last number will schale it.
   
PDF_end_page($pdf); // End of Page.

    //Make Second Page

   
PDF_begin_page($pdf, 450, 225); // page width and height.
   
$bookmark1 = PDF_add_bookmark($pdf, "Chapter1", $bookmark); // add a nested bookmark. (can be nested multiple times.)
   
PDF_setfont($pdf, $font2, 12); // use this font from now on.
   
PDF_show_xy($pdf, "Chapter1!", 225, 5);
   
PDF_add_bookmark($pdf, "Chapter1.1", $bookmark1); // add a nested bookmark (already in a nested one).
   
PDF_setfont($pdf, $font1, 12);
   
PDF_show_xy($pdf, "Chapter1.1", 225, 5);
   
PDF_end_page($pdf);
   
   
// Finish the PDF File
   
   
PDF_close($pdf); // End Of PDF-File.
   
$output = PDF_get_buffer($pdf); // assemble the file in a variable.

    // Output Area

   
header("Content-type: application/pdf"); //set filetype to pdf.
   
header("Content-Length: ".strlen($output)); //content length
   
header("Content-Disposition: attachment; filename=test.pdf"); // you can use inline or attachment.
   
echo $output; // actual print area!

    // Cleanup

   
PDF_delete($pdf);
?>
thodge at ipswich dot qld dot gov dot au 04-Sep-2005 10:22
Yet another addition to the PDF text extraction code last posted by jorromer. The code only seemed to work for PDF 1.2 (Acrobat 3.x) or below. This pdfExtractText function uses regular expressions to cover cases I have found in PDF 1.3 and 1.4 documents. The code also handles closing brackets in the text stream, which were ignored by the previous version. My regular expression skills are somewhat lacking, so improvements may possible by a more skilled programmer. I'm sure there are still cases that this function will not handle, but I haven't come across any yet...

<?php

function pdf2string($sourcefile) {

   
$fp = fopen($sourcefile, 'rb');
   
$content = fread($fp, filesize($sourcefile));
   
fclose($fp);

   
$searchstart = 'stream';
   
$searchend = 'endstream';
   
$pdfText = '';
   
$pos = 0;
   
$pos2 = 0;
   
$startpos = 0;

    while (
$pos !== false && $pos2 !== false) {

       
$pos = strpos($content, $searchstart, $startpos);
       
$pos2 = strpos($content, $searchend, $startpos + 1);

        if (
$pos !== false && $pos2 !== false){

            if (
$content[$pos] == 0x0d && $content[$pos + 1] == 0x0a) {
               
$pos += 2;
            } else if (
$content[$pos] == 0x0a) {
               
$pos++;
            }

            if (
$content[$pos2 - 2] == 0x0d && $content[$pos2 - 1] == 0x0a) {
               
$pos2 -= 2;
            } else if (
$content[$pos2 - 1] == 0x0a) {
               
$pos2--;
            }

           
$textsection = substr(
               
$content,
               
$pos + strlen($searchstart) + 2,
               
$pos2 - $pos - strlen($searchstart) - 1
           
);
           
$data = @gzuncompress($textsection);
           
$pdfText .= pdfExtractText($data);
           
$startpos = $pos2 + strlen($searchend) - 1;

        }
    }

    return
preg_replace('/(\s)+/', ' ', $pdfText);

}

function
pdfExtractText($psData){

    if (!
is_string($psData)) {
        return
'';
    }

   
$text = '';

   
// Handle brackets in the text stream that could be mistaken for
    // the end of a text field. I'm sure you can do this as part of the
    // regular expression, but my skills aren't good enough yet.
   
$psData = str_replace('\)', '##ENDBRACKET##', $psData);
   
$psData = str_replace('\]', '##ENDSBRACKET##', $psData);

   
preg_match_all(
       
'/(T[wdcm*])[\s]*(\[([^\]]*)\]|\(([^\)]*)\))[\s]*Tj/si',
       
$psData,
       
$matches
   
);
    for (
$i = 0; $i < sizeof($matches[0]); $i++) {
        if (
$matches[3][$i] != '') {
           
// Run another match over the contents.
           
preg_match_all('/\(([^)]*)\)/si', $matches[3][$i], $subMatches);
            foreach (
$subMatches[1] as $subMatch) {
               
$text .= $subMatch;
            }
        } else if (
$matches[4][$i] != '') {
           
$text .= ($matches[1][$i] == 'Tc' ? ' ' : '') . $matches[4][$i];
        }
    }

   
// Translate special characters and put back brackets.
   
$trans = array(
       
'...'                => '…',
       
'\205'                => '…',
       
'\221'                => chr(145),
       
'\222'                => chr(146),
       
'\223'                => chr(147),
       
'\224'                => chr(148),
       
'\226'                => '-',
       
'\267'                => '•',
       
'\('                => '(',
       
'\['                => '[',
       
'##ENDBRACKET##'    => ')',
       
'##ENDSBRACKET##'    => ']',
       
chr(133)            => '-',
       
chr(141)            => chr(147),
       
chr(142)            => chr(148),
       
chr(143)            => chr(145),
       
chr(144)            => chr(146),
    );
   
$text = strtr($text, $trans);

    return
$text;

}

?>
28-Aug-2005 09:58
If you want to display the number of pages (for example: page 1 of 3) then the following code could be helpful:

<?php
...

$pdf->begin_page_ext(842,595 , "");
  ..
add text,images,...
$pdf->suspend_page("");

$pdf->begin_page_ext(842,595 , "");
  ..
add text,images,...
$pdf->suspend_page("");

...
create all pages

$pdf
->resume_page("pagenumber 1");
...
add number of pages to page 1
$pdf
->end_page_ext("");

$pdf->resume_page("pagenumber 2");
...
add number of pages to page 2
$pdf
->end_page_ext("");

...
?>
jorromer at uchile dot cl -- Krash 07-Jun-2005 10:51
I recently use mattb code below for the extraction of text from PDF files. I modify this code for only extract text fields.

Hope i can help some one

Here is the Function

<?php

  $text
= pdf2string("file.pdf");
  echo
$text;

  function
pdf2string($sourcefile){
   
$fp = fopen($sourcefile, 'rb');
   
$content = fread($fp, filesize($sourcefile));
   
fclose($fp);

   
$searchstart = 'stream';
   
$searchend = 'endstream';
   
$pdfdocument = '';
   
$pos = 0;
   
$pos2 = 0;
   
$startpos = 0;
  
    while(
$pos !== false && $pos2 !== false ){
     
$pos = strpos($content, $searchstart, $startpos);
     
$pos2 = strpos($content, $searchend, $startpos + 1);
    
      if (
$pos !== false && $pos2 !== false){
        if (
$content[$pos]==0x0d && $content[$pos+1]==0x0a) $pos+=2;
        else if (
$content[$pos]==0x0a) $pos++;

        if (
$content[$pos2-2]==0x0d && $content[$pos2-1]==0x0a) $pos2-=2;
        else if (
$content[$pos2-1]==0x0a) $pos2--;

       
$textsection = substr($content, $pos + strlen($searchstart) + 2, $pos2 - $pos - strlen($searchstart) - 1);
       
$data = @gzuncompress($textsection);
       
$data = ExtractText2($data);
       
$startpos = $pos2 + strlen($searchend) - 1;
       
        if (
$data === false){
          return -
1;}
         
       
$pdfdocument .= $data;}}
   return
$pdfdocument;}

function
ExtractText2($postScriptData){
 
$sw = true;
 
$textStart = 0;
 
$len = strlen($postScriptData);

  while (
$sw){
   
$ini = strpos($postScriptData, '(', $textStart);
   
$end = strpos($postScriptData, ')', $textStart+1);
    if ((
$ini>0) && ($end>$ini)){
     
$valtext = strpos($postScriptData,'Tj',$end+1);
      if (
$valtext == $end + 2)
       
$text .= substr($postScriptData,$ini+1,$end - $ini - 1);}
     
   
$textStart = $end + 1;
    if (
$len<=$textStart) $sw=false;
   
    if ((
$ini == 0) && ($end == 0)) $sw=false;}
 
 
$trans = array("\\341" => "a","\\351" => "e","\\355" => "i","\\363" => "o","\\223" => "","\\224" => "");
 
$text  = strtr($text, $trans);
  return
$text;
}
?>
webadmin at secretscreen dot com 05-Apr-2005 02:51
I found this info about pdflib scope on a Chinese (I think) site and translated it.  I was trying to do pdf_setfont and kept getting the wrong scope error.  Turns out it has to be in the Page scope.  So pdf_setfont will only work when called between pdf_begin_page and pdf_end_page.

#########################################
When API of the PDFlib is called, the error, Can't - IN 'document' scope occurs
There is a concept of " the scope " in the PDFlib, as for all API of the PDFlib it is called with some scope, the *1 which is decided This error occurs when it is called other than the scope where API is appointed. The chart below in reference, please verify API call position.

Path: PDF_moveto (), PDF_circle (), PDF_arc (), PDF_arcn (), PDF_rect () in each case PDF_stroke (), PDF_closepath_stroke (), PDF_fill (), PDF_fill_stroke (), PDF_closepath_fill_stroke (), PDF_clip (), PDF_endpath () the between

Page: PDF_begin_page () with PDF_end_page () in between outside path 

Template: PDF_begin_template () with PDF_end_template () in between outside path 

Pattern: PDF_begin_pattern () with PDF_end_pattern () in between outside path 

Font: PDF_begin_font () with PDF_end_font () in between outside glyph 

Glyph: PDF_begin_glyph () with PDF_end_glyph () in between outside path 

Document: PDF_open_* () with PDF_close () in between outside page tempalte and pattern 

Object: The PDF_new () with the PDF_delete () it belongs to the other no scope in between the place

Null: Outside object 

Any: All scopes other than 

##########################################

Hope this helps others as much as it helped me!!!
chu61 dot tw at gmail dot com 06-Mar-2005 07:57
How to get how many pages in a PDF? I read PDF spec. V1.6 and find this:

PDF set  a "Page Tree Node" to define the ordering of pages in the document. The tree structure allows PDF applications, using little memory to quickly open a document containing thousands of pages.

If a PDF have 63 pages, the page tree node will like this...

2 0 obj
<< /Type /Pages
    /Kidsn [ 4 0 R
               10 0 R
             ]
     /Count 63        <---- YES, got it
>>
endobj

[P.S]   a  PDF may not only a pages tree node, The right answer is in "root page tree node", if  /Count XX with  /Parent XXX node, it not "root page tree node"

SO, You must find the node with /Count XX and Without /Parent  terms, and you'll get total pages of PDF

%PDF-1.0  ~  %PDF-1.5 all works

Alex form Taipei,Taiwan
mattb at bluewebstudios dot com 04-Feb-2005 01:44
I recently tested Donatas' code below for the extraction of text from PDF files.  After running into a few problems where PDF files were not being read at all, I've modified it somewhat.  It still isn't perfect, but should work great for searching.  Thanks Donatas.

<?php
$test
= pdf2string("<pathtoPDFfile>");
echo
"$test";

# Returns a -1 if uncompression failed
function pdf2string($sourcefile)
{
  
$fp = fopen($sourcefile, 'rb');
  
$content = fread($fp, filesize($sourcefile));
  
fclose($fp);

  
# Locate all text hidden within the stream and endstream tags
  
$searchstart = 'stream';
  
$searchend = 'endstream';
  
$pdfdocument = "";

  
$pos = 0;
  
$pos2 = 0;
  
$startpos = 0;
  
# Iterate through each stream block
  
while( $pos !== false && $pos2 !== false )
   {
     
# Grab beginning and end tag locations if they have not yet been parsed
     
$pos = strpos($content, $searchstart, $startpos);
     
$pos2 = strpos($content, $searchend, $startpos + 1);
      if(
$pos !== false && $pos2 !== false )
      {
        
# Extract compressed text from between stream tags and uncompress
        
$textsection = substr($content, $pos + strlen($searchstart) + 2, $pos2 - $pos - strlen($searchstart) - 1);
        
$data = @gzuncompress($textsection);
        
# Clean up text via a special function
        
$data = ExtractText($data);
        
# Increase our PDF pointer past the section we just read
        
$startpos = $pos2 + strlen($searchend) - 1;
         if(
$data === false ) { return -1; }
        
$pdfdocument = $pdfdocument . $data;
      }
   }

   return
$pdfdocument;
}

function
ExtractText($postScriptData)
{
   while( ((
$textStart = strpos($postScriptData, '(', $textStart)) && ($textEnd = strpos($postScriptData, ')', $textStart + 1)) && substr($postScriptData, $textEnd - 1) != '\\') )
   {
     
$plainText .= substr($postScriptData, $textStart + 1, $textEnd - $textStart - 1);
      if(
substr($postScriptData, $textEnd + 1, 1) == ']' ) // This adds quite some additional spaces between the words
     
{
        
$plainText .= ' ';
      }

     
$textStart = $textStart < $textEnd ? $textEnd : $textStart + 1;
   }

   return
stripslashes($plainText);
}
?>
michi (Alt+Q) marel.at 01-Jul-2004 07:10
<?PHP
/* A little helpful function to calculate millimeters to points */
function calcToPt($intMillimeter) {
 
$intPoints = ($intMillimeter*72)/25.4;
 
$intPoints = round($intPoints);
  return
$intPoints;
}

/* For example: Create DIN A4 210x297 mm */
pdf_begin_page( $pdf, calcToPt(210), calcToPt(297)); // 595x842 pt
?>
donatas at spurgius dot com 22-Jun-2004 12:56
I've been looking for a way to extract plain text from PDF documents (needed to search for text inside 'em). Not being able to find one I wrote the needed functions myself. here you go folks.

<?php
 
function pdf2string ($sourceFile)
  {
   
$textArray = array ();
   
$objStart = 0;
   
   
$fp = fopen ($sourceFile, 'rb');
   
$content = fread ($fp, filesize ($sourceFile));
   
fclose ($fp);
   
   
$searchTagStart = chr(13).chr(10).'stream';
   
$searchTagStartLenght = strlen ($searchTagStart);
   
    while (((
$objStart = strpos ($content, $searchTagStart, $objStart)) && ($objEnd = strpos ($content, 'endstream', $objStart+1))))
    {
     
$data = substr ($content, $objStart + $searchTagStartLenght + 2, $objEnd - ($objStart + $searchTagStartLenght) - 2);
     
$data = @gzuncompress ($data);
     
      if (
$data !== FALSE && strpos ($data, 'BT') !== FALSE && strpos ($data, 'ET') !== FALSE)
      {
       
$textArray [] = ExtractText ($data);
      }
     
     
$objStart = $objStart < $objEnd ? $objEnd : $objStart + 1;
    }
   
    return
$textArray;
  }
 
  function
ExtractText ($postScriptData)
  {
    while (((
$textStart = strpos ($postScriptData, '(', $textStart)) && ($textEnd = strpos ($postScriptData, ')', $textStart + 1)) && substr ($postScriptData, $textEnd - 1) != '\\'))
    {
     
$plainText .= substr ($postScriptData, $textStart + 1, $textEnd - $textStart - 1);
      if (
substr ($postScriptData, $textEnd + 1, 1) == ']') //this adds quite some additional spaces between the words
     
{
       
$plainText .= ' ';
      }
     
     
$textStart = $textStart < $textEnd ? $textEnd : $textStart + 1;
    }
   
    return
stripslashes ($plainText);
  }
?>
uwe at steinmann dot cx 13-May-2004 06:25
Those looking for a free replacement of pdflib may consider
pslib at http://pslib.sourceforge.net which produces PostScript but it can be easily turned into PDF by Acrobat Distiller or ghostscript. The API is very similar and even hypertext functions are supported. There
is also a php extension for pslib in PECL, called ps.
samcontact at myteks dot com 01-May-2004 04:28
Here is another great tutorial on basic PDF building w/ PHP:
http://hotwired.lycos.com/webmonkey/02/20/index3a.html?tw=programming

=======================
http://myteks.com
Computer Repair & Web Design
=======================
SenorTZ senortz at nospam dot yahoo dot com 28-Jul-2003 06:23
About creating a PDF document based on the content of another document(let's say a text file):

I have tried to send to the PDF-creator page from a link from the sender page the file name of the file I want to read the content from and generate the PDF document containing this content. The idea is is that when I tried to reffer the pdf-creator page via the link your_root/create_pdf.php?filename=$your_file_name, the pdf-creator page does not behave well when before creating the pdf document I have a line like $filename = $_GET["filename"].
I solved this using on the sender page instead of the link a form with a button, so the form has as action "create_pdf.php", as method "post" and a hidden field containing the "filename" value. And it works like this if, on the pdf-creator page I have a line like $filename = $_POST["filename"].

I would like to understand why this way it works and the other way does not.

I hope this helps. Here are the pieces of code I used.

Sender page:
print("<form name='to_pdf' action='see_pdf_file.php' method='post'>");
print("<br/><input type='submit' value='PDF'><input type='hidden' name='filename' value='$filename'></form>");

PDF-creator page:
<?
$filename
= $_POST["filename"];
$file_handle = fopen($filename, "r");
$file_content = file_get_contents($filename);
fclose($file_handle);
//
$file_content = wordwrap($file_content,72,"|");
$a_row = explode("|",$file_content);
$i = 0;
//
$pdf = pdf_new();
pdf_open_file($pdf, "");
pdf_begin_page($pdf, 595, 842);
pdf_set_font($pdf, "Times-Roman", 16, "host");
pdf_add_outline($pdf, "Page 1");
pdf_set_value($pdf, "textrendering", 1);
pdf_show_xy($pdf, 'The content of the file:',50,700);
while (
$a_row[$i] != "")
{
      
pdf_continue_text($pdf,$a_row[$i]);
      
$i++;
}
pdf_end_page($pdf);
pdf_close($pdf);
//
$data = pdf_get_buffer($pdf);
//
header("Content-type: application/pdf");
header("Content-disposition: inline; filename=test.pdf");
header("Content-length: " . strlen($data));
//
echo $data;
?>

PDFLib and PHP 431 used.

Thanks.
bmironov at jonview dot com 24-Jun-2003 03:46
RedHat 9 + Apache 2.0 + PHP 4.3.2 + Oracle 9i + PDFlib 5.0.1 (binary distribution)

It seems to be a working bundle if you do some magic with ./configure:

RedHat 9:
kernel-2.4.20-18.9

Apache 2.0.46:
./configure --enable-so --enable-rewrite=shared --enable-status --enable-mpm=prefork

PHP 4.3.2:
./configure \
--program-prefix= \
--prefix=/usr \
--exec-prefix=/usr \
--bindir=/usr/bin \
--sbindir=/usr/sbin \
--sysconfdir=/etc \
--datadir=/usr/share \
--includedir=/usr/include \
--libdir=/usr/lib \
--libexecdir=/usr/libexec \
--localstatedir=/var \
--sharedstatedir=/usr/com \
--mandir=/usr/share/man \
--infodir=/usr/share/info \
--with-config-file-path=/etc \
--with-config-file-scan-dir=/etc/php.d \
--without-tsrm-pthreads \    # !!!!!!!!!!!!!!!!!!!!
--with-zlib \
--with-gd \
--enable-gd-native-ttf \
--with-ttf \
--without-mysql \
--with-apxs2filter=/usr/local/apache2/bin/apxs \
--with-oci8 \
--enable-sigchild \
--enable-inline-optimization

Oracle9i:
ln -s $ORACLE_HOME/rdbms/public/nzerror.h $ORACLE_HOME/rdbms/demo/nzerror.h

ln -s $ORACLE_HOME/rdbms/public/nzt.h $ORACLE_HOME/rdbms/demo/nzt.h

ln -s $ORACLE_HOME/rdbms/public/ociextp.h $ORACLE_HOME/rdbms/demo/ociextp.h

If you want to use bundled GD-library then:
1) install following packages: libjpeg, libjpeg-devel, libpng, libpng-devel, freetype, freetype-devel, libtiff, libtiff-devel, zlib, zlib-devel

2) ln -s /usr/lib/libjpeg.so.62 /usr/lib/libjpeg.so
ln -s /usr/lib/libpng.so.62 /usr/lib/libpng.so

It seems to be a working combination, because it is NOT give you:
1) error message in Apache's error_log:
Module compiled with module API=20020429, debug=0, thread-safety=0
PHP compiled with module API=20020429, debug=0, thread-safety=1

2) error message in Apache's error_log:
[notice] child pid 12345 exit signal Segmentation fault (11)

3) MS Internet Explorer can show PDF-output from your PHP-script via Acrobat plug-in and does not crush. No confusing messages about opening "Adobe Acrobat Control for ActiveX".

Hope it will save you some time.

Good luck,
Boris
pbierans at lynet dot de 27-Mar-2002 09:56
Load extension, open a PDF, add a font, modify PDF in memory and send
it to browser:

<?php
 
// no cache headers:
 
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
 
header("Last-Modified: ".gmdate("D, d M Y H:i:s")." GMT");
 
header("Cache-Control: no-store, no-cache, must-revalidate");
 
header("Cache-Control: post-check=0, pre-check=0", false);
 
header("Pragma: no-cache");

 
$ext_name="libpdf_php.so";
   
// libpdf_php.so is the PDFLIB for SunOS by "PDFlib GmbH"
    // visit http://www.pdflib.com

  // if the extension is not automatically loaded by Apache
  // dl() will try to load it on demand:
 
if (!extension_loaded($ext_name) && !@dl($ext_name))
  {
   
?>
    <table width="100%" border="0"><tr><td align="center">
      <table style="border: solid #f0f0f0 2px;"><tr>
        <td valign="middle" style="padding: 20px; margin: 0px;">
          <p style="font-family: arial; font-size: 12px; ">
          <b>Sorry,</b><br>
          &nbsp;<br>
          A PDF can not be generated right now.<br>
          The administrator has been informed and will fix this as
          soon as possible.<br>
          Please try again later.
        </p>
      </td></tr></table>
    </td></tr></table>
    <?php
    mail
('admin@domain.com','Error: PDFLib not found',
        
'Called by script:\n  '.$SCRIPT_FILENAME.'?'.$QUERY_STRING,
        
"From: warnings@domain.com\n");
    exit;
  }
// verify that extension is usable

  // unique serial number:
 
srand(microtime()*10000);
 
$usnr= gmdate("Ymd-His-").rand(1000,9999).'-';
 
$pdf_file=$usnr.'result.pdf';
 
$src_file='source.pdf';

 
// create pdf object
 
$pdf = pdf_new();
 
pdf_open_file($pdf);
 
pdf_set_parameter($pdf, 'serial',      'if-you-have-one');

 
// fonts to embed, they are in the folder of this file:
 
pdf_set_parameter($pdf, 'FontAFM',     'TradeGothic=Tg______.afm');
 
pdf_set_parameter($pdf, 'FontOutline', 'TradeGothic=Tg______.pfb');
 
pdf_set_parameter($pdf, 'FontPFM',     'TradeGothic=Tg______.pfm');

 
// load the source file:
 
$src_doc   =pdf_open_pdi($pdf,$src_file,'', 0);
 
$src_page  =pdf_open_pdi_page($pdf,$src_doc,1,'');
 
$src_width =pdf_get_pdi_value($pdf,'width' ,$src_doc,$src_page,0);
 
$src_height=pdf_get_pdi_value($pdf,'height',$src_doc,$src_page,0);

 
pdf_begin_page($pdf, $src_width, $src_height);
  {
   
// place the sourcefile to the background of the actual page:
   
pdf_place_pdi_page($pdf,$src_page,0,0,1,1);
   
pdf_close_pdi_page($pdf,$src_page);

   
// modify the page:
   
pdf_set_font($pdf, 'TradeGothic', 8, 'host');
   
pdf_show_xy($pdf, 'Now: '.gmdate("Y-m-d H:i:s"),50,50);
  }
 
pdf_end_page($pdf);
 
pdf_close($pdf);

 
// prepare output:
 
$pdfdata = pdf_get_buffer($pdf); // to echo the pdf-data
 
$pdfsize = strlen($pdfdata);     // IE requires the datasize

  // real datatype headers:
 
header('Content-type: application/pdf');
 
header('Content-disposition: attachment; filename="'.$pdf_file.'"');
 
header('Content-length: '.$pdfsize);
  echo
$pdfdata;
  exit;
// keep this one so no #13#10 or #32 will be written
?>

 
show source | credits | sitemap | contact | advertising | mirror sites