| 1 |
lars |
1 |
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
|
|
|
2 |
<html>
|
|
|
3 |
<head>
|
|
|
4 |
<meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
|
|
|
5 |
<title>FAQ</title>
|
|
|
6 |
<link type="text/css" rel="stylesheet" href="fpdf.css">
|
|
|
7 |
<style type="text/css">
|
|
|
8 |
ul {list-style-type:none; margin:0; padding:0}
|
|
|
9 |
ul#answers li {margin-top:1.8em}
|
|
|
10 |
.question {font-weight:bold; color:#900000}
|
|
|
11 |
</style>
|
|
|
12 |
</head>
|
|
|
13 |
<body>
|
|
|
14 |
<h1>FAQ</h1>
|
|
|
15 |
<ul>
|
|
|
16 |
<li><b>1.</b> <a href='#q1'>What's exactly the license of FPDF? Are there any usage restrictions?</a></li>
|
|
|
17 |
<li><b>2.</b> <a href='#q2'>When I try to create a PDF, a lot of weird characters show on the screen. Why?</a></li>
|
|
|
18 |
<li><b>3.</b> <a href='#q3'>I try to generate a PDF and IE displays a blank page. What happens?</a></li>
|
|
|
19 |
<li><b>4.</b> <a href='#q4'>I can't make line breaks work. I put \n in the string printed by MultiCell but it doesn't work.</a></li>
|
|
|
20 |
<li><b>5.</b> <a href='#q5'>I try to display a variable in the Header method but nothing prints.</a></li>
|
|
|
21 |
<li><b>6.</b> <a href='#q6'>I defined the Header and Footer methods in my PDF class but nothing appears.</a></li>
|
|
|
22 |
<li><b>7.</b> <a href='#q7'>Accented characters are replaced by some strange characters like é.</a></li>
|
|
|
23 |
<li><b>8.</b> <a href='#q8'>I try to display the Euro symbol but it doesn't work.</a></li>
|
|
|
24 |
<li><b>9.</b> <a href='#q9'>I get the following error when I try to generate a PDF: Some data has already been output, can't send PDF file</a></li>
|
|
|
25 |
<li><b>10.</b> <a href='#q10'>I draw a frame with very precise dimensions, but when printed I notice some differences.</a></li>
|
|
|
26 |
<li><b>11.</b> <a href='#q11'>I'd like to use the whole surface of the page, but when printed I always have some margins. How can I get rid of them?</a></li>
|
|
|
27 |
<li><b>12.</b> <a href='#q12'>How can I put a background in my PDF?</a></li>
|
|
|
28 |
<li><b>13.</b> <a href='#q13'>How can I set a specific header or footer on the first page?</a></li>
|
|
|
29 |
<li><b>14.</b> <a href='#q14'>I'd like to use extensions provided by different scripts. How can I combine them?</a></li>
|
|
|
30 |
<li><b>15.</b> <a href='#q15'>How can I send the PDF by email?</a></li>
|
|
|
31 |
<li><b>16.</b> <a href='#q16'>What's the limit of the file sizes I can generate with FPDF?</a></li>
|
|
|
32 |
<li><b>17.</b> <a href='#q17'>Can I modify a PDF with FPDF?</a></li>
|
|
|
33 |
<li><b>18.</b> <a href='#q18'>I'd like to make a search engine in PHP and index PDF files. Can I do it with FPDF?</a></li>
|
|
|
34 |
<li><b>19.</b> <a href='#q19'>Can I convert an HTML page to PDF with FPDF?</a></li>
|
|
|
35 |
<li><b>20.</b> <a href='#q20'>Can I concatenate PDF files with FPDF?</a></li>
|
|
|
36 |
</ul>
|
|
|
37 |
|
|
|
38 |
<ul id='answers'>
|
|
|
39 |
<li id='q1'>
|
|
|
40 |
<p><b>1.</b> <span class='question'>What's exactly the license of FPDF? Are there any usage restrictions?</span></p>
|
|
|
41 |
FPDF is released under a permissive license: there is no usage restriction. You may embed it
|
|
|
42 |
freely in your application (commercial or not), with or without modifications.
|
|
|
43 |
</li>
|
|
|
44 |
|
|
|
45 |
<li id='q2'>
|
|
|
46 |
<p><b>2.</b> <span class='question'>When I try to create a PDF, a lot of weird characters show on the screen. Why?</span></p>
|
|
|
47 |
These "weird" characters are in fact the actual content of your PDF. This behavior is a bug of
|
|
|
48 |
IE6. When it first receives an HTML page, then a PDF from the same URL, it displays it directly
|
|
|
49 |
without launching Acrobat. This happens frequently during the development stage: on the least
|
|
|
50 |
script error, an HTML page is sent, and after correction, the PDF arrives.
|
|
|
51 |
<br>
|
|
|
52 |
To solve the problem, simply quit and restart IE. You can also go to another URL and come
|
|
|
53 |
back.
|
|
|
54 |
<br>
|
|
|
55 |
To avoid this kind of inconvenience during the development, you can generate the PDF directly
|
|
|
56 |
to a file and open it through the explorer.
|
|
|
57 |
</li>
|
|
|
58 |
|
|
|
59 |
<li id='q3'>
|
|
|
60 |
<p><b>3.</b> <span class='question'>I try to generate a PDF and IE displays a blank page. What happens?</span></p>
|
|
|
61 |
First of all, check that you send nothing to the browser after the PDF (not even a space or a
|
|
|
62 |
carriage return). You can put an exit statement just after the call to the Output() method to
|
|
|
63 |
be sure. If it still doesn't work, it means you're a victim of the "blank page syndrome". IE
|
|
|
64 |
used in conjunction with the Acrobat plug-in suffers from many bugs. To avoid these problems
|
|
|
65 |
in a reliable manner, two main techniques exist:
|
|
|
66 |
<br>
|
|
|
67 |
<br>
|
|
|
68 |
- Disable the plug-in and use Acrobat as a helper application. To do this, launch Acrobat, go
|
|
|
69 |
to the Edit menu, Preferences, Internet, and uncheck "Display PDF in browser". Then, the next
|
|
|
70 |
time you load a PDF in IE, it displays the dialog box "Open it" or "Save it to disk". Uncheck
|
|
|
71 |
the option "Always ask before opening this type of file" and choose Open. From now on, PDF files
|
|
|
72 |
will open automatically in an external Acrobat window.
|
|
|
73 |
<br>
|
|
|
74 |
The drawback of the method is that you need to alter the client configuration, which you can do
|
|
|
75 |
in an intranet environment but not for the Internet.
|
|
|
76 |
<br>
|
|
|
77 |
<br>
|
|
|
78 |
- Use a redirection technique. It consists in generating the PDF in a temporary file on the server
|
|
|
79 |
and redirect the client to it. For example, at the end of the script, you can put the following:
|
|
|
80 |
<div class="doc-source">
|
|
|
81 |
<pre><code>//Determine a temporary file name in the current directory
|
|
|
82 |
$file = basename(tempnam('.', 'tmp'));
|
|
|
83 |
rename($file, $file.'.pdf');
|
|
|
84 |
$file .= '.pdf';
|
|
|
85 |
//Save PDF to file
|
|
|
86 |
$pdf->Output($file, 'F');
|
|
|
87 |
//Redirect
|
|
|
88 |
header('Location: '.$file);</code></pre>
|
|
|
89 |
</div>
|
|
|
90 |
This method turns the dynamic PDF into a static one and avoids all troubles. But you have to do
|
|
|
91 |
some cleaning in order to delete the temporary files. For example:
|
|
|
92 |
<div class="doc-source">
|
|
|
93 |
<pre><code>function CleanFiles($dir)
|
|
|
94 |
{
|
|
|
95 |
//Delete temporary files
|
|
|
96 |
$t = time();
|
|
|
97 |
$h = opendir($dir);
|
|
|
98 |
while($file=readdir($h))
|
|
|
99 |
{
|
|
|
100 |
if(substr($file,0,3)=='tmp' && substr($file,-4)=='.pdf')
|
|
|
101 |
{
|
|
|
102 |
$path = $dir.'/'.$file;
|
|
|
103 |
if($t-filemtime($path)>3600)
|
|
|
104 |
@unlink($path);
|
|
|
105 |
}
|
|
|
106 |
}
|
|
|
107 |
closedir($h);
|
|
|
108 |
}</code></pre>
|
|
|
109 |
</div>
|
|
|
110 |
This function deletes all files of the form tmp*.pdf older than an hour in the specified
|
|
|
111 |
directory. You may call it where you want, for example in the script which generates the PDF.
|
|
|
112 |
</li>
|
|
|
113 |
|
|
|
114 |
<li id='q4'>
|
|
|
115 |
<p><b>4.</b> <span class='question'>I can't make line breaks work. I put \n in the string printed by MultiCell but it doesn't work.</span></p>
|
|
|
116 |
You have to enclose your string with double quotes, not single ones.
|
|
|
117 |
</li>
|
|
|
118 |
|
|
|
119 |
<li id='q5'>
|
|
|
120 |
<p><b>5.</b> <span class='question'>I try to display a variable in the Header method but nothing prints.</span></p>
|
|
|
121 |
You have to use the <code>global</code> keyword to access global variables, for example:
|
|
|
122 |
<div class="doc-source">
|
|
|
123 |
<pre><code>function Header()
|
|
|
124 |
{
|
|
|
125 |
global $title;
|
|
|
126 |
|
|
|
127 |
$this->SetFont('Arial', 'B', 15);
|
|
|
128 |
$this->Cell(0, 10, $title, 1, 1, 'C');
|
|
|
129 |
}
|
|
|
130 |
|
|
|
131 |
$title = 'My title';</code></pre>
|
|
|
132 |
</div>
|
|
|
133 |
Alternatively, you can use an object property:
|
|
|
134 |
<div class="doc-source">
|
|
|
135 |
<pre><code>function Header()
|
|
|
136 |
{
|
|
|
137 |
$this->SetFont('Arial', 'B', 15);
|
|
|
138 |
$this->Cell(0, 10, $this->title, 1, 1, 'C');
|
|
|
139 |
}
|
|
|
140 |
|
|
|
141 |
$pdf->title = 'My title';</code></pre>
|
|
|
142 |
</div>
|
|
|
143 |
</li>
|
|
|
144 |
|
|
|
145 |
<li id='q6'>
|
|
|
146 |
<p><b>6.</b> <span class='question'>I defined the Header and Footer methods in my PDF class but nothing appears.</span></p>
|
|
|
147 |
You have to create an object from the PDF class, not FPDF:
|
|
|
148 |
<div class="doc-source">
|
|
|
149 |
<pre><code>$pdf = new PDF();</code></pre>
|
|
|
150 |
</div>
|
|
|
151 |
</li>
|
|
|
152 |
|
|
|
153 |
<li id='q7'>
|
|
|
154 |
<p><b>7.</b> <span class='question'>Accented characters are replaced by some strange characters like é.</span></p>
|
|
|
155 |
Don't use UTF-8 encoding. Standard FPDF fonts use ISO-8859-1 or Windows-1252.
|
|
|
156 |
It is possible to perform a conversion to ISO-8859-1 with utf8_decode():
|
|
|
157 |
<div class="doc-source">
|
|
|
158 |
<pre><code>$str = utf8_decode($str);</code></pre>
|
|
|
159 |
</div>
|
|
|
160 |
But some characters such as Euro won't be translated correctly. If the iconv extension is available, the
|
|
|
161 |
right way to do it is the following:
|
|
|
162 |
<div class="doc-source">
|
|
|
163 |
<pre><code>$str = iconv('UTF-8', 'windows-1252', $str);</code></pre>
|
|
|
164 |
</div>
|
|
|
165 |
</li>
|
|
|
166 |
|
|
|
167 |
<li id='q8'>
|
|
|
168 |
<p><b>8.</b> <span class='question'>I try to display the Euro symbol but it doesn't work.</span></p>
|
|
|
169 |
The standard fonts have the Euro character at position 128. You can define a constant like this
|
|
|
170 |
for convenience:
|
|
|
171 |
<div class="doc-source">
|
|
|
172 |
<pre><code>define('EURO', chr(128));</code></pre>
|
|
|
173 |
</div>
|
|
|
174 |
</li>
|
|
|
175 |
|
|
|
176 |
<li id='q9'>
|
|
|
177 |
<p><b>9.</b> <span class='question'>I get the following error when I try to generate a PDF: Some data has already been output, can't send PDF file</span></p>
|
|
|
178 |
You must send nothing to the browser except the PDF itself: no HTML, no space, no carriage return. A common
|
|
|
179 |
case is having extra blank at the end of an included script file.<br>
|
|
|
180 |
If you can't figure out where the problem comes from, this other message appearing just before can help you:<br>
|
|
|
181 |
<br>
|
|
|
182 |
<b>Warning:</b> Cannot modify header information - headers already sent by (output started at script.php:X)<br>
|
|
|
183 |
<br>
|
|
|
184 |
It means that script.php outputs something at line X. Go to this line and fix it.
|
|
|
185 |
In case the message doesn't show, first check that you didn't disable warnings, then add this at the very
|
|
|
186 |
beginning of your script:
|
|
|
187 |
<div class="doc-source">
|
|
|
188 |
<pre><code>ob_end_clean();</code></pre>
|
|
|
189 |
</div>
|
|
|
190 |
If you still don't see it, disable zlib.output_compression in your php.ini and it should appear.
|
|
|
191 |
</li>
|
|
|
192 |
|
|
|
193 |
<li id='q10'>
|
|
|
194 |
<p><b>10.</b> <span class='question'>I draw a frame with very precise dimensions, but when printed I notice some differences.</span></p>
|
|
|
195 |
To respect dimensions, select "None" for the Page Scaling setting instead of "Shrink to Printable Area" in the print dialog box.
|
|
|
196 |
</li>
|
|
|
197 |
|
|
|
198 |
<li id='q11'>
|
|
|
199 |
<p><b>11.</b> <span class='question'>I'd like to use the whole surface of the page, but when printed I always have some margins. How can I get rid of them?</span></p>
|
|
|
200 |
Printers have physical margins (different depending on the models); it is therefore impossible to remove
|
|
|
201 |
them and print on the whole surface of the paper.
|
|
|
202 |
</li>
|
|
|
203 |
|
|
|
204 |
<li id='q12'>
|
|
|
205 |
<p><b>12.</b> <span class='question'>How can I put a background in my PDF?</span></p>
|
|
|
206 |
For a picture, call Image() in the Header() method, before any other output. To set a background color, use Rect().
|
|
|
207 |
</li>
|
|
|
208 |
|
|
|
209 |
<li id='q13'>
|
|
|
210 |
<p><b>13.</b> <span class='question'>How can I set a specific header or footer on the first page?</span></p>
|
|
|
211 |
Simply test the page number:
|
|
|
212 |
<div class="doc-source">
|
|
|
213 |
<pre><code>function Header()
|
|
|
214 |
{
|
|
|
215 |
if($this->PageNo()==1)
|
|
|
216 |
{
|
|
|
217 |
//First page
|
|
|
218 |
...
|
|
|
219 |
}
|
|
|
220 |
else
|
|
|
221 |
{
|
|
|
222 |
//Other pages
|
|
|
223 |
...
|
|
|
224 |
}
|
|
|
225 |
}</code></pre>
|
|
|
226 |
</div>
|
|
|
227 |
</li>
|
|
|
228 |
|
|
|
229 |
<li id='q14'>
|
|
|
230 |
<p><b>14.</b> <span class='question'>I'd like to use extensions provided by different scripts. How can I combine them?</span></p>
|
|
|
231 |
Use an inheritance chain. If you have two classes, say A in a.php:
|
|
|
232 |
<div class="doc-source">
|
|
|
233 |
<pre><code>require('fpdf.php');
|
|
|
234 |
|
|
|
235 |
class A extends FPDF
|
|
|
236 |
{
|
|
|
237 |
...
|
|
|
238 |
}</code></pre>
|
|
|
239 |
</div>
|
|
|
240 |
and B in b.php:
|
|
|
241 |
<div class="doc-source">
|
|
|
242 |
<pre><code>require('fpdf.php');
|
|
|
243 |
|
|
|
244 |
class B extends FPDF
|
|
|
245 |
{
|
|
|
246 |
...
|
|
|
247 |
}</code></pre>
|
|
|
248 |
</div>
|
|
|
249 |
then make B extend A:
|
|
|
250 |
<div class="doc-source">
|
|
|
251 |
<pre><code>require('a.php');
|
|
|
252 |
|
|
|
253 |
class B extends A
|
|
|
254 |
{
|
|
|
255 |
...
|
|
|
256 |
}</code></pre>
|
|
|
257 |
</div>
|
|
|
258 |
and make your own class extend B:
|
|
|
259 |
<div class="doc-source">
|
|
|
260 |
<pre><code>require('b.php');
|
|
|
261 |
|
|
|
262 |
class PDF extends B
|
|
|
263 |
{
|
|
|
264 |
...
|
|
|
265 |
}
|
|
|
266 |
|
|
|
267 |
$pdf = new PDF();</code></pre>
|
|
|
268 |
</div>
|
|
|
269 |
</li>
|
|
|
270 |
|
|
|
271 |
<li id='q15'>
|
|
|
272 |
<p><b>15.</b> <span class='question'>How can I send the PDF by email?</span></p>
|
|
|
273 |
As any other file, but an easy way is to use <a href="http://phpmailer.codeworxtech.com">PHPMailer</a> and
|
|
|
274 |
its in-memory attachment:
|
|
|
275 |
<div class="doc-source">
|
|
|
276 |
<pre><code>$mail = new PHPMailer();
|
|
|
277 |
...
|
|
|
278 |
$doc = $pdf->Output('', 'S');
|
|
|
279 |
$mail->AddStringAttachment($doc, 'doc.pdf', 'base64', 'application/pdf');
|
|
|
280 |
$mail->Send();</code></pre>
|
|
|
281 |
</div>
|
|
|
282 |
</li>
|
|
|
283 |
|
|
|
284 |
<li id='q16'>
|
|
|
285 |
<p><b>16.</b> <span class='question'>What's the limit of the file sizes I can generate with FPDF?</span></p>
|
|
|
286 |
There is no particular limit. There are some constraints, however:
|
|
|
287 |
<br>
|
|
|
288 |
<br>
|
|
|
289 |
- The maximum memory size allocated to PHP scripts is usually 8MB. For very big documents,
|
|
|
290 |
especially with images, this limit may be reached (the file being built into memory). The
|
|
|
291 |
parameter is configured in the php.ini file.
|
|
|
292 |
<br>
|
|
|
293 |
<br>
|
|
|
294 |
- The maximum execution time allocated defaults to 30 seconds. This limit can of course be easily
|
|
|
295 |
reached. It is configured in php.ini and may be altered dynamically with set_time_limit().
|
|
|
296 |
<br>
|
|
|
297 |
<br>
|
|
|
298 |
- Browsers generally have a 5 minute time-out. If you send the PDF directly to the browser and
|
|
|
299 |
reach the limit, it will be lost. It is therefore advised for very big documents to
|
|
|
300 |
generate them in a file, and to send some data to the browser from time to time (with a call
|
|
|
301 |
to flush() to force the output). When the document is finished, you can send a redirection to
|
|
|
302 |
it or create a link.
|
|
|
303 |
<br>
|
|
|
304 |
Remark: even if the browser times out, the script may continue to run on the server.
|
|
|
305 |
</li>
|
|
|
306 |
|
|
|
307 |
<li id='q17'>
|
|
|
308 |
<p><b>17.</b> <span class='question'>Can I modify a PDF with FPDF?</span></p>
|
|
|
309 |
It is possible to import pages from an existing PDF document thanks to the FPDI extension:<br>
|
|
|
310 |
<br>
|
|
|
311 |
<a href="http://www.setasign.de/products/pdf-php-solutions/fpdi/" target="_blank">http://www.setasign.de/products/pdf-php-solutions/fpdi/</a><br>
|
|
|
312 |
<br>
|
|
|
313 |
You can then add some content to them.
|
|
|
314 |
</li>
|
|
|
315 |
|
|
|
316 |
<li id='q18'>
|
|
|
317 |
<p><b>18.</b> <span class='question'>I'd like to make a search engine in PHP and index PDF files. Can I do it with FPDF?</span></p>
|
|
|
318 |
No. But a GPL C utility does exist, pdftotext, which is able to extract the textual content from
|
|
|
319 |
a PDF. It is provided with the Xpdf package:<br>
|
|
|
320 |
<br>
|
|
|
321 |
<a href="http://www.foolabs.com/xpdf/" target="_blank">http://www.foolabs.com/xpdf/</a>
|
|
|
322 |
</li>
|
|
|
323 |
|
|
|
324 |
<li id='q19'>
|
|
|
325 |
<p><b>19.</b> <span class='question'>Can I convert an HTML page to PDF with FPDF?</span></p>
|
|
|
326 |
Not real-world pages. But a GPL C utility does exist, htmldoc, which allows to do it and gives good results:<br>
|
|
|
327 |
<br>
|
|
|
328 |
<a href="http://www.htmldoc.org" target="_blank">http://www.htmldoc.org</a>
|
|
|
329 |
</li>
|
|
|
330 |
|
|
|
331 |
<li id='q20'>
|
|
|
332 |
<p><b>20.</b> <span class='question'>Can I concatenate PDF files with FPDF?</span></p>
|
|
|
333 |
Not directly, but it is possible to use <a href="http://www.setasign.de/products/pdf-php-solutions/fpdi/demos/concatenate-fake/" target="_blank">FPDI</a>
|
|
|
334 |
to perform this task. Some free command-line tools also exist:<br>
|
|
|
335 |
<br>
|
|
|
336 |
<a href="http://thierry.schmit.free.fr/spip/spip.php?article15&lang=en" target="_blank">mbtPdfAsm</a><br>
|
|
|
337 |
<a href="http://www.accesspdf.com/pdftk/" target="_blank">pdftk</a>
|
|
|
338 |
</li>
|
|
|
339 |
</ul>
|
|
|
340 |
</body>
|
|
|
341 |
</html>
|