Primer commit del sistema avantika sin cambios
This commit is contained in:
456
pdf/LICENSE.LGPL
Executable file
456
pdf/LICENSE.LGPL
Executable file
@@ -0,0 +1,456 @@
|
||||
GNU LESSER GENERAL PUBLIC LICENSE
|
||||
Version 2.1, February 1999
|
||||
|
||||
Copyright (C) 1991, 1999 Free Software Foundation, Inc.
|
||||
59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
Everyone is permitted to copy and distribute verbatim copies
|
||||
of this license document, but changing it is not allowed.
|
||||
|
||||
[This is the first released version of the Lesser GPL. It also counts
|
||||
as the successor of the GNU Library Public License, version 2, hence
|
||||
the version number 2.1.]
|
||||
|
||||
Preamble
|
||||
|
||||
The licenses for most software are designed to take away your
|
||||
freedom to share and change it. By contrast, the GNU General Public
|
||||
Licenses are intended to guarantee your freedom to share and change
|
||||
free software--to make sure the software is free for all its users.
|
||||
|
||||
This license, the Lesser General Public License, applies to some
|
||||
specially designated software packages--typically libraries--of the
|
||||
Free Software Foundation and other authors who decide to use it. You
|
||||
can use it too, but we suggest you first think carefully about whether
|
||||
this license or the ordinary General Public License is the better
|
||||
strategy to use in any particular case, based on the explanations below.
|
||||
|
||||
When we speak of free software, we are referring to freedom of use,
|
||||
not price. Our General Public Licenses are designed to make sure that
|
||||
you have the freedom to distribute copies of free software (and charge
|
||||
for this service if you wish); that you receive source code or can get
|
||||
it if you want it; that you can change the software and use pieces of
|
||||
it in new free programs; and that you are informed that you can do
|
||||
these things.
|
||||
|
||||
To protect your rights, we need to make restrictions that forbid
|
||||
distributors to deny you these rights or to ask you to surrender these
|
||||
rights. These restrictions translate to certain responsibilities for
|
||||
you if you distribute copies of the library or if you modify it.
|
||||
|
||||
For example, if you distribute copies of the library, whether gratis
|
||||
or for a fee, you must give the recipients all the rights that we gave
|
||||
you. You must make sure that they, too, receive or can get the source
|
||||
code. If you link other code with the library, you must provide
|
||||
complete object files to the recipients, so that they can relink them
|
||||
with the library after making changes to the library and recompiling
|
||||
it. And you must show them these terms so they know their rights.
|
||||
|
||||
We protect your rights with a two-step method: (1) we copyright the
|
||||
library, and (2) we offer you this license, which gives you legal
|
||||
permission to copy, distribute and/or modify the library.
|
||||
|
||||
To protect each distributor, we want to make it very clear that
|
||||
there is no warranty for the free library. Also, if the library is
|
||||
modified by someone else and passed on, the recipients should know
|
||||
that what they have is not the original version, so that the original
|
||||
author's reputation will not be affected by problems that might be
|
||||
introduced by others.
|
||||
|
||||
Finally, software patents pose a constant threat to the existence of
|
||||
any free program. We wish to make sure that a company cannot
|
||||
effectively restrict the users of a free program by obtaining a
|
||||
restrictive license from a patent holder. Therefore, we insist that
|
||||
any patent license obtained for a version of the library must be
|
||||
consistent with the full freedom of use specified in this license.
|
||||
|
||||
Most GNU software, including some libraries, is covered by the
|
||||
ordinary GNU General Public License. This license, the GNU Lesser
|
||||
General Public License, applies to certain designated libraries, and
|
||||
is quite different from the ordinary General Public License. We use
|
||||
this license for certain libraries in order to permit linking those
|
||||
libraries into non-free programs.
|
||||
|
||||
When a program is linked with a library, whether statically or using
|
||||
a shared library, the combination of the two is legally speaking a
|
||||
combined work, a derivative of the original library. The ordinary
|
||||
General Public License therefore permits such linking only if the
|
||||
entire combination fits its criteria of freedom. The Lesser General
|
||||
Public License permits more lax criteria for linking other code with
|
||||
the library.
|
||||
|
||||
We call this license the "Lesser" General Public License because it
|
||||
does Less to protect the user's freedom than the ordinary General
|
||||
Public License. It also provides other free software developers Less
|
||||
of an advantage over competing non-free programs. These disadvantages
|
||||
are the reason we use the ordinary General Public License for many
|
||||
libraries. However, the Lesser license provides advantages in certain
|
||||
special circumstances.
|
||||
|
||||
For example, on rare occasions, there may be a special need to
|
||||
encourage the widest possible use of a certain library, so that it becomes
|
||||
a de-facto standard. To achieve this, non-free programs must be
|
||||
allowed to use the library. A more frequent case is that a free
|
||||
library does the same job as widely used non-free libraries. In this
|
||||
case, there is little to gain by limiting the free library to free
|
||||
software only, so we use the Lesser General Public License.
|
||||
|
||||
In other cases, permission to use a particular library in non-free
|
||||
programs enables a greater number of people to use a large body of
|
||||
free software. For example, permission to use the GNU C Library in
|
||||
non-free programs enables many more people to use the whole GNU
|
||||
operating system, as well as its variant, the GNU/Linux operating
|
||||
system.
|
||||
|
||||
Although the Lesser General Public License is Less protective of the
|
||||
users' freedom, it does ensure that the user of a program that is
|
||||
linked with the Library has the freedom and the wherewithal to run
|
||||
that program using a modified version of the Library.
|
||||
|
||||
The precise terms and conditions for copying, distribution and
|
||||
modification follow. Pay close attention to the difference between a
|
||||
"work based on the library" and a "work that uses the library". The
|
||||
former contains code derived from the library, whereas the latter must
|
||||
be combined with the library in order to run.
|
||||
|
||||
GNU LESSER GENERAL PUBLIC LICENSE
|
||||
TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
|
||||
|
||||
0. This License Agreement applies to any software library or other
|
||||
program which contains a notice placed by the copyright holder or
|
||||
other authorized party saying it may be distributed under the terms of
|
||||
this Lesser General Public License (also called "this License").
|
||||
Each licensee is addressed as "you".
|
||||
|
||||
A "library" means a collection of software functions and/or data
|
||||
prepared so as to be conveniently linked with application programs
|
||||
(which use some of those functions and data) to form executables.
|
||||
|
||||
The "Library", below, refers to any such software library or work
|
||||
which has been distributed under these terms. A "work based on the
|
||||
Library" means either the Library or any derivative work under
|
||||
copyright law: that is to say, a work containing the Library or a
|
||||
portion of it, either verbatim or with modifications and/or translated
|
||||
straightforwardly into another language. (Hereinafter, translation is
|
||||
included without limitation in the term "modification".)
|
||||
|
||||
"Source code" for a work means the preferred form of the work for
|
||||
making modifications to it. For a library, complete source code means
|
||||
all the source code for all modules it contains, plus any associated
|
||||
interface definition files, plus the scripts used to control compilation
|
||||
and installation of the library.
|
||||
|
||||
Activities other than copying, distribution and modification are not
|
||||
covered by this License; they are outside its scope. The act of
|
||||
running a program using the Library is not restricted, and output from
|
||||
such a program is covered only if its contents constitute a work based
|
||||
on the Library (independent of the use of the Library in a tool for
|
||||
writing it). Whether that is true depends on what the Library does
|
||||
and what the program that uses the Library does.
|
||||
|
||||
1. You may copy and distribute verbatim copies of the Library's
|
||||
complete source code as you receive it, in any medium, provided that
|
||||
you conspicuously and appropriately publish on each copy an
|
||||
appropriate copyright notice and disclaimer of warranty; keep intact
|
||||
all the notices that refer to this License and to the absence of any
|
||||
warranty; and distribute a copy of this License along with the
|
||||
Library.
|
||||
|
||||
You may charge a fee for the physical act of transferring a copy,
|
||||
and you may at your option offer warranty protection in exchange for a
|
||||
fee.
|
||||
|
||||
2. You may modify your copy or copies of the Library or any portion
|
||||
of it, thus forming a work based on the Library, and copy and
|
||||
distribute such modifications or work under the terms of Section 1
|
||||
above, provided that you also meet all of these conditions:
|
||||
|
||||
a) The modified work must itself be a software library.
|
||||
|
||||
b) You must cause the files modified to carry prominent notices
|
||||
stating that you changed the files and the date of any change.
|
||||
|
||||
c) You must cause the whole of the work to be licensed at no
|
||||
charge to all third parties under the terms of this License.
|
||||
|
||||
d) If a facility in the modified Library refers to a function or a
|
||||
table of data to be supplied by an application program that uses
|
||||
the facility, other than as an argument passed when the facility
|
||||
is invoked, then you must make a good faith effort to ensure that,
|
||||
in the event an application does not supply such function or
|
||||
table, the facility still operates, and performs whatever part of
|
||||
its purpose remains meaningful.
|
||||
|
||||
(For example, a function in a library to compute square roots has
|
||||
a purpose that is entirely well-defined independent of the
|
||||
application. Therefore, Subsection 2d requires that any
|
||||
application-supplied function or table used by this function must
|
||||
be optional: if the application does not supply it, the square
|
||||
root function must still compute square roots.)
|
||||
|
||||
These requirements apply to the modified work as a whole. If
|
||||
identifiable sections of that work are not derived from the Library,
|
||||
and can be reasonably considered independent and separate works in
|
||||
themselves, then this License, and its terms, do not apply to those
|
||||
sections when you distribute them as separate works. But when you
|
||||
distribute the same sections as part of a whole which is a work based
|
||||
on the Library, the distribution of the whole must be on the terms of
|
||||
this License, whose permissions for other licensees extend to the
|
||||
entire whole, and thus to each and every part regardless of who wrote
|
||||
it.
|
||||
|
||||
Thus, it is not the intent of this section to claim rights or contest
|
||||
your rights to work written entirely by you; rather, the intent is to
|
||||
exercise the right to control the distribution of derivative or
|
||||
collective works based on the Library.
|
||||
|
||||
In addition, mere aggregation of another work not based on the Library
|
||||
with the Library (or with a work based on the Library) on a volume of
|
||||
a storage or distribution medium does not bring the other work under
|
||||
the scope of this License.
|
||||
|
||||
3. You may opt to apply the terms of the ordinary GNU General Public
|
||||
License instead of this License to a given copy of the Library. To do
|
||||
this, you must alter all the notices that refer to this License, so
|
||||
that they refer to the ordinary GNU General Public License, version 2,
|
||||
instead of to this License. (If a newer version than version 2 of the
|
||||
ordinary GNU General Public License has appeared, then you can specify
|
||||
that version instead if you wish.) Do not make any other change in
|
||||
these notices.
|
||||
|
||||
Once this change is made in a given copy, it is irreversible for
|
||||
that copy, so the ordinary GNU General Public License applies to all
|
||||
subsequent copies and derivative works made from that copy.
|
||||
|
||||
This option is useful when you wish to copy part of the code of
|
||||
the Library into a program that is not a library.
|
||||
|
||||
4. You may copy and distribute the Library (or a portion or
|
||||
derivative of it, under Section 2) in object code or executable form
|
||||
under the terms of Sections 1 and 2 above provided that you accompany
|
||||
it with the complete corresponding machine-readable source code, which
|
||||
must be distributed under the terms of Sections 1 and 2 above on a
|
||||
medium customarily used for software interchange.
|
||||
|
||||
If distribution of object code is made by offering access to copy
|
||||
from a designated place, then offering equivalent access to copy the
|
||||
source code from the same place satisfies the requirement to
|
||||
distribute the source code, even though third parties are not
|
||||
compelled to copy the source along with the object code.
|
||||
|
||||
5. A program that contains no derivative of any portion of the
|
||||
Library, but is designed to work with the Library by being compiled or
|
||||
linked with it, is called a "work that uses the Library". Such a
|
||||
work, in isolation, is not a derivative work of the Library, and
|
||||
therefore falls outside the scope of this License.
|
||||
|
||||
However, linking a "work that uses the Library" with the Library
|
||||
creates an executable that is a derivative of the Library (because it
|
||||
contains portions of the Library), rather than a "work that uses the
|
||||
library". The executable is therefore covered by this License.
|
||||
Section 6 states terms for distribution of such executables.
|
||||
|
||||
When a "work that uses the Library" uses material from a header file
|
||||
that is part of the Library, the object code for the work may be a
|
||||
derivative work of the Library even though the source code is not.
|
||||
Whether this is true is especially significant if the work can be
|
||||
linked without the Library, or if the work is itself a library. The
|
||||
threshold for this to be true is not precisely defined by law.
|
||||
|
||||
If such an object file uses only numerical parameters, data
|
||||
structure layouts and accessors, and small macros and small inline
|
||||
functions (ten lines or less in length), then the use of the object
|
||||
file is unrestricted, regardless of whether it is legally a derivative
|
||||
work. (Executables containing this object code plus portions of the
|
||||
Library will still fall under Section 6.)
|
||||
|
||||
Otherwise, if the work is a derivative of the Library, you may
|
||||
distribute the object code for the work under the terms of Section 6.
|
||||
Any executables containing that work also fall under Section 6,
|
||||
whether or not they are linked directly with the Library itself.
|
||||
|
||||
6. As an exception to the Sections above, you may also combine or
|
||||
link a "work that uses the Library" with the Library to produce a
|
||||
work containing portions of the Library, and distribute that work
|
||||
under terms of your choice, provided that the terms permit
|
||||
modification of the work for the customer's own use and reverse
|
||||
engineering for debugging such modifications.
|
||||
|
||||
You must give prominent notice with each copy of the work that the
|
||||
Library is used in it and that the Library and its use are covered by
|
||||
this License. You must supply a copy of this License. If the work
|
||||
during execution displays copyright notices, you must include the
|
||||
copyright notice for the Library among them, as well as a reference
|
||||
directing the user to the copy of this License. Also, you must do one
|
||||
of these things:
|
||||
|
||||
a) Accompany the work with the complete corresponding
|
||||
machine-readable source code for the Library including whatever
|
||||
changes were used in the work (which must be distributed under
|
||||
Sections 1 and 2 above); and, if the work is an executable linked
|
||||
with the Library, with the complete machine-readable "work that
|
||||
uses the Library", as object code and/or source code, so that the
|
||||
user can modify the Library and then relink to produce a modified
|
||||
executable containing the modified Library. (It is understood
|
||||
that the user who changes the contents of definitions files in the
|
||||
Library will not necessarily be able to recompile the application
|
||||
to use the modified definitions.)
|
||||
|
||||
b) Use a suitable shared library mechanism for linking with the
|
||||
Library. A suitable mechanism is one that (1) uses at run time a
|
||||
copy of the library already present on the user's computer system,
|
||||
rather than copying library functions into the executable, and (2)
|
||||
will operate properly with a modified version of the library, if
|
||||
the user installs one, as long as the modified version is
|
||||
interface-compatible with the version that the work was made with.
|
||||
|
||||
c) Accompany the work with a written offer, valid for at
|
||||
least three years, to give the same user the materials
|
||||
specified in Subsection 6a, above, for a charge no more
|
||||
than the cost of performing this distribution.
|
||||
|
||||
d) If distribution of the work is made by offering access to copy
|
||||
from a designated place, offer equivalent access to copy the above
|
||||
specified materials from the same place.
|
||||
|
||||
e) Verify that the user has already received a copy of these
|
||||
materials or that you have already sent this user a copy.
|
||||
|
||||
For an executable, the required form of the "work that uses the
|
||||
Library" must include any data and utility programs needed for
|
||||
reproducing the executable from it. However, as a special exception,
|
||||
the materials to be distributed need not include anything that is
|
||||
normally distributed (in either source or binary form) with the major
|
||||
components (compiler, kernel, and so on) of the operating system on
|
||||
which the executable runs, unless that component itself accompanies
|
||||
the executable.
|
||||
|
||||
It may happen that this requirement contradicts the license
|
||||
restrictions of other proprietary libraries that do not normally
|
||||
accompany the operating system. Such a contradiction means you cannot
|
||||
use both them and the Library together in an executable that you
|
||||
distribute.
|
||||
|
||||
7. You may place library facilities that are a work based on the
|
||||
Library side-by-side in a single library together with other library
|
||||
facilities not covered by this License, and distribute such a combined
|
||||
library, provided that the separate distribution of the work based on
|
||||
the Library and of the other library facilities is otherwise
|
||||
permitted, and provided that you do these two things:
|
||||
|
||||
a) Accompany the combined library with a copy of the same work
|
||||
based on the Library, uncombined with any other library
|
||||
facilities. This must be distributed under the terms of the
|
||||
Sections above.
|
||||
|
||||
b) Give prominent notice with the combined library of the fact
|
||||
that part of it is a work based on the Library, and explaining
|
||||
where to find the accompanying uncombined form of the same work.
|
||||
|
||||
8. You may not copy, modify, sublicense, link with, or distribute
|
||||
the Library except as expressly provided under this License. Any
|
||||
attempt otherwise to copy, modify, sublicense, link with, or
|
||||
distribute the Library is void, and will automatically terminate your
|
||||
rights under this License. However, parties who have received copies,
|
||||
or rights, from you under this License will not have their licenses
|
||||
terminated so long as such parties remain in full compliance.
|
||||
|
||||
9. You are not required to accept this License, since you have not
|
||||
signed it. However, nothing else grants you permission to modify or
|
||||
distribute the Library or its derivative works. These actions are
|
||||
prohibited by law if you do not accept this License. Therefore, by
|
||||
modifying or distributing the Library (or any work based on the
|
||||
Library), you indicate your acceptance of this License to do so, and
|
||||
all its terms and conditions for copying, distributing or modifying
|
||||
the Library or works based on it.
|
||||
|
||||
10. Each time you redistribute the Library (or any work based on the
|
||||
Library), the recipient automatically receives a license from the
|
||||
original licensor to copy, distribute, link with or modify the Library
|
||||
subject to these terms and conditions. You may not impose any further
|
||||
restrictions on the recipients' exercise of the rights granted herein.
|
||||
You are not responsible for enforcing compliance by third parties with
|
||||
this License.
|
||||
|
||||
11. If, as a consequence of a court judgment or allegation of patent
|
||||
infringement or for any other reason (not limited to patent issues),
|
||||
conditions are imposed on you (whether by court order, agreement or
|
||||
otherwise) that contradict the conditions of this License, they do not
|
||||
excuse you from the conditions of this License. If you cannot
|
||||
distribute so as to satisfy simultaneously your obligations under this
|
||||
License and any other pertinent obligations, then as a consequence you
|
||||
may not distribute the Library at all. For example, if a patent
|
||||
license would not permit royalty-free redistribution of the Library by
|
||||
all those who receive copies directly or indirectly through you, then
|
||||
the only way you could satisfy both it and this License would be to
|
||||
refrain entirely from distribution of the Library.
|
||||
|
||||
If any portion of this section is held invalid or unenforceable under any
|
||||
particular circumstance, the balance of the section is intended to apply,
|
||||
and the section as a whole is intended to apply in other circumstances.
|
||||
|
||||
It is not the purpose of this section to induce you to infringe any
|
||||
patents or other property right claims or to contest validity of any
|
||||
such claims; this section has the sole purpose of protecting the
|
||||
integrity of the free software distribution system which is
|
||||
implemented by public license practices. Many people have made
|
||||
generous contributions to the wide range of software distributed
|
||||
through that system in reliance on consistent application of that
|
||||
system; it is up to the author/donor to decide if he or she is willing
|
||||
to distribute software through any other system and a licensee cannot
|
||||
impose that choice.
|
||||
|
||||
This section is intended to make thoroughly clear what is believed to
|
||||
be a consequence of the rest of this License.
|
||||
|
||||
12. If the distribution and/or use of the Library is restricted in
|
||||
certain countries either by patents or by copyrighted interfaces, the
|
||||
original copyright holder who places the Library under this License may add
|
||||
an explicit geographical distribution limitation excluding those countries,
|
||||
so that distribution is permitted only in or among countries not thus
|
||||
excluded. In such case, this License incorporates the limitation as if
|
||||
written in the body of this License.
|
||||
|
||||
13. The Free Software Foundation may publish revised and/or new
|
||||
versions of the Lesser General Public License from time to time.
|
||||
Such new versions will be similar in spirit to the present version,
|
||||
but may differ in detail to address new problems or concerns.
|
||||
|
||||
Each version is given a distinguishing version number. If the Library
|
||||
specifies a version number of this License which applies to it and
|
||||
"any later version", you have the option of following the terms and
|
||||
conditions either of that version or of any later version published by
|
||||
the Free Software Foundation. If the Library does not specify a
|
||||
license version number, you may choose any version ever published by
|
||||
the Free Software Foundation.
|
||||
|
||||
14. If you wish to incorporate parts of the Library into other free
|
||||
programs whose distribution conditions are incompatible with these,
|
||||
write to the author to ask for permission. For software which is
|
||||
copyrighted by the Free Software Foundation, write to the Free
|
||||
Software Foundation; we sometimes make exceptions for this. Our
|
||||
decision will be guided by the two goals of preserving the free status
|
||||
of all derivatives of our free software and of promoting the sharing
|
||||
and reuse of software generally.
|
||||
|
||||
NO WARRANTY
|
||||
|
||||
15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
|
||||
WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
|
||||
EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
|
||||
OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
|
||||
KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
|
||||
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
|
||||
LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
|
||||
THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
|
||||
|
||||
16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
|
||||
WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
|
||||
AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
|
||||
FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
|
||||
CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
|
||||
LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
|
||||
RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
|
||||
FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
|
||||
SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
|
||||
DAMAGES.
|
||||
16
pdf/_notes/dwsync.xml
Executable file
16
pdf/_notes/dwsync.xml
Executable file
@@ -0,0 +1,16 @@
|
||||
<?xml version="1.0" encoding="utf-8" ?>
|
||||
<dwsync>
|
||||
<file name="fpdf.css" server="trazzos.com" local="128609714900000000" remote="129066048000000000" />
|
||||
<file name="fpdf.php" server="trazzos.com" local="128622547680000000" remote="129066048000000000" />
|
||||
<file name="trazzos-logo.jpg" server="trazzos.com" local="129030910753437504" remote="129068945400000000" />
|
||||
<file name="trazzos-logo.png" server="trazzos.com" local="129068947671757808" remote="129068947800000000" />
|
||||
<file name="facturabg.jpg" server="trazzos.com" local="129079036989609376" remote="129079039200000000" />
|
||||
<file name="facturabg.png" server="trazzos.com" local="129079048716789593" remote="129079048800000000" />
|
||||
<file name="facturabg.jpg" server="trazzos.com/public_html/newcbta/" local="129079036989609376" remote="129156950400000000" />
|
||||
<file name="facturabg.png" server="trazzos.com/public_html/newcbta/" local="129079048716789593" remote="129156950400000000" />
|
||||
<file name="fpdf.css" server="trazzos.com/public_html/newcbta/" local="128609714900000000" remote="129156951000000000" />
|
||||
<file name="fpdf.php" server="trazzos.com/public_html/newcbta/" local="129156988475869009" remote="129156988200000000" />
|
||||
<file name="trazzos-logo.jpg" server="trazzos.com/public_html/newcbta/" local="129030910753437504" remote="129156951000000000" />
|
||||
<file name="trazzos-logo.png" server="trazzos.com/public_html/newcbta/" local="129068947671757808" remote="129156951000000000" />
|
||||
<file name="reporte.php" server="prana.mx" local="129253488020256228" remote="129253488000000000" />
|
||||
</dwsync>
|
||||
328
pdf/dompdf.php
Executable file
328
pdf/dompdf.php
Executable file
@@ -0,0 +1,328 @@
|
||||
<?php
|
||||
/**
|
||||
* DOMPDF - PHP5 HTML to PDF renderer
|
||||
*
|
||||
* File: $RCSfile: dompdf.php,v $
|
||||
* Created on: 2004-06-22
|
||||
*
|
||||
* Copyright (c) 2004 - Benj Carson <benjcarson@digitaljunkies.ca>
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with this library in the file LICENSE.LGPL; if not, write to the
|
||||
* Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
* 02111-1307 USA
|
||||
*
|
||||
* Alternatively, you may distribute this software under the terms of the
|
||||
* PHP License, version 3.0 or later. A copy of this license should have
|
||||
* been distributed with this file in the file LICENSE.PHP . If this is not
|
||||
* the case, you can obtain a copy at http://www.php.net/license/3_0.txt.
|
||||
*
|
||||
* The latest version of DOMPDF might be available at:
|
||||
* http://www.dompdf.com/
|
||||
*
|
||||
* dompdf.php is a simple script to drive DOMPDF. It can be executed from
|
||||
* a browser or from the command line.
|
||||
*
|
||||
* @link http://www.dompdf.com/
|
||||
* @copyright 2004 Benj Carson
|
||||
* @author Benj Carson <benjcarson@digitaljunkies.ca>
|
||||
* @package dompdf
|
||||
|
||||
*/
|
||||
|
||||
/* $Id: dompdf.php 301 2010-08-23 21:00:51Z fabien.menager $ */
|
||||
|
||||
/**
|
||||
* Display command line usage:
|
||||
*
|
||||
* Usage: ./dompdf.php [options] html_file
|
||||
*
|
||||
* html_file can be a filename, a url if fopen_wrappers are enabled, or the '-'
|
||||
* character to read from standard input.
|
||||
*
|
||||
* Options:
|
||||
* -h Show this message
|
||||
* -l list available paper sizes
|
||||
* -p size paper size; something like 'letter', 'A4', 'legal', etc. The default is
|
||||
* 'letter'
|
||||
* -o orientation either 'portrait' or 'landscape'. Default is 'portrait'.
|
||||
* -b path set the 'document root' of the html_file. Relative urls (for
|
||||
* stylesheets) are resolved using this directory. Default is the
|
||||
* directory of html_file.
|
||||
* -f file the output filename. Default is the input [html_file].pdf.
|
||||
* -v verbose: display html parsing warnings and file not found errors.
|
||||
* -d very verbose: display oodles of debugging output: every frame in the
|
||||
* tree is printed to stdout.
|
||||
* -t comma separated list of debugging types (page-break,reflow,split)
|
||||
* -r write the render time to the log file
|
||||
*
|
||||
*
|
||||
*/
|
||||
function dompdf_usage() {
|
||||
echo
|
||||
"\nUsage: {$_SERVER["argv"][0]} [options] html_file\n\n".
|
||||
"html_file can be a filename, a url if fopen_wrappers are enabled, or the '-' \n".
|
||||
"character to read from standard input.\n\n".
|
||||
"Options:\n".
|
||||
" -h\t\tShow this message\n".
|
||||
" -l\t\tlist available paper sizes\n".
|
||||
" -p size\tpaper size; something like 'letter', 'A4', 'legal', etc. The default is\n".
|
||||
" \t\t'" . DOMPDF_DEFAULT_PAPER_SIZE . "'\n".
|
||||
" -o orientation\teither 'portrait' or 'landscape'. Default is 'portrait'.\n".
|
||||
" -b path\tset the 'document root' of the html_file. Relative urls (for \n".
|
||||
" \tstylesheets) are resolved using this directory. Default is the \n".
|
||||
" \tdirectory of html_file.\n".
|
||||
" -f file\tthe output filename. Default is the input [html_file].pdf.\n".
|
||||
" -v \tverbose: display html parsing warnings and file not found errors.\n".
|
||||
" -d \tvery verbose: display oodles of debugging output: every frame\n".
|
||||
" \tin the tree printed to stdout.\n".
|
||||
" -t comma separated list of debugging types (page-break,reflow,split)\n\n";
|
||||
}
|
||||
|
||||
function getoptions() {
|
||||
|
||||
$opts = array();
|
||||
|
||||
if ( $_SERVER["argc"] == 1 )
|
||||
return $opts;
|
||||
|
||||
$i = 1;
|
||||
while ($i < $_SERVER["argc"]) {
|
||||
|
||||
switch ($_SERVER["argv"][$i]) {
|
||||
|
||||
case "--help":
|
||||
case "-h":
|
||||
$opts["h"] = true;
|
||||
$i++;
|
||||
break;
|
||||
|
||||
case "-l":
|
||||
$opts["l"] = true;
|
||||
$i++;
|
||||
break;
|
||||
|
||||
case "-p":
|
||||
if ( !isset($_SERVER["argv"][$i+1]) )
|
||||
die("-p switch requires a size parameter\n");
|
||||
$opts["p"] = $_SERVER["argv"][$i+1];
|
||||
$i += 2;
|
||||
break;
|
||||
|
||||
case "-o":
|
||||
if ( !isset($_SERVER["argv"][$i+1]) )
|
||||
die("-o switch requires an orientation parameter\n");
|
||||
$opts["o"] = $_SERVER["argv"][$i+1];
|
||||
$i += 2;
|
||||
break;
|
||||
|
||||
case "-b":
|
||||
if ( !isset($_SERVER["argv"][$i+1]) )
|
||||
die("-b switch requires a path parameter\n");
|
||||
$opts["b"] = $_SERVER["argv"][$i+1];
|
||||
$i += 2;
|
||||
break;
|
||||
|
||||
case "-f":
|
||||
if ( !isset($_SERVER["argv"][$i+1]) )
|
||||
die("-f switch requires a filename parameter\n");
|
||||
$opts["f"] = $_SERVER["argv"][$i+1];
|
||||
$i += 2;
|
||||
break;
|
||||
|
||||
case "-v":
|
||||
$opts["v"] = true;
|
||||
$i++;
|
||||
break;
|
||||
|
||||
case "-d":
|
||||
$opts["d"] = true;
|
||||
$i++;
|
||||
break;
|
||||
|
||||
case "-t":
|
||||
if ( !isset($_SERVER['argv'][$i + 1]) )
|
||||
die("-t switch requires a comma separated list of types\n");
|
||||
$opts["t"] = $_SERVER['argv'][$i+1];
|
||||
$i += 2;
|
||||
break;
|
||||
|
||||
default:
|
||||
$opts["filename"] = $_SERVER["argv"][$i];
|
||||
$i++;
|
||||
break;
|
||||
}
|
||||
|
||||
}
|
||||
return $opts;
|
||||
}
|
||||
|
||||
require_once("dompdf_config.inc.php");
|
||||
global $_dompdf_show_warnings, $_dompdf_debug, $_DOMPDF_DEBUG_TYPES;
|
||||
|
||||
$sapi = php_sapi_name();
|
||||
$options = array();
|
||||
|
||||
switch ( $sapi ) {
|
||||
|
||||
case "cli":
|
||||
|
||||
$opts = getoptions();
|
||||
|
||||
if ( isset($opts["h"]) || (!isset($opts["filename"]) && !isset($opts["l"])) ) {
|
||||
dompdf_usage();
|
||||
exit;
|
||||
}
|
||||
|
||||
if ( isset($opts["l"]) ) {
|
||||
echo "\nUnderstood paper sizes:\n";
|
||||
|
||||
foreach (array_keys(CPDF_Adapter::$PAPER_SIZES) as $size)
|
||||
echo " " . mb_strtoupper($size) . "\n";
|
||||
exit;
|
||||
}
|
||||
$file = $opts["filename"];
|
||||
|
||||
if ( isset($opts["p"]) )
|
||||
$paper = $opts["p"];
|
||||
else
|
||||
$paper = DOMPDF_DEFAULT_PAPER_SIZE;
|
||||
|
||||
if ( isset($opts["o"]) )
|
||||
$orientation = $opts["o"];
|
||||
else
|
||||
$orientation = "portrait";
|
||||
|
||||
if ( isset($opts["b"]) )
|
||||
$base_path = $opts["b"];
|
||||
|
||||
if ( isset($opts["f"]) )
|
||||
$outfile = $opts["f"];
|
||||
else {
|
||||
if ( $file === "-" )
|
||||
$outfile = "dompdf_out.pdf";
|
||||
else
|
||||
$outfile = str_ireplace(array(".html", ".htm", ".php"), "", $file) . ".pdf";
|
||||
}
|
||||
|
||||
if ( isset($opts["v"]) )
|
||||
$_dompdf_show_warnings = true;
|
||||
|
||||
if ( isset($opts["d"]) ) {
|
||||
$_dompdf_show_warnings = true;
|
||||
$_dompdf_debug = true;
|
||||
}
|
||||
|
||||
if ( isset($opts['t']) ) {
|
||||
$arr = split(',',$opts['t']);
|
||||
$types = array();
|
||||
foreach ($arr as $type)
|
||||
$types[ trim($type) ] = 1;
|
||||
$_DOMPDF_DEBUG_TYPES = $types;
|
||||
}
|
||||
|
||||
$save_file = true;
|
||||
|
||||
break;
|
||||
|
||||
default:
|
||||
|
||||
if ( isset($_GET["input_file"]) )
|
||||
$file = rawurldecode($_GET["input_file"]);
|
||||
else
|
||||
throw new DOMPDF_Exception("An input file is required (i.e. input_file _GET variable).");
|
||||
|
||||
if ( isset($_GET["paper"]) )
|
||||
$paper = rawurldecode($_GET["paper"]);
|
||||
else
|
||||
$paper = DOMPDF_DEFAULT_PAPER_SIZE;
|
||||
|
||||
if ( isset($_GET["orientation"]) )
|
||||
$orientation = rawurldecode($_GET["orientation"]);
|
||||
else
|
||||
$orientation = "portrait";
|
||||
|
||||
if ( isset($_GET["base_path"]) ) {
|
||||
$base_path = rawurldecode($_GET["base_path"]);
|
||||
$file = $base_path . $file; # Set the input file
|
||||
}
|
||||
|
||||
if ( isset($_GET["options"]) ) {
|
||||
$options = $_GET["options"];
|
||||
}
|
||||
|
||||
$file_parts = explode_url($file);
|
||||
/* Check to see if the input file is local and, if so, that the base path falls within that specified by DOMDPF_CHROOT */
|
||||
if(($file_parts['protocol'] == '' || $file_parts['protocol'] === 'file://')) {
|
||||
$file = realpath($file);
|
||||
if (strpos($file, DOMPDF_CHROOT) !== 0) {
|
||||
throw new DOMPDF_Exception("Permission denied on $file.");
|
||||
}
|
||||
}
|
||||
|
||||
$outfile = "dompdf_out.pdf"; # Don't allow them to set the output file
|
||||
$save_file = false; # Don't save the file
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
$dompdf = new DOMPDF();
|
||||
|
||||
if ( $file === "-" ) {
|
||||
$str = "";
|
||||
while ( !feof(STDIN) )
|
||||
$str .= fread(STDIN, 4096);
|
||||
|
||||
$dompdf->load_html($str);
|
||||
|
||||
} else
|
||||
$dompdf->load_html_file($file);
|
||||
|
||||
if ( isset($base_path) ) {
|
||||
$dompdf->set_base_path($base_path);
|
||||
}
|
||||
|
||||
$dompdf->set_paper($paper, $orientation);
|
||||
|
||||
$dompdf->render();
|
||||
|
||||
if ( $_dompdf_show_warnings ) {
|
||||
global $_dompdf_warnings;
|
||||
foreach ($_dompdf_warnings as $msg)
|
||||
echo $msg . "\n";
|
||||
echo $dompdf->get_canvas()->get_cpdf()->messages;
|
||||
flush();
|
||||
}
|
||||
|
||||
if ( $save_file ) {
|
||||
// if ( !is_writable($outfile) )
|
||||
// throw new DOMPDF_Exception("'$outfile' is not writable.");
|
||||
if ( strtolower(DOMPDF_PDF_BACKEND) === "gd" )
|
||||
$outfile = str_replace(".pdf", ".png", $outfile);
|
||||
|
||||
list($proto, $host, $path, $file) = explode_url($outfile);
|
||||
if ( $proto != "" ) // i.e. not file://
|
||||
$outfile = $file; // just save it locally, FIXME? could save it like wget: ./host/basepath/file
|
||||
|
||||
$outfile = realpath(dirname($outfile)) . DIRECTORY_SEPARATOR . basename($outfile);
|
||||
|
||||
if ( strpos($outfile, DOMPDF_CHROOT) !== 0 )
|
||||
throw new DOMPDF_Exception("Permission denied.");
|
||||
|
||||
file_put_contents($outfile, $dompdf->output( array("compress" => 0) ));
|
||||
exit(0);
|
||||
}
|
||||
|
||||
if ( !headers_sent() ) {
|
||||
$dompdf->stream($outfile, $options);
|
||||
}
|
||||
24
pdf/dompdf_config.custom.inc.php
Executable file
24
pdf/dompdf_config.custom.inc.php
Executable file
@@ -0,0 +1,24 @@
|
||||
<?php
|
||||
//define("DOMPDF_TEMP_DIR", "/tmp");
|
||||
//define("DOMPDF_CHROOT", DOMPDF_DIR);
|
||||
//define("DOMPDF_UNICODE_ENABLED", false);
|
||||
//define("TTF2AFM", "C:/Program Files (x86)/GnuWin32/bin/ttf2pt1.exe");
|
||||
//define("DOMPDF_PDF_BACKEND", "PDFLib");
|
||||
//define("DOMPDF_DEFAULT_MEDIA_TYPE", "print");
|
||||
//define("DOMPDF_DEFAULT_PAPER_SIZE", "letter");
|
||||
//define("DOMPDF_DEFAULT_FONT", "serif");
|
||||
//define("DOMPDF_DPI", 72);
|
||||
//define("DOMPDF_ENABLE_PHP", true);
|
||||
//define("DOMPDF_ENABLE_REMOTE", true);
|
||||
//define("DOMPDF_ENABLE_CSS_FLOAT", true);
|
||||
//define("DOMPDF_ENABLE_JAVASCRIPT", false);
|
||||
//define("DEBUGPNG", true);
|
||||
//define("DEBUGKEEPTEMP", true);
|
||||
//define("DEBUGCSS", true);
|
||||
//define("DEBUG_LAYOUT", true);
|
||||
//define("DEBUG_LAYOUT_LINES", false);
|
||||
//define("DEBUG_LAYOUT_BLOCKS", false);
|
||||
//define("DEBUG_LAYOUT_INLINE", false);
|
||||
//define("DOMPDF_FONT_HEIGHT_RATIO", 1.0);
|
||||
//define("DEBUG_LAYOUT_PADDINGBOX", false);
|
||||
//define("DOMPDF_LOG_OUTPUT_FILE", DOMPDF_FONT_DIR."log.htm");
|
||||
497
pdf/dompdf_config.inc.php
Executable file
497
pdf/dompdf_config.inc.php
Executable file
@@ -0,0 +1,497 @@
|
||||
<?php
|
||||
/**
|
||||
* DOMPDF - PHP5 HTML to PDF renderer
|
||||
*
|
||||
* File: $RCSfile: dompdf_config.inc.php,v $
|
||||
* Created on: 2004-08-04
|
||||
*
|
||||
* Copyright (c) 2004 - Benj Carson <benjcarson@digitaljunkies.ca>
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with this library in the file LICENSE.LGPL; if not, write to the
|
||||
* Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
* 02111-1307 USA
|
||||
*
|
||||
* Alternatively, you may distribute this software under the terms of the
|
||||
* PHP License, version 3.0 or later. A copy of this license should have
|
||||
* been distributed with this file in the file LICENSE.PHP . If this is not
|
||||
* the case, you can obtain a copy at http://www.php.net/license/3_0.txt.
|
||||
*
|
||||
* The latest version of DOMPDF might be available at:
|
||||
* http://www.dompdf.com/
|
||||
*
|
||||
* @link http://www.dompdf.com/
|
||||
* @copyright 2004 Benj Carson
|
||||
* @author Benj Carson <benjcarson@digitaljunkies.ca>
|
||||
* @contributor Helmut Tischer <htischer@weihenstephan.org>
|
||||
* @package dompdf
|
||||
*
|
||||
* Changes
|
||||
* @contributor Helmut Tischer <htischer@weihenstephan.org>
|
||||
* @version 0.5.1.htischer.20090507
|
||||
* - Allow overriding of configuration settings by calling php script.
|
||||
* This allows replacing of dompdf by a new version in an application
|
||||
* without any modification,
|
||||
* - Optionally separate font cache folder from font folder.
|
||||
* This allows write protecting the entire installation
|
||||
* - Add settings to enable/disable additional debug output categories
|
||||
* - Change some defaults to more practical values
|
||||
* - Add comments about configuration parameter implications
|
||||
*/
|
||||
|
||||
/* $Id: dompdf_config.inc.php 363 2011-02-17 21:18:25Z fabien.menager $ */
|
||||
|
||||
//error_reporting(E_STRICT | E_ALL | E_DEPRECATED);
|
||||
//ini_set("display_errors", 1);
|
||||
|
||||
/**
|
||||
* The root of your DOMPDF installation
|
||||
*/
|
||||
define("DOMPDF_DIR", str_replace(DIRECTORY_SEPARATOR, '/', realpath(dirname(__FILE__))));
|
||||
|
||||
/**
|
||||
* The location of the DOMPDF include directory
|
||||
*/
|
||||
define("DOMPDF_INC_DIR", DOMPDF_DIR . "/include");
|
||||
|
||||
/**
|
||||
* The location of the DOMPDF lib directory
|
||||
*/
|
||||
define("DOMPDF_LIB_DIR", DOMPDF_DIR . "/lib");
|
||||
|
||||
/**
|
||||
* Some installations don't have $_SERVER['DOCUMENT_ROOT']
|
||||
* http://fyneworks.blogspot.com/2007/08/php-documentroot-in-iis-windows-servers.html
|
||||
*/
|
||||
if( !isset($_SERVER['DOCUMENT_ROOT']) ) {
|
||||
$path = "";
|
||||
|
||||
if ( isset($_SERVER['SCRIPT_FILENAME']) )
|
||||
$path = $_SERVER['SCRIPT_FILENAME'];
|
||||
elseif ( isset($_SERVER['PATH_TRANSLATED']) )
|
||||
$path = str_replace('\\\\', '\\', $_SERVER['PATH_TRANSLATED']);
|
||||
|
||||
$_SERVER['DOCUMENT_ROOT'] = str_replace( '\\', '/', substr($path, 0, 0-strlen($_SERVER['PHP_SELF'])));
|
||||
}
|
||||
|
||||
/** Include the custom config file if it exists */
|
||||
if ( file_exists(DOMPDF_DIR . "/dompdf_config.custom.inc.php") ){
|
||||
require_once(DOMPDF_DIR . "/dompdf_config.custom.inc.php");
|
||||
}
|
||||
|
||||
//FIXME: Some function definitions rely on the constants defined by DOMPDF. However, might this location prove problematic?
|
||||
require_once(DOMPDF_INC_DIR . "/functions.inc.php");
|
||||
|
||||
/**
|
||||
* The location of the DOMPDF font directory
|
||||
*
|
||||
* If DOMPDF_FONT_DIR identical to DOMPDF_FONT_CACHE or user executing DOMPDF from the CLI,
|
||||
* this directory must be writable by the webserver process ().
|
||||
* *Please note the trailing slash.*
|
||||
*
|
||||
* Notes regarding fonts:
|
||||
* Additional .afm font metrics can be added by executing load_font.php from command line.
|
||||
* Converting ttf fonts to afm requires the external tool referenced by TTF2AFM
|
||||
*
|
||||
* Only the original "Base 14 fonts" are present on all pdf viewers. Additional fonts must
|
||||
* be embedded in the pdf file or the PDF may not display correctly. This can significantly
|
||||
* increase file size and could violate copyright provisions of a font. Font embedding is
|
||||
* not currently supported (? via HT).
|
||||
*
|
||||
* Any font specification in the source HTML is translated to the closest font available
|
||||
* in the font directory.
|
||||
*
|
||||
* The pdf standard "Base 14 fonts" are:
|
||||
* Courier, Courier-Bold, Courier-BoldOblique, Courier-Oblique,
|
||||
* Helvetica, Helvetica-Bold, Helvetica-BoldOblique, Helvetica-Oblique,
|
||||
* Times-Roman, Times-Bold, Times-BoldItalic, Times-Italic,
|
||||
* Symbol,
|
||||
* ZapfDingbats,
|
||||
*
|
||||
* *Please note the trailing slash.*
|
||||
*/
|
||||
def("DOMPDF_FONT_DIR", DOMPDF_DIR . "/lib/fonts/");
|
||||
|
||||
/**
|
||||
* The location of the DOMPDF font cache directory
|
||||
*
|
||||
* Note this directory must be writable by the webserver process
|
||||
* This folder must already exist!
|
||||
* It contains the .afm files, on demand parsed, converted to php syntax and cached
|
||||
* This folder can be the same as DOMPDF_FONT_DIR
|
||||
*/
|
||||
def("DOMPDF_FONT_CACHE", DOMPDF_FONT_DIR);
|
||||
|
||||
/**
|
||||
* The location of a temporary directory.
|
||||
*
|
||||
* The directory specified must be writeable by the webserver process.
|
||||
* The temporary directory is required to download remote images and when
|
||||
* using the PFDLib back end.
|
||||
*/
|
||||
def("DOMPDF_TEMP_DIR", sys_get_temp_dir());
|
||||
|
||||
/**
|
||||
* ==== IMPORTANT ====
|
||||
*
|
||||
* dompdf's "chroot": Prevents dompdf from accessing system files or other
|
||||
* files on the webserver. All local files opened by dompdf must be in a
|
||||
* subdirectory of this directory. DO NOT set it to '/' since this could
|
||||
* allow an attacker to use dompdf to read any files on the server. This
|
||||
* should be an absolute path.
|
||||
* This is only checked on command line call by dompdf.php, but not by
|
||||
* direct class use like:
|
||||
* $dompdf = new DOMPDF(); $dompdf->load_html($htmldata); $dompdf->render(); $pdfdata = $dompdf->output();
|
||||
*/
|
||||
def("DOMPDF_CHROOT", realpath(DOMPDF_DIR));
|
||||
|
||||
/**
|
||||
* Whether to use Unicode fonts or not.
|
||||
*
|
||||
* When set to true the PDF backend must be set to "CPDF" and fonts must be
|
||||
* loaded via the modified ttf2ufm tool included with dompdf (see below).
|
||||
* Unicode font metric files (with .ufm extensions) must be created with
|
||||
* ttf2ufm. load_font.php should do this for you if the TTF2AFM define below
|
||||
* points to the modified ttf2ufm tool included with dompdf.
|
||||
*
|
||||
* When enabled, dompdf can support all Unicode glyphs. Any glyphs used in a
|
||||
* document must be present in your fonts, however.
|
||||
*/
|
||||
def("DOMPDF_UNICODE_ENABLED", true);
|
||||
|
||||
/**
|
||||
* The path to the tt2pt1 utility (used to convert ttf to afm)
|
||||
*
|
||||
* Not strictly necessary, but useful if you would like to install
|
||||
* additional fonts using the {@link load_font.php} utility.
|
||||
*
|
||||
* Windows users should use something like this:
|
||||
* define("TTF2AFM", "C:\\Program Files\\Ttf2Pt1\\bin\\ttf2pt1.exe");
|
||||
*
|
||||
* @link http://ttf2pt1.sourceforge.net/
|
||||
*/
|
||||
if ( strpos(PHP_OS, "WIN") === false )
|
||||
def("TTF2AFM", DOMPDF_LIB_DIR ."/ttf2ufm/ttf2ufm-src/ttf2pt1");
|
||||
else
|
||||
def("TTF2AFM", "C:\\Program Files\\GnuWin32\\bin\\ttf2pt1.exe");
|
||||
|
||||
/**
|
||||
* The PDF rendering backend to use
|
||||
*
|
||||
* Valid settings are 'PDFLib', 'CPDF' (the bundled R&OS PDF class), 'GD' and
|
||||
* 'auto'. 'auto' will look for PDFLib and use it if found, or if not it will
|
||||
* fall back on CPDF. 'GD' renders PDFs to graphic files. {@link
|
||||
* Canvas_Factory} ultimately determines which rendering class to instantiate
|
||||
* based on this setting.
|
||||
*
|
||||
* Both PDFLib & CPDF rendering backends provide sufficient rendering
|
||||
* capabilities for dompdf, however additional features (e.g. object,
|
||||
* image and font support, etc.) differ between backends. Please see
|
||||
* {@link PDFLib_Adapter} for more information on the PDFLib backend
|
||||
* and {@link CPDF_Adapter} and lib/class.pdf.php for more information
|
||||
* on CPDF. Also see the documentation for each backend at the links
|
||||
* below.
|
||||
*
|
||||
* The GD rendering backend is a little different than PDFLib and
|
||||
* CPDF. Several features of CPDF and PDFLib are not supported or do
|
||||
* not make any sense when creating image files. For example,
|
||||
* multiple pages are not supported, nor are PDF 'objects'. Have a
|
||||
* look at {@link GD_Adapter} for more information. GD support is new
|
||||
* and experimental, so use it at your own risk.
|
||||
*
|
||||
* @link http://www.pdflib.com
|
||||
* @link http://www.ros.co.nz/pdf
|
||||
* @link http://www.php.net/image
|
||||
*/
|
||||
def("DOMPDF_PDF_BACKEND", "CPDF");
|
||||
|
||||
/**
|
||||
* PDFlib license key
|
||||
*
|
||||
* If you are using a licensed, commercial version of PDFlib, specify
|
||||
* your license key here. If you are using PDFlib-Lite or are evaluating
|
||||
* the commercial version of PDFlib, comment out this setting.
|
||||
*
|
||||
* @link http://www.pdflib.com
|
||||
*
|
||||
* If pdflib present in web server and auto or selected explicitely above,
|
||||
* a real license code must exist!
|
||||
*/
|
||||
#def("DOMPDF_PDFLIB_LICENSE", "your license key here");
|
||||
|
||||
/**
|
||||
* html target media view which should be rendered into pdf.
|
||||
* List of types and parsing rules for future extensions:
|
||||
* http://www.w3.org/TR/REC-html40/types.html
|
||||
* screen, tty, tv, projection, handheld, print, braille, aural, all
|
||||
* Note: aural is deprecated in CSS 2.1 because it is replaced by speech in CSS 3.
|
||||
* Note, even though the generated pdf file is intended for print output,
|
||||
* the desired content might be different (e.g. screen or projection view of html file).
|
||||
* Therefore allow specification of content here.
|
||||
*/
|
||||
def("DOMPDF_DEFAULT_MEDIA_TYPE", "screen");
|
||||
|
||||
/**
|
||||
* The default paper size.
|
||||
*
|
||||
* North America standard is "letter"; other countries generally "a4"
|
||||
*
|
||||
* @see CPDF_Adapter::PAPER_SIZES for valid sizes
|
||||
*/
|
||||
def("DOMPDF_DEFAULT_PAPER_SIZE", "letter");
|
||||
|
||||
/**
|
||||
* The default font family
|
||||
*
|
||||
* Used if no suitable fonts can be found. This must exist in the font folder.
|
||||
* @var string
|
||||
*/
|
||||
def("DOMPDF_DEFAULT_FONT", "serif");
|
||||
|
||||
/**
|
||||
* Image DPI setting
|
||||
*
|
||||
* This setting determines the default DPI setting for images and fonts. The
|
||||
* DPI may be overridden for inline images by explictly setting the
|
||||
* image's width & height style attributes (i.e. if the image's native
|
||||
* width is 600 pixels and you specify the image's width as 72 points,
|
||||
* the image will have a DPI of 600 in the rendered PDF. The DPI of
|
||||
* background images can not be overridden and is controlled entirely
|
||||
* via this parameter.
|
||||
*
|
||||
* For the purposes of DOMPDF, pixels per inch (PPI) = dots per inch (DPI).
|
||||
* If a size in html is given as px (or without unit as image size),
|
||||
* this tells the corresponding size in pt.
|
||||
* This adjusts the relative sizes to be similar to the rendering of the
|
||||
* html page in a reference browser.
|
||||
*
|
||||
* In pdf, always 1 pt = 1/72 inch
|
||||
*
|
||||
* Rendering resolution of various browsers in px per inch:
|
||||
* Windows Firefox and Internet Explorer:
|
||||
* SystemControl->Display properties->FontResolution: Default:96, largefonts:120, custom:?
|
||||
* Linux Firefox:
|
||||
* about:config *resolution: Default:96
|
||||
* (xorg screen dimension in mm and Desktop font dpi settings are ignored)
|
||||
*
|
||||
* Take care about extra font/image zoom factor of browser.
|
||||
*
|
||||
* In images, <img> size in pixel attribute, img css style, are overriding
|
||||
* the real image dimension in px for rendering.
|
||||
*
|
||||
* @var int
|
||||
*/
|
||||
def("DOMPDF_DPI", 96);
|
||||
|
||||
/**
|
||||
* Enable inline PHP
|
||||
*
|
||||
* If this setting is set to true then DOMPDF will automatically evaluate
|
||||
* inline PHP contained within <script type="text/php"> ... </script> tags.
|
||||
*
|
||||
* Enabling this for documents you do not trust (e.g. arbitrary remote html
|
||||
* pages) is a security risk. Set this option to false if you wish to process
|
||||
* untrusted documents.
|
||||
*
|
||||
* @var bool
|
||||
*/
|
||||
def("DOMPDF_ENABLE_PHP", false);
|
||||
|
||||
/**
|
||||
* Enable inline Javascript
|
||||
*
|
||||
* If this setting is set to true then DOMPDF will automatically insert
|
||||
* JavaScript code contained within <script type="text/javascript"> ... </script> tags.
|
||||
*
|
||||
* @var bool
|
||||
*/
|
||||
def("DOMPDF_ENABLE_JAVASCRIPT", true);
|
||||
|
||||
/**
|
||||
* Enable remote file access
|
||||
*
|
||||
* If this setting is set to true, DOMPDF will access remote sites for
|
||||
* images and CSS files as required.
|
||||
* This is required for part of test case www/test/image_variants.html through www/examples.php
|
||||
*
|
||||
* Attention!
|
||||
* This can be a security risk, in particular in combination with DOMPDF_ENABLE_PHP and
|
||||
* allowing remote access to dompdf.php or on allowing remote html code to be passed to
|
||||
* $dompdf = new DOMPDF(); $dompdf->load_html(...);
|
||||
* This allows anonymous users to download legally doubtful internet content which on
|
||||
* tracing back appears to being downloaded by your server, or allows malicious php code
|
||||
* in remote html pages to be executed by your server with your account privileges.
|
||||
*
|
||||
* @var bool
|
||||
*/
|
||||
def("DOMPDF_ENABLE_REMOTE", false);
|
||||
|
||||
/**
|
||||
* The debug output log
|
||||
* @var string
|
||||
*/
|
||||
def("DOMPDF_LOG_OUTPUT_FILE", DOMPDF_FONT_DIR."log.htm");
|
||||
|
||||
/**
|
||||
* A ratio applied to the fonts height to be more like browsers' line height
|
||||
*/
|
||||
def("DOMPDF_FONT_HEIGHT_RATIO", 1.1);
|
||||
|
||||
/**
|
||||
* Enable CSS float
|
||||
*
|
||||
* Allows people to disabled CSS float support
|
||||
* @var bool
|
||||
*/
|
||||
def("DOMPDF_ENABLE_CSS_FLOAT", false);
|
||||
|
||||
/**
|
||||
* DOMPDF autoload function
|
||||
*
|
||||
* If you have an existing autoload function, add a call to this function
|
||||
* from your existing __autoload() implementation.
|
||||
*
|
||||
* @param string $class
|
||||
*/
|
||||
function DOMPDF_autoload($class) {
|
||||
$filename = DOMPDF_INC_DIR . "/" . mb_strtolower($class) . ".cls.php";
|
||||
|
||||
if ( is_file($filename) )
|
||||
require_once($filename);
|
||||
}
|
||||
|
||||
// If SPL autoload functions are available (PHP >= 5.1.2)
|
||||
if ( function_exists("spl_autoload_register") ) {
|
||||
$autoload = "DOMPDF_autoload";
|
||||
$funcs = spl_autoload_functions();
|
||||
|
||||
// No functions currently in the stack.
|
||||
if ( $funcs === false ) {
|
||||
spl_autoload_register($autoload);
|
||||
}
|
||||
|
||||
// If PHP >= 5.3 the $prepend argument is available
|
||||
else if ( version_compare(PHP_VERSION, '5.3', '>=') ) {
|
||||
spl_autoload_register($autoload, true, true);
|
||||
}
|
||||
|
||||
else {
|
||||
// Unregister existing autoloaders...
|
||||
$compat = version_compare(PHP_VERSION, '5.1.2', '<=') &&
|
||||
version_compare(PHP_VERSION, '5.1.0', '>=');
|
||||
|
||||
foreach ($funcs as $func) {
|
||||
if (is_array($func)) {
|
||||
// :TRICKY: There are some compatibility issues and some
|
||||
// places where we need to error out
|
||||
$reflector = new ReflectionMethod($func[0], $func[1]);
|
||||
if (!$reflector->isStatic()) {
|
||||
throw new Exception('This function is not compatible with non-static object methods due to PHP Bug #44144.');
|
||||
}
|
||||
|
||||
// Suprisingly, spl_autoload_register supports the
|
||||
// Class::staticMethod callback format, although call_user_func doesn't
|
||||
if ($compat) $func = implode('::', $func);
|
||||
}
|
||||
|
||||
spl_autoload_unregister($func);
|
||||
}
|
||||
|
||||
// Register the new one, thus putting it at the front of the stack...
|
||||
spl_autoload_register($autoload);
|
||||
|
||||
// Now, go back and re-register all of our old ones.
|
||||
foreach ($funcs as $func) {
|
||||
spl_autoload_register($func);
|
||||
}
|
||||
|
||||
// Be polite and ensure that userland autoload gets retained
|
||||
if ( function_exists("__autoload") ) {
|
||||
spl_autoload_register("__autoload");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
else if ( !function_exists("__autoload") ) {
|
||||
/**
|
||||
* Default __autoload() function
|
||||
*
|
||||
* @param string $class
|
||||
*/
|
||||
function __autoload($class) {
|
||||
DOMPDF_autoload($class);
|
||||
}
|
||||
}
|
||||
|
||||
// ### End of user-configurable options ###
|
||||
|
||||
|
||||
/**
|
||||
* Ensure that PHP is working with text internally using UTF8 character encoding.
|
||||
*/
|
||||
mb_internal_encoding('UTF-8');
|
||||
|
||||
/**
|
||||
* Global array of warnings generated by DomDocument parser and
|
||||
* stylesheet class
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
global $_dompdf_warnings;
|
||||
$_dompdf_warnings = array();
|
||||
|
||||
/**
|
||||
* If true, $_dompdf_warnings is dumped on script termination when using
|
||||
* dompdf/dompdf.php or after rendering when using the DOMPDF class.
|
||||
* When using the class, setting this value to true will prevent you from
|
||||
* streaming the PDF.
|
||||
*
|
||||
* @var bool
|
||||
*/
|
||||
global $_dompdf_show_warnings;
|
||||
$_dompdf_show_warnings = false;
|
||||
|
||||
/**
|
||||
* If true, the entire tree is dumped to stdout in dompdf.cls.php.
|
||||
* Setting this value to true will prevent you from streaming the PDF.
|
||||
*
|
||||
* @var bool
|
||||
*/
|
||||
global $_dompdf_debug;
|
||||
$_dompdf_debug = false;
|
||||
|
||||
/**
|
||||
* Array of enabled debug message types
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
global $_DOMPDF_DEBUG_TYPES;
|
||||
$_DOMPDF_DEBUG_TYPES = array(); //array("page-break" => 1);
|
||||
|
||||
/* Optionally enable different classes of debug output before the pdf content.
|
||||
* Visible if displaying pdf as text,
|
||||
* E.g. on repeated display of same pdf in browser when pdf is not taken out of
|
||||
* the browser cache and the premature output prevents setting of the mime type.
|
||||
*/
|
||||
def('DEBUGPNG', false);
|
||||
def('DEBUGKEEPTEMP', false);
|
||||
def('DEBUGCSS', false);
|
||||
|
||||
/* Layout debugging. Will display rectangles around different block levels.
|
||||
* Visible in the PDF itself.
|
||||
*/
|
||||
def('DEBUG_LAYOUT', false);
|
||||
def('DEBUG_LAYOUT_LINES', true);
|
||||
def('DEBUG_LAYOUT_BLOCKS', true);
|
||||
def('DEBUG_LAYOUT_INLINE', true);
|
||||
def('DEBUG_LAYOUT_PADDINGBOX', true);
|
||||
BIN
pdf/facturabg.jpg
Executable file
BIN
pdf/facturabg.jpg
Executable file
Binary file not shown.
BIN
pdf/facturabg.png
Executable file
BIN
pdf/facturabg.png
Executable file
Binary file not shown.
|
After Width: | Height: | Size: 212 KiB |
101
pdf/filters/FilterASCII85.php
Executable file
101
pdf/filters/FilterASCII85.php
Executable file
@@ -0,0 +1,101 @@
|
||||
<?php
|
||||
//
|
||||
// FPDI - Version 1.4.1
|
||||
//
|
||||
// Copyright 2004-2011 Setasign - Jan Slabon
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
//
|
||||
|
||||
if (!defined('ORD_z'))
|
||||
define('ORD_z',ord('z'));
|
||||
if (!defined('ORD_exclmark'))
|
||||
define('ORD_exclmark', ord('!'));
|
||||
if (!defined('ORD_u'))
|
||||
define('ORD_u', ord('u'));
|
||||
if (!defined('ORD_tilde'))
|
||||
define('ORD_tilde', ord('~'));
|
||||
|
||||
if (!class_exists('FilterASCII85', false)) {
|
||||
|
||||
class FilterASCII85 {
|
||||
|
||||
function error($msg) {
|
||||
die($msg);
|
||||
}
|
||||
|
||||
function decode($in) {
|
||||
$out = '';
|
||||
$state = 0;
|
||||
$chn = null;
|
||||
|
||||
$l = strlen($in);
|
||||
|
||||
for ($k = 0; $k < $l; ++$k) {
|
||||
$ch = ord($in[$k]) & 0xff;
|
||||
|
||||
if ($ch == ORD_tilde) {
|
||||
break;
|
||||
}
|
||||
if (preg_match('/^\s$/',chr($ch))) {
|
||||
continue;
|
||||
}
|
||||
if ($ch == ORD_z && $state == 0) {
|
||||
$out .= chr(0).chr(0).chr(0).chr(0);
|
||||
continue;
|
||||
}
|
||||
if ($ch < ORD_exclmark || $ch > ORD_u) {
|
||||
return $this->error('Illegal character in ASCII85Decode.');
|
||||
}
|
||||
|
||||
$chn[$state++] = $ch - ORD_exclmark;
|
||||
|
||||
if ($state == 5) {
|
||||
$state = 0;
|
||||
$r = 0;
|
||||
for ($j = 0; $j < 5; ++$j)
|
||||
$r = $r * 85 + $chn[$j];
|
||||
$out .= chr($r >> 24);
|
||||
$out .= chr($r >> 16);
|
||||
$out .= chr($r >> 8);
|
||||
$out .= chr($r);
|
||||
}
|
||||
}
|
||||
$r = 0;
|
||||
|
||||
if ($state == 1)
|
||||
return $this->error('Illegal length in ASCII85Decode.');
|
||||
if ($state == 2) {
|
||||
$r = $chn[0] * 85 * 85 * 85 * 85 + ($chn[1]+1) * 85 * 85 * 85;
|
||||
$out .= chr($r >> 24);
|
||||
}
|
||||
else if ($state == 3) {
|
||||
$r = $chn[0] * 85 * 85 * 85 * 85 + $chn[1] * 85 * 85 * 85 + ($chn[2]+1) * 85 * 85;
|
||||
$out .= chr($r >> 24);
|
||||
$out .= chr($r >> 16);
|
||||
}
|
||||
else if ($state == 4) {
|
||||
$r = $chn[0] * 85 * 85 * 85 * 85 + $chn[1] * 85 * 85 * 85 + $chn[2] * 85 * 85 + ($chn[3]+1) * 85 ;
|
||||
$out .= chr($r >> 24);
|
||||
$out .= chr($r >> 16);
|
||||
$out .= chr($r >> 8);
|
||||
}
|
||||
|
||||
return $out;
|
||||
}
|
||||
|
||||
function encode($in) {
|
||||
return $this->error("ASCII85 encoding not implemented.");
|
||||
}
|
||||
}
|
||||
}
|
||||
33
pdf/filters/FilterASCII85_FPDI.php
Executable file
33
pdf/filters/FilterASCII85_FPDI.php
Executable file
@@ -0,0 +1,33 @@
|
||||
<?php
|
||||
//
|
||||
// FPDI - Version 1.4.1
|
||||
//
|
||||
// Copyright 2004-2011 Setasign - Jan Slabon
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
//
|
||||
|
||||
require_once('FilterASCII85.php');
|
||||
|
||||
class FilterASCII85_FPDI extends FilterASCII85 {
|
||||
|
||||
var $fpdi;
|
||||
|
||||
function FilterASCII85_FPDI(&$fpdi) {
|
||||
$this->fpdi =& $fpdi;
|
||||
}
|
||||
|
||||
function error($msg) {
|
||||
$this->fpdi->error($msg);
|
||||
}
|
||||
}
|
||||
157
pdf/filters/FilterLZW.php
Executable file
157
pdf/filters/FilterLZW.php
Executable file
@@ -0,0 +1,157 @@
|
||||
<?php
|
||||
//
|
||||
// FPDI - Version 1.4.1
|
||||
//
|
||||
// Copyright 2004-2011 Setasign - Jan Slabon
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
//
|
||||
|
||||
if (!class_exists('FilterLZW', false)) {
|
||||
|
||||
class FilterLZW {
|
||||
|
||||
var $sTable = array();
|
||||
var $data = null;
|
||||
var $dataLength = 0;
|
||||
var $tIdx;
|
||||
var $bitsToGet = 9;
|
||||
var $bytePointer;
|
||||
var $bitPointer;
|
||||
var $nextData = 0;
|
||||
var $nextBits = 0;
|
||||
var $andTable = array(511, 1023, 2047, 4095);
|
||||
|
||||
function error($msg) {
|
||||
die($msg);
|
||||
}
|
||||
|
||||
/**
|
||||
* Method to decode LZW compressed data.
|
||||
*
|
||||
* @param string data The compressed data.
|
||||
*/
|
||||
function decode($data) {
|
||||
|
||||
if($data[0] == 0x00 && $data[1] == 0x01) {
|
||||
$this->error('LZW flavour not supported.');
|
||||
}
|
||||
|
||||
$this->initsTable();
|
||||
|
||||
$this->data = $data;
|
||||
$this->dataLength = strlen($data);
|
||||
|
||||
// Initialize pointers
|
||||
$this->bytePointer = 0;
|
||||
$this->bitPointer = 0;
|
||||
|
||||
$this->nextData = 0;
|
||||
$this->nextBits = 0;
|
||||
|
||||
$oldCode = 0;
|
||||
|
||||
$string = '';
|
||||
$uncompData = '';
|
||||
|
||||
while (($code = $this->getNextCode()) != 257) {
|
||||
if ($code == 256) {
|
||||
$this->initsTable();
|
||||
$code = $this->getNextCode();
|
||||
|
||||
if ($code == 257) {
|
||||
break;
|
||||
}
|
||||
|
||||
$uncompData .= $this->sTable[$code];
|
||||
$oldCode = $code;
|
||||
|
||||
} else {
|
||||
|
||||
if ($code < $this->tIdx) {
|
||||
$string = $this->sTable[$code];
|
||||
$uncompData .= $string;
|
||||
|
||||
$this->addStringToTable($this->sTable[$oldCode], $string[0]);
|
||||
$oldCode = $code;
|
||||
} else {
|
||||
$string = $this->sTable[$oldCode];
|
||||
$string = $string.$string[0];
|
||||
$uncompData .= $string;
|
||||
|
||||
$this->addStringToTable($string);
|
||||
$oldCode = $code;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return $uncompData;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Initialize the string table.
|
||||
*/
|
||||
function initsTable() {
|
||||
$this->sTable = array();
|
||||
|
||||
for ($i = 0; $i < 256; $i++)
|
||||
$this->sTable[$i] = chr($i);
|
||||
|
||||
$this->tIdx = 258;
|
||||
$this->bitsToGet = 9;
|
||||
}
|
||||
|
||||
/**
|
||||
* Add a new string to the string table.
|
||||
*/
|
||||
function addStringToTable ($oldString, $newString='') {
|
||||
$string = $oldString.$newString;
|
||||
|
||||
// Add this new String to the table
|
||||
$this->sTable[$this->tIdx++] = $string;
|
||||
|
||||
if ($this->tIdx == 511) {
|
||||
$this->bitsToGet = 10;
|
||||
} else if ($this->tIdx == 1023) {
|
||||
$this->bitsToGet = 11;
|
||||
} else if ($this->tIdx == 2047) {
|
||||
$this->bitsToGet = 12;
|
||||
}
|
||||
}
|
||||
|
||||
// Returns the next 9, 10, 11 or 12 bits
|
||||
function getNextCode() {
|
||||
if ($this->bytePointer == $this->dataLength) {
|
||||
return 257;
|
||||
}
|
||||
|
||||
$this->nextData = ($this->nextData << 8) | (ord($this->data[$this->bytePointer++]) & 0xff);
|
||||
$this->nextBits += 8;
|
||||
|
||||
if ($this->nextBits < $this->bitsToGet) {
|
||||
$this->nextData = ($this->nextData << 8) | (ord($this->data[$this->bytePointer++]) & 0xff);
|
||||
$this->nextBits += 8;
|
||||
}
|
||||
|
||||
$code = ($this->nextData >> ($this->nextBits - $this->bitsToGet)) & $this->andTable[$this->bitsToGet-9];
|
||||
$this->nextBits -= $this->bitsToGet;
|
||||
|
||||
return $code;
|
||||
}
|
||||
|
||||
function encode($in) {
|
||||
$this->error("LZW encoding not implemented.");
|
||||
}
|
||||
}
|
||||
}
|
||||
33
pdf/filters/FilterLZW_FPDI.php
Executable file
33
pdf/filters/FilterLZW_FPDI.php
Executable file
@@ -0,0 +1,33 @@
|
||||
<?php
|
||||
//
|
||||
// FPDI - Version 1.4.1
|
||||
//
|
||||
// Copyright 2004-2011 Setasign - Jan Slabon
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
//
|
||||
|
||||
require_once('FilterLZW.php');
|
||||
|
||||
class FilterLZW_FPDI extends FilterLZW {
|
||||
|
||||
var $fpdi;
|
||||
|
||||
function FilterLZW_FPDI(&$fpdi) {
|
||||
$this->fpdi =& $fpdi;
|
||||
}
|
||||
|
||||
function error($msg) {
|
||||
$this->fpdi->error($msg);
|
||||
}
|
||||
}
|
||||
27
pdf/font/_notes/dwsync.xml
Executable file
27
pdf/font/_notes/dwsync.xml
Executable file
@@ -0,0 +1,27 @@
|
||||
<?xml version="1.0" encoding="utf-8" ?>
|
||||
<dwsync>
|
||||
<file name="courier.php" server="trazzos.com" local="126499790140000000" remote="129066048000000000" />
|
||||
<file name="helvetica.php" server="trazzos.com" local="126491538960000000" remote="129066048000000000" />
|
||||
<file name="helveticab.php" server="trazzos.com" local="126491541760000000" remote="129066048000000000" />
|
||||
<file name="helveticabi.php" server="trazzos.com" local="126491543580000000" remote="129066048000000000" />
|
||||
<file name="helveticai.php" server="trazzos.com" local="126491542620000000" remote="129066048000000000" />
|
||||
<file name="symbol.php" server="trazzos.com" local="126493048920000000" remote="129066048000000000" />
|
||||
<file name="times.php" server="trazzos.com" local="126490632940000000" remote="129066048000000000" />
|
||||
<file name="timesb.php" server="trazzos.com" local="126491533260000000" remote="129066048000000000" />
|
||||
<file name="timesbi.php" server="trazzos.com" local="126491536080000000" remote="129066048000000000" />
|
||||
<file name="timesi.php" server="trazzos.com" local="126491535640000000" remote="129066048000000000" />
|
||||
<file name="zapfdingbats.php" server="trazzos.com" local="126493794220000000" remote="129066048000000000" />
|
||||
<file name="courier.php" server="trazzos.com/public_html/newcbta/" local="126499790140000000" remote="129156962400000000" />
|
||||
<file name="helvetica.php" server="trazzos.com/public_html/newcbta/" local="126491538960000000" remote="129156962400000000" />
|
||||
<file name="helveticab.php" server="trazzos.com/public_html/newcbta/" local="126491541760000000" remote="129156962400000000" />
|
||||
<file name="helveticabi.php" server="trazzos.com/public_html/newcbta/" local="126491543580000000" remote="129156962400000000" />
|
||||
<file name="helveticai.php" server="trazzos.com/public_html/newcbta/" local="126491542620000000" remote="129156962400000000" />
|
||||
<file name="symbol.php" server="trazzos.com/public_html/newcbta/" local="126493048920000000" remote="129156963000000000" />
|
||||
<file name="times.php" server="trazzos.com/public_html/newcbta/" local="126490632940000000" remote="129156963000000000" />
|
||||
<file name="timesb.php" server="trazzos.com/public_html/newcbta/" local="126491533260000000" remote="129156963000000000" />
|
||||
<file name="timesbi.php" server="trazzos.com/public_html/newcbta/" local="126491536080000000" remote="129156963000000000" />
|
||||
<file name="timesi.php" server="trazzos.com/public_html/newcbta/" local="126491535640000000" remote="129156963000000000" />
|
||||
<file name="zapfdingbats.php" server="trazzos.com/public_html/newcbta/" local="126493794220000000" remote="129156963000000000" />
|
||||
<file name="verdana.php" server="trazzos.com/public_html/newcbta/" local="129067291200000000" remote="129156964800000000" />
|
||||
<file name="verdana.z" server="trazzos.com/public_html/newcbta/" local="129067291200000000" remote="129156966000000000" />
|
||||
</dwsync>
|
||||
7
pdf/font/courier.php
Executable file
7
pdf/font/courier.php
Executable file
@@ -0,0 +1,7 @@
|
||||
<?php
|
||||
for($i=0;$i<=255;$i++)
|
||||
$fpdf_charwidths['courier'][chr($i)]=600;
|
||||
$fpdf_charwidths['courierB']=$fpdf_charwidths['courier'];
|
||||
$fpdf_charwidths['courierI']=$fpdf_charwidths['courier'];
|
||||
$fpdf_charwidths['courierBI']=$fpdf_charwidths['courier'];
|
||||
?>
|
||||
4
pdf/font/desktop.ini
Executable file
4
pdf/font/desktop.ini
Executable file
@@ -0,0 +1,4 @@
|
||||
[ViewState]
|
||||
Mode=
|
||||
Vid=
|
||||
FolderType=NotSpecified
|
||||
15
pdf/font/helvetica.php
Executable file
15
pdf/font/helvetica.php
Executable file
@@ -0,0 +1,15 @@
|
||||
<?php
|
||||
$fpdf_charwidths['helvetica']=array(
|
||||
chr(0)=>278,chr(1)=>278,chr(2)=>278,chr(3)=>278,chr(4)=>278,chr(5)=>278,chr(6)=>278,chr(7)=>278,chr(8)=>278,chr(9)=>278,chr(10)=>278,chr(11)=>278,chr(12)=>278,chr(13)=>278,chr(14)=>278,chr(15)=>278,chr(16)=>278,chr(17)=>278,chr(18)=>278,chr(19)=>278,chr(20)=>278,chr(21)=>278,
|
||||
chr(22)=>278,chr(23)=>278,chr(24)=>278,chr(25)=>278,chr(26)=>278,chr(27)=>278,chr(28)=>278,chr(29)=>278,chr(30)=>278,chr(31)=>278,' '=>278,'!'=>278,'"'=>355,'#'=>556,'$'=>556,'%'=>889,'&'=>667,'\''=>191,'('=>333,')'=>333,'*'=>389,'+'=>584,
|
||||
','=>278,'-'=>333,'.'=>278,'/'=>278,'0'=>556,'1'=>556,'2'=>556,'3'=>556,'4'=>556,'5'=>556,'6'=>556,'7'=>556,'8'=>556,'9'=>556,':'=>278,';'=>278,'<'=>584,'='=>584,'>'=>584,'?'=>556,'@'=>1015,'A'=>667,
|
||||
'B'=>667,'C'=>722,'D'=>722,'E'=>667,'F'=>611,'G'=>778,'H'=>722,'I'=>278,'J'=>500,'K'=>667,'L'=>556,'M'=>833,'N'=>722,'O'=>778,'P'=>667,'Q'=>778,'R'=>722,'S'=>667,'T'=>611,'U'=>722,'V'=>667,'W'=>944,
|
||||
'X'=>667,'Y'=>667,'Z'=>611,'['=>278,'\\'=>278,']'=>278,'^'=>469,'_'=>556,'`'=>333,'a'=>556,'b'=>556,'c'=>500,'d'=>556,'e'=>556,'f'=>278,'g'=>556,'h'=>556,'i'=>222,'j'=>222,'k'=>500,'l'=>222,'m'=>833,
|
||||
'n'=>556,'o'=>556,'p'=>556,'q'=>556,'r'=>333,'s'=>500,'t'=>278,'u'=>556,'v'=>500,'w'=>722,'x'=>500,'y'=>500,'z'=>500,'{'=>334,'|'=>260,'}'=>334,'~'=>584,chr(127)=>350,chr(128)=>556,chr(129)=>350,chr(130)=>222,chr(131)=>556,
|
||||
chr(132)=>333,chr(133)=>1000,chr(134)=>556,chr(135)=>556,chr(136)=>333,chr(137)=>1000,chr(138)=>667,chr(139)=>333,chr(140)=>1000,chr(141)=>350,chr(142)=>611,chr(143)=>350,chr(144)=>350,chr(145)=>222,chr(146)=>222,chr(147)=>333,chr(148)=>333,chr(149)=>350,chr(150)=>556,chr(151)=>1000,chr(152)=>333,chr(153)=>1000,
|
||||
chr(154)=>500,chr(155)=>333,chr(156)=>944,chr(157)=>350,chr(158)=>500,chr(159)=>667,chr(160)=>278,chr(161)=>333,chr(162)=>556,chr(163)=>556,chr(164)=>556,chr(165)=>556,chr(166)=>260,chr(167)=>556,chr(168)=>333,chr(169)=>737,chr(170)=>370,chr(171)=>556,chr(172)=>584,chr(173)=>333,chr(174)=>737,chr(175)=>333,
|
||||
chr(176)=>400,chr(177)=>584,chr(178)=>333,chr(179)=>333,chr(180)=>333,chr(181)=>556,chr(182)=>537,chr(183)=>278,chr(184)=>333,chr(185)=>333,chr(186)=>365,chr(187)=>556,chr(188)=>834,chr(189)=>834,chr(190)=>834,chr(191)=>611,chr(192)=>667,chr(193)=>667,chr(194)=>667,chr(195)=>667,chr(196)=>667,chr(197)=>667,
|
||||
chr(198)=>1000,chr(199)=>722,chr(200)=>667,chr(201)=>667,chr(202)=>667,chr(203)=>667,chr(204)=>278,chr(205)=>278,chr(206)=>278,chr(207)=>278,chr(208)=>722,chr(209)=>722,chr(210)=>778,chr(211)=>778,chr(212)=>778,chr(213)=>778,chr(214)=>778,chr(215)=>584,chr(216)=>778,chr(217)=>722,chr(218)=>722,chr(219)=>722,
|
||||
chr(220)=>722,chr(221)=>667,chr(222)=>667,chr(223)=>611,chr(224)=>556,chr(225)=>556,chr(226)=>556,chr(227)=>556,chr(228)=>556,chr(229)=>556,chr(230)=>889,chr(231)=>500,chr(232)=>556,chr(233)=>556,chr(234)=>556,chr(235)=>556,chr(236)=>278,chr(237)=>278,chr(238)=>278,chr(239)=>278,chr(240)=>556,chr(241)=>556,
|
||||
chr(242)=>556,chr(243)=>556,chr(244)=>556,chr(245)=>556,chr(246)=>556,chr(247)=>584,chr(248)=>611,chr(249)=>556,chr(250)=>556,chr(251)=>556,chr(252)=>556,chr(253)=>500,chr(254)=>556,chr(255)=>500);
|
||||
?>
|
||||
15
pdf/font/helveticab.php
Executable file
15
pdf/font/helveticab.php
Executable file
@@ -0,0 +1,15 @@
|
||||
<?php
|
||||
$fpdf_charwidths['helveticaB']=array(
|
||||
chr(0)=>278,chr(1)=>278,chr(2)=>278,chr(3)=>278,chr(4)=>278,chr(5)=>278,chr(6)=>278,chr(7)=>278,chr(8)=>278,chr(9)=>278,chr(10)=>278,chr(11)=>278,chr(12)=>278,chr(13)=>278,chr(14)=>278,chr(15)=>278,chr(16)=>278,chr(17)=>278,chr(18)=>278,chr(19)=>278,chr(20)=>278,chr(21)=>278,
|
||||
chr(22)=>278,chr(23)=>278,chr(24)=>278,chr(25)=>278,chr(26)=>278,chr(27)=>278,chr(28)=>278,chr(29)=>278,chr(30)=>278,chr(31)=>278,' '=>278,'!'=>333,'"'=>474,'#'=>556,'$'=>556,'%'=>889,'&'=>722,'\''=>238,'('=>333,')'=>333,'*'=>389,'+'=>584,
|
||||
','=>278,'-'=>333,'.'=>278,'/'=>278,'0'=>556,'1'=>556,'2'=>556,'3'=>556,'4'=>556,'5'=>556,'6'=>556,'7'=>556,'8'=>556,'9'=>556,':'=>333,';'=>333,'<'=>584,'='=>584,'>'=>584,'?'=>611,'@'=>975,'A'=>722,
|
||||
'B'=>722,'C'=>722,'D'=>722,'E'=>667,'F'=>611,'G'=>778,'H'=>722,'I'=>278,'J'=>556,'K'=>722,'L'=>611,'M'=>833,'N'=>722,'O'=>778,'P'=>667,'Q'=>778,'R'=>722,'S'=>667,'T'=>611,'U'=>722,'V'=>667,'W'=>944,
|
||||
'X'=>667,'Y'=>667,'Z'=>611,'['=>333,'\\'=>278,']'=>333,'^'=>584,'_'=>556,'`'=>333,'a'=>556,'b'=>611,'c'=>556,'d'=>611,'e'=>556,'f'=>333,'g'=>611,'h'=>611,'i'=>278,'j'=>278,'k'=>556,'l'=>278,'m'=>889,
|
||||
'n'=>611,'o'=>611,'p'=>611,'q'=>611,'r'=>389,'s'=>556,'t'=>333,'u'=>611,'v'=>556,'w'=>778,'x'=>556,'y'=>556,'z'=>500,'{'=>389,'|'=>280,'}'=>389,'~'=>584,chr(127)=>350,chr(128)=>556,chr(129)=>350,chr(130)=>278,chr(131)=>556,
|
||||
chr(132)=>500,chr(133)=>1000,chr(134)=>556,chr(135)=>556,chr(136)=>333,chr(137)=>1000,chr(138)=>667,chr(139)=>333,chr(140)=>1000,chr(141)=>350,chr(142)=>611,chr(143)=>350,chr(144)=>350,chr(145)=>278,chr(146)=>278,chr(147)=>500,chr(148)=>500,chr(149)=>350,chr(150)=>556,chr(151)=>1000,chr(152)=>333,chr(153)=>1000,
|
||||
chr(154)=>556,chr(155)=>333,chr(156)=>944,chr(157)=>350,chr(158)=>500,chr(159)=>667,chr(160)=>278,chr(161)=>333,chr(162)=>556,chr(163)=>556,chr(164)=>556,chr(165)=>556,chr(166)=>280,chr(167)=>556,chr(168)=>333,chr(169)=>737,chr(170)=>370,chr(171)=>556,chr(172)=>584,chr(173)=>333,chr(174)=>737,chr(175)=>333,
|
||||
chr(176)=>400,chr(177)=>584,chr(178)=>333,chr(179)=>333,chr(180)=>333,chr(181)=>611,chr(182)=>556,chr(183)=>278,chr(184)=>333,chr(185)=>333,chr(186)=>365,chr(187)=>556,chr(188)=>834,chr(189)=>834,chr(190)=>834,chr(191)=>611,chr(192)=>722,chr(193)=>722,chr(194)=>722,chr(195)=>722,chr(196)=>722,chr(197)=>722,
|
||||
chr(198)=>1000,chr(199)=>722,chr(200)=>667,chr(201)=>667,chr(202)=>667,chr(203)=>667,chr(204)=>278,chr(205)=>278,chr(206)=>278,chr(207)=>278,chr(208)=>722,chr(209)=>722,chr(210)=>778,chr(211)=>778,chr(212)=>778,chr(213)=>778,chr(214)=>778,chr(215)=>584,chr(216)=>778,chr(217)=>722,chr(218)=>722,chr(219)=>722,
|
||||
chr(220)=>722,chr(221)=>667,chr(222)=>667,chr(223)=>611,chr(224)=>556,chr(225)=>556,chr(226)=>556,chr(227)=>556,chr(228)=>556,chr(229)=>556,chr(230)=>889,chr(231)=>556,chr(232)=>556,chr(233)=>556,chr(234)=>556,chr(235)=>556,chr(236)=>278,chr(237)=>278,chr(238)=>278,chr(239)=>278,chr(240)=>611,chr(241)=>611,
|
||||
chr(242)=>611,chr(243)=>611,chr(244)=>611,chr(245)=>611,chr(246)=>611,chr(247)=>584,chr(248)=>611,chr(249)=>611,chr(250)=>611,chr(251)=>611,chr(252)=>611,chr(253)=>556,chr(254)=>611,chr(255)=>556);
|
||||
?>
|
||||
15
pdf/font/helveticabi.php
Executable file
15
pdf/font/helveticabi.php
Executable file
@@ -0,0 +1,15 @@
|
||||
<?php
|
||||
$fpdf_charwidths['helveticaBI']=array(
|
||||
chr(0)=>278,chr(1)=>278,chr(2)=>278,chr(3)=>278,chr(4)=>278,chr(5)=>278,chr(6)=>278,chr(7)=>278,chr(8)=>278,chr(9)=>278,chr(10)=>278,chr(11)=>278,chr(12)=>278,chr(13)=>278,chr(14)=>278,chr(15)=>278,chr(16)=>278,chr(17)=>278,chr(18)=>278,chr(19)=>278,chr(20)=>278,chr(21)=>278,
|
||||
chr(22)=>278,chr(23)=>278,chr(24)=>278,chr(25)=>278,chr(26)=>278,chr(27)=>278,chr(28)=>278,chr(29)=>278,chr(30)=>278,chr(31)=>278,' '=>278,'!'=>333,'"'=>474,'#'=>556,'$'=>556,'%'=>889,'&'=>722,'\''=>238,'('=>333,')'=>333,'*'=>389,'+'=>584,
|
||||
','=>278,'-'=>333,'.'=>278,'/'=>278,'0'=>556,'1'=>556,'2'=>556,'3'=>556,'4'=>556,'5'=>556,'6'=>556,'7'=>556,'8'=>556,'9'=>556,':'=>333,';'=>333,'<'=>584,'='=>584,'>'=>584,'?'=>611,'@'=>975,'A'=>722,
|
||||
'B'=>722,'C'=>722,'D'=>722,'E'=>667,'F'=>611,'G'=>778,'H'=>722,'I'=>278,'J'=>556,'K'=>722,'L'=>611,'M'=>833,'N'=>722,'O'=>778,'P'=>667,'Q'=>778,'R'=>722,'S'=>667,'T'=>611,'U'=>722,'V'=>667,'W'=>944,
|
||||
'X'=>667,'Y'=>667,'Z'=>611,'['=>333,'\\'=>278,']'=>333,'^'=>584,'_'=>556,'`'=>333,'a'=>556,'b'=>611,'c'=>556,'d'=>611,'e'=>556,'f'=>333,'g'=>611,'h'=>611,'i'=>278,'j'=>278,'k'=>556,'l'=>278,'m'=>889,
|
||||
'n'=>611,'o'=>611,'p'=>611,'q'=>611,'r'=>389,'s'=>556,'t'=>333,'u'=>611,'v'=>556,'w'=>778,'x'=>556,'y'=>556,'z'=>500,'{'=>389,'|'=>280,'}'=>389,'~'=>584,chr(127)=>350,chr(128)=>556,chr(129)=>350,chr(130)=>278,chr(131)=>556,
|
||||
chr(132)=>500,chr(133)=>1000,chr(134)=>556,chr(135)=>556,chr(136)=>333,chr(137)=>1000,chr(138)=>667,chr(139)=>333,chr(140)=>1000,chr(141)=>350,chr(142)=>611,chr(143)=>350,chr(144)=>350,chr(145)=>278,chr(146)=>278,chr(147)=>500,chr(148)=>500,chr(149)=>350,chr(150)=>556,chr(151)=>1000,chr(152)=>333,chr(153)=>1000,
|
||||
chr(154)=>556,chr(155)=>333,chr(156)=>944,chr(157)=>350,chr(158)=>500,chr(159)=>667,chr(160)=>278,chr(161)=>333,chr(162)=>556,chr(163)=>556,chr(164)=>556,chr(165)=>556,chr(166)=>280,chr(167)=>556,chr(168)=>333,chr(169)=>737,chr(170)=>370,chr(171)=>556,chr(172)=>584,chr(173)=>333,chr(174)=>737,chr(175)=>333,
|
||||
chr(176)=>400,chr(177)=>584,chr(178)=>333,chr(179)=>333,chr(180)=>333,chr(181)=>611,chr(182)=>556,chr(183)=>278,chr(184)=>333,chr(185)=>333,chr(186)=>365,chr(187)=>556,chr(188)=>834,chr(189)=>834,chr(190)=>834,chr(191)=>611,chr(192)=>722,chr(193)=>722,chr(194)=>722,chr(195)=>722,chr(196)=>722,chr(197)=>722,
|
||||
chr(198)=>1000,chr(199)=>722,chr(200)=>667,chr(201)=>667,chr(202)=>667,chr(203)=>667,chr(204)=>278,chr(205)=>278,chr(206)=>278,chr(207)=>278,chr(208)=>722,chr(209)=>722,chr(210)=>778,chr(211)=>778,chr(212)=>778,chr(213)=>778,chr(214)=>778,chr(215)=>584,chr(216)=>778,chr(217)=>722,chr(218)=>722,chr(219)=>722,
|
||||
chr(220)=>722,chr(221)=>667,chr(222)=>667,chr(223)=>611,chr(224)=>556,chr(225)=>556,chr(226)=>556,chr(227)=>556,chr(228)=>556,chr(229)=>556,chr(230)=>889,chr(231)=>556,chr(232)=>556,chr(233)=>556,chr(234)=>556,chr(235)=>556,chr(236)=>278,chr(237)=>278,chr(238)=>278,chr(239)=>278,chr(240)=>611,chr(241)=>611,
|
||||
chr(242)=>611,chr(243)=>611,chr(244)=>611,chr(245)=>611,chr(246)=>611,chr(247)=>584,chr(248)=>611,chr(249)=>611,chr(250)=>611,chr(251)=>611,chr(252)=>611,chr(253)=>556,chr(254)=>611,chr(255)=>556);
|
||||
?>
|
||||
15
pdf/font/helveticai.php
Executable file
15
pdf/font/helveticai.php
Executable file
@@ -0,0 +1,15 @@
|
||||
<?php
|
||||
$fpdf_charwidths['helveticaI']=array(
|
||||
chr(0)=>278,chr(1)=>278,chr(2)=>278,chr(3)=>278,chr(4)=>278,chr(5)=>278,chr(6)=>278,chr(7)=>278,chr(8)=>278,chr(9)=>278,chr(10)=>278,chr(11)=>278,chr(12)=>278,chr(13)=>278,chr(14)=>278,chr(15)=>278,chr(16)=>278,chr(17)=>278,chr(18)=>278,chr(19)=>278,chr(20)=>278,chr(21)=>278,
|
||||
chr(22)=>278,chr(23)=>278,chr(24)=>278,chr(25)=>278,chr(26)=>278,chr(27)=>278,chr(28)=>278,chr(29)=>278,chr(30)=>278,chr(31)=>278,' '=>278,'!'=>278,'"'=>355,'#'=>556,'$'=>556,'%'=>889,'&'=>667,'\''=>191,'('=>333,')'=>333,'*'=>389,'+'=>584,
|
||||
','=>278,'-'=>333,'.'=>278,'/'=>278,'0'=>556,'1'=>556,'2'=>556,'3'=>556,'4'=>556,'5'=>556,'6'=>556,'7'=>556,'8'=>556,'9'=>556,':'=>278,';'=>278,'<'=>584,'='=>584,'>'=>584,'?'=>556,'@'=>1015,'A'=>667,
|
||||
'B'=>667,'C'=>722,'D'=>722,'E'=>667,'F'=>611,'G'=>778,'H'=>722,'I'=>278,'J'=>500,'K'=>667,'L'=>556,'M'=>833,'N'=>722,'O'=>778,'P'=>667,'Q'=>778,'R'=>722,'S'=>667,'T'=>611,'U'=>722,'V'=>667,'W'=>944,
|
||||
'X'=>667,'Y'=>667,'Z'=>611,'['=>278,'\\'=>278,']'=>278,'^'=>469,'_'=>556,'`'=>333,'a'=>556,'b'=>556,'c'=>500,'d'=>556,'e'=>556,'f'=>278,'g'=>556,'h'=>556,'i'=>222,'j'=>222,'k'=>500,'l'=>222,'m'=>833,
|
||||
'n'=>556,'o'=>556,'p'=>556,'q'=>556,'r'=>333,'s'=>500,'t'=>278,'u'=>556,'v'=>500,'w'=>722,'x'=>500,'y'=>500,'z'=>500,'{'=>334,'|'=>260,'}'=>334,'~'=>584,chr(127)=>350,chr(128)=>556,chr(129)=>350,chr(130)=>222,chr(131)=>556,
|
||||
chr(132)=>333,chr(133)=>1000,chr(134)=>556,chr(135)=>556,chr(136)=>333,chr(137)=>1000,chr(138)=>667,chr(139)=>333,chr(140)=>1000,chr(141)=>350,chr(142)=>611,chr(143)=>350,chr(144)=>350,chr(145)=>222,chr(146)=>222,chr(147)=>333,chr(148)=>333,chr(149)=>350,chr(150)=>556,chr(151)=>1000,chr(152)=>333,chr(153)=>1000,
|
||||
chr(154)=>500,chr(155)=>333,chr(156)=>944,chr(157)=>350,chr(158)=>500,chr(159)=>667,chr(160)=>278,chr(161)=>333,chr(162)=>556,chr(163)=>556,chr(164)=>556,chr(165)=>556,chr(166)=>260,chr(167)=>556,chr(168)=>333,chr(169)=>737,chr(170)=>370,chr(171)=>556,chr(172)=>584,chr(173)=>333,chr(174)=>737,chr(175)=>333,
|
||||
chr(176)=>400,chr(177)=>584,chr(178)=>333,chr(179)=>333,chr(180)=>333,chr(181)=>556,chr(182)=>537,chr(183)=>278,chr(184)=>333,chr(185)=>333,chr(186)=>365,chr(187)=>556,chr(188)=>834,chr(189)=>834,chr(190)=>834,chr(191)=>611,chr(192)=>667,chr(193)=>667,chr(194)=>667,chr(195)=>667,chr(196)=>667,chr(197)=>667,
|
||||
chr(198)=>1000,chr(199)=>722,chr(200)=>667,chr(201)=>667,chr(202)=>667,chr(203)=>667,chr(204)=>278,chr(205)=>278,chr(206)=>278,chr(207)=>278,chr(208)=>722,chr(209)=>722,chr(210)=>778,chr(211)=>778,chr(212)=>778,chr(213)=>778,chr(214)=>778,chr(215)=>584,chr(216)=>778,chr(217)=>722,chr(218)=>722,chr(219)=>722,
|
||||
chr(220)=>722,chr(221)=>667,chr(222)=>667,chr(223)=>611,chr(224)=>556,chr(225)=>556,chr(226)=>556,chr(227)=>556,chr(228)=>556,chr(229)=>556,chr(230)=>889,chr(231)=>500,chr(232)=>556,chr(233)=>556,chr(234)=>556,chr(235)=>556,chr(236)=>278,chr(237)=>278,chr(238)=>278,chr(239)=>278,chr(240)=>556,chr(241)=>556,
|
||||
chr(242)=>556,chr(243)=>556,chr(244)=>556,chr(245)=>556,chr(246)=>556,chr(247)=>584,chr(248)=>611,chr(249)=>556,chr(250)=>556,chr(251)=>556,chr(252)=>556,chr(253)=>500,chr(254)=>556,chr(255)=>500);
|
||||
?>
|
||||
51
pdf/font/makefont/_notes/dwsync.xml
Executable file
51
pdf/font/makefont/_notes/dwsync.xml
Executable file
@@ -0,0 +1,51 @@
|
||||
<?xml version="1.0" encoding="utf-8" ?>
|
||||
<dwsync>
|
||||
<file name="cp1250.map" server="trazzos.com" local="126656306520000000" remote="129066048000000000" />
|
||||
<file name="cp1251.map" server="trazzos.com" local="126645859840000000" remote="129066048000000000" />
|
||||
<file name="cp1252.map" server="trazzos.com" local="126645859840000000" remote="129066048000000000" />
|
||||
<file name="cp1253.map" server="trazzos.com" local="126651033360000000" remote="129066048000000000" />
|
||||
<file name="cp1254.map" server="trazzos.com" local="126806854080000000" remote="129066048000000000" />
|
||||
<file name="cp1255.map" server="trazzos.com" local="127001969540000000" remote="129066048000000000" />
|
||||
<file name="cp1257.map" server="trazzos.com" local="126726238460000000" remote="129066048000000000" />
|
||||
<file name="cp1258.map" server="trazzos.com" local="127173199060000000" remote="129066048000000000" />
|
||||
<file name="cp874.map" server="trazzos.com" local="126898274440000000" remote="129066048000000000" />
|
||||
<file name="iso-8859-1.map" server="trazzos.com" local="126653523680000000" remote="129066048000000000" />
|
||||
<file name="iso-8859-11.map" server="trazzos.com" local="126898273540000000" remote="129066048000000000" />
|
||||
<file name="iso-8859-15.map" server="trazzos.com" local="126653522960000000" remote="129066048000000000" />
|
||||
<file name="iso-8859-16.map" server="trazzos.com" local="126653537800000000" remote="129066048000000000" />
|
||||
<file name="iso-8859-2.map" server="trazzos.com" local="126653524460000000" remote="129066048000000000" />
|
||||
<file name="iso-8859-4.map" server="trazzos.com" local="126726235500000000" remote="129066048000000000" />
|
||||
<file name="iso-8859-5.map" server="trazzos.com" local="126653603100000000" remote="129066048000000000" />
|
||||
<file name="iso-8859-7.map" server="trazzos.com" local="126653642820000000" remote="129066048000000000" />
|
||||
<file name="iso-8859-9.map" server="trazzos.com" local="126807556460000000" remote="129066048000000000" />
|
||||
<file name="koi8-r.map" server="trazzos.com" local="126653629520000000" remote="129066048000000000" />
|
||||
<file name="koi8-u.map" server="trazzos.com" local="127171326560000000" remote="129066048000000000" />
|
||||
<file name="makefont.php" server="trazzos.com" local="128622516220000000" remote="129066048000000000" />
|
||||
<file name="createfont.php" server="trazzos.com" local="129067291210000000" remote="129067291200000000" />
|
||||
<file name="verdana.afm" server="trazzos.com" local="129067281031564059" remote="129067290000000000" />
|
||||
<file name="verdana.ttf" server="trazzos.com" local="128820363699742751" remote="129067290600000000" />
|
||||
<file name="cp1250.map" server="trazzos.com/public_html/newcbta/" local="126656306520000000" remote="129156962400000000" />
|
||||
<file name="cp1251.map" server="trazzos.com/public_html/newcbta/" local="126645859840000000" remote="129156962400000000" />
|
||||
<file name="cp1252.map" server="trazzos.com/public_html/newcbta/" local="126645859840000000" remote="129156962400000000" />
|
||||
<file name="cp1253.map" server="trazzos.com/public_html/newcbta/" local="126651033360000000" remote="129156962400000000" />
|
||||
<file name="cp1254.map" server="trazzos.com/public_html/newcbta/" local="126806854080000000" remote="129156962400000000" />
|
||||
<file name="cp1255.map" server="trazzos.com/public_html/newcbta/" local="127001969540000000" remote="129156962400000000" />
|
||||
<file name="cp1257.map" server="trazzos.com/public_html/newcbta/" local="126726238460000000" remote="129156962400000000" />
|
||||
<file name="cp1258.map" server="trazzos.com/public_html/newcbta/" local="127173199060000000" remote="129156962400000000" />
|
||||
<file name="cp874.map" server="trazzos.com/public_html/newcbta/" local="126898274440000000" remote="129156962400000000" />
|
||||
<file name="createfont.php" server="trazzos.com/public_html/newcbta/" local="129067291210000000" remote="129156962400000000" />
|
||||
<file name="iso-8859-1.map" server="trazzos.com/public_html/newcbta/" local="126653523680000000" remote="129156962400000000" />
|
||||
<file name="iso-8859-11.map" server="trazzos.com/public_html/newcbta/" local="126898273540000000" remote="129156962400000000" />
|
||||
<file name="iso-8859-15.map" server="trazzos.com/public_html/newcbta/" local="126653522960000000" remote="129156962400000000" />
|
||||
<file name="iso-8859-16.map" server="trazzos.com/public_html/newcbta/" local="126653537800000000" remote="129156962400000000" />
|
||||
<file name="iso-8859-2.map" server="trazzos.com/public_html/newcbta/" local="126653524460000000" remote="129156962400000000" />
|
||||
<file name="iso-8859-4.map" server="trazzos.com/public_html/newcbta/" local="126726235500000000" remote="129156962400000000" />
|
||||
<file name="iso-8859-5.map" server="trazzos.com/public_html/newcbta/" local="126653603100000000" remote="129156962400000000" />
|
||||
<file name="iso-8859-7.map" server="trazzos.com/public_html/newcbta/" local="126653642820000000" remote="129156962400000000" />
|
||||
<file name="iso-8859-9.map" server="trazzos.com/public_html/newcbta/" local="126807556460000000" remote="129156962400000000" />
|
||||
<file name="koi8-r.map" server="trazzos.com/public_html/newcbta/" local="126653629520000000" remote="129156962400000000" />
|
||||
<file name="koi8-u.map" server="trazzos.com/public_html/newcbta/" local="127171326560000000" remote="129156962400000000" />
|
||||
<file name="makefont.php" server="trazzos.com/public_html/newcbta/" local="128622516220000000" remote="129156962400000000" />
|
||||
<file name="verdana.afm" server="trazzos.com/public_html/newcbta/" local="129067281031564059" remote="129156962400000000" />
|
||||
<file name="verdana.ttf" server="trazzos.com/public_html/newcbta/" local="128820363699742751" remote="129156962400000000" />
|
||||
</dwsync>
|
||||
251
pdf/font/makefont/cp1250.map
Executable file
251
pdf/font/makefont/cp1250.map
Executable file
@@ -0,0 +1,251 @@
|
||||
!00 U+0000 .notdef
|
||||
!01 U+0001 .notdef
|
||||
!02 U+0002 .notdef
|
||||
!03 U+0003 .notdef
|
||||
!04 U+0004 .notdef
|
||||
!05 U+0005 .notdef
|
||||
!06 U+0006 .notdef
|
||||
!07 U+0007 .notdef
|
||||
!08 U+0008 .notdef
|
||||
!09 U+0009 .notdef
|
||||
!0A U+000A .notdef
|
||||
!0B U+000B .notdef
|
||||
!0C U+000C .notdef
|
||||
!0D U+000D .notdef
|
||||
!0E U+000E .notdef
|
||||
!0F U+000F .notdef
|
||||
!10 U+0010 .notdef
|
||||
!11 U+0011 .notdef
|
||||
!12 U+0012 .notdef
|
||||
!13 U+0013 .notdef
|
||||
!14 U+0014 .notdef
|
||||
!15 U+0015 .notdef
|
||||
!16 U+0016 .notdef
|
||||
!17 U+0017 .notdef
|
||||
!18 U+0018 .notdef
|
||||
!19 U+0019 .notdef
|
||||
!1A U+001A .notdef
|
||||
!1B U+001B .notdef
|
||||
!1C U+001C .notdef
|
||||
!1D U+001D .notdef
|
||||
!1E U+001E .notdef
|
||||
!1F U+001F .notdef
|
||||
!20 U+0020 space
|
||||
!21 U+0021 exclam
|
||||
!22 U+0022 quotedbl
|
||||
!23 U+0023 numbersign
|
||||
!24 U+0024 dollar
|
||||
!25 U+0025 percent
|
||||
!26 U+0026 ampersand
|
||||
!27 U+0027 quotesingle
|
||||
!28 U+0028 parenleft
|
||||
!29 U+0029 parenright
|
||||
!2A U+002A asterisk
|
||||
!2B U+002B plus
|
||||
!2C U+002C comma
|
||||
!2D U+002D hyphen
|
||||
!2E U+002E period
|
||||
!2F U+002F slash
|
||||
!30 U+0030 zero
|
||||
!31 U+0031 one
|
||||
!32 U+0032 two
|
||||
!33 U+0033 three
|
||||
!34 U+0034 four
|
||||
!35 U+0035 five
|
||||
!36 U+0036 six
|
||||
!37 U+0037 seven
|
||||
!38 U+0038 eight
|
||||
!39 U+0039 nine
|
||||
!3A U+003A colon
|
||||
!3B U+003B semicolon
|
||||
!3C U+003C less
|
||||
!3D U+003D equal
|
||||
!3E U+003E greater
|
||||
!3F U+003F question
|
||||
!40 U+0040 at
|
||||
!41 U+0041 A
|
||||
!42 U+0042 B
|
||||
!43 U+0043 C
|
||||
!44 U+0044 D
|
||||
!45 U+0045 E
|
||||
!46 U+0046 F
|
||||
!47 U+0047 G
|
||||
!48 U+0048 H
|
||||
!49 U+0049 I
|
||||
!4A U+004A J
|
||||
!4B U+004B K
|
||||
!4C U+004C L
|
||||
!4D U+004D M
|
||||
!4E U+004E N
|
||||
!4F U+004F O
|
||||
!50 U+0050 P
|
||||
!51 U+0051 Q
|
||||
!52 U+0052 R
|
||||
!53 U+0053 S
|
||||
!54 U+0054 T
|
||||
!55 U+0055 U
|
||||
!56 U+0056 V
|
||||
!57 U+0057 W
|
||||
!58 U+0058 X
|
||||
!59 U+0059 Y
|
||||
!5A U+005A Z
|
||||
!5B U+005B bracketleft
|
||||
!5C U+005C backslash
|
||||
!5D U+005D bracketright
|
||||
!5E U+005E asciicircum
|
||||
!5F U+005F underscore
|
||||
!60 U+0060 grave
|
||||
!61 U+0061 a
|
||||
!62 U+0062 b
|
||||
!63 U+0063 c
|
||||
!64 U+0064 d
|
||||
!65 U+0065 e
|
||||
!66 U+0066 f
|
||||
!67 U+0067 g
|
||||
!68 U+0068 h
|
||||
!69 U+0069 i
|
||||
!6A U+006A j
|
||||
!6B U+006B k
|
||||
!6C U+006C l
|
||||
!6D U+006D m
|
||||
!6E U+006E n
|
||||
!6F U+006F o
|
||||
!70 U+0070 p
|
||||
!71 U+0071 q
|
||||
!72 U+0072 r
|
||||
!73 U+0073 s
|
||||
!74 U+0074 t
|
||||
!75 U+0075 u
|
||||
!76 U+0076 v
|
||||
!77 U+0077 w
|
||||
!78 U+0078 x
|
||||
!79 U+0079 y
|
||||
!7A U+007A z
|
||||
!7B U+007B braceleft
|
||||
!7C U+007C bar
|
||||
!7D U+007D braceright
|
||||
!7E U+007E asciitilde
|
||||
!7F U+007F .notdef
|
||||
!80 U+20AC Euro
|
||||
!82 U+201A quotesinglbase
|
||||
!84 U+201E quotedblbase
|
||||
!85 U+2026 ellipsis
|
||||
!86 U+2020 dagger
|
||||
!87 U+2021 daggerdbl
|
||||
!89 U+2030 perthousand
|
||||
!8A U+0160 Scaron
|
||||
!8B U+2039 guilsinglleft
|
||||
!8C U+015A Sacute
|
||||
!8D U+0164 Tcaron
|
||||
!8E U+017D Zcaron
|
||||
!8F U+0179 Zacute
|
||||
!91 U+2018 quoteleft
|
||||
!92 U+2019 quoteright
|
||||
!93 U+201C quotedblleft
|
||||
!94 U+201D quotedblright
|
||||
!95 U+2022 bullet
|
||||
!96 U+2013 endash
|
||||
!97 U+2014 emdash
|
||||
!99 U+2122 trademark
|
||||
!9A U+0161 scaron
|
||||
!9B U+203A guilsinglright
|
||||
!9C U+015B sacute
|
||||
!9D U+0165 tcaron
|
||||
!9E U+017E zcaron
|
||||
!9F U+017A zacute
|
||||
!A0 U+00A0 space
|
||||
!A1 U+02C7 caron
|
||||
!A2 U+02D8 breve
|
||||
!A3 U+0141 Lslash
|
||||
!A4 U+00A4 currency
|
||||
!A5 U+0104 Aogonek
|
||||
!A6 U+00A6 brokenbar
|
||||
!A7 U+00A7 section
|
||||
!A8 U+00A8 dieresis
|
||||
!A9 U+00A9 copyright
|
||||
!AA U+015E Scedilla
|
||||
!AB U+00AB guillemotleft
|
||||
!AC U+00AC logicalnot
|
||||
!AD U+00AD hyphen
|
||||
!AE U+00AE registered
|
||||
!AF U+017B Zdotaccent
|
||||
!B0 U+00B0 degree
|
||||
!B1 U+00B1 plusminus
|
||||
!B2 U+02DB ogonek
|
||||
!B3 U+0142 lslash
|
||||
!B4 U+00B4 acute
|
||||
!B5 U+00B5 mu
|
||||
!B6 U+00B6 paragraph
|
||||
!B7 U+00B7 periodcentered
|
||||
!B8 U+00B8 cedilla
|
||||
!B9 U+0105 aogonek
|
||||
!BA U+015F scedilla
|
||||
!BB U+00BB guillemotright
|
||||
!BC U+013D Lcaron
|
||||
!BD U+02DD hungarumlaut
|
||||
!BE U+013E lcaron
|
||||
!BF U+017C zdotaccent
|
||||
!C0 U+0154 Racute
|
||||
!C1 U+00C1 Aacute
|
||||
!C2 U+00C2 Acircumflex
|
||||
!C3 U+0102 Abreve
|
||||
!C4 U+00C4 Adieresis
|
||||
!C5 U+0139 Lacute
|
||||
!C6 U+0106 Cacute
|
||||
!C7 U+00C7 Ccedilla
|
||||
!C8 U+010C Ccaron
|
||||
!C9 U+00C9 Eacute
|
||||
!CA U+0118 Eogonek
|
||||
!CB U+00CB Edieresis
|
||||
!CC U+011A Ecaron
|
||||
!CD U+00CD Iacute
|
||||
!CE U+00CE Icircumflex
|
||||
!CF U+010E Dcaron
|
||||
!D0 U+0110 Dcroat
|
||||
!D1 U+0143 Nacute
|
||||
!D2 U+0147 Ncaron
|
||||
!D3 U+00D3 Oacute
|
||||
!D4 U+00D4 Ocircumflex
|
||||
!D5 U+0150 Ohungarumlaut
|
||||
!D6 U+00D6 Odieresis
|
||||
!D7 U+00D7 multiply
|
||||
!D8 U+0158 Rcaron
|
||||
!D9 U+016E Uring
|
||||
!DA U+00DA Uacute
|
||||
!DB U+0170 Uhungarumlaut
|
||||
!DC U+00DC Udieresis
|
||||
!DD U+00DD Yacute
|
||||
!DE U+0162 Tcommaaccent
|
||||
!DF U+00DF germandbls
|
||||
!E0 U+0155 racute
|
||||
!E1 U+00E1 aacute
|
||||
!E2 U+00E2 acircumflex
|
||||
!E3 U+0103 abreve
|
||||
!E4 U+00E4 adieresis
|
||||
!E5 U+013A lacute
|
||||
!E6 U+0107 cacute
|
||||
!E7 U+00E7 ccedilla
|
||||
!E8 U+010D ccaron
|
||||
!E9 U+00E9 eacute
|
||||
!EA U+0119 eogonek
|
||||
!EB U+00EB edieresis
|
||||
!EC U+011B ecaron
|
||||
!ED U+00ED iacute
|
||||
!EE U+00EE icircumflex
|
||||
!EF U+010F dcaron
|
||||
!F0 U+0111 dcroat
|
||||
!F1 U+0144 nacute
|
||||
!F2 U+0148 ncaron
|
||||
!F3 U+00F3 oacute
|
||||
!F4 U+00F4 ocircumflex
|
||||
!F5 U+0151 ohungarumlaut
|
||||
!F6 U+00F6 odieresis
|
||||
!F7 U+00F7 divide
|
||||
!F8 U+0159 rcaron
|
||||
!F9 U+016F uring
|
||||
!FA U+00FA uacute
|
||||
!FB U+0171 uhungarumlaut
|
||||
!FC U+00FC udieresis
|
||||
!FD U+00FD yacute
|
||||
!FE U+0163 tcommaaccent
|
||||
!FF U+02D9 dotaccent
|
||||
255
pdf/font/makefont/cp1251.map
Executable file
255
pdf/font/makefont/cp1251.map
Executable file
@@ -0,0 +1,255 @@
|
||||
!00 U+0000 .notdef
|
||||
!01 U+0001 .notdef
|
||||
!02 U+0002 .notdef
|
||||
!03 U+0003 .notdef
|
||||
!04 U+0004 .notdef
|
||||
!05 U+0005 .notdef
|
||||
!06 U+0006 .notdef
|
||||
!07 U+0007 .notdef
|
||||
!08 U+0008 .notdef
|
||||
!09 U+0009 .notdef
|
||||
!0A U+000A .notdef
|
||||
!0B U+000B .notdef
|
||||
!0C U+000C .notdef
|
||||
!0D U+000D .notdef
|
||||
!0E U+000E .notdef
|
||||
!0F U+000F .notdef
|
||||
!10 U+0010 .notdef
|
||||
!11 U+0011 .notdef
|
||||
!12 U+0012 .notdef
|
||||
!13 U+0013 .notdef
|
||||
!14 U+0014 .notdef
|
||||
!15 U+0015 .notdef
|
||||
!16 U+0016 .notdef
|
||||
!17 U+0017 .notdef
|
||||
!18 U+0018 .notdef
|
||||
!19 U+0019 .notdef
|
||||
!1A U+001A .notdef
|
||||
!1B U+001B .notdef
|
||||
!1C U+001C .notdef
|
||||
!1D U+001D .notdef
|
||||
!1E U+001E .notdef
|
||||
!1F U+001F .notdef
|
||||
!20 U+0020 space
|
||||
!21 U+0021 exclam
|
||||
!22 U+0022 quotedbl
|
||||
!23 U+0023 numbersign
|
||||
!24 U+0024 dollar
|
||||
!25 U+0025 percent
|
||||
!26 U+0026 ampersand
|
||||
!27 U+0027 quotesingle
|
||||
!28 U+0028 parenleft
|
||||
!29 U+0029 parenright
|
||||
!2A U+002A asterisk
|
||||
!2B U+002B plus
|
||||
!2C U+002C comma
|
||||
!2D U+002D hyphen
|
||||
!2E U+002E period
|
||||
!2F U+002F slash
|
||||
!30 U+0030 zero
|
||||
!31 U+0031 one
|
||||
!32 U+0032 two
|
||||
!33 U+0033 three
|
||||
!34 U+0034 four
|
||||
!35 U+0035 five
|
||||
!36 U+0036 six
|
||||
!37 U+0037 seven
|
||||
!38 U+0038 eight
|
||||
!39 U+0039 nine
|
||||
!3A U+003A colon
|
||||
!3B U+003B semicolon
|
||||
!3C U+003C less
|
||||
!3D U+003D equal
|
||||
!3E U+003E greater
|
||||
!3F U+003F question
|
||||
!40 U+0040 at
|
||||
!41 U+0041 A
|
||||
!42 U+0042 B
|
||||
!43 U+0043 C
|
||||
!44 U+0044 D
|
||||
!45 U+0045 E
|
||||
!46 U+0046 F
|
||||
!47 U+0047 G
|
||||
!48 U+0048 H
|
||||
!49 U+0049 I
|
||||
!4A U+004A J
|
||||
!4B U+004B K
|
||||
!4C U+004C L
|
||||
!4D U+004D M
|
||||
!4E U+004E N
|
||||
!4F U+004F O
|
||||
!50 U+0050 P
|
||||
!51 U+0051 Q
|
||||
!52 U+0052 R
|
||||
!53 U+0053 S
|
||||
!54 U+0054 T
|
||||
!55 U+0055 U
|
||||
!56 U+0056 V
|
||||
!57 U+0057 W
|
||||
!58 U+0058 X
|
||||
!59 U+0059 Y
|
||||
!5A U+005A Z
|
||||
!5B U+005B bracketleft
|
||||
!5C U+005C backslash
|
||||
!5D U+005D bracketright
|
||||
!5E U+005E asciicircum
|
||||
!5F U+005F underscore
|
||||
!60 U+0060 grave
|
||||
!61 U+0061 a
|
||||
!62 U+0062 b
|
||||
!63 U+0063 c
|
||||
!64 U+0064 d
|
||||
!65 U+0065 e
|
||||
!66 U+0066 f
|
||||
!67 U+0067 g
|
||||
!68 U+0068 h
|
||||
!69 U+0069 i
|
||||
!6A U+006A j
|
||||
!6B U+006B k
|
||||
!6C U+006C l
|
||||
!6D U+006D m
|
||||
!6E U+006E n
|
||||
!6F U+006F o
|
||||
!70 U+0070 p
|
||||
!71 U+0071 q
|
||||
!72 U+0072 r
|
||||
!73 U+0073 s
|
||||
!74 U+0074 t
|
||||
!75 U+0075 u
|
||||
!76 U+0076 v
|
||||
!77 U+0077 w
|
||||
!78 U+0078 x
|
||||
!79 U+0079 y
|
||||
!7A U+007A z
|
||||
!7B U+007B braceleft
|
||||
!7C U+007C bar
|
||||
!7D U+007D braceright
|
||||
!7E U+007E asciitilde
|
||||
!7F U+007F .notdef
|
||||
!80 U+0402 afii10051
|
||||
!81 U+0403 afii10052
|
||||
!82 U+201A quotesinglbase
|
||||
!83 U+0453 afii10100
|
||||
!84 U+201E quotedblbase
|
||||
!85 U+2026 ellipsis
|
||||
!86 U+2020 dagger
|
||||
!87 U+2021 daggerdbl
|
||||
!88 U+20AC Euro
|
||||
!89 U+2030 perthousand
|
||||
!8A U+0409 afii10058
|
||||
!8B U+2039 guilsinglleft
|
||||
!8C U+040A afii10059
|
||||
!8D U+040C afii10061
|
||||
!8E U+040B afii10060
|
||||
!8F U+040F afii10145
|
||||
!90 U+0452 afii10099
|
||||
!91 U+2018 quoteleft
|
||||
!92 U+2019 quoteright
|
||||
!93 U+201C quotedblleft
|
||||
!94 U+201D quotedblright
|
||||
!95 U+2022 bullet
|
||||
!96 U+2013 endash
|
||||
!97 U+2014 emdash
|
||||
!99 U+2122 trademark
|
||||
!9A U+0459 afii10106
|
||||
!9B U+203A guilsinglright
|
||||
!9C U+045A afii10107
|
||||
!9D U+045C afii10109
|
||||
!9E U+045B afii10108
|
||||
!9F U+045F afii10193
|
||||
!A0 U+00A0 space
|
||||
!A1 U+040E afii10062
|
||||
!A2 U+045E afii10110
|
||||
!A3 U+0408 afii10057
|
||||
!A4 U+00A4 currency
|
||||
!A5 U+0490 afii10050
|
||||
!A6 U+00A6 brokenbar
|
||||
!A7 U+00A7 section
|
||||
!A8 U+0401 afii10023
|
||||
!A9 U+00A9 copyright
|
||||
!AA U+0404 afii10053
|
||||
!AB U+00AB guillemotleft
|
||||
!AC U+00AC logicalnot
|
||||
!AD U+00AD hyphen
|
||||
!AE U+00AE registered
|
||||
!AF U+0407 afii10056
|
||||
!B0 U+00B0 degree
|
||||
!B1 U+00B1 plusminus
|
||||
!B2 U+0406 afii10055
|
||||
!B3 U+0456 afii10103
|
||||
!B4 U+0491 afii10098
|
||||
!B5 U+00B5 mu
|
||||
!B6 U+00B6 paragraph
|
||||
!B7 U+00B7 periodcentered
|
||||
!B8 U+0451 afii10071
|
||||
!B9 U+2116 afii61352
|
||||
!BA U+0454 afii10101
|
||||
!BB U+00BB guillemotright
|
||||
!BC U+0458 afii10105
|
||||
!BD U+0405 afii10054
|
||||
!BE U+0455 afii10102
|
||||
!BF U+0457 afii10104
|
||||
!C0 U+0410 afii10017
|
||||
!C1 U+0411 afii10018
|
||||
!C2 U+0412 afii10019
|
||||
!C3 U+0413 afii10020
|
||||
!C4 U+0414 afii10021
|
||||
!C5 U+0415 afii10022
|
||||
!C6 U+0416 afii10024
|
||||
!C7 U+0417 afii10025
|
||||
!C8 U+0418 afii10026
|
||||
!C9 U+0419 afii10027
|
||||
!CA U+041A afii10028
|
||||
!CB U+041B afii10029
|
||||
!CC U+041C afii10030
|
||||
!CD U+041D afii10031
|
||||
!CE U+041E afii10032
|
||||
!CF U+041F afii10033
|
||||
!D0 U+0420 afii10034
|
||||
!D1 U+0421 afii10035
|
||||
!D2 U+0422 afii10036
|
||||
!D3 U+0423 afii10037
|
||||
!D4 U+0424 afii10038
|
||||
!D5 U+0425 afii10039
|
||||
!D6 U+0426 afii10040
|
||||
!D7 U+0427 afii10041
|
||||
!D8 U+0428 afii10042
|
||||
!D9 U+0429 afii10043
|
||||
!DA U+042A afii10044
|
||||
!DB U+042B afii10045
|
||||
!DC U+042C afii10046
|
||||
!DD U+042D afii10047
|
||||
!DE U+042E afii10048
|
||||
!DF U+042F afii10049
|
||||
!E0 U+0430 afii10065
|
||||
!E1 U+0431 afii10066
|
||||
!E2 U+0432 afii10067
|
||||
!E3 U+0433 afii10068
|
||||
!E4 U+0434 afii10069
|
||||
!E5 U+0435 afii10070
|
||||
!E6 U+0436 afii10072
|
||||
!E7 U+0437 afii10073
|
||||
!E8 U+0438 afii10074
|
||||
!E9 U+0439 afii10075
|
||||
!EA U+043A afii10076
|
||||
!EB U+043B afii10077
|
||||
!EC U+043C afii10078
|
||||
!ED U+043D afii10079
|
||||
!EE U+043E afii10080
|
||||
!EF U+043F afii10081
|
||||
!F0 U+0440 afii10082
|
||||
!F1 U+0441 afii10083
|
||||
!F2 U+0442 afii10084
|
||||
!F3 U+0443 afii10085
|
||||
!F4 U+0444 afii10086
|
||||
!F5 U+0445 afii10087
|
||||
!F6 U+0446 afii10088
|
||||
!F7 U+0447 afii10089
|
||||
!F8 U+0448 afii10090
|
||||
!F9 U+0449 afii10091
|
||||
!FA U+044A afii10092
|
||||
!FB U+044B afii10093
|
||||
!FC U+044C afii10094
|
||||
!FD U+044D afii10095
|
||||
!FE U+044E afii10096
|
||||
!FF U+044F afii10097
|
||||
251
pdf/font/makefont/cp1252.map
Executable file
251
pdf/font/makefont/cp1252.map
Executable file
@@ -0,0 +1,251 @@
|
||||
!00 U+0000 .notdef
|
||||
!01 U+0001 .notdef
|
||||
!02 U+0002 .notdef
|
||||
!03 U+0003 .notdef
|
||||
!04 U+0004 .notdef
|
||||
!05 U+0005 .notdef
|
||||
!06 U+0006 .notdef
|
||||
!07 U+0007 .notdef
|
||||
!08 U+0008 .notdef
|
||||
!09 U+0009 .notdef
|
||||
!0A U+000A .notdef
|
||||
!0B U+000B .notdef
|
||||
!0C U+000C .notdef
|
||||
!0D U+000D .notdef
|
||||
!0E U+000E .notdef
|
||||
!0F U+000F .notdef
|
||||
!10 U+0010 .notdef
|
||||
!11 U+0011 .notdef
|
||||
!12 U+0012 .notdef
|
||||
!13 U+0013 .notdef
|
||||
!14 U+0014 .notdef
|
||||
!15 U+0015 .notdef
|
||||
!16 U+0016 .notdef
|
||||
!17 U+0017 .notdef
|
||||
!18 U+0018 .notdef
|
||||
!19 U+0019 .notdef
|
||||
!1A U+001A .notdef
|
||||
!1B U+001B .notdef
|
||||
!1C U+001C .notdef
|
||||
!1D U+001D .notdef
|
||||
!1E U+001E .notdef
|
||||
!1F U+001F .notdef
|
||||
!20 U+0020 space
|
||||
!21 U+0021 exclam
|
||||
!22 U+0022 quotedbl
|
||||
!23 U+0023 numbersign
|
||||
!24 U+0024 dollar
|
||||
!25 U+0025 percent
|
||||
!26 U+0026 ampersand
|
||||
!27 U+0027 quotesingle
|
||||
!28 U+0028 parenleft
|
||||
!29 U+0029 parenright
|
||||
!2A U+002A asterisk
|
||||
!2B U+002B plus
|
||||
!2C U+002C comma
|
||||
!2D U+002D hyphen
|
||||
!2E U+002E period
|
||||
!2F U+002F slash
|
||||
!30 U+0030 zero
|
||||
!31 U+0031 one
|
||||
!32 U+0032 two
|
||||
!33 U+0033 three
|
||||
!34 U+0034 four
|
||||
!35 U+0035 five
|
||||
!36 U+0036 six
|
||||
!37 U+0037 seven
|
||||
!38 U+0038 eight
|
||||
!39 U+0039 nine
|
||||
!3A U+003A colon
|
||||
!3B U+003B semicolon
|
||||
!3C U+003C less
|
||||
!3D U+003D equal
|
||||
!3E U+003E greater
|
||||
!3F U+003F question
|
||||
!40 U+0040 at
|
||||
!41 U+0041 A
|
||||
!42 U+0042 B
|
||||
!43 U+0043 C
|
||||
!44 U+0044 D
|
||||
!45 U+0045 E
|
||||
!46 U+0046 F
|
||||
!47 U+0047 G
|
||||
!48 U+0048 H
|
||||
!49 U+0049 I
|
||||
!4A U+004A J
|
||||
!4B U+004B K
|
||||
!4C U+004C L
|
||||
!4D U+004D M
|
||||
!4E U+004E N
|
||||
!4F U+004F O
|
||||
!50 U+0050 P
|
||||
!51 U+0051 Q
|
||||
!52 U+0052 R
|
||||
!53 U+0053 S
|
||||
!54 U+0054 T
|
||||
!55 U+0055 U
|
||||
!56 U+0056 V
|
||||
!57 U+0057 W
|
||||
!58 U+0058 X
|
||||
!59 U+0059 Y
|
||||
!5A U+005A Z
|
||||
!5B U+005B bracketleft
|
||||
!5C U+005C backslash
|
||||
!5D U+005D bracketright
|
||||
!5E U+005E asciicircum
|
||||
!5F U+005F underscore
|
||||
!60 U+0060 grave
|
||||
!61 U+0061 a
|
||||
!62 U+0062 b
|
||||
!63 U+0063 c
|
||||
!64 U+0064 d
|
||||
!65 U+0065 e
|
||||
!66 U+0066 f
|
||||
!67 U+0067 g
|
||||
!68 U+0068 h
|
||||
!69 U+0069 i
|
||||
!6A U+006A j
|
||||
!6B U+006B k
|
||||
!6C U+006C l
|
||||
!6D U+006D m
|
||||
!6E U+006E n
|
||||
!6F U+006F o
|
||||
!70 U+0070 p
|
||||
!71 U+0071 q
|
||||
!72 U+0072 r
|
||||
!73 U+0073 s
|
||||
!74 U+0074 t
|
||||
!75 U+0075 u
|
||||
!76 U+0076 v
|
||||
!77 U+0077 w
|
||||
!78 U+0078 x
|
||||
!79 U+0079 y
|
||||
!7A U+007A z
|
||||
!7B U+007B braceleft
|
||||
!7C U+007C bar
|
||||
!7D U+007D braceright
|
||||
!7E U+007E asciitilde
|
||||
!7F U+007F .notdef
|
||||
!80 U+20AC Euro
|
||||
!82 U+201A quotesinglbase
|
||||
!83 U+0192 florin
|
||||
!84 U+201E quotedblbase
|
||||
!85 U+2026 ellipsis
|
||||
!86 U+2020 dagger
|
||||
!87 U+2021 daggerdbl
|
||||
!88 U+02C6 circumflex
|
||||
!89 U+2030 perthousand
|
||||
!8A U+0160 Scaron
|
||||
!8B U+2039 guilsinglleft
|
||||
!8C U+0152 OE
|
||||
!8E U+017D Zcaron
|
||||
!91 U+2018 quoteleft
|
||||
!92 U+2019 quoteright
|
||||
!93 U+201C quotedblleft
|
||||
!94 U+201D quotedblright
|
||||
!95 U+2022 bullet
|
||||
!96 U+2013 endash
|
||||
!97 U+2014 emdash
|
||||
!98 U+02DC tilde
|
||||
!99 U+2122 trademark
|
||||
!9A U+0161 scaron
|
||||
!9B U+203A guilsinglright
|
||||
!9C U+0153 oe
|
||||
!9E U+017E zcaron
|
||||
!9F U+0178 Ydieresis
|
||||
!A0 U+00A0 space
|
||||
!A1 U+00A1 exclamdown
|
||||
!A2 U+00A2 cent
|
||||
!A3 U+00A3 sterling
|
||||
!A4 U+00A4 currency
|
||||
!A5 U+00A5 yen
|
||||
!A6 U+00A6 brokenbar
|
||||
!A7 U+00A7 section
|
||||
!A8 U+00A8 dieresis
|
||||
!A9 U+00A9 copyright
|
||||
!AA U+00AA ordfeminine
|
||||
!AB U+00AB guillemotleft
|
||||
!AC U+00AC logicalnot
|
||||
!AD U+00AD hyphen
|
||||
!AE U+00AE registered
|
||||
!AF U+00AF macron
|
||||
!B0 U+00B0 degree
|
||||
!B1 U+00B1 plusminus
|
||||
!B2 U+00B2 twosuperior
|
||||
!B3 U+00B3 threesuperior
|
||||
!B4 U+00B4 acute
|
||||
!B5 U+00B5 mu
|
||||
!B6 U+00B6 paragraph
|
||||
!B7 U+00B7 periodcentered
|
||||
!B8 U+00B8 cedilla
|
||||
!B9 U+00B9 onesuperior
|
||||
!BA U+00BA ordmasculine
|
||||
!BB U+00BB guillemotright
|
||||
!BC U+00BC onequarter
|
||||
!BD U+00BD onehalf
|
||||
!BE U+00BE threequarters
|
||||
!BF U+00BF questiondown
|
||||
!C0 U+00C0 Agrave
|
||||
!C1 U+00C1 Aacute
|
||||
!C2 U+00C2 Acircumflex
|
||||
!C3 U+00C3 Atilde
|
||||
!C4 U+00C4 Adieresis
|
||||
!C5 U+00C5 Aring
|
||||
!C6 U+00C6 AE
|
||||
!C7 U+00C7 Ccedilla
|
||||
!C8 U+00C8 Egrave
|
||||
!C9 U+00C9 Eacute
|
||||
!CA U+00CA Ecircumflex
|
||||
!CB U+00CB Edieresis
|
||||
!CC U+00CC Igrave
|
||||
!CD U+00CD Iacute
|
||||
!CE U+00CE Icircumflex
|
||||
!CF U+00CF Idieresis
|
||||
!D0 U+00D0 Eth
|
||||
!D1 U+00D1 Ntilde
|
||||
!D2 U+00D2 Ograve
|
||||
!D3 U+00D3 Oacute
|
||||
!D4 U+00D4 Ocircumflex
|
||||
!D5 U+00D5 Otilde
|
||||
!D6 U+00D6 Odieresis
|
||||
!D7 U+00D7 multiply
|
||||
!D8 U+00D8 Oslash
|
||||
!D9 U+00D9 Ugrave
|
||||
!DA U+00DA Uacute
|
||||
!DB U+00DB Ucircumflex
|
||||
!DC U+00DC Udieresis
|
||||
!DD U+00DD Yacute
|
||||
!DE U+00DE Thorn
|
||||
!DF U+00DF germandbls
|
||||
!E0 U+00E0 agrave
|
||||
!E1 U+00E1 aacute
|
||||
!E2 U+00E2 acircumflex
|
||||
!E3 U+00E3 atilde
|
||||
!E4 U+00E4 adieresis
|
||||
!E5 U+00E5 aring
|
||||
!E6 U+00E6 ae
|
||||
!E7 U+00E7 ccedilla
|
||||
!E8 U+00E8 egrave
|
||||
!E9 U+00E9 eacute
|
||||
!EA U+00EA ecircumflex
|
||||
!EB U+00EB edieresis
|
||||
!EC U+00EC igrave
|
||||
!ED U+00ED iacute
|
||||
!EE U+00EE icircumflex
|
||||
!EF U+00EF idieresis
|
||||
!F0 U+00F0 eth
|
||||
!F1 U+00F1 ntilde
|
||||
!F2 U+00F2 ograve
|
||||
!F3 U+00F3 oacute
|
||||
!F4 U+00F4 ocircumflex
|
||||
!F5 U+00F5 otilde
|
||||
!F6 U+00F6 odieresis
|
||||
!F7 U+00F7 divide
|
||||
!F8 U+00F8 oslash
|
||||
!F9 U+00F9 ugrave
|
||||
!FA U+00FA uacute
|
||||
!FB U+00FB ucircumflex
|
||||
!FC U+00FC udieresis
|
||||
!FD U+00FD yacute
|
||||
!FE U+00FE thorn
|
||||
!FF U+00FF ydieresis
|
||||
239
pdf/font/makefont/cp1253.map
Executable file
239
pdf/font/makefont/cp1253.map
Executable file
@@ -0,0 +1,239 @@
|
||||
!00 U+0000 .notdef
|
||||
!01 U+0001 .notdef
|
||||
!02 U+0002 .notdef
|
||||
!03 U+0003 .notdef
|
||||
!04 U+0004 .notdef
|
||||
!05 U+0005 .notdef
|
||||
!06 U+0006 .notdef
|
||||
!07 U+0007 .notdef
|
||||
!08 U+0008 .notdef
|
||||
!09 U+0009 .notdef
|
||||
!0A U+000A .notdef
|
||||
!0B U+000B .notdef
|
||||
!0C U+000C .notdef
|
||||
!0D U+000D .notdef
|
||||
!0E U+000E .notdef
|
||||
!0F U+000F .notdef
|
||||
!10 U+0010 .notdef
|
||||
!11 U+0011 .notdef
|
||||
!12 U+0012 .notdef
|
||||
!13 U+0013 .notdef
|
||||
!14 U+0014 .notdef
|
||||
!15 U+0015 .notdef
|
||||
!16 U+0016 .notdef
|
||||
!17 U+0017 .notdef
|
||||
!18 U+0018 .notdef
|
||||
!19 U+0019 .notdef
|
||||
!1A U+001A .notdef
|
||||
!1B U+001B .notdef
|
||||
!1C U+001C .notdef
|
||||
!1D U+001D .notdef
|
||||
!1E U+001E .notdef
|
||||
!1F U+001F .notdef
|
||||
!20 U+0020 space
|
||||
!21 U+0021 exclam
|
||||
!22 U+0022 quotedbl
|
||||
!23 U+0023 numbersign
|
||||
!24 U+0024 dollar
|
||||
!25 U+0025 percent
|
||||
!26 U+0026 ampersand
|
||||
!27 U+0027 quotesingle
|
||||
!28 U+0028 parenleft
|
||||
!29 U+0029 parenright
|
||||
!2A U+002A asterisk
|
||||
!2B U+002B plus
|
||||
!2C U+002C comma
|
||||
!2D U+002D hyphen
|
||||
!2E U+002E period
|
||||
!2F U+002F slash
|
||||
!30 U+0030 zero
|
||||
!31 U+0031 one
|
||||
!32 U+0032 two
|
||||
!33 U+0033 three
|
||||
!34 U+0034 four
|
||||
!35 U+0035 five
|
||||
!36 U+0036 six
|
||||
!37 U+0037 seven
|
||||
!38 U+0038 eight
|
||||
!39 U+0039 nine
|
||||
!3A U+003A colon
|
||||
!3B U+003B semicolon
|
||||
!3C U+003C less
|
||||
!3D U+003D equal
|
||||
!3E U+003E greater
|
||||
!3F U+003F question
|
||||
!40 U+0040 at
|
||||
!41 U+0041 A
|
||||
!42 U+0042 B
|
||||
!43 U+0043 C
|
||||
!44 U+0044 D
|
||||
!45 U+0045 E
|
||||
!46 U+0046 F
|
||||
!47 U+0047 G
|
||||
!48 U+0048 H
|
||||
!49 U+0049 I
|
||||
!4A U+004A J
|
||||
!4B U+004B K
|
||||
!4C U+004C L
|
||||
!4D U+004D M
|
||||
!4E U+004E N
|
||||
!4F U+004F O
|
||||
!50 U+0050 P
|
||||
!51 U+0051 Q
|
||||
!52 U+0052 R
|
||||
!53 U+0053 S
|
||||
!54 U+0054 T
|
||||
!55 U+0055 U
|
||||
!56 U+0056 V
|
||||
!57 U+0057 W
|
||||
!58 U+0058 X
|
||||
!59 U+0059 Y
|
||||
!5A U+005A Z
|
||||
!5B U+005B bracketleft
|
||||
!5C U+005C backslash
|
||||
!5D U+005D bracketright
|
||||
!5E U+005E asciicircum
|
||||
!5F U+005F underscore
|
||||
!60 U+0060 grave
|
||||
!61 U+0061 a
|
||||
!62 U+0062 b
|
||||
!63 U+0063 c
|
||||
!64 U+0064 d
|
||||
!65 U+0065 e
|
||||
!66 U+0066 f
|
||||
!67 U+0067 g
|
||||
!68 U+0068 h
|
||||
!69 U+0069 i
|
||||
!6A U+006A j
|
||||
!6B U+006B k
|
||||
!6C U+006C l
|
||||
!6D U+006D m
|
||||
!6E U+006E n
|
||||
!6F U+006F o
|
||||
!70 U+0070 p
|
||||
!71 U+0071 q
|
||||
!72 U+0072 r
|
||||
!73 U+0073 s
|
||||
!74 U+0074 t
|
||||
!75 U+0075 u
|
||||
!76 U+0076 v
|
||||
!77 U+0077 w
|
||||
!78 U+0078 x
|
||||
!79 U+0079 y
|
||||
!7A U+007A z
|
||||
!7B U+007B braceleft
|
||||
!7C U+007C bar
|
||||
!7D U+007D braceright
|
||||
!7E U+007E asciitilde
|
||||
!7F U+007F .notdef
|
||||
!80 U+20AC Euro
|
||||
!82 U+201A quotesinglbase
|
||||
!83 U+0192 florin
|
||||
!84 U+201E quotedblbase
|
||||
!85 U+2026 ellipsis
|
||||
!86 U+2020 dagger
|
||||
!87 U+2021 daggerdbl
|
||||
!89 U+2030 perthousand
|
||||
!8B U+2039 guilsinglleft
|
||||
!91 U+2018 quoteleft
|
||||
!92 U+2019 quoteright
|
||||
!93 U+201C quotedblleft
|
||||
!94 U+201D quotedblright
|
||||
!95 U+2022 bullet
|
||||
!96 U+2013 endash
|
||||
!97 U+2014 emdash
|
||||
!99 U+2122 trademark
|
||||
!9B U+203A guilsinglright
|
||||
!A0 U+00A0 space
|
||||
!A1 U+0385 dieresistonos
|
||||
!A2 U+0386 Alphatonos
|
||||
!A3 U+00A3 sterling
|
||||
!A4 U+00A4 currency
|
||||
!A5 U+00A5 yen
|
||||
!A6 U+00A6 brokenbar
|
||||
!A7 U+00A7 section
|
||||
!A8 U+00A8 dieresis
|
||||
!A9 U+00A9 copyright
|
||||
!AB U+00AB guillemotleft
|
||||
!AC U+00AC logicalnot
|
||||
!AD U+00AD hyphen
|
||||
!AE U+00AE registered
|
||||
!AF U+2015 afii00208
|
||||
!B0 U+00B0 degree
|
||||
!B1 U+00B1 plusminus
|
||||
!B2 U+00B2 twosuperior
|
||||
!B3 U+00B3 threesuperior
|
||||
!B4 U+0384 tonos
|
||||
!B5 U+00B5 mu
|
||||
!B6 U+00B6 paragraph
|
||||
!B7 U+00B7 periodcentered
|
||||
!B8 U+0388 Epsilontonos
|
||||
!B9 U+0389 Etatonos
|
||||
!BA U+038A Iotatonos
|
||||
!BB U+00BB guillemotright
|
||||
!BC U+038C Omicrontonos
|
||||
!BD U+00BD onehalf
|
||||
!BE U+038E Upsilontonos
|
||||
!BF U+038F Omegatonos
|
||||
!C0 U+0390 iotadieresistonos
|
||||
!C1 U+0391 Alpha
|
||||
!C2 U+0392 Beta
|
||||
!C3 U+0393 Gamma
|
||||
!C4 U+0394 Delta
|
||||
!C5 U+0395 Epsilon
|
||||
!C6 U+0396 Zeta
|
||||
!C7 U+0397 Eta
|
||||
!C8 U+0398 Theta
|
||||
!C9 U+0399 Iota
|
||||
!CA U+039A Kappa
|
||||
!CB U+039B Lambda
|
||||
!CC U+039C Mu
|
||||
!CD U+039D Nu
|
||||
!CE U+039E Xi
|
||||
!CF U+039F Omicron
|
||||
!D0 U+03A0 Pi
|
||||
!D1 U+03A1 Rho
|
||||
!D3 U+03A3 Sigma
|
||||
!D4 U+03A4 Tau
|
||||
!D5 U+03A5 Upsilon
|
||||
!D6 U+03A6 Phi
|
||||
!D7 U+03A7 Chi
|
||||
!D8 U+03A8 Psi
|
||||
!D9 U+03A9 Omega
|
||||
!DA U+03AA Iotadieresis
|
||||
!DB U+03AB Upsilondieresis
|
||||
!DC U+03AC alphatonos
|
||||
!DD U+03AD epsilontonos
|
||||
!DE U+03AE etatonos
|
||||
!DF U+03AF iotatonos
|
||||
!E0 U+03B0 upsilondieresistonos
|
||||
!E1 U+03B1 alpha
|
||||
!E2 U+03B2 beta
|
||||
!E3 U+03B3 gamma
|
||||
!E4 U+03B4 delta
|
||||
!E5 U+03B5 epsilon
|
||||
!E6 U+03B6 zeta
|
||||
!E7 U+03B7 eta
|
||||
!E8 U+03B8 theta
|
||||
!E9 U+03B9 iota
|
||||
!EA U+03BA kappa
|
||||
!EB U+03BB lambda
|
||||
!EC U+03BC mu
|
||||
!ED U+03BD nu
|
||||
!EE U+03BE xi
|
||||
!EF U+03BF omicron
|
||||
!F0 U+03C0 pi
|
||||
!F1 U+03C1 rho
|
||||
!F2 U+03C2 sigma1
|
||||
!F3 U+03C3 sigma
|
||||
!F4 U+03C4 tau
|
||||
!F5 U+03C5 upsilon
|
||||
!F6 U+03C6 phi
|
||||
!F7 U+03C7 chi
|
||||
!F8 U+03C8 psi
|
||||
!F9 U+03C9 omega
|
||||
!FA U+03CA iotadieresis
|
||||
!FB U+03CB upsilondieresis
|
||||
!FC U+03CC omicrontonos
|
||||
!FD U+03CD upsilontonos
|
||||
!FE U+03CE omegatonos
|
||||
249
pdf/font/makefont/cp1254.map
Executable file
249
pdf/font/makefont/cp1254.map
Executable file
@@ -0,0 +1,249 @@
|
||||
!00 U+0000 .notdef
|
||||
!01 U+0001 .notdef
|
||||
!02 U+0002 .notdef
|
||||
!03 U+0003 .notdef
|
||||
!04 U+0004 .notdef
|
||||
!05 U+0005 .notdef
|
||||
!06 U+0006 .notdef
|
||||
!07 U+0007 .notdef
|
||||
!08 U+0008 .notdef
|
||||
!09 U+0009 .notdef
|
||||
!0A U+000A .notdef
|
||||
!0B U+000B .notdef
|
||||
!0C U+000C .notdef
|
||||
!0D U+000D .notdef
|
||||
!0E U+000E .notdef
|
||||
!0F U+000F .notdef
|
||||
!10 U+0010 .notdef
|
||||
!11 U+0011 .notdef
|
||||
!12 U+0012 .notdef
|
||||
!13 U+0013 .notdef
|
||||
!14 U+0014 .notdef
|
||||
!15 U+0015 .notdef
|
||||
!16 U+0016 .notdef
|
||||
!17 U+0017 .notdef
|
||||
!18 U+0018 .notdef
|
||||
!19 U+0019 .notdef
|
||||
!1A U+001A .notdef
|
||||
!1B U+001B .notdef
|
||||
!1C U+001C .notdef
|
||||
!1D U+001D .notdef
|
||||
!1E U+001E .notdef
|
||||
!1F U+001F .notdef
|
||||
!20 U+0020 space
|
||||
!21 U+0021 exclam
|
||||
!22 U+0022 quotedbl
|
||||
!23 U+0023 numbersign
|
||||
!24 U+0024 dollar
|
||||
!25 U+0025 percent
|
||||
!26 U+0026 ampersand
|
||||
!27 U+0027 quotesingle
|
||||
!28 U+0028 parenleft
|
||||
!29 U+0029 parenright
|
||||
!2A U+002A asterisk
|
||||
!2B U+002B plus
|
||||
!2C U+002C comma
|
||||
!2D U+002D hyphen
|
||||
!2E U+002E period
|
||||
!2F U+002F slash
|
||||
!30 U+0030 zero
|
||||
!31 U+0031 one
|
||||
!32 U+0032 two
|
||||
!33 U+0033 three
|
||||
!34 U+0034 four
|
||||
!35 U+0035 five
|
||||
!36 U+0036 six
|
||||
!37 U+0037 seven
|
||||
!38 U+0038 eight
|
||||
!39 U+0039 nine
|
||||
!3A U+003A colon
|
||||
!3B U+003B semicolon
|
||||
!3C U+003C less
|
||||
!3D U+003D equal
|
||||
!3E U+003E greater
|
||||
!3F U+003F question
|
||||
!40 U+0040 at
|
||||
!41 U+0041 A
|
||||
!42 U+0042 B
|
||||
!43 U+0043 C
|
||||
!44 U+0044 D
|
||||
!45 U+0045 E
|
||||
!46 U+0046 F
|
||||
!47 U+0047 G
|
||||
!48 U+0048 H
|
||||
!49 U+0049 I
|
||||
!4A U+004A J
|
||||
!4B U+004B K
|
||||
!4C U+004C L
|
||||
!4D U+004D M
|
||||
!4E U+004E N
|
||||
!4F U+004F O
|
||||
!50 U+0050 P
|
||||
!51 U+0051 Q
|
||||
!52 U+0052 R
|
||||
!53 U+0053 S
|
||||
!54 U+0054 T
|
||||
!55 U+0055 U
|
||||
!56 U+0056 V
|
||||
!57 U+0057 W
|
||||
!58 U+0058 X
|
||||
!59 U+0059 Y
|
||||
!5A U+005A Z
|
||||
!5B U+005B bracketleft
|
||||
!5C U+005C backslash
|
||||
!5D U+005D bracketright
|
||||
!5E U+005E asciicircum
|
||||
!5F U+005F underscore
|
||||
!60 U+0060 grave
|
||||
!61 U+0061 a
|
||||
!62 U+0062 b
|
||||
!63 U+0063 c
|
||||
!64 U+0064 d
|
||||
!65 U+0065 e
|
||||
!66 U+0066 f
|
||||
!67 U+0067 g
|
||||
!68 U+0068 h
|
||||
!69 U+0069 i
|
||||
!6A U+006A j
|
||||
!6B U+006B k
|
||||
!6C U+006C l
|
||||
!6D U+006D m
|
||||
!6E U+006E n
|
||||
!6F U+006F o
|
||||
!70 U+0070 p
|
||||
!71 U+0071 q
|
||||
!72 U+0072 r
|
||||
!73 U+0073 s
|
||||
!74 U+0074 t
|
||||
!75 U+0075 u
|
||||
!76 U+0076 v
|
||||
!77 U+0077 w
|
||||
!78 U+0078 x
|
||||
!79 U+0079 y
|
||||
!7A U+007A z
|
||||
!7B U+007B braceleft
|
||||
!7C U+007C bar
|
||||
!7D U+007D braceright
|
||||
!7E U+007E asciitilde
|
||||
!7F U+007F .notdef
|
||||
!80 U+20AC Euro
|
||||
!82 U+201A quotesinglbase
|
||||
!83 U+0192 florin
|
||||
!84 U+201E quotedblbase
|
||||
!85 U+2026 ellipsis
|
||||
!86 U+2020 dagger
|
||||
!87 U+2021 daggerdbl
|
||||
!88 U+02C6 circumflex
|
||||
!89 U+2030 perthousand
|
||||
!8A U+0160 Scaron
|
||||
!8B U+2039 guilsinglleft
|
||||
!8C U+0152 OE
|
||||
!91 U+2018 quoteleft
|
||||
!92 U+2019 quoteright
|
||||
!93 U+201C quotedblleft
|
||||
!94 U+201D quotedblright
|
||||
!95 U+2022 bullet
|
||||
!96 U+2013 endash
|
||||
!97 U+2014 emdash
|
||||
!98 U+02DC tilde
|
||||
!99 U+2122 trademark
|
||||
!9A U+0161 scaron
|
||||
!9B U+203A guilsinglright
|
||||
!9C U+0153 oe
|
||||
!9F U+0178 Ydieresis
|
||||
!A0 U+00A0 space
|
||||
!A1 U+00A1 exclamdown
|
||||
!A2 U+00A2 cent
|
||||
!A3 U+00A3 sterling
|
||||
!A4 U+00A4 currency
|
||||
!A5 U+00A5 yen
|
||||
!A6 U+00A6 brokenbar
|
||||
!A7 U+00A7 section
|
||||
!A8 U+00A8 dieresis
|
||||
!A9 U+00A9 copyright
|
||||
!AA U+00AA ordfeminine
|
||||
!AB U+00AB guillemotleft
|
||||
!AC U+00AC logicalnot
|
||||
!AD U+00AD hyphen
|
||||
!AE U+00AE registered
|
||||
!AF U+00AF macron
|
||||
!B0 U+00B0 degree
|
||||
!B1 U+00B1 plusminus
|
||||
!B2 U+00B2 twosuperior
|
||||
!B3 U+00B3 threesuperior
|
||||
!B4 U+00B4 acute
|
||||
!B5 U+00B5 mu
|
||||
!B6 U+00B6 paragraph
|
||||
!B7 U+00B7 periodcentered
|
||||
!B8 U+00B8 cedilla
|
||||
!B9 U+00B9 onesuperior
|
||||
!BA U+00BA ordmasculine
|
||||
!BB U+00BB guillemotright
|
||||
!BC U+00BC onequarter
|
||||
!BD U+00BD onehalf
|
||||
!BE U+00BE threequarters
|
||||
!BF U+00BF questiondown
|
||||
!C0 U+00C0 Agrave
|
||||
!C1 U+00C1 Aacute
|
||||
!C2 U+00C2 Acircumflex
|
||||
!C3 U+00C3 Atilde
|
||||
!C4 U+00C4 Adieresis
|
||||
!C5 U+00C5 Aring
|
||||
!C6 U+00C6 AE
|
||||
!C7 U+00C7 Ccedilla
|
||||
!C8 U+00C8 Egrave
|
||||
!C9 U+00C9 Eacute
|
||||
!CA U+00CA Ecircumflex
|
||||
!CB U+00CB Edieresis
|
||||
!CC U+00CC Igrave
|
||||
!CD U+00CD Iacute
|
||||
!CE U+00CE Icircumflex
|
||||
!CF U+00CF Idieresis
|
||||
!D0 U+011E Gbreve
|
||||
!D1 U+00D1 Ntilde
|
||||
!D2 U+00D2 Ograve
|
||||
!D3 U+00D3 Oacute
|
||||
!D4 U+00D4 Ocircumflex
|
||||
!D5 U+00D5 Otilde
|
||||
!D6 U+00D6 Odieresis
|
||||
!D7 U+00D7 multiply
|
||||
!D8 U+00D8 Oslash
|
||||
!D9 U+00D9 Ugrave
|
||||
!DA U+00DA Uacute
|
||||
!DB U+00DB Ucircumflex
|
||||
!DC U+00DC Udieresis
|
||||
!DD U+0130 Idotaccent
|
||||
!DE U+015E Scedilla
|
||||
!DF U+00DF germandbls
|
||||
!E0 U+00E0 agrave
|
||||
!E1 U+00E1 aacute
|
||||
!E2 U+00E2 acircumflex
|
||||
!E3 U+00E3 atilde
|
||||
!E4 U+00E4 adieresis
|
||||
!E5 U+00E5 aring
|
||||
!E6 U+00E6 ae
|
||||
!E7 U+00E7 ccedilla
|
||||
!E8 U+00E8 egrave
|
||||
!E9 U+00E9 eacute
|
||||
!EA U+00EA ecircumflex
|
||||
!EB U+00EB edieresis
|
||||
!EC U+00EC igrave
|
||||
!ED U+00ED iacute
|
||||
!EE U+00EE icircumflex
|
||||
!EF U+00EF idieresis
|
||||
!F0 U+011F gbreve
|
||||
!F1 U+00F1 ntilde
|
||||
!F2 U+00F2 ograve
|
||||
!F3 U+00F3 oacute
|
||||
!F4 U+00F4 ocircumflex
|
||||
!F5 U+00F5 otilde
|
||||
!F6 U+00F6 odieresis
|
||||
!F7 U+00F7 divide
|
||||
!F8 U+00F8 oslash
|
||||
!F9 U+00F9 ugrave
|
||||
!FA U+00FA uacute
|
||||
!FB U+00FB ucircumflex
|
||||
!FC U+00FC udieresis
|
||||
!FD U+0131 dotlessi
|
||||
!FE U+015F scedilla
|
||||
!FF U+00FF ydieresis
|
||||
233
pdf/font/makefont/cp1255.map
Executable file
233
pdf/font/makefont/cp1255.map
Executable file
@@ -0,0 +1,233 @@
|
||||
!00 U+0000 .notdef
|
||||
!01 U+0001 .notdef
|
||||
!02 U+0002 .notdef
|
||||
!03 U+0003 .notdef
|
||||
!04 U+0004 .notdef
|
||||
!05 U+0005 .notdef
|
||||
!06 U+0006 .notdef
|
||||
!07 U+0007 .notdef
|
||||
!08 U+0008 .notdef
|
||||
!09 U+0009 .notdef
|
||||
!0A U+000A .notdef
|
||||
!0B U+000B .notdef
|
||||
!0C U+000C .notdef
|
||||
!0D U+000D .notdef
|
||||
!0E U+000E .notdef
|
||||
!0F U+000F .notdef
|
||||
!10 U+0010 .notdef
|
||||
!11 U+0011 .notdef
|
||||
!12 U+0012 .notdef
|
||||
!13 U+0013 .notdef
|
||||
!14 U+0014 .notdef
|
||||
!15 U+0015 .notdef
|
||||
!16 U+0016 .notdef
|
||||
!17 U+0017 .notdef
|
||||
!18 U+0018 .notdef
|
||||
!19 U+0019 .notdef
|
||||
!1A U+001A .notdef
|
||||
!1B U+001B .notdef
|
||||
!1C U+001C .notdef
|
||||
!1D U+001D .notdef
|
||||
!1E U+001E .notdef
|
||||
!1F U+001F .notdef
|
||||
!20 U+0020 space
|
||||
!21 U+0021 exclam
|
||||
!22 U+0022 quotedbl
|
||||
!23 U+0023 numbersign
|
||||
!24 U+0024 dollar
|
||||
!25 U+0025 percent
|
||||
!26 U+0026 ampersand
|
||||
!27 U+0027 quotesingle
|
||||
!28 U+0028 parenleft
|
||||
!29 U+0029 parenright
|
||||
!2A U+002A asterisk
|
||||
!2B U+002B plus
|
||||
!2C U+002C comma
|
||||
!2D U+002D hyphen
|
||||
!2E U+002E period
|
||||
!2F U+002F slash
|
||||
!30 U+0030 zero
|
||||
!31 U+0031 one
|
||||
!32 U+0032 two
|
||||
!33 U+0033 three
|
||||
!34 U+0034 four
|
||||
!35 U+0035 five
|
||||
!36 U+0036 six
|
||||
!37 U+0037 seven
|
||||
!38 U+0038 eight
|
||||
!39 U+0039 nine
|
||||
!3A U+003A colon
|
||||
!3B U+003B semicolon
|
||||
!3C U+003C less
|
||||
!3D U+003D equal
|
||||
!3E U+003E greater
|
||||
!3F U+003F question
|
||||
!40 U+0040 at
|
||||
!41 U+0041 A
|
||||
!42 U+0042 B
|
||||
!43 U+0043 C
|
||||
!44 U+0044 D
|
||||
!45 U+0045 E
|
||||
!46 U+0046 F
|
||||
!47 U+0047 G
|
||||
!48 U+0048 H
|
||||
!49 U+0049 I
|
||||
!4A U+004A J
|
||||
!4B U+004B K
|
||||
!4C U+004C L
|
||||
!4D U+004D M
|
||||
!4E U+004E N
|
||||
!4F U+004F O
|
||||
!50 U+0050 P
|
||||
!51 U+0051 Q
|
||||
!52 U+0052 R
|
||||
!53 U+0053 S
|
||||
!54 U+0054 T
|
||||
!55 U+0055 U
|
||||
!56 U+0056 V
|
||||
!57 U+0057 W
|
||||
!58 U+0058 X
|
||||
!59 U+0059 Y
|
||||
!5A U+005A Z
|
||||
!5B U+005B bracketleft
|
||||
!5C U+005C backslash
|
||||
!5D U+005D bracketright
|
||||
!5E U+005E asciicircum
|
||||
!5F U+005F underscore
|
||||
!60 U+0060 grave
|
||||
!61 U+0061 a
|
||||
!62 U+0062 b
|
||||
!63 U+0063 c
|
||||
!64 U+0064 d
|
||||
!65 U+0065 e
|
||||
!66 U+0066 f
|
||||
!67 U+0067 g
|
||||
!68 U+0068 h
|
||||
!69 U+0069 i
|
||||
!6A U+006A j
|
||||
!6B U+006B k
|
||||
!6C U+006C l
|
||||
!6D U+006D m
|
||||
!6E U+006E n
|
||||
!6F U+006F o
|
||||
!70 U+0070 p
|
||||
!71 U+0071 q
|
||||
!72 U+0072 r
|
||||
!73 U+0073 s
|
||||
!74 U+0074 t
|
||||
!75 U+0075 u
|
||||
!76 U+0076 v
|
||||
!77 U+0077 w
|
||||
!78 U+0078 x
|
||||
!79 U+0079 y
|
||||
!7A U+007A z
|
||||
!7B U+007B braceleft
|
||||
!7C U+007C bar
|
||||
!7D U+007D braceright
|
||||
!7E U+007E asciitilde
|
||||
!7F U+007F .notdef
|
||||
!80 U+20AC Euro
|
||||
!82 U+201A quotesinglbase
|
||||
!83 U+0192 florin
|
||||
!84 U+201E quotedblbase
|
||||
!85 U+2026 ellipsis
|
||||
!86 U+2020 dagger
|
||||
!87 U+2021 daggerdbl
|
||||
!88 U+02C6 circumflex
|
||||
!89 U+2030 perthousand
|
||||
!8B U+2039 guilsinglleft
|
||||
!91 U+2018 quoteleft
|
||||
!92 U+2019 quoteright
|
||||
!93 U+201C quotedblleft
|
||||
!94 U+201D quotedblright
|
||||
!95 U+2022 bullet
|
||||
!96 U+2013 endash
|
||||
!97 U+2014 emdash
|
||||
!98 U+02DC tilde
|
||||
!99 U+2122 trademark
|
||||
!9B U+203A guilsinglright
|
||||
!A0 U+00A0 space
|
||||
!A1 U+00A1 exclamdown
|
||||
!A2 U+00A2 cent
|
||||
!A3 U+00A3 sterling
|
||||
!A4 U+20AA afii57636
|
||||
!A5 U+00A5 yen
|
||||
!A6 U+00A6 brokenbar
|
||||
!A7 U+00A7 section
|
||||
!A8 U+00A8 dieresis
|
||||
!A9 U+00A9 copyright
|
||||
!AA U+00D7 multiply
|
||||
!AB U+00AB guillemotleft
|
||||
!AC U+00AC logicalnot
|
||||
!AD U+00AD sfthyphen
|
||||
!AE U+00AE registered
|
||||
!AF U+00AF macron
|
||||
!B0 U+00B0 degree
|
||||
!B1 U+00B1 plusminus
|
||||
!B2 U+00B2 twosuperior
|
||||
!B3 U+00B3 threesuperior
|
||||
!B4 U+00B4 acute
|
||||
!B5 U+00B5 mu
|
||||
!B6 U+00B6 paragraph
|
||||
!B7 U+00B7 middot
|
||||
!B8 U+00B8 cedilla
|
||||
!B9 U+00B9 onesuperior
|
||||
!BA U+00F7 divide
|
||||
!BB U+00BB guillemotright
|
||||
!BC U+00BC onequarter
|
||||
!BD U+00BD onehalf
|
||||
!BE U+00BE threequarters
|
||||
!BF U+00BF questiondown
|
||||
!C0 U+05B0 afii57799
|
||||
!C1 U+05B1 afii57801
|
||||
!C2 U+05B2 afii57800
|
||||
!C3 U+05B3 afii57802
|
||||
!C4 U+05B4 afii57793
|
||||
!C5 U+05B5 afii57794
|
||||
!C6 U+05B6 afii57795
|
||||
!C7 U+05B7 afii57798
|
||||
!C8 U+05B8 afii57797
|
||||
!C9 U+05B9 afii57806
|
||||
!CB U+05BB afii57796
|
||||
!CC U+05BC afii57807
|
||||
!CD U+05BD afii57839
|
||||
!CE U+05BE afii57645
|
||||
!CF U+05BF afii57841
|
||||
!D0 U+05C0 afii57842
|
||||
!D1 U+05C1 afii57804
|
||||
!D2 U+05C2 afii57803
|
||||
!D3 U+05C3 afii57658
|
||||
!D4 U+05F0 afii57716
|
||||
!D5 U+05F1 afii57717
|
||||
!D6 U+05F2 afii57718
|
||||
!D7 U+05F3 gereshhebrew
|
||||
!D8 U+05F4 gershayimhebrew
|
||||
!E0 U+05D0 afii57664
|
||||
!E1 U+05D1 afii57665
|
||||
!E2 U+05D2 afii57666
|
||||
!E3 U+05D3 afii57667
|
||||
!E4 U+05D4 afii57668
|
||||
!E5 U+05D5 afii57669
|
||||
!E6 U+05D6 afii57670
|
||||
!E7 U+05D7 afii57671
|
||||
!E8 U+05D8 afii57672
|
||||
!E9 U+05D9 afii57673
|
||||
!EA U+05DA afii57674
|
||||
!EB U+05DB afii57675
|
||||
!EC U+05DC afii57676
|
||||
!ED U+05DD afii57677
|
||||
!EE U+05DE afii57678
|
||||
!EF U+05DF afii57679
|
||||
!F0 U+05E0 afii57680
|
||||
!F1 U+05E1 afii57681
|
||||
!F2 U+05E2 afii57682
|
||||
!F3 U+05E3 afii57683
|
||||
!F4 U+05E4 afii57684
|
||||
!F5 U+05E5 afii57685
|
||||
!F6 U+05E6 afii57686
|
||||
!F7 U+05E7 afii57687
|
||||
!F8 U+05E8 afii57688
|
||||
!F9 U+05E9 afii57689
|
||||
!FA U+05EA afii57690
|
||||
!FD U+200E afii299
|
||||
!FE U+200F afii300
|
||||
244
pdf/font/makefont/cp1257.map
Executable file
244
pdf/font/makefont/cp1257.map
Executable file
@@ -0,0 +1,244 @@
|
||||
!00 U+0000 .notdef
|
||||
!01 U+0001 .notdef
|
||||
!02 U+0002 .notdef
|
||||
!03 U+0003 .notdef
|
||||
!04 U+0004 .notdef
|
||||
!05 U+0005 .notdef
|
||||
!06 U+0006 .notdef
|
||||
!07 U+0007 .notdef
|
||||
!08 U+0008 .notdef
|
||||
!09 U+0009 .notdef
|
||||
!0A U+000A .notdef
|
||||
!0B U+000B .notdef
|
||||
!0C U+000C .notdef
|
||||
!0D U+000D .notdef
|
||||
!0E U+000E .notdef
|
||||
!0F U+000F .notdef
|
||||
!10 U+0010 .notdef
|
||||
!11 U+0011 .notdef
|
||||
!12 U+0012 .notdef
|
||||
!13 U+0013 .notdef
|
||||
!14 U+0014 .notdef
|
||||
!15 U+0015 .notdef
|
||||
!16 U+0016 .notdef
|
||||
!17 U+0017 .notdef
|
||||
!18 U+0018 .notdef
|
||||
!19 U+0019 .notdef
|
||||
!1A U+001A .notdef
|
||||
!1B U+001B .notdef
|
||||
!1C U+001C .notdef
|
||||
!1D U+001D .notdef
|
||||
!1E U+001E .notdef
|
||||
!1F U+001F .notdef
|
||||
!20 U+0020 space
|
||||
!21 U+0021 exclam
|
||||
!22 U+0022 quotedbl
|
||||
!23 U+0023 numbersign
|
||||
!24 U+0024 dollar
|
||||
!25 U+0025 percent
|
||||
!26 U+0026 ampersand
|
||||
!27 U+0027 quotesingle
|
||||
!28 U+0028 parenleft
|
||||
!29 U+0029 parenright
|
||||
!2A U+002A asterisk
|
||||
!2B U+002B plus
|
||||
!2C U+002C comma
|
||||
!2D U+002D hyphen
|
||||
!2E U+002E period
|
||||
!2F U+002F slash
|
||||
!30 U+0030 zero
|
||||
!31 U+0031 one
|
||||
!32 U+0032 two
|
||||
!33 U+0033 three
|
||||
!34 U+0034 four
|
||||
!35 U+0035 five
|
||||
!36 U+0036 six
|
||||
!37 U+0037 seven
|
||||
!38 U+0038 eight
|
||||
!39 U+0039 nine
|
||||
!3A U+003A colon
|
||||
!3B U+003B semicolon
|
||||
!3C U+003C less
|
||||
!3D U+003D equal
|
||||
!3E U+003E greater
|
||||
!3F U+003F question
|
||||
!40 U+0040 at
|
||||
!41 U+0041 A
|
||||
!42 U+0042 B
|
||||
!43 U+0043 C
|
||||
!44 U+0044 D
|
||||
!45 U+0045 E
|
||||
!46 U+0046 F
|
||||
!47 U+0047 G
|
||||
!48 U+0048 H
|
||||
!49 U+0049 I
|
||||
!4A U+004A J
|
||||
!4B U+004B K
|
||||
!4C U+004C L
|
||||
!4D U+004D M
|
||||
!4E U+004E N
|
||||
!4F U+004F O
|
||||
!50 U+0050 P
|
||||
!51 U+0051 Q
|
||||
!52 U+0052 R
|
||||
!53 U+0053 S
|
||||
!54 U+0054 T
|
||||
!55 U+0055 U
|
||||
!56 U+0056 V
|
||||
!57 U+0057 W
|
||||
!58 U+0058 X
|
||||
!59 U+0059 Y
|
||||
!5A U+005A Z
|
||||
!5B U+005B bracketleft
|
||||
!5C U+005C backslash
|
||||
!5D U+005D bracketright
|
||||
!5E U+005E asciicircum
|
||||
!5F U+005F underscore
|
||||
!60 U+0060 grave
|
||||
!61 U+0061 a
|
||||
!62 U+0062 b
|
||||
!63 U+0063 c
|
||||
!64 U+0064 d
|
||||
!65 U+0065 e
|
||||
!66 U+0066 f
|
||||
!67 U+0067 g
|
||||
!68 U+0068 h
|
||||
!69 U+0069 i
|
||||
!6A U+006A j
|
||||
!6B U+006B k
|
||||
!6C U+006C l
|
||||
!6D U+006D m
|
||||
!6E U+006E n
|
||||
!6F U+006F o
|
||||
!70 U+0070 p
|
||||
!71 U+0071 q
|
||||
!72 U+0072 r
|
||||
!73 U+0073 s
|
||||
!74 U+0074 t
|
||||
!75 U+0075 u
|
||||
!76 U+0076 v
|
||||
!77 U+0077 w
|
||||
!78 U+0078 x
|
||||
!79 U+0079 y
|
||||
!7A U+007A z
|
||||
!7B U+007B braceleft
|
||||
!7C U+007C bar
|
||||
!7D U+007D braceright
|
||||
!7E U+007E asciitilde
|
||||
!7F U+007F .notdef
|
||||
!80 U+20AC Euro
|
||||
!82 U+201A quotesinglbase
|
||||
!84 U+201E quotedblbase
|
||||
!85 U+2026 ellipsis
|
||||
!86 U+2020 dagger
|
||||
!87 U+2021 daggerdbl
|
||||
!89 U+2030 perthousand
|
||||
!8B U+2039 guilsinglleft
|
||||
!8D U+00A8 dieresis
|
||||
!8E U+02C7 caron
|
||||
!8F U+00B8 cedilla
|
||||
!91 U+2018 quoteleft
|
||||
!92 U+2019 quoteright
|
||||
!93 U+201C quotedblleft
|
||||
!94 U+201D quotedblright
|
||||
!95 U+2022 bullet
|
||||
!96 U+2013 endash
|
||||
!97 U+2014 emdash
|
||||
!99 U+2122 trademark
|
||||
!9B U+203A guilsinglright
|
||||
!9D U+00AF macron
|
||||
!9E U+02DB ogonek
|
||||
!A0 U+00A0 space
|
||||
!A2 U+00A2 cent
|
||||
!A3 U+00A3 sterling
|
||||
!A4 U+00A4 currency
|
||||
!A6 U+00A6 brokenbar
|
||||
!A7 U+00A7 section
|
||||
!A8 U+00D8 Oslash
|
||||
!A9 U+00A9 copyright
|
||||
!AA U+0156 Rcommaaccent
|
||||
!AB U+00AB guillemotleft
|
||||
!AC U+00AC logicalnot
|
||||
!AD U+00AD hyphen
|
||||
!AE U+00AE registered
|
||||
!AF U+00C6 AE
|
||||
!B0 U+00B0 degree
|
||||
!B1 U+00B1 plusminus
|
||||
!B2 U+00B2 twosuperior
|
||||
!B3 U+00B3 threesuperior
|
||||
!B4 U+00B4 acute
|
||||
!B5 U+00B5 mu
|
||||
!B6 U+00B6 paragraph
|
||||
!B7 U+00B7 periodcentered
|
||||
!B8 U+00F8 oslash
|
||||
!B9 U+00B9 onesuperior
|
||||
!BA U+0157 rcommaaccent
|
||||
!BB U+00BB guillemotright
|
||||
!BC U+00BC onequarter
|
||||
!BD U+00BD onehalf
|
||||
!BE U+00BE threequarters
|
||||
!BF U+00E6 ae
|
||||
!C0 U+0104 Aogonek
|
||||
!C1 U+012E Iogonek
|
||||
!C2 U+0100 Amacron
|
||||
!C3 U+0106 Cacute
|
||||
!C4 U+00C4 Adieresis
|
||||
!C5 U+00C5 Aring
|
||||
!C6 U+0118 Eogonek
|
||||
!C7 U+0112 Emacron
|
||||
!C8 U+010C Ccaron
|
||||
!C9 U+00C9 Eacute
|
||||
!CA U+0179 Zacute
|
||||
!CB U+0116 Edotaccent
|
||||
!CC U+0122 Gcommaaccent
|
||||
!CD U+0136 Kcommaaccent
|
||||
!CE U+012A Imacron
|
||||
!CF U+013B Lcommaaccent
|
||||
!D0 U+0160 Scaron
|
||||
!D1 U+0143 Nacute
|
||||
!D2 U+0145 Ncommaaccent
|
||||
!D3 U+00D3 Oacute
|
||||
!D4 U+014C Omacron
|
||||
!D5 U+00D5 Otilde
|
||||
!D6 U+00D6 Odieresis
|
||||
!D7 U+00D7 multiply
|
||||
!D8 U+0172 Uogonek
|
||||
!D9 U+0141 Lslash
|
||||
!DA U+015A Sacute
|
||||
!DB U+016A Umacron
|
||||
!DC U+00DC Udieresis
|
||||
!DD U+017B Zdotaccent
|
||||
!DE U+017D Zcaron
|
||||
!DF U+00DF germandbls
|
||||
!E0 U+0105 aogonek
|
||||
!E1 U+012F iogonek
|
||||
!E2 U+0101 amacron
|
||||
!E3 U+0107 cacute
|
||||
!E4 U+00E4 adieresis
|
||||
!E5 U+00E5 aring
|
||||
!E6 U+0119 eogonek
|
||||
!E7 U+0113 emacron
|
||||
!E8 U+010D ccaron
|
||||
!E9 U+00E9 eacute
|
||||
!EA U+017A zacute
|
||||
!EB U+0117 edotaccent
|
||||
!EC U+0123 gcommaaccent
|
||||
!ED U+0137 kcommaaccent
|
||||
!EE U+012B imacron
|
||||
!EF U+013C lcommaaccent
|
||||
!F0 U+0161 scaron
|
||||
!F1 U+0144 nacute
|
||||
!F2 U+0146 ncommaaccent
|
||||
!F3 U+00F3 oacute
|
||||
!F4 U+014D omacron
|
||||
!F5 U+00F5 otilde
|
||||
!F6 U+00F6 odieresis
|
||||
!F7 U+00F7 divide
|
||||
!F8 U+0173 uogonek
|
||||
!F9 U+0142 lslash
|
||||
!FA U+015B sacute
|
||||
!FB U+016B umacron
|
||||
!FC U+00FC udieresis
|
||||
!FD U+017C zdotaccent
|
||||
!FE U+017E zcaron
|
||||
!FF U+02D9 dotaccent
|
||||
247
pdf/font/makefont/cp1258.map
Executable file
247
pdf/font/makefont/cp1258.map
Executable file
@@ -0,0 +1,247 @@
|
||||
!00 U+0000 .notdef
|
||||
!01 U+0001 .notdef
|
||||
!02 U+0002 .notdef
|
||||
!03 U+0003 .notdef
|
||||
!04 U+0004 .notdef
|
||||
!05 U+0005 .notdef
|
||||
!06 U+0006 .notdef
|
||||
!07 U+0007 .notdef
|
||||
!08 U+0008 .notdef
|
||||
!09 U+0009 .notdef
|
||||
!0A U+000A .notdef
|
||||
!0B U+000B .notdef
|
||||
!0C U+000C .notdef
|
||||
!0D U+000D .notdef
|
||||
!0E U+000E .notdef
|
||||
!0F U+000F .notdef
|
||||
!10 U+0010 .notdef
|
||||
!11 U+0011 .notdef
|
||||
!12 U+0012 .notdef
|
||||
!13 U+0013 .notdef
|
||||
!14 U+0014 .notdef
|
||||
!15 U+0015 .notdef
|
||||
!16 U+0016 .notdef
|
||||
!17 U+0017 .notdef
|
||||
!18 U+0018 .notdef
|
||||
!19 U+0019 .notdef
|
||||
!1A U+001A .notdef
|
||||
!1B U+001B .notdef
|
||||
!1C U+001C .notdef
|
||||
!1D U+001D .notdef
|
||||
!1E U+001E .notdef
|
||||
!1F U+001F .notdef
|
||||
!20 U+0020 space
|
||||
!21 U+0021 exclam
|
||||
!22 U+0022 quotedbl
|
||||
!23 U+0023 numbersign
|
||||
!24 U+0024 dollar
|
||||
!25 U+0025 percent
|
||||
!26 U+0026 ampersand
|
||||
!27 U+0027 quotesingle
|
||||
!28 U+0028 parenleft
|
||||
!29 U+0029 parenright
|
||||
!2A U+002A asterisk
|
||||
!2B U+002B plus
|
||||
!2C U+002C comma
|
||||
!2D U+002D hyphen
|
||||
!2E U+002E period
|
||||
!2F U+002F slash
|
||||
!30 U+0030 zero
|
||||
!31 U+0031 one
|
||||
!32 U+0032 two
|
||||
!33 U+0033 three
|
||||
!34 U+0034 four
|
||||
!35 U+0035 five
|
||||
!36 U+0036 six
|
||||
!37 U+0037 seven
|
||||
!38 U+0038 eight
|
||||
!39 U+0039 nine
|
||||
!3A U+003A colon
|
||||
!3B U+003B semicolon
|
||||
!3C U+003C less
|
||||
!3D U+003D equal
|
||||
!3E U+003E greater
|
||||
!3F U+003F question
|
||||
!40 U+0040 at
|
||||
!41 U+0041 A
|
||||
!42 U+0042 B
|
||||
!43 U+0043 C
|
||||
!44 U+0044 D
|
||||
!45 U+0045 E
|
||||
!46 U+0046 F
|
||||
!47 U+0047 G
|
||||
!48 U+0048 H
|
||||
!49 U+0049 I
|
||||
!4A U+004A J
|
||||
!4B U+004B K
|
||||
!4C U+004C L
|
||||
!4D U+004D M
|
||||
!4E U+004E N
|
||||
!4F U+004F O
|
||||
!50 U+0050 P
|
||||
!51 U+0051 Q
|
||||
!52 U+0052 R
|
||||
!53 U+0053 S
|
||||
!54 U+0054 T
|
||||
!55 U+0055 U
|
||||
!56 U+0056 V
|
||||
!57 U+0057 W
|
||||
!58 U+0058 X
|
||||
!59 U+0059 Y
|
||||
!5A U+005A Z
|
||||
!5B U+005B bracketleft
|
||||
!5C U+005C backslash
|
||||
!5D U+005D bracketright
|
||||
!5E U+005E asciicircum
|
||||
!5F U+005F underscore
|
||||
!60 U+0060 grave
|
||||
!61 U+0061 a
|
||||
!62 U+0062 b
|
||||
!63 U+0063 c
|
||||
!64 U+0064 d
|
||||
!65 U+0065 e
|
||||
!66 U+0066 f
|
||||
!67 U+0067 g
|
||||
!68 U+0068 h
|
||||
!69 U+0069 i
|
||||
!6A U+006A j
|
||||
!6B U+006B k
|
||||
!6C U+006C l
|
||||
!6D U+006D m
|
||||
!6E U+006E n
|
||||
!6F U+006F o
|
||||
!70 U+0070 p
|
||||
!71 U+0071 q
|
||||
!72 U+0072 r
|
||||
!73 U+0073 s
|
||||
!74 U+0074 t
|
||||
!75 U+0075 u
|
||||
!76 U+0076 v
|
||||
!77 U+0077 w
|
||||
!78 U+0078 x
|
||||
!79 U+0079 y
|
||||
!7A U+007A z
|
||||
!7B U+007B braceleft
|
||||
!7C U+007C bar
|
||||
!7D U+007D braceright
|
||||
!7E U+007E asciitilde
|
||||
!7F U+007F .notdef
|
||||
!80 U+20AC Euro
|
||||
!82 U+201A quotesinglbase
|
||||
!83 U+0192 florin
|
||||
!84 U+201E quotedblbase
|
||||
!85 U+2026 ellipsis
|
||||
!86 U+2020 dagger
|
||||
!87 U+2021 daggerdbl
|
||||
!88 U+02C6 circumflex
|
||||
!89 U+2030 perthousand
|
||||
!8B U+2039 guilsinglleft
|
||||
!8C U+0152 OE
|
||||
!91 U+2018 quoteleft
|
||||
!92 U+2019 quoteright
|
||||
!93 U+201C quotedblleft
|
||||
!94 U+201D quotedblright
|
||||
!95 U+2022 bullet
|
||||
!96 U+2013 endash
|
||||
!97 U+2014 emdash
|
||||
!98 U+02DC tilde
|
||||
!99 U+2122 trademark
|
||||
!9B U+203A guilsinglright
|
||||
!9C U+0153 oe
|
||||
!9F U+0178 Ydieresis
|
||||
!A0 U+00A0 space
|
||||
!A1 U+00A1 exclamdown
|
||||
!A2 U+00A2 cent
|
||||
!A3 U+00A3 sterling
|
||||
!A4 U+00A4 currency
|
||||
!A5 U+00A5 yen
|
||||
!A6 U+00A6 brokenbar
|
||||
!A7 U+00A7 section
|
||||
!A8 U+00A8 dieresis
|
||||
!A9 U+00A9 copyright
|
||||
!AA U+00AA ordfeminine
|
||||
!AB U+00AB guillemotleft
|
||||
!AC U+00AC logicalnot
|
||||
!AD U+00AD hyphen
|
||||
!AE U+00AE registered
|
||||
!AF U+00AF macron
|
||||
!B0 U+00B0 degree
|
||||
!B1 U+00B1 plusminus
|
||||
!B2 U+00B2 twosuperior
|
||||
!B3 U+00B3 threesuperior
|
||||
!B4 U+00B4 acute
|
||||
!B5 U+00B5 mu
|
||||
!B6 U+00B6 paragraph
|
||||
!B7 U+00B7 periodcentered
|
||||
!B8 U+00B8 cedilla
|
||||
!B9 U+00B9 onesuperior
|
||||
!BA U+00BA ordmasculine
|
||||
!BB U+00BB guillemotright
|
||||
!BC U+00BC onequarter
|
||||
!BD U+00BD onehalf
|
||||
!BE U+00BE threequarters
|
||||
!BF U+00BF questiondown
|
||||
!C0 U+00C0 Agrave
|
||||
!C1 U+00C1 Aacute
|
||||
!C2 U+00C2 Acircumflex
|
||||
!C3 U+0102 Abreve
|
||||
!C4 U+00C4 Adieresis
|
||||
!C5 U+00C5 Aring
|
||||
!C6 U+00C6 AE
|
||||
!C7 U+00C7 Ccedilla
|
||||
!C8 U+00C8 Egrave
|
||||
!C9 U+00C9 Eacute
|
||||
!CA U+00CA Ecircumflex
|
||||
!CB U+00CB Edieresis
|
||||
!CC U+0300 gravecomb
|
||||
!CD U+00CD Iacute
|
||||
!CE U+00CE Icircumflex
|
||||
!CF U+00CF Idieresis
|
||||
!D0 U+0110 Dcroat
|
||||
!D1 U+00D1 Ntilde
|
||||
!D2 U+0309 hookabovecomb
|
||||
!D3 U+00D3 Oacute
|
||||
!D4 U+00D4 Ocircumflex
|
||||
!D5 U+01A0 Ohorn
|
||||
!D6 U+00D6 Odieresis
|
||||
!D7 U+00D7 multiply
|
||||
!D8 U+00D8 Oslash
|
||||
!D9 U+00D9 Ugrave
|
||||
!DA U+00DA Uacute
|
||||
!DB U+00DB Ucircumflex
|
||||
!DC U+00DC Udieresis
|
||||
!DD U+01AF Uhorn
|
||||
!DE U+0303 tildecomb
|
||||
!DF U+00DF germandbls
|
||||
!E0 U+00E0 agrave
|
||||
!E1 U+00E1 aacute
|
||||
!E2 U+00E2 acircumflex
|
||||
!E3 U+0103 abreve
|
||||
!E4 U+00E4 adieresis
|
||||
!E5 U+00E5 aring
|
||||
!E6 U+00E6 ae
|
||||
!E7 U+00E7 ccedilla
|
||||
!E8 U+00E8 egrave
|
||||
!E9 U+00E9 eacute
|
||||
!EA U+00EA ecircumflex
|
||||
!EB U+00EB edieresis
|
||||
!EC U+0301 acutecomb
|
||||
!ED U+00ED iacute
|
||||
!EE U+00EE icircumflex
|
||||
!EF U+00EF idieresis
|
||||
!F0 U+0111 dcroat
|
||||
!F1 U+00F1 ntilde
|
||||
!F2 U+0323 dotbelowcomb
|
||||
!F3 U+00F3 oacute
|
||||
!F4 U+00F4 ocircumflex
|
||||
!F5 U+01A1 ohorn
|
||||
!F6 U+00F6 odieresis
|
||||
!F7 U+00F7 divide
|
||||
!F8 U+00F8 oslash
|
||||
!F9 U+00F9 ugrave
|
||||
!FA U+00FA uacute
|
||||
!FB U+00FB ucircumflex
|
||||
!FC U+00FC udieresis
|
||||
!FD U+01B0 uhorn
|
||||
!FE U+20AB dong
|
||||
!FF U+00FF ydieresis
|
||||
225
pdf/font/makefont/cp874.map
Executable file
225
pdf/font/makefont/cp874.map
Executable file
@@ -0,0 +1,225 @@
|
||||
!00 U+0000 .notdef
|
||||
!01 U+0001 .notdef
|
||||
!02 U+0002 .notdef
|
||||
!03 U+0003 .notdef
|
||||
!04 U+0004 .notdef
|
||||
!05 U+0005 .notdef
|
||||
!06 U+0006 .notdef
|
||||
!07 U+0007 .notdef
|
||||
!08 U+0008 .notdef
|
||||
!09 U+0009 .notdef
|
||||
!0A U+000A .notdef
|
||||
!0B U+000B .notdef
|
||||
!0C U+000C .notdef
|
||||
!0D U+000D .notdef
|
||||
!0E U+000E .notdef
|
||||
!0F U+000F .notdef
|
||||
!10 U+0010 .notdef
|
||||
!11 U+0011 .notdef
|
||||
!12 U+0012 .notdef
|
||||
!13 U+0013 .notdef
|
||||
!14 U+0014 .notdef
|
||||
!15 U+0015 .notdef
|
||||
!16 U+0016 .notdef
|
||||
!17 U+0017 .notdef
|
||||
!18 U+0018 .notdef
|
||||
!19 U+0019 .notdef
|
||||
!1A U+001A .notdef
|
||||
!1B U+001B .notdef
|
||||
!1C U+001C .notdef
|
||||
!1D U+001D .notdef
|
||||
!1E U+001E .notdef
|
||||
!1F U+001F .notdef
|
||||
!20 U+0020 space
|
||||
!21 U+0021 exclam
|
||||
!22 U+0022 quotedbl
|
||||
!23 U+0023 numbersign
|
||||
!24 U+0024 dollar
|
||||
!25 U+0025 percent
|
||||
!26 U+0026 ampersand
|
||||
!27 U+0027 quotesingle
|
||||
!28 U+0028 parenleft
|
||||
!29 U+0029 parenright
|
||||
!2A U+002A asterisk
|
||||
!2B U+002B plus
|
||||
!2C U+002C comma
|
||||
!2D U+002D hyphen
|
||||
!2E U+002E period
|
||||
!2F U+002F slash
|
||||
!30 U+0030 zero
|
||||
!31 U+0031 one
|
||||
!32 U+0032 two
|
||||
!33 U+0033 three
|
||||
!34 U+0034 four
|
||||
!35 U+0035 five
|
||||
!36 U+0036 six
|
||||
!37 U+0037 seven
|
||||
!38 U+0038 eight
|
||||
!39 U+0039 nine
|
||||
!3A U+003A colon
|
||||
!3B U+003B semicolon
|
||||
!3C U+003C less
|
||||
!3D U+003D equal
|
||||
!3E U+003E greater
|
||||
!3F U+003F question
|
||||
!40 U+0040 at
|
||||
!41 U+0041 A
|
||||
!42 U+0042 B
|
||||
!43 U+0043 C
|
||||
!44 U+0044 D
|
||||
!45 U+0045 E
|
||||
!46 U+0046 F
|
||||
!47 U+0047 G
|
||||
!48 U+0048 H
|
||||
!49 U+0049 I
|
||||
!4A U+004A J
|
||||
!4B U+004B K
|
||||
!4C U+004C L
|
||||
!4D U+004D M
|
||||
!4E U+004E N
|
||||
!4F U+004F O
|
||||
!50 U+0050 P
|
||||
!51 U+0051 Q
|
||||
!52 U+0052 R
|
||||
!53 U+0053 S
|
||||
!54 U+0054 T
|
||||
!55 U+0055 U
|
||||
!56 U+0056 V
|
||||
!57 U+0057 W
|
||||
!58 U+0058 X
|
||||
!59 U+0059 Y
|
||||
!5A U+005A Z
|
||||
!5B U+005B bracketleft
|
||||
!5C U+005C backslash
|
||||
!5D U+005D bracketright
|
||||
!5E U+005E asciicircum
|
||||
!5F U+005F underscore
|
||||
!60 U+0060 grave
|
||||
!61 U+0061 a
|
||||
!62 U+0062 b
|
||||
!63 U+0063 c
|
||||
!64 U+0064 d
|
||||
!65 U+0065 e
|
||||
!66 U+0066 f
|
||||
!67 U+0067 g
|
||||
!68 U+0068 h
|
||||
!69 U+0069 i
|
||||
!6A U+006A j
|
||||
!6B U+006B k
|
||||
!6C U+006C l
|
||||
!6D U+006D m
|
||||
!6E U+006E n
|
||||
!6F U+006F o
|
||||
!70 U+0070 p
|
||||
!71 U+0071 q
|
||||
!72 U+0072 r
|
||||
!73 U+0073 s
|
||||
!74 U+0074 t
|
||||
!75 U+0075 u
|
||||
!76 U+0076 v
|
||||
!77 U+0077 w
|
||||
!78 U+0078 x
|
||||
!79 U+0079 y
|
||||
!7A U+007A z
|
||||
!7B U+007B braceleft
|
||||
!7C U+007C bar
|
||||
!7D U+007D braceright
|
||||
!7E U+007E asciitilde
|
||||
!7F U+007F .notdef
|
||||
!80 U+20AC Euro
|
||||
!85 U+2026 ellipsis
|
||||
!91 U+2018 quoteleft
|
||||
!92 U+2019 quoteright
|
||||
!93 U+201C quotedblleft
|
||||
!94 U+201D quotedblright
|
||||
!95 U+2022 bullet
|
||||
!96 U+2013 endash
|
||||
!97 U+2014 emdash
|
||||
!A0 U+00A0 space
|
||||
!A1 U+0E01 kokaithai
|
||||
!A2 U+0E02 khokhaithai
|
||||
!A3 U+0E03 khokhuatthai
|
||||
!A4 U+0E04 khokhwaithai
|
||||
!A5 U+0E05 khokhonthai
|
||||
!A6 U+0E06 khorakhangthai
|
||||
!A7 U+0E07 ngonguthai
|
||||
!A8 U+0E08 chochanthai
|
||||
!A9 U+0E09 chochingthai
|
||||
!AA U+0E0A chochangthai
|
||||
!AB U+0E0B sosothai
|
||||
!AC U+0E0C chochoethai
|
||||
!AD U+0E0D yoyingthai
|
||||
!AE U+0E0E dochadathai
|
||||
!AF U+0E0F topatakthai
|
||||
!B0 U+0E10 thothanthai
|
||||
!B1 U+0E11 thonangmonthothai
|
||||
!B2 U+0E12 thophuthaothai
|
||||
!B3 U+0E13 nonenthai
|
||||
!B4 U+0E14 dodekthai
|
||||
!B5 U+0E15 totaothai
|
||||
!B6 U+0E16 thothungthai
|
||||
!B7 U+0E17 thothahanthai
|
||||
!B8 U+0E18 thothongthai
|
||||
!B9 U+0E19 nonuthai
|
||||
!BA U+0E1A bobaimaithai
|
||||
!BB U+0E1B poplathai
|
||||
!BC U+0E1C phophungthai
|
||||
!BD U+0E1D fofathai
|
||||
!BE U+0E1E phophanthai
|
||||
!BF U+0E1F fofanthai
|
||||
!C0 U+0E20 phosamphaothai
|
||||
!C1 U+0E21 momathai
|
||||
!C2 U+0E22 yoyakthai
|
||||
!C3 U+0E23 roruathai
|
||||
!C4 U+0E24 ruthai
|
||||
!C5 U+0E25 lolingthai
|
||||
!C6 U+0E26 luthai
|
||||
!C7 U+0E27 wowaenthai
|
||||
!C8 U+0E28 sosalathai
|
||||
!C9 U+0E29 sorusithai
|
||||
!CA U+0E2A sosuathai
|
||||
!CB U+0E2B hohipthai
|
||||
!CC U+0E2C lochulathai
|
||||
!CD U+0E2D oangthai
|
||||
!CE U+0E2E honokhukthai
|
||||
!CF U+0E2F paiyannoithai
|
||||
!D0 U+0E30 saraathai
|
||||
!D1 U+0E31 maihanakatthai
|
||||
!D2 U+0E32 saraaathai
|
||||
!D3 U+0E33 saraamthai
|
||||
!D4 U+0E34 saraithai
|
||||
!D5 U+0E35 saraiithai
|
||||
!D6 U+0E36 sarauethai
|
||||
!D7 U+0E37 saraueethai
|
||||
!D8 U+0E38 sarauthai
|
||||
!D9 U+0E39 sarauuthai
|
||||
!DA U+0E3A phinthuthai
|
||||
!DF U+0E3F bahtthai
|
||||
!E0 U+0E40 saraethai
|
||||
!E1 U+0E41 saraaethai
|
||||
!E2 U+0E42 saraothai
|
||||
!E3 U+0E43 saraaimaimuanthai
|
||||
!E4 U+0E44 saraaimaimalaithai
|
||||
!E5 U+0E45 lakkhangyaothai
|
||||
!E6 U+0E46 maiyamokthai
|
||||
!E7 U+0E47 maitaikhuthai
|
||||
!E8 U+0E48 maiekthai
|
||||
!E9 U+0E49 maithothai
|
||||
!EA U+0E4A maitrithai
|
||||
!EB U+0E4B maichattawathai
|
||||
!EC U+0E4C thanthakhatthai
|
||||
!ED U+0E4D nikhahitthai
|
||||
!EE U+0E4E yamakkanthai
|
||||
!EF U+0E4F fongmanthai
|
||||
!F0 U+0E50 zerothai
|
||||
!F1 U+0E51 onethai
|
||||
!F2 U+0E52 twothai
|
||||
!F3 U+0E53 threethai
|
||||
!F4 U+0E54 fourthai
|
||||
!F5 U+0E55 fivethai
|
||||
!F6 U+0E56 sixthai
|
||||
!F7 U+0E57 seventhai
|
||||
!F8 U+0E58 eightthai
|
||||
!F9 U+0E59 ninethai
|
||||
!FA U+0E5A angkhankhuthai
|
||||
!FB U+0E5B khomutthai
|
||||
6
pdf/font/makefont/createfont.php
Executable file
6
pdf/font/makefont/createfont.php
Executable file
@@ -0,0 +1,6 @@
|
||||
<?php
|
||||
|
||||
include_once("makefont.php");
|
||||
|
||||
MakeFont('verdana.ttf','verdana.afm','cp1252');
|
||||
?>
|
||||
256
pdf/font/makefont/iso-8859-1.map
Executable file
256
pdf/font/makefont/iso-8859-1.map
Executable file
@@ -0,0 +1,256 @@
|
||||
!00 U+0000 .notdef
|
||||
!01 U+0001 .notdef
|
||||
!02 U+0002 .notdef
|
||||
!03 U+0003 .notdef
|
||||
!04 U+0004 .notdef
|
||||
!05 U+0005 .notdef
|
||||
!06 U+0006 .notdef
|
||||
!07 U+0007 .notdef
|
||||
!08 U+0008 .notdef
|
||||
!09 U+0009 .notdef
|
||||
!0A U+000A .notdef
|
||||
!0B U+000B .notdef
|
||||
!0C U+000C .notdef
|
||||
!0D U+000D .notdef
|
||||
!0E U+000E .notdef
|
||||
!0F U+000F .notdef
|
||||
!10 U+0010 .notdef
|
||||
!11 U+0011 .notdef
|
||||
!12 U+0012 .notdef
|
||||
!13 U+0013 .notdef
|
||||
!14 U+0014 .notdef
|
||||
!15 U+0015 .notdef
|
||||
!16 U+0016 .notdef
|
||||
!17 U+0017 .notdef
|
||||
!18 U+0018 .notdef
|
||||
!19 U+0019 .notdef
|
||||
!1A U+001A .notdef
|
||||
!1B U+001B .notdef
|
||||
!1C U+001C .notdef
|
||||
!1D U+001D .notdef
|
||||
!1E U+001E .notdef
|
||||
!1F U+001F .notdef
|
||||
!20 U+0020 space
|
||||
!21 U+0021 exclam
|
||||
!22 U+0022 quotedbl
|
||||
!23 U+0023 numbersign
|
||||
!24 U+0024 dollar
|
||||
!25 U+0025 percent
|
||||
!26 U+0026 ampersand
|
||||
!27 U+0027 quotesingle
|
||||
!28 U+0028 parenleft
|
||||
!29 U+0029 parenright
|
||||
!2A U+002A asterisk
|
||||
!2B U+002B plus
|
||||
!2C U+002C comma
|
||||
!2D U+002D hyphen
|
||||
!2E U+002E period
|
||||
!2F U+002F slash
|
||||
!30 U+0030 zero
|
||||
!31 U+0031 one
|
||||
!32 U+0032 two
|
||||
!33 U+0033 three
|
||||
!34 U+0034 four
|
||||
!35 U+0035 five
|
||||
!36 U+0036 six
|
||||
!37 U+0037 seven
|
||||
!38 U+0038 eight
|
||||
!39 U+0039 nine
|
||||
!3A U+003A colon
|
||||
!3B U+003B semicolon
|
||||
!3C U+003C less
|
||||
!3D U+003D equal
|
||||
!3E U+003E greater
|
||||
!3F U+003F question
|
||||
!40 U+0040 at
|
||||
!41 U+0041 A
|
||||
!42 U+0042 B
|
||||
!43 U+0043 C
|
||||
!44 U+0044 D
|
||||
!45 U+0045 E
|
||||
!46 U+0046 F
|
||||
!47 U+0047 G
|
||||
!48 U+0048 H
|
||||
!49 U+0049 I
|
||||
!4A U+004A J
|
||||
!4B U+004B K
|
||||
!4C U+004C L
|
||||
!4D U+004D M
|
||||
!4E U+004E N
|
||||
!4F U+004F O
|
||||
!50 U+0050 P
|
||||
!51 U+0051 Q
|
||||
!52 U+0052 R
|
||||
!53 U+0053 S
|
||||
!54 U+0054 T
|
||||
!55 U+0055 U
|
||||
!56 U+0056 V
|
||||
!57 U+0057 W
|
||||
!58 U+0058 X
|
||||
!59 U+0059 Y
|
||||
!5A U+005A Z
|
||||
!5B U+005B bracketleft
|
||||
!5C U+005C backslash
|
||||
!5D U+005D bracketright
|
||||
!5E U+005E asciicircum
|
||||
!5F U+005F underscore
|
||||
!60 U+0060 grave
|
||||
!61 U+0061 a
|
||||
!62 U+0062 b
|
||||
!63 U+0063 c
|
||||
!64 U+0064 d
|
||||
!65 U+0065 e
|
||||
!66 U+0066 f
|
||||
!67 U+0067 g
|
||||
!68 U+0068 h
|
||||
!69 U+0069 i
|
||||
!6A U+006A j
|
||||
!6B U+006B k
|
||||
!6C U+006C l
|
||||
!6D U+006D m
|
||||
!6E U+006E n
|
||||
!6F U+006F o
|
||||
!70 U+0070 p
|
||||
!71 U+0071 q
|
||||
!72 U+0072 r
|
||||
!73 U+0073 s
|
||||
!74 U+0074 t
|
||||
!75 U+0075 u
|
||||
!76 U+0076 v
|
||||
!77 U+0077 w
|
||||
!78 U+0078 x
|
||||
!79 U+0079 y
|
||||
!7A U+007A z
|
||||
!7B U+007B braceleft
|
||||
!7C U+007C bar
|
||||
!7D U+007D braceright
|
||||
!7E U+007E asciitilde
|
||||
!7F U+007F .notdef
|
||||
!80 U+0080 .notdef
|
||||
!81 U+0081 .notdef
|
||||
!82 U+0082 .notdef
|
||||
!83 U+0083 .notdef
|
||||
!84 U+0084 .notdef
|
||||
!85 U+0085 .notdef
|
||||
!86 U+0086 .notdef
|
||||
!87 U+0087 .notdef
|
||||
!88 U+0088 .notdef
|
||||
!89 U+0089 .notdef
|
||||
!8A U+008A .notdef
|
||||
!8B U+008B .notdef
|
||||
!8C U+008C .notdef
|
||||
!8D U+008D .notdef
|
||||
!8E U+008E .notdef
|
||||
!8F U+008F .notdef
|
||||
!90 U+0090 .notdef
|
||||
!91 U+0091 .notdef
|
||||
!92 U+0092 .notdef
|
||||
!93 U+0093 .notdef
|
||||
!94 U+0094 .notdef
|
||||
!95 U+0095 .notdef
|
||||
!96 U+0096 .notdef
|
||||
!97 U+0097 .notdef
|
||||
!98 U+0098 .notdef
|
||||
!99 U+0099 .notdef
|
||||
!9A U+009A .notdef
|
||||
!9B U+009B .notdef
|
||||
!9C U+009C .notdef
|
||||
!9D U+009D .notdef
|
||||
!9E U+009E .notdef
|
||||
!9F U+009F .notdef
|
||||
!A0 U+00A0 space
|
||||
!A1 U+00A1 exclamdown
|
||||
!A2 U+00A2 cent
|
||||
!A3 U+00A3 sterling
|
||||
!A4 U+00A4 currency
|
||||
!A5 U+00A5 yen
|
||||
!A6 U+00A6 brokenbar
|
||||
!A7 U+00A7 section
|
||||
!A8 U+00A8 dieresis
|
||||
!A9 U+00A9 copyright
|
||||
!AA U+00AA ordfeminine
|
||||
!AB U+00AB guillemotleft
|
||||
!AC U+00AC logicalnot
|
||||
!AD U+00AD hyphen
|
||||
!AE U+00AE registered
|
||||
!AF U+00AF macron
|
||||
!B0 U+00B0 degree
|
||||
!B1 U+00B1 plusminus
|
||||
!B2 U+00B2 twosuperior
|
||||
!B3 U+00B3 threesuperior
|
||||
!B4 U+00B4 acute
|
||||
!B5 U+00B5 mu
|
||||
!B6 U+00B6 paragraph
|
||||
!B7 U+00B7 periodcentered
|
||||
!B8 U+00B8 cedilla
|
||||
!B9 U+00B9 onesuperior
|
||||
!BA U+00BA ordmasculine
|
||||
!BB U+00BB guillemotright
|
||||
!BC U+00BC onequarter
|
||||
!BD U+00BD onehalf
|
||||
!BE U+00BE threequarters
|
||||
!BF U+00BF questiondown
|
||||
!C0 U+00C0 Agrave
|
||||
!C1 U+00C1 Aacute
|
||||
!C2 U+00C2 Acircumflex
|
||||
!C3 U+00C3 Atilde
|
||||
!C4 U+00C4 Adieresis
|
||||
!C5 U+00C5 Aring
|
||||
!C6 U+00C6 AE
|
||||
!C7 U+00C7 Ccedilla
|
||||
!C8 U+00C8 Egrave
|
||||
!C9 U+00C9 Eacute
|
||||
!CA U+00CA Ecircumflex
|
||||
!CB U+00CB Edieresis
|
||||
!CC U+00CC Igrave
|
||||
!CD U+00CD Iacute
|
||||
!CE U+00CE Icircumflex
|
||||
!CF U+00CF Idieresis
|
||||
!D0 U+00D0 Eth
|
||||
!D1 U+00D1 Ntilde
|
||||
!D2 U+00D2 Ograve
|
||||
!D3 U+00D3 Oacute
|
||||
!D4 U+00D4 Ocircumflex
|
||||
!D5 U+00D5 Otilde
|
||||
!D6 U+00D6 Odieresis
|
||||
!D7 U+00D7 multiply
|
||||
!D8 U+00D8 Oslash
|
||||
!D9 U+00D9 Ugrave
|
||||
!DA U+00DA Uacute
|
||||
!DB U+00DB Ucircumflex
|
||||
!DC U+00DC Udieresis
|
||||
!DD U+00DD Yacute
|
||||
!DE U+00DE Thorn
|
||||
!DF U+00DF germandbls
|
||||
!E0 U+00E0 agrave
|
||||
!E1 U+00E1 aacute
|
||||
!E2 U+00E2 acircumflex
|
||||
!E3 U+00E3 atilde
|
||||
!E4 U+00E4 adieresis
|
||||
!E5 U+00E5 aring
|
||||
!E6 U+00E6 ae
|
||||
!E7 U+00E7 ccedilla
|
||||
!E8 U+00E8 egrave
|
||||
!E9 U+00E9 eacute
|
||||
!EA U+00EA ecircumflex
|
||||
!EB U+00EB edieresis
|
||||
!EC U+00EC igrave
|
||||
!ED U+00ED iacute
|
||||
!EE U+00EE icircumflex
|
||||
!EF U+00EF idieresis
|
||||
!F0 U+00F0 eth
|
||||
!F1 U+00F1 ntilde
|
||||
!F2 U+00F2 ograve
|
||||
!F3 U+00F3 oacute
|
||||
!F4 U+00F4 ocircumflex
|
||||
!F5 U+00F5 otilde
|
||||
!F6 U+00F6 odieresis
|
||||
!F7 U+00F7 divide
|
||||
!F8 U+00F8 oslash
|
||||
!F9 U+00F9 ugrave
|
||||
!FA U+00FA uacute
|
||||
!FB U+00FB ucircumflex
|
||||
!FC U+00FC udieresis
|
||||
!FD U+00FD yacute
|
||||
!FE U+00FE thorn
|
||||
!FF U+00FF ydieresis
|
||||
248
pdf/font/makefont/iso-8859-11.map
Executable file
248
pdf/font/makefont/iso-8859-11.map
Executable file
@@ -0,0 +1,248 @@
|
||||
!00 U+0000 .notdef
|
||||
!01 U+0001 .notdef
|
||||
!02 U+0002 .notdef
|
||||
!03 U+0003 .notdef
|
||||
!04 U+0004 .notdef
|
||||
!05 U+0005 .notdef
|
||||
!06 U+0006 .notdef
|
||||
!07 U+0007 .notdef
|
||||
!08 U+0008 .notdef
|
||||
!09 U+0009 .notdef
|
||||
!0A U+000A .notdef
|
||||
!0B U+000B .notdef
|
||||
!0C U+000C .notdef
|
||||
!0D U+000D .notdef
|
||||
!0E U+000E .notdef
|
||||
!0F U+000F .notdef
|
||||
!10 U+0010 .notdef
|
||||
!11 U+0011 .notdef
|
||||
!12 U+0012 .notdef
|
||||
!13 U+0013 .notdef
|
||||
!14 U+0014 .notdef
|
||||
!15 U+0015 .notdef
|
||||
!16 U+0016 .notdef
|
||||
!17 U+0017 .notdef
|
||||
!18 U+0018 .notdef
|
||||
!19 U+0019 .notdef
|
||||
!1A U+001A .notdef
|
||||
!1B U+001B .notdef
|
||||
!1C U+001C .notdef
|
||||
!1D U+001D .notdef
|
||||
!1E U+001E .notdef
|
||||
!1F U+001F .notdef
|
||||
!20 U+0020 space
|
||||
!21 U+0021 exclam
|
||||
!22 U+0022 quotedbl
|
||||
!23 U+0023 numbersign
|
||||
!24 U+0024 dollar
|
||||
!25 U+0025 percent
|
||||
!26 U+0026 ampersand
|
||||
!27 U+0027 quotesingle
|
||||
!28 U+0028 parenleft
|
||||
!29 U+0029 parenright
|
||||
!2A U+002A asterisk
|
||||
!2B U+002B plus
|
||||
!2C U+002C comma
|
||||
!2D U+002D hyphen
|
||||
!2E U+002E period
|
||||
!2F U+002F slash
|
||||
!30 U+0030 zero
|
||||
!31 U+0031 one
|
||||
!32 U+0032 two
|
||||
!33 U+0033 three
|
||||
!34 U+0034 four
|
||||
!35 U+0035 five
|
||||
!36 U+0036 six
|
||||
!37 U+0037 seven
|
||||
!38 U+0038 eight
|
||||
!39 U+0039 nine
|
||||
!3A U+003A colon
|
||||
!3B U+003B semicolon
|
||||
!3C U+003C less
|
||||
!3D U+003D equal
|
||||
!3E U+003E greater
|
||||
!3F U+003F question
|
||||
!40 U+0040 at
|
||||
!41 U+0041 A
|
||||
!42 U+0042 B
|
||||
!43 U+0043 C
|
||||
!44 U+0044 D
|
||||
!45 U+0045 E
|
||||
!46 U+0046 F
|
||||
!47 U+0047 G
|
||||
!48 U+0048 H
|
||||
!49 U+0049 I
|
||||
!4A U+004A J
|
||||
!4B U+004B K
|
||||
!4C U+004C L
|
||||
!4D U+004D M
|
||||
!4E U+004E N
|
||||
!4F U+004F O
|
||||
!50 U+0050 P
|
||||
!51 U+0051 Q
|
||||
!52 U+0052 R
|
||||
!53 U+0053 S
|
||||
!54 U+0054 T
|
||||
!55 U+0055 U
|
||||
!56 U+0056 V
|
||||
!57 U+0057 W
|
||||
!58 U+0058 X
|
||||
!59 U+0059 Y
|
||||
!5A U+005A Z
|
||||
!5B U+005B bracketleft
|
||||
!5C U+005C backslash
|
||||
!5D U+005D bracketright
|
||||
!5E U+005E asciicircum
|
||||
!5F U+005F underscore
|
||||
!60 U+0060 grave
|
||||
!61 U+0061 a
|
||||
!62 U+0062 b
|
||||
!63 U+0063 c
|
||||
!64 U+0064 d
|
||||
!65 U+0065 e
|
||||
!66 U+0066 f
|
||||
!67 U+0067 g
|
||||
!68 U+0068 h
|
||||
!69 U+0069 i
|
||||
!6A U+006A j
|
||||
!6B U+006B k
|
||||
!6C U+006C l
|
||||
!6D U+006D m
|
||||
!6E U+006E n
|
||||
!6F U+006F o
|
||||
!70 U+0070 p
|
||||
!71 U+0071 q
|
||||
!72 U+0072 r
|
||||
!73 U+0073 s
|
||||
!74 U+0074 t
|
||||
!75 U+0075 u
|
||||
!76 U+0076 v
|
||||
!77 U+0077 w
|
||||
!78 U+0078 x
|
||||
!79 U+0079 y
|
||||
!7A U+007A z
|
||||
!7B U+007B braceleft
|
||||
!7C U+007C bar
|
||||
!7D U+007D braceright
|
||||
!7E U+007E asciitilde
|
||||
!7F U+007F .notdef
|
||||
!80 U+0080 .notdef
|
||||
!81 U+0081 .notdef
|
||||
!82 U+0082 .notdef
|
||||
!83 U+0083 .notdef
|
||||
!84 U+0084 .notdef
|
||||
!85 U+0085 .notdef
|
||||
!86 U+0086 .notdef
|
||||
!87 U+0087 .notdef
|
||||
!88 U+0088 .notdef
|
||||
!89 U+0089 .notdef
|
||||
!8A U+008A .notdef
|
||||
!8B U+008B .notdef
|
||||
!8C U+008C .notdef
|
||||
!8D U+008D .notdef
|
||||
!8E U+008E .notdef
|
||||
!8F U+008F .notdef
|
||||
!90 U+0090 .notdef
|
||||
!91 U+0091 .notdef
|
||||
!92 U+0092 .notdef
|
||||
!93 U+0093 .notdef
|
||||
!94 U+0094 .notdef
|
||||
!95 U+0095 .notdef
|
||||
!96 U+0096 .notdef
|
||||
!97 U+0097 .notdef
|
||||
!98 U+0098 .notdef
|
||||
!99 U+0099 .notdef
|
||||
!9A U+009A .notdef
|
||||
!9B U+009B .notdef
|
||||
!9C U+009C .notdef
|
||||
!9D U+009D .notdef
|
||||
!9E U+009E .notdef
|
||||
!9F U+009F .notdef
|
||||
!A0 U+00A0 space
|
||||
!A1 U+0E01 kokaithai
|
||||
!A2 U+0E02 khokhaithai
|
||||
!A3 U+0E03 khokhuatthai
|
||||
!A4 U+0E04 khokhwaithai
|
||||
!A5 U+0E05 khokhonthai
|
||||
!A6 U+0E06 khorakhangthai
|
||||
!A7 U+0E07 ngonguthai
|
||||
!A8 U+0E08 chochanthai
|
||||
!A9 U+0E09 chochingthai
|
||||
!AA U+0E0A chochangthai
|
||||
!AB U+0E0B sosothai
|
||||
!AC U+0E0C chochoethai
|
||||
!AD U+0E0D yoyingthai
|
||||
!AE U+0E0E dochadathai
|
||||
!AF U+0E0F topatakthai
|
||||
!B0 U+0E10 thothanthai
|
||||
!B1 U+0E11 thonangmonthothai
|
||||
!B2 U+0E12 thophuthaothai
|
||||
!B3 U+0E13 nonenthai
|
||||
!B4 U+0E14 dodekthai
|
||||
!B5 U+0E15 totaothai
|
||||
!B6 U+0E16 thothungthai
|
||||
!B7 U+0E17 thothahanthai
|
||||
!B8 U+0E18 thothongthai
|
||||
!B9 U+0E19 nonuthai
|
||||
!BA U+0E1A bobaimaithai
|
||||
!BB U+0E1B poplathai
|
||||
!BC U+0E1C phophungthai
|
||||
!BD U+0E1D fofathai
|
||||
!BE U+0E1E phophanthai
|
||||
!BF U+0E1F fofanthai
|
||||
!C0 U+0E20 phosamphaothai
|
||||
!C1 U+0E21 momathai
|
||||
!C2 U+0E22 yoyakthai
|
||||
!C3 U+0E23 roruathai
|
||||
!C4 U+0E24 ruthai
|
||||
!C5 U+0E25 lolingthai
|
||||
!C6 U+0E26 luthai
|
||||
!C7 U+0E27 wowaenthai
|
||||
!C8 U+0E28 sosalathai
|
||||
!C9 U+0E29 sorusithai
|
||||
!CA U+0E2A sosuathai
|
||||
!CB U+0E2B hohipthai
|
||||
!CC U+0E2C lochulathai
|
||||
!CD U+0E2D oangthai
|
||||
!CE U+0E2E honokhukthai
|
||||
!CF U+0E2F paiyannoithai
|
||||
!D0 U+0E30 saraathai
|
||||
!D1 U+0E31 maihanakatthai
|
||||
!D2 U+0E32 saraaathai
|
||||
!D3 U+0E33 saraamthai
|
||||
!D4 U+0E34 saraithai
|
||||
!D5 U+0E35 saraiithai
|
||||
!D6 U+0E36 sarauethai
|
||||
!D7 U+0E37 saraueethai
|
||||
!D8 U+0E38 sarauthai
|
||||
!D9 U+0E39 sarauuthai
|
||||
!DA U+0E3A phinthuthai
|
||||
!DF U+0E3F bahtthai
|
||||
!E0 U+0E40 saraethai
|
||||
!E1 U+0E41 saraaethai
|
||||
!E2 U+0E42 saraothai
|
||||
!E3 U+0E43 saraaimaimuanthai
|
||||
!E4 U+0E44 saraaimaimalaithai
|
||||
!E5 U+0E45 lakkhangyaothai
|
||||
!E6 U+0E46 maiyamokthai
|
||||
!E7 U+0E47 maitaikhuthai
|
||||
!E8 U+0E48 maiekthai
|
||||
!E9 U+0E49 maithothai
|
||||
!EA U+0E4A maitrithai
|
||||
!EB U+0E4B maichattawathai
|
||||
!EC U+0E4C thanthakhatthai
|
||||
!ED U+0E4D nikhahitthai
|
||||
!EE U+0E4E yamakkanthai
|
||||
!EF U+0E4F fongmanthai
|
||||
!F0 U+0E50 zerothai
|
||||
!F1 U+0E51 onethai
|
||||
!F2 U+0E52 twothai
|
||||
!F3 U+0E53 threethai
|
||||
!F4 U+0E54 fourthai
|
||||
!F5 U+0E55 fivethai
|
||||
!F6 U+0E56 sixthai
|
||||
!F7 U+0E57 seventhai
|
||||
!F8 U+0E58 eightthai
|
||||
!F9 U+0E59 ninethai
|
||||
!FA U+0E5A angkhankhuthai
|
||||
!FB U+0E5B khomutthai
|
||||
256
pdf/font/makefont/iso-8859-15.map
Executable file
256
pdf/font/makefont/iso-8859-15.map
Executable file
@@ -0,0 +1,256 @@
|
||||
!00 U+0000 .notdef
|
||||
!01 U+0001 .notdef
|
||||
!02 U+0002 .notdef
|
||||
!03 U+0003 .notdef
|
||||
!04 U+0004 .notdef
|
||||
!05 U+0005 .notdef
|
||||
!06 U+0006 .notdef
|
||||
!07 U+0007 .notdef
|
||||
!08 U+0008 .notdef
|
||||
!09 U+0009 .notdef
|
||||
!0A U+000A .notdef
|
||||
!0B U+000B .notdef
|
||||
!0C U+000C .notdef
|
||||
!0D U+000D .notdef
|
||||
!0E U+000E .notdef
|
||||
!0F U+000F .notdef
|
||||
!10 U+0010 .notdef
|
||||
!11 U+0011 .notdef
|
||||
!12 U+0012 .notdef
|
||||
!13 U+0013 .notdef
|
||||
!14 U+0014 .notdef
|
||||
!15 U+0015 .notdef
|
||||
!16 U+0016 .notdef
|
||||
!17 U+0017 .notdef
|
||||
!18 U+0018 .notdef
|
||||
!19 U+0019 .notdef
|
||||
!1A U+001A .notdef
|
||||
!1B U+001B .notdef
|
||||
!1C U+001C .notdef
|
||||
!1D U+001D .notdef
|
||||
!1E U+001E .notdef
|
||||
!1F U+001F .notdef
|
||||
!20 U+0020 space
|
||||
!21 U+0021 exclam
|
||||
!22 U+0022 quotedbl
|
||||
!23 U+0023 numbersign
|
||||
!24 U+0024 dollar
|
||||
!25 U+0025 percent
|
||||
!26 U+0026 ampersand
|
||||
!27 U+0027 quotesingle
|
||||
!28 U+0028 parenleft
|
||||
!29 U+0029 parenright
|
||||
!2A U+002A asterisk
|
||||
!2B U+002B plus
|
||||
!2C U+002C comma
|
||||
!2D U+002D hyphen
|
||||
!2E U+002E period
|
||||
!2F U+002F slash
|
||||
!30 U+0030 zero
|
||||
!31 U+0031 one
|
||||
!32 U+0032 two
|
||||
!33 U+0033 three
|
||||
!34 U+0034 four
|
||||
!35 U+0035 five
|
||||
!36 U+0036 six
|
||||
!37 U+0037 seven
|
||||
!38 U+0038 eight
|
||||
!39 U+0039 nine
|
||||
!3A U+003A colon
|
||||
!3B U+003B semicolon
|
||||
!3C U+003C less
|
||||
!3D U+003D equal
|
||||
!3E U+003E greater
|
||||
!3F U+003F question
|
||||
!40 U+0040 at
|
||||
!41 U+0041 A
|
||||
!42 U+0042 B
|
||||
!43 U+0043 C
|
||||
!44 U+0044 D
|
||||
!45 U+0045 E
|
||||
!46 U+0046 F
|
||||
!47 U+0047 G
|
||||
!48 U+0048 H
|
||||
!49 U+0049 I
|
||||
!4A U+004A J
|
||||
!4B U+004B K
|
||||
!4C U+004C L
|
||||
!4D U+004D M
|
||||
!4E U+004E N
|
||||
!4F U+004F O
|
||||
!50 U+0050 P
|
||||
!51 U+0051 Q
|
||||
!52 U+0052 R
|
||||
!53 U+0053 S
|
||||
!54 U+0054 T
|
||||
!55 U+0055 U
|
||||
!56 U+0056 V
|
||||
!57 U+0057 W
|
||||
!58 U+0058 X
|
||||
!59 U+0059 Y
|
||||
!5A U+005A Z
|
||||
!5B U+005B bracketleft
|
||||
!5C U+005C backslash
|
||||
!5D U+005D bracketright
|
||||
!5E U+005E asciicircum
|
||||
!5F U+005F underscore
|
||||
!60 U+0060 grave
|
||||
!61 U+0061 a
|
||||
!62 U+0062 b
|
||||
!63 U+0063 c
|
||||
!64 U+0064 d
|
||||
!65 U+0065 e
|
||||
!66 U+0066 f
|
||||
!67 U+0067 g
|
||||
!68 U+0068 h
|
||||
!69 U+0069 i
|
||||
!6A U+006A j
|
||||
!6B U+006B k
|
||||
!6C U+006C l
|
||||
!6D U+006D m
|
||||
!6E U+006E n
|
||||
!6F U+006F o
|
||||
!70 U+0070 p
|
||||
!71 U+0071 q
|
||||
!72 U+0072 r
|
||||
!73 U+0073 s
|
||||
!74 U+0074 t
|
||||
!75 U+0075 u
|
||||
!76 U+0076 v
|
||||
!77 U+0077 w
|
||||
!78 U+0078 x
|
||||
!79 U+0079 y
|
||||
!7A U+007A z
|
||||
!7B U+007B braceleft
|
||||
!7C U+007C bar
|
||||
!7D U+007D braceright
|
||||
!7E U+007E asciitilde
|
||||
!7F U+007F .notdef
|
||||
!80 U+0080 .notdef
|
||||
!81 U+0081 .notdef
|
||||
!82 U+0082 .notdef
|
||||
!83 U+0083 .notdef
|
||||
!84 U+0084 .notdef
|
||||
!85 U+0085 .notdef
|
||||
!86 U+0086 .notdef
|
||||
!87 U+0087 .notdef
|
||||
!88 U+0088 .notdef
|
||||
!89 U+0089 .notdef
|
||||
!8A U+008A .notdef
|
||||
!8B U+008B .notdef
|
||||
!8C U+008C .notdef
|
||||
!8D U+008D .notdef
|
||||
!8E U+008E .notdef
|
||||
!8F U+008F .notdef
|
||||
!90 U+0090 .notdef
|
||||
!91 U+0091 .notdef
|
||||
!92 U+0092 .notdef
|
||||
!93 U+0093 .notdef
|
||||
!94 U+0094 .notdef
|
||||
!95 U+0095 .notdef
|
||||
!96 U+0096 .notdef
|
||||
!97 U+0097 .notdef
|
||||
!98 U+0098 .notdef
|
||||
!99 U+0099 .notdef
|
||||
!9A U+009A .notdef
|
||||
!9B U+009B .notdef
|
||||
!9C U+009C .notdef
|
||||
!9D U+009D .notdef
|
||||
!9E U+009E .notdef
|
||||
!9F U+009F .notdef
|
||||
!A0 U+00A0 space
|
||||
!A1 U+00A1 exclamdown
|
||||
!A2 U+00A2 cent
|
||||
!A3 U+00A3 sterling
|
||||
!A4 U+20AC Euro
|
||||
!A5 U+00A5 yen
|
||||
!A6 U+0160 Scaron
|
||||
!A7 U+00A7 section
|
||||
!A8 U+0161 scaron
|
||||
!A9 U+00A9 copyright
|
||||
!AA U+00AA ordfeminine
|
||||
!AB U+00AB guillemotleft
|
||||
!AC U+00AC logicalnot
|
||||
!AD U+00AD hyphen
|
||||
!AE U+00AE registered
|
||||
!AF U+00AF macron
|
||||
!B0 U+00B0 degree
|
||||
!B1 U+00B1 plusminus
|
||||
!B2 U+00B2 twosuperior
|
||||
!B3 U+00B3 threesuperior
|
||||
!B4 U+017D Zcaron
|
||||
!B5 U+00B5 mu
|
||||
!B6 U+00B6 paragraph
|
||||
!B7 U+00B7 periodcentered
|
||||
!B8 U+017E zcaron
|
||||
!B9 U+00B9 onesuperior
|
||||
!BA U+00BA ordmasculine
|
||||
!BB U+00BB guillemotright
|
||||
!BC U+0152 OE
|
||||
!BD U+0153 oe
|
||||
!BE U+0178 Ydieresis
|
||||
!BF U+00BF questiondown
|
||||
!C0 U+00C0 Agrave
|
||||
!C1 U+00C1 Aacute
|
||||
!C2 U+00C2 Acircumflex
|
||||
!C3 U+00C3 Atilde
|
||||
!C4 U+00C4 Adieresis
|
||||
!C5 U+00C5 Aring
|
||||
!C6 U+00C6 AE
|
||||
!C7 U+00C7 Ccedilla
|
||||
!C8 U+00C8 Egrave
|
||||
!C9 U+00C9 Eacute
|
||||
!CA U+00CA Ecircumflex
|
||||
!CB U+00CB Edieresis
|
||||
!CC U+00CC Igrave
|
||||
!CD U+00CD Iacute
|
||||
!CE U+00CE Icircumflex
|
||||
!CF U+00CF Idieresis
|
||||
!D0 U+00D0 Eth
|
||||
!D1 U+00D1 Ntilde
|
||||
!D2 U+00D2 Ograve
|
||||
!D3 U+00D3 Oacute
|
||||
!D4 U+00D4 Ocircumflex
|
||||
!D5 U+00D5 Otilde
|
||||
!D6 U+00D6 Odieresis
|
||||
!D7 U+00D7 multiply
|
||||
!D8 U+00D8 Oslash
|
||||
!D9 U+00D9 Ugrave
|
||||
!DA U+00DA Uacute
|
||||
!DB U+00DB Ucircumflex
|
||||
!DC U+00DC Udieresis
|
||||
!DD U+00DD Yacute
|
||||
!DE U+00DE Thorn
|
||||
!DF U+00DF germandbls
|
||||
!E0 U+00E0 agrave
|
||||
!E1 U+00E1 aacute
|
||||
!E2 U+00E2 acircumflex
|
||||
!E3 U+00E3 atilde
|
||||
!E4 U+00E4 adieresis
|
||||
!E5 U+00E5 aring
|
||||
!E6 U+00E6 ae
|
||||
!E7 U+00E7 ccedilla
|
||||
!E8 U+00E8 egrave
|
||||
!E9 U+00E9 eacute
|
||||
!EA U+00EA ecircumflex
|
||||
!EB U+00EB edieresis
|
||||
!EC U+00EC igrave
|
||||
!ED U+00ED iacute
|
||||
!EE U+00EE icircumflex
|
||||
!EF U+00EF idieresis
|
||||
!F0 U+00F0 eth
|
||||
!F1 U+00F1 ntilde
|
||||
!F2 U+00F2 ograve
|
||||
!F3 U+00F3 oacute
|
||||
!F4 U+00F4 ocircumflex
|
||||
!F5 U+00F5 otilde
|
||||
!F6 U+00F6 odieresis
|
||||
!F7 U+00F7 divide
|
||||
!F8 U+00F8 oslash
|
||||
!F9 U+00F9 ugrave
|
||||
!FA U+00FA uacute
|
||||
!FB U+00FB ucircumflex
|
||||
!FC U+00FC udieresis
|
||||
!FD U+00FD yacute
|
||||
!FE U+00FE thorn
|
||||
!FF U+00FF ydieresis
|
||||
256
pdf/font/makefont/iso-8859-16.map
Executable file
256
pdf/font/makefont/iso-8859-16.map
Executable file
@@ -0,0 +1,256 @@
|
||||
!00 U+0000 .notdef
|
||||
!01 U+0001 .notdef
|
||||
!02 U+0002 .notdef
|
||||
!03 U+0003 .notdef
|
||||
!04 U+0004 .notdef
|
||||
!05 U+0005 .notdef
|
||||
!06 U+0006 .notdef
|
||||
!07 U+0007 .notdef
|
||||
!08 U+0008 .notdef
|
||||
!09 U+0009 .notdef
|
||||
!0A U+000A .notdef
|
||||
!0B U+000B .notdef
|
||||
!0C U+000C .notdef
|
||||
!0D U+000D .notdef
|
||||
!0E U+000E .notdef
|
||||
!0F U+000F .notdef
|
||||
!10 U+0010 .notdef
|
||||
!11 U+0011 .notdef
|
||||
!12 U+0012 .notdef
|
||||
!13 U+0013 .notdef
|
||||
!14 U+0014 .notdef
|
||||
!15 U+0015 .notdef
|
||||
!16 U+0016 .notdef
|
||||
!17 U+0017 .notdef
|
||||
!18 U+0018 .notdef
|
||||
!19 U+0019 .notdef
|
||||
!1A U+001A .notdef
|
||||
!1B U+001B .notdef
|
||||
!1C U+001C .notdef
|
||||
!1D U+001D .notdef
|
||||
!1E U+001E .notdef
|
||||
!1F U+001F .notdef
|
||||
!20 U+0020 space
|
||||
!21 U+0021 exclam
|
||||
!22 U+0022 quotedbl
|
||||
!23 U+0023 numbersign
|
||||
!24 U+0024 dollar
|
||||
!25 U+0025 percent
|
||||
!26 U+0026 ampersand
|
||||
!27 U+0027 quotesingle
|
||||
!28 U+0028 parenleft
|
||||
!29 U+0029 parenright
|
||||
!2A U+002A asterisk
|
||||
!2B U+002B plus
|
||||
!2C U+002C comma
|
||||
!2D U+002D hyphen
|
||||
!2E U+002E period
|
||||
!2F U+002F slash
|
||||
!30 U+0030 zero
|
||||
!31 U+0031 one
|
||||
!32 U+0032 two
|
||||
!33 U+0033 three
|
||||
!34 U+0034 four
|
||||
!35 U+0035 five
|
||||
!36 U+0036 six
|
||||
!37 U+0037 seven
|
||||
!38 U+0038 eight
|
||||
!39 U+0039 nine
|
||||
!3A U+003A colon
|
||||
!3B U+003B semicolon
|
||||
!3C U+003C less
|
||||
!3D U+003D equal
|
||||
!3E U+003E greater
|
||||
!3F U+003F question
|
||||
!40 U+0040 at
|
||||
!41 U+0041 A
|
||||
!42 U+0042 B
|
||||
!43 U+0043 C
|
||||
!44 U+0044 D
|
||||
!45 U+0045 E
|
||||
!46 U+0046 F
|
||||
!47 U+0047 G
|
||||
!48 U+0048 H
|
||||
!49 U+0049 I
|
||||
!4A U+004A J
|
||||
!4B U+004B K
|
||||
!4C U+004C L
|
||||
!4D U+004D M
|
||||
!4E U+004E N
|
||||
!4F U+004F O
|
||||
!50 U+0050 P
|
||||
!51 U+0051 Q
|
||||
!52 U+0052 R
|
||||
!53 U+0053 S
|
||||
!54 U+0054 T
|
||||
!55 U+0055 U
|
||||
!56 U+0056 V
|
||||
!57 U+0057 W
|
||||
!58 U+0058 X
|
||||
!59 U+0059 Y
|
||||
!5A U+005A Z
|
||||
!5B U+005B bracketleft
|
||||
!5C U+005C backslash
|
||||
!5D U+005D bracketright
|
||||
!5E U+005E asciicircum
|
||||
!5F U+005F underscore
|
||||
!60 U+0060 grave
|
||||
!61 U+0061 a
|
||||
!62 U+0062 b
|
||||
!63 U+0063 c
|
||||
!64 U+0064 d
|
||||
!65 U+0065 e
|
||||
!66 U+0066 f
|
||||
!67 U+0067 g
|
||||
!68 U+0068 h
|
||||
!69 U+0069 i
|
||||
!6A U+006A j
|
||||
!6B U+006B k
|
||||
!6C U+006C l
|
||||
!6D U+006D m
|
||||
!6E U+006E n
|
||||
!6F U+006F o
|
||||
!70 U+0070 p
|
||||
!71 U+0071 q
|
||||
!72 U+0072 r
|
||||
!73 U+0073 s
|
||||
!74 U+0074 t
|
||||
!75 U+0075 u
|
||||
!76 U+0076 v
|
||||
!77 U+0077 w
|
||||
!78 U+0078 x
|
||||
!79 U+0079 y
|
||||
!7A U+007A z
|
||||
!7B U+007B braceleft
|
||||
!7C U+007C bar
|
||||
!7D U+007D braceright
|
||||
!7E U+007E asciitilde
|
||||
!7F U+007F .notdef
|
||||
!80 U+0080 .notdef
|
||||
!81 U+0081 .notdef
|
||||
!82 U+0082 .notdef
|
||||
!83 U+0083 .notdef
|
||||
!84 U+0084 .notdef
|
||||
!85 U+0085 .notdef
|
||||
!86 U+0086 .notdef
|
||||
!87 U+0087 .notdef
|
||||
!88 U+0088 .notdef
|
||||
!89 U+0089 .notdef
|
||||
!8A U+008A .notdef
|
||||
!8B U+008B .notdef
|
||||
!8C U+008C .notdef
|
||||
!8D U+008D .notdef
|
||||
!8E U+008E .notdef
|
||||
!8F U+008F .notdef
|
||||
!90 U+0090 .notdef
|
||||
!91 U+0091 .notdef
|
||||
!92 U+0092 .notdef
|
||||
!93 U+0093 .notdef
|
||||
!94 U+0094 .notdef
|
||||
!95 U+0095 .notdef
|
||||
!96 U+0096 .notdef
|
||||
!97 U+0097 .notdef
|
||||
!98 U+0098 .notdef
|
||||
!99 U+0099 .notdef
|
||||
!9A U+009A .notdef
|
||||
!9B U+009B .notdef
|
||||
!9C U+009C .notdef
|
||||
!9D U+009D .notdef
|
||||
!9E U+009E .notdef
|
||||
!9F U+009F .notdef
|
||||
!A0 U+00A0 space
|
||||
!A1 U+0104 Aogonek
|
||||
!A2 U+0105 aogonek
|
||||
!A3 U+0141 Lslash
|
||||
!A4 U+20AC Euro
|
||||
!A5 U+201E quotedblbase
|
||||
!A6 U+0160 Scaron
|
||||
!A7 U+00A7 section
|
||||
!A8 U+0161 scaron
|
||||
!A9 U+00A9 copyright
|
||||
!AA U+0218 Scommaaccent
|
||||
!AB U+00AB guillemotleft
|
||||
!AC U+0179 Zacute
|
||||
!AD U+00AD hyphen
|
||||
!AE U+017A zacute
|
||||
!AF U+017B Zdotaccent
|
||||
!B0 U+00B0 degree
|
||||
!B1 U+00B1 plusminus
|
||||
!B2 U+010C Ccaron
|
||||
!B3 U+0142 lslash
|
||||
!B4 U+017D Zcaron
|
||||
!B5 U+201D quotedblright
|
||||
!B6 U+00B6 paragraph
|
||||
!B7 U+00B7 periodcentered
|
||||
!B8 U+017E zcaron
|
||||
!B9 U+010D ccaron
|
||||
!BA U+0219 scommaaccent
|
||||
!BB U+00BB guillemotright
|
||||
!BC U+0152 OE
|
||||
!BD U+0153 oe
|
||||
!BE U+0178 Ydieresis
|
||||
!BF U+017C zdotaccent
|
||||
!C0 U+00C0 Agrave
|
||||
!C1 U+00C1 Aacute
|
||||
!C2 U+00C2 Acircumflex
|
||||
!C3 U+0102 Abreve
|
||||
!C4 U+00C4 Adieresis
|
||||
!C5 U+0106 Cacute
|
||||
!C6 U+00C6 AE
|
||||
!C7 U+00C7 Ccedilla
|
||||
!C8 U+00C8 Egrave
|
||||
!C9 U+00C9 Eacute
|
||||
!CA U+00CA Ecircumflex
|
||||
!CB U+00CB Edieresis
|
||||
!CC U+00CC Igrave
|
||||
!CD U+00CD Iacute
|
||||
!CE U+00CE Icircumflex
|
||||
!CF U+00CF Idieresis
|
||||
!D0 U+0110 Dcroat
|
||||
!D1 U+0143 Nacute
|
||||
!D2 U+00D2 Ograve
|
||||
!D3 U+00D3 Oacute
|
||||
!D4 U+00D4 Ocircumflex
|
||||
!D5 U+0150 Ohungarumlaut
|
||||
!D6 U+00D6 Odieresis
|
||||
!D7 U+015A Sacute
|
||||
!D8 U+0170 Uhungarumlaut
|
||||
!D9 U+00D9 Ugrave
|
||||
!DA U+00DA Uacute
|
||||
!DB U+00DB Ucircumflex
|
||||
!DC U+00DC Udieresis
|
||||
!DD U+0118 Eogonek
|
||||
!DE U+021A Tcommaaccent
|
||||
!DF U+00DF germandbls
|
||||
!E0 U+00E0 agrave
|
||||
!E1 U+00E1 aacute
|
||||
!E2 U+00E2 acircumflex
|
||||
!E3 U+0103 abreve
|
||||
!E4 U+00E4 adieresis
|
||||
!E5 U+0107 cacute
|
||||
!E6 U+00E6 ae
|
||||
!E7 U+00E7 ccedilla
|
||||
!E8 U+00E8 egrave
|
||||
!E9 U+00E9 eacute
|
||||
!EA U+00EA ecircumflex
|
||||
!EB U+00EB edieresis
|
||||
!EC U+00EC igrave
|
||||
!ED U+00ED iacute
|
||||
!EE U+00EE icircumflex
|
||||
!EF U+00EF idieresis
|
||||
!F0 U+0111 dcroat
|
||||
!F1 U+0144 nacute
|
||||
!F2 U+00F2 ograve
|
||||
!F3 U+00F3 oacute
|
||||
!F4 U+00F4 ocircumflex
|
||||
!F5 U+0151 ohungarumlaut
|
||||
!F6 U+00F6 odieresis
|
||||
!F7 U+015B sacute
|
||||
!F8 U+0171 uhungarumlaut
|
||||
!F9 U+00F9 ugrave
|
||||
!FA U+00FA uacute
|
||||
!FB U+00FB ucircumflex
|
||||
!FC U+00FC udieresis
|
||||
!FD U+0119 eogonek
|
||||
!FE U+021B tcommaaccent
|
||||
!FF U+00FF ydieresis
|
||||
256
pdf/font/makefont/iso-8859-2.map
Executable file
256
pdf/font/makefont/iso-8859-2.map
Executable file
@@ -0,0 +1,256 @@
|
||||
!00 U+0000 .notdef
|
||||
!01 U+0001 .notdef
|
||||
!02 U+0002 .notdef
|
||||
!03 U+0003 .notdef
|
||||
!04 U+0004 .notdef
|
||||
!05 U+0005 .notdef
|
||||
!06 U+0006 .notdef
|
||||
!07 U+0007 .notdef
|
||||
!08 U+0008 .notdef
|
||||
!09 U+0009 .notdef
|
||||
!0A U+000A .notdef
|
||||
!0B U+000B .notdef
|
||||
!0C U+000C .notdef
|
||||
!0D U+000D .notdef
|
||||
!0E U+000E .notdef
|
||||
!0F U+000F .notdef
|
||||
!10 U+0010 .notdef
|
||||
!11 U+0011 .notdef
|
||||
!12 U+0012 .notdef
|
||||
!13 U+0013 .notdef
|
||||
!14 U+0014 .notdef
|
||||
!15 U+0015 .notdef
|
||||
!16 U+0016 .notdef
|
||||
!17 U+0017 .notdef
|
||||
!18 U+0018 .notdef
|
||||
!19 U+0019 .notdef
|
||||
!1A U+001A .notdef
|
||||
!1B U+001B .notdef
|
||||
!1C U+001C .notdef
|
||||
!1D U+001D .notdef
|
||||
!1E U+001E .notdef
|
||||
!1F U+001F .notdef
|
||||
!20 U+0020 space
|
||||
!21 U+0021 exclam
|
||||
!22 U+0022 quotedbl
|
||||
!23 U+0023 numbersign
|
||||
!24 U+0024 dollar
|
||||
!25 U+0025 percent
|
||||
!26 U+0026 ampersand
|
||||
!27 U+0027 quotesingle
|
||||
!28 U+0028 parenleft
|
||||
!29 U+0029 parenright
|
||||
!2A U+002A asterisk
|
||||
!2B U+002B plus
|
||||
!2C U+002C comma
|
||||
!2D U+002D hyphen
|
||||
!2E U+002E period
|
||||
!2F U+002F slash
|
||||
!30 U+0030 zero
|
||||
!31 U+0031 one
|
||||
!32 U+0032 two
|
||||
!33 U+0033 three
|
||||
!34 U+0034 four
|
||||
!35 U+0035 five
|
||||
!36 U+0036 six
|
||||
!37 U+0037 seven
|
||||
!38 U+0038 eight
|
||||
!39 U+0039 nine
|
||||
!3A U+003A colon
|
||||
!3B U+003B semicolon
|
||||
!3C U+003C less
|
||||
!3D U+003D equal
|
||||
!3E U+003E greater
|
||||
!3F U+003F question
|
||||
!40 U+0040 at
|
||||
!41 U+0041 A
|
||||
!42 U+0042 B
|
||||
!43 U+0043 C
|
||||
!44 U+0044 D
|
||||
!45 U+0045 E
|
||||
!46 U+0046 F
|
||||
!47 U+0047 G
|
||||
!48 U+0048 H
|
||||
!49 U+0049 I
|
||||
!4A U+004A J
|
||||
!4B U+004B K
|
||||
!4C U+004C L
|
||||
!4D U+004D M
|
||||
!4E U+004E N
|
||||
!4F U+004F O
|
||||
!50 U+0050 P
|
||||
!51 U+0051 Q
|
||||
!52 U+0052 R
|
||||
!53 U+0053 S
|
||||
!54 U+0054 T
|
||||
!55 U+0055 U
|
||||
!56 U+0056 V
|
||||
!57 U+0057 W
|
||||
!58 U+0058 X
|
||||
!59 U+0059 Y
|
||||
!5A U+005A Z
|
||||
!5B U+005B bracketleft
|
||||
!5C U+005C backslash
|
||||
!5D U+005D bracketright
|
||||
!5E U+005E asciicircum
|
||||
!5F U+005F underscore
|
||||
!60 U+0060 grave
|
||||
!61 U+0061 a
|
||||
!62 U+0062 b
|
||||
!63 U+0063 c
|
||||
!64 U+0064 d
|
||||
!65 U+0065 e
|
||||
!66 U+0066 f
|
||||
!67 U+0067 g
|
||||
!68 U+0068 h
|
||||
!69 U+0069 i
|
||||
!6A U+006A j
|
||||
!6B U+006B k
|
||||
!6C U+006C l
|
||||
!6D U+006D m
|
||||
!6E U+006E n
|
||||
!6F U+006F o
|
||||
!70 U+0070 p
|
||||
!71 U+0071 q
|
||||
!72 U+0072 r
|
||||
!73 U+0073 s
|
||||
!74 U+0074 t
|
||||
!75 U+0075 u
|
||||
!76 U+0076 v
|
||||
!77 U+0077 w
|
||||
!78 U+0078 x
|
||||
!79 U+0079 y
|
||||
!7A U+007A z
|
||||
!7B U+007B braceleft
|
||||
!7C U+007C bar
|
||||
!7D U+007D braceright
|
||||
!7E U+007E asciitilde
|
||||
!7F U+007F .notdef
|
||||
!80 U+0080 .notdef
|
||||
!81 U+0081 .notdef
|
||||
!82 U+0082 .notdef
|
||||
!83 U+0083 .notdef
|
||||
!84 U+0084 .notdef
|
||||
!85 U+0085 .notdef
|
||||
!86 U+0086 .notdef
|
||||
!87 U+0087 .notdef
|
||||
!88 U+0088 .notdef
|
||||
!89 U+0089 .notdef
|
||||
!8A U+008A .notdef
|
||||
!8B U+008B .notdef
|
||||
!8C U+008C .notdef
|
||||
!8D U+008D .notdef
|
||||
!8E U+008E .notdef
|
||||
!8F U+008F .notdef
|
||||
!90 U+0090 .notdef
|
||||
!91 U+0091 .notdef
|
||||
!92 U+0092 .notdef
|
||||
!93 U+0093 .notdef
|
||||
!94 U+0094 .notdef
|
||||
!95 U+0095 .notdef
|
||||
!96 U+0096 .notdef
|
||||
!97 U+0097 .notdef
|
||||
!98 U+0098 .notdef
|
||||
!99 U+0099 .notdef
|
||||
!9A U+009A .notdef
|
||||
!9B U+009B .notdef
|
||||
!9C U+009C .notdef
|
||||
!9D U+009D .notdef
|
||||
!9E U+009E .notdef
|
||||
!9F U+009F .notdef
|
||||
!A0 U+00A0 space
|
||||
!A1 U+0104 Aogonek
|
||||
!A2 U+02D8 breve
|
||||
!A3 U+0141 Lslash
|
||||
!A4 U+00A4 currency
|
||||
!A5 U+013D Lcaron
|
||||
!A6 U+015A Sacute
|
||||
!A7 U+00A7 section
|
||||
!A8 U+00A8 dieresis
|
||||
!A9 U+0160 Scaron
|
||||
!AA U+015E Scedilla
|
||||
!AB U+0164 Tcaron
|
||||
!AC U+0179 Zacute
|
||||
!AD U+00AD hyphen
|
||||
!AE U+017D Zcaron
|
||||
!AF U+017B Zdotaccent
|
||||
!B0 U+00B0 degree
|
||||
!B1 U+0105 aogonek
|
||||
!B2 U+02DB ogonek
|
||||
!B3 U+0142 lslash
|
||||
!B4 U+00B4 acute
|
||||
!B5 U+013E lcaron
|
||||
!B6 U+015B sacute
|
||||
!B7 U+02C7 caron
|
||||
!B8 U+00B8 cedilla
|
||||
!B9 U+0161 scaron
|
||||
!BA U+015F scedilla
|
||||
!BB U+0165 tcaron
|
||||
!BC U+017A zacute
|
||||
!BD U+02DD hungarumlaut
|
||||
!BE U+017E zcaron
|
||||
!BF U+017C zdotaccent
|
||||
!C0 U+0154 Racute
|
||||
!C1 U+00C1 Aacute
|
||||
!C2 U+00C2 Acircumflex
|
||||
!C3 U+0102 Abreve
|
||||
!C4 U+00C4 Adieresis
|
||||
!C5 U+0139 Lacute
|
||||
!C6 U+0106 Cacute
|
||||
!C7 U+00C7 Ccedilla
|
||||
!C8 U+010C Ccaron
|
||||
!C9 U+00C9 Eacute
|
||||
!CA U+0118 Eogonek
|
||||
!CB U+00CB Edieresis
|
||||
!CC U+011A Ecaron
|
||||
!CD U+00CD Iacute
|
||||
!CE U+00CE Icircumflex
|
||||
!CF U+010E Dcaron
|
||||
!D0 U+0110 Dcroat
|
||||
!D1 U+0143 Nacute
|
||||
!D2 U+0147 Ncaron
|
||||
!D3 U+00D3 Oacute
|
||||
!D4 U+00D4 Ocircumflex
|
||||
!D5 U+0150 Ohungarumlaut
|
||||
!D6 U+00D6 Odieresis
|
||||
!D7 U+00D7 multiply
|
||||
!D8 U+0158 Rcaron
|
||||
!D9 U+016E Uring
|
||||
!DA U+00DA Uacute
|
||||
!DB U+0170 Uhungarumlaut
|
||||
!DC U+00DC Udieresis
|
||||
!DD U+00DD Yacute
|
||||
!DE U+0162 Tcommaaccent
|
||||
!DF U+00DF germandbls
|
||||
!E0 U+0155 racute
|
||||
!E1 U+00E1 aacute
|
||||
!E2 U+00E2 acircumflex
|
||||
!E3 U+0103 abreve
|
||||
!E4 U+00E4 adieresis
|
||||
!E5 U+013A lacute
|
||||
!E6 U+0107 cacute
|
||||
!E7 U+00E7 ccedilla
|
||||
!E8 U+010D ccaron
|
||||
!E9 U+00E9 eacute
|
||||
!EA U+0119 eogonek
|
||||
!EB U+00EB edieresis
|
||||
!EC U+011B ecaron
|
||||
!ED U+00ED iacute
|
||||
!EE U+00EE icircumflex
|
||||
!EF U+010F dcaron
|
||||
!F0 U+0111 dcroat
|
||||
!F1 U+0144 nacute
|
||||
!F2 U+0148 ncaron
|
||||
!F3 U+00F3 oacute
|
||||
!F4 U+00F4 ocircumflex
|
||||
!F5 U+0151 ohungarumlaut
|
||||
!F6 U+00F6 odieresis
|
||||
!F7 U+00F7 divide
|
||||
!F8 U+0159 rcaron
|
||||
!F9 U+016F uring
|
||||
!FA U+00FA uacute
|
||||
!FB U+0171 uhungarumlaut
|
||||
!FC U+00FC udieresis
|
||||
!FD U+00FD yacute
|
||||
!FE U+0163 tcommaaccent
|
||||
!FF U+02D9 dotaccent
|
||||
256
pdf/font/makefont/iso-8859-4.map
Executable file
256
pdf/font/makefont/iso-8859-4.map
Executable file
@@ -0,0 +1,256 @@
|
||||
!00 U+0000 .notdef
|
||||
!01 U+0001 .notdef
|
||||
!02 U+0002 .notdef
|
||||
!03 U+0003 .notdef
|
||||
!04 U+0004 .notdef
|
||||
!05 U+0005 .notdef
|
||||
!06 U+0006 .notdef
|
||||
!07 U+0007 .notdef
|
||||
!08 U+0008 .notdef
|
||||
!09 U+0009 .notdef
|
||||
!0A U+000A .notdef
|
||||
!0B U+000B .notdef
|
||||
!0C U+000C .notdef
|
||||
!0D U+000D .notdef
|
||||
!0E U+000E .notdef
|
||||
!0F U+000F .notdef
|
||||
!10 U+0010 .notdef
|
||||
!11 U+0011 .notdef
|
||||
!12 U+0012 .notdef
|
||||
!13 U+0013 .notdef
|
||||
!14 U+0014 .notdef
|
||||
!15 U+0015 .notdef
|
||||
!16 U+0016 .notdef
|
||||
!17 U+0017 .notdef
|
||||
!18 U+0018 .notdef
|
||||
!19 U+0019 .notdef
|
||||
!1A U+001A .notdef
|
||||
!1B U+001B .notdef
|
||||
!1C U+001C .notdef
|
||||
!1D U+001D .notdef
|
||||
!1E U+001E .notdef
|
||||
!1F U+001F .notdef
|
||||
!20 U+0020 space
|
||||
!21 U+0021 exclam
|
||||
!22 U+0022 quotedbl
|
||||
!23 U+0023 numbersign
|
||||
!24 U+0024 dollar
|
||||
!25 U+0025 percent
|
||||
!26 U+0026 ampersand
|
||||
!27 U+0027 quotesingle
|
||||
!28 U+0028 parenleft
|
||||
!29 U+0029 parenright
|
||||
!2A U+002A asterisk
|
||||
!2B U+002B plus
|
||||
!2C U+002C comma
|
||||
!2D U+002D hyphen
|
||||
!2E U+002E period
|
||||
!2F U+002F slash
|
||||
!30 U+0030 zero
|
||||
!31 U+0031 one
|
||||
!32 U+0032 two
|
||||
!33 U+0033 three
|
||||
!34 U+0034 four
|
||||
!35 U+0035 five
|
||||
!36 U+0036 six
|
||||
!37 U+0037 seven
|
||||
!38 U+0038 eight
|
||||
!39 U+0039 nine
|
||||
!3A U+003A colon
|
||||
!3B U+003B semicolon
|
||||
!3C U+003C less
|
||||
!3D U+003D equal
|
||||
!3E U+003E greater
|
||||
!3F U+003F question
|
||||
!40 U+0040 at
|
||||
!41 U+0041 A
|
||||
!42 U+0042 B
|
||||
!43 U+0043 C
|
||||
!44 U+0044 D
|
||||
!45 U+0045 E
|
||||
!46 U+0046 F
|
||||
!47 U+0047 G
|
||||
!48 U+0048 H
|
||||
!49 U+0049 I
|
||||
!4A U+004A J
|
||||
!4B U+004B K
|
||||
!4C U+004C L
|
||||
!4D U+004D M
|
||||
!4E U+004E N
|
||||
!4F U+004F O
|
||||
!50 U+0050 P
|
||||
!51 U+0051 Q
|
||||
!52 U+0052 R
|
||||
!53 U+0053 S
|
||||
!54 U+0054 T
|
||||
!55 U+0055 U
|
||||
!56 U+0056 V
|
||||
!57 U+0057 W
|
||||
!58 U+0058 X
|
||||
!59 U+0059 Y
|
||||
!5A U+005A Z
|
||||
!5B U+005B bracketleft
|
||||
!5C U+005C backslash
|
||||
!5D U+005D bracketright
|
||||
!5E U+005E asciicircum
|
||||
!5F U+005F underscore
|
||||
!60 U+0060 grave
|
||||
!61 U+0061 a
|
||||
!62 U+0062 b
|
||||
!63 U+0063 c
|
||||
!64 U+0064 d
|
||||
!65 U+0065 e
|
||||
!66 U+0066 f
|
||||
!67 U+0067 g
|
||||
!68 U+0068 h
|
||||
!69 U+0069 i
|
||||
!6A U+006A j
|
||||
!6B U+006B k
|
||||
!6C U+006C l
|
||||
!6D U+006D m
|
||||
!6E U+006E n
|
||||
!6F U+006F o
|
||||
!70 U+0070 p
|
||||
!71 U+0071 q
|
||||
!72 U+0072 r
|
||||
!73 U+0073 s
|
||||
!74 U+0074 t
|
||||
!75 U+0075 u
|
||||
!76 U+0076 v
|
||||
!77 U+0077 w
|
||||
!78 U+0078 x
|
||||
!79 U+0079 y
|
||||
!7A U+007A z
|
||||
!7B U+007B braceleft
|
||||
!7C U+007C bar
|
||||
!7D U+007D braceright
|
||||
!7E U+007E asciitilde
|
||||
!7F U+007F .notdef
|
||||
!80 U+0080 .notdef
|
||||
!81 U+0081 .notdef
|
||||
!82 U+0082 .notdef
|
||||
!83 U+0083 .notdef
|
||||
!84 U+0084 .notdef
|
||||
!85 U+0085 .notdef
|
||||
!86 U+0086 .notdef
|
||||
!87 U+0087 .notdef
|
||||
!88 U+0088 .notdef
|
||||
!89 U+0089 .notdef
|
||||
!8A U+008A .notdef
|
||||
!8B U+008B .notdef
|
||||
!8C U+008C .notdef
|
||||
!8D U+008D .notdef
|
||||
!8E U+008E .notdef
|
||||
!8F U+008F .notdef
|
||||
!90 U+0090 .notdef
|
||||
!91 U+0091 .notdef
|
||||
!92 U+0092 .notdef
|
||||
!93 U+0093 .notdef
|
||||
!94 U+0094 .notdef
|
||||
!95 U+0095 .notdef
|
||||
!96 U+0096 .notdef
|
||||
!97 U+0097 .notdef
|
||||
!98 U+0098 .notdef
|
||||
!99 U+0099 .notdef
|
||||
!9A U+009A .notdef
|
||||
!9B U+009B .notdef
|
||||
!9C U+009C .notdef
|
||||
!9D U+009D .notdef
|
||||
!9E U+009E .notdef
|
||||
!9F U+009F .notdef
|
||||
!A0 U+00A0 space
|
||||
!A1 U+0104 Aogonek
|
||||
!A2 U+0138 kgreenlandic
|
||||
!A3 U+0156 Rcommaaccent
|
||||
!A4 U+00A4 currency
|
||||
!A5 U+0128 Itilde
|
||||
!A6 U+013B Lcommaaccent
|
||||
!A7 U+00A7 section
|
||||
!A8 U+00A8 dieresis
|
||||
!A9 U+0160 Scaron
|
||||
!AA U+0112 Emacron
|
||||
!AB U+0122 Gcommaaccent
|
||||
!AC U+0166 Tbar
|
||||
!AD U+00AD hyphen
|
||||
!AE U+017D Zcaron
|
||||
!AF U+00AF macron
|
||||
!B0 U+00B0 degree
|
||||
!B1 U+0105 aogonek
|
||||
!B2 U+02DB ogonek
|
||||
!B3 U+0157 rcommaaccent
|
||||
!B4 U+00B4 acute
|
||||
!B5 U+0129 itilde
|
||||
!B6 U+013C lcommaaccent
|
||||
!B7 U+02C7 caron
|
||||
!B8 U+00B8 cedilla
|
||||
!B9 U+0161 scaron
|
||||
!BA U+0113 emacron
|
||||
!BB U+0123 gcommaaccent
|
||||
!BC U+0167 tbar
|
||||
!BD U+014A Eng
|
||||
!BE U+017E zcaron
|
||||
!BF U+014B eng
|
||||
!C0 U+0100 Amacron
|
||||
!C1 U+00C1 Aacute
|
||||
!C2 U+00C2 Acircumflex
|
||||
!C3 U+00C3 Atilde
|
||||
!C4 U+00C4 Adieresis
|
||||
!C5 U+00C5 Aring
|
||||
!C6 U+00C6 AE
|
||||
!C7 U+012E Iogonek
|
||||
!C8 U+010C Ccaron
|
||||
!C9 U+00C9 Eacute
|
||||
!CA U+0118 Eogonek
|
||||
!CB U+00CB Edieresis
|
||||
!CC U+0116 Edotaccent
|
||||
!CD U+00CD Iacute
|
||||
!CE U+00CE Icircumflex
|
||||
!CF U+012A Imacron
|
||||
!D0 U+0110 Dcroat
|
||||
!D1 U+0145 Ncommaaccent
|
||||
!D2 U+014C Omacron
|
||||
!D3 U+0136 Kcommaaccent
|
||||
!D4 U+00D4 Ocircumflex
|
||||
!D5 U+00D5 Otilde
|
||||
!D6 U+00D6 Odieresis
|
||||
!D7 U+00D7 multiply
|
||||
!D8 U+00D8 Oslash
|
||||
!D9 U+0172 Uogonek
|
||||
!DA U+00DA Uacute
|
||||
!DB U+00DB Ucircumflex
|
||||
!DC U+00DC Udieresis
|
||||
!DD U+0168 Utilde
|
||||
!DE U+016A Umacron
|
||||
!DF U+00DF germandbls
|
||||
!E0 U+0101 amacron
|
||||
!E1 U+00E1 aacute
|
||||
!E2 U+00E2 acircumflex
|
||||
!E3 U+00E3 atilde
|
||||
!E4 U+00E4 adieresis
|
||||
!E5 U+00E5 aring
|
||||
!E6 U+00E6 ae
|
||||
!E7 U+012F iogonek
|
||||
!E8 U+010D ccaron
|
||||
!E9 U+00E9 eacute
|
||||
!EA U+0119 eogonek
|
||||
!EB U+00EB edieresis
|
||||
!EC U+0117 edotaccent
|
||||
!ED U+00ED iacute
|
||||
!EE U+00EE icircumflex
|
||||
!EF U+012B imacron
|
||||
!F0 U+0111 dcroat
|
||||
!F1 U+0146 ncommaaccent
|
||||
!F2 U+014D omacron
|
||||
!F3 U+0137 kcommaaccent
|
||||
!F4 U+00F4 ocircumflex
|
||||
!F5 U+00F5 otilde
|
||||
!F6 U+00F6 odieresis
|
||||
!F7 U+00F7 divide
|
||||
!F8 U+00F8 oslash
|
||||
!F9 U+0173 uogonek
|
||||
!FA U+00FA uacute
|
||||
!FB U+00FB ucircumflex
|
||||
!FC U+00FC udieresis
|
||||
!FD U+0169 utilde
|
||||
!FE U+016B umacron
|
||||
!FF U+02D9 dotaccent
|
||||
256
pdf/font/makefont/iso-8859-5.map
Executable file
256
pdf/font/makefont/iso-8859-5.map
Executable file
@@ -0,0 +1,256 @@
|
||||
!00 U+0000 .notdef
|
||||
!01 U+0001 .notdef
|
||||
!02 U+0002 .notdef
|
||||
!03 U+0003 .notdef
|
||||
!04 U+0004 .notdef
|
||||
!05 U+0005 .notdef
|
||||
!06 U+0006 .notdef
|
||||
!07 U+0007 .notdef
|
||||
!08 U+0008 .notdef
|
||||
!09 U+0009 .notdef
|
||||
!0A U+000A .notdef
|
||||
!0B U+000B .notdef
|
||||
!0C U+000C .notdef
|
||||
!0D U+000D .notdef
|
||||
!0E U+000E .notdef
|
||||
!0F U+000F .notdef
|
||||
!10 U+0010 .notdef
|
||||
!11 U+0011 .notdef
|
||||
!12 U+0012 .notdef
|
||||
!13 U+0013 .notdef
|
||||
!14 U+0014 .notdef
|
||||
!15 U+0015 .notdef
|
||||
!16 U+0016 .notdef
|
||||
!17 U+0017 .notdef
|
||||
!18 U+0018 .notdef
|
||||
!19 U+0019 .notdef
|
||||
!1A U+001A .notdef
|
||||
!1B U+001B .notdef
|
||||
!1C U+001C .notdef
|
||||
!1D U+001D .notdef
|
||||
!1E U+001E .notdef
|
||||
!1F U+001F .notdef
|
||||
!20 U+0020 space
|
||||
!21 U+0021 exclam
|
||||
!22 U+0022 quotedbl
|
||||
!23 U+0023 numbersign
|
||||
!24 U+0024 dollar
|
||||
!25 U+0025 percent
|
||||
!26 U+0026 ampersand
|
||||
!27 U+0027 quotesingle
|
||||
!28 U+0028 parenleft
|
||||
!29 U+0029 parenright
|
||||
!2A U+002A asterisk
|
||||
!2B U+002B plus
|
||||
!2C U+002C comma
|
||||
!2D U+002D hyphen
|
||||
!2E U+002E period
|
||||
!2F U+002F slash
|
||||
!30 U+0030 zero
|
||||
!31 U+0031 one
|
||||
!32 U+0032 two
|
||||
!33 U+0033 three
|
||||
!34 U+0034 four
|
||||
!35 U+0035 five
|
||||
!36 U+0036 six
|
||||
!37 U+0037 seven
|
||||
!38 U+0038 eight
|
||||
!39 U+0039 nine
|
||||
!3A U+003A colon
|
||||
!3B U+003B semicolon
|
||||
!3C U+003C less
|
||||
!3D U+003D equal
|
||||
!3E U+003E greater
|
||||
!3F U+003F question
|
||||
!40 U+0040 at
|
||||
!41 U+0041 A
|
||||
!42 U+0042 B
|
||||
!43 U+0043 C
|
||||
!44 U+0044 D
|
||||
!45 U+0045 E
|
||||
!46 U+0046 F
|
||||
!47 U+0047 G
|
||||
!48 U+0048 H
|
||||
!49 U+0049 I
|
||||
!4A U+004A J
|
||||
!4B U+004B K
|
||||
!4C U+004C L
|
||||
!4D U+004D M
|
||||
!4E U+004E N
|
||||
!4F U+004F O
|
||||
!50 U+0050 P
|
||||
!51 U+0051 Q
|
||||
!52 U+0052 R
|
||||
!53 U+0053 S
|
||||
!54 U+0054 T
|
||||
!55 U+0055 U
|
||||
!56 U+0056 V
|
||||
!57 U+0057 W
|
||||
!58 U+0058 X
|
||||
!59 U+0059 Y
|
||||
!5A U+005A Z
|
||||
!5B U+005B bracketleft
|
||||
!5C U+005C backslash
|
||||
!5D U+005D bracketright
|
||||
!5E U+005E asciicircum
|
||||
!5F U+005F underscore
|
||||
!60 U+0060 grave
|
||||
!61 U+0061 a
|
||||
!62 U+0062 b
|
||||
!63 U+0063 c
|
||||
!64 U+0064 d
|
||||
!65 U+0065 e
|
||||
!66 U+0066 f
|
||||
!67 U+0067 g
|
||||
!68 U+0068 h
|
||||
!69 U+0069 i
|
||||
!6A U+006A j
|
||||
!6B U+006B k
|
||||
!6C U+006C l
|
||||
!6D U+006D m
|
||||
!6E U+006E n
|
||||
!6F U+006F o
|
||||
!70 U+0070 p
|
||||
!71 U+0071 q
|
||||
!72 U+0072 r
|
||||
!73 U+0073 s
|
||||
!74 U+0074 t
|
||||
!75 U+0075 u
|
||||
!76 U+0076 v
|
||||
!77 U+0077 w
|
||||
!78 U+0078 x
|
||||
!79 U+0079 y
|
||||
!7A U+007A z
|
||||
!7B U+007B braceleft
|
||||
!7C U+007C bar
|
||||
!7D U+007D braceright
|
||||
!7E U+007E asciitilde
|
||||
!7F U+007F .notdef
|
||||
!80 U+0080 .notdef
|
||||
!81 U+0081 .notdef
|
||||
!82 U+0082 .notdef
|
||||
!83 U+0083 .notdef
|
||||
!84 U+0084 .notdef
|
||||
!85 U+0085 .notdef
|
||||
!86 U+0086 .notdef
|
||||
!87 U+0087 .notdef
|
||||
!88 U+0088 .notdef
|
||||
!89 U+0089 .notdef
|
||||
!8A U+008A .notdef
|
||||
!8B U+008B .notdef
|
||||
!8C U+008C .notdef
|
||||
!8D U+008D .notdef
|
||||
!8E U+008E .notdef
|
||||
!8F U+008F .notdef
|
||||
!90 U+0090 .notdef
|
||||
!91 U+0091 .notdef
|
||||
!92 U+0092 .notdef
|
||||
!93 U+0093 .notdef
|
||||
!94 U+0094 .notdef
|
||||
!95 U+0095 .notdef
|
||||
!96 U+0096 .notdef
|
||||
!97 U+0097 .notdef
|
||||
!98 U+0098 .notdef
|
||||
!99 U+0099 .notdef
|
||||
!9A U+009A .notdef
|
||||
!9B U+009B .notdef
|
||||
!9C U+009C .notdef
|
||||
!9D U+009D .notdef
|
||||
!9E U+009E .notdef
|
||||
!9F U+009F .notdef
|
||||
!A0 U+00A0 space
|
||||
!A1 U+0401 afii10023
|
||||
!A2 U+0402 afii10051
|
||||
!A3 U+0403 afii10052
|
||||
!A4 U+0404 afii10053
|
||||
!A5 U+0405 afii10054
|
||||
!A6 U+0406 afii10055
|
||||
!A7 U+0407 afii10056
|
||||
!A8 U+0408 afii10057
|
||||
!A9 U+0409 afii10058
|
||||
!AA U+040A afii10059
|
||||
!AB U+040B afii10060
|
||||
!AC U+040C afii10061
|
||||
!AD U+00AD hyphen
|
||||
!AE U+040E afii10062
|
||||
!AF U+040F afii10145
|
||||
!B0 U+0410 afii10017
|
||||
!B1 U+0411 afii10018
|
||||
!B2 U+0412 afii10019
|
||||
!B3 U+0413 afii10020
|
||||
!B4 U+0414 afii10021
|
||||
!B5 U+0415 afii10022
|
||||
!B6 U+0416 afii10024
|
||||
!B7 U+0417 afii10025
|
||||
!B8 U+0418 afii10026
|
||||
!B9 U+0419 afii10027
|
||||
!BA U+041A afii10028
|
||||
!BB U+041B afii10029
|
||||
!BC U+041C afii10030
|
||||
!BD U+041D afii10031
|
||||
!BE U+041E afii10032
|
||||
!BF U+041F afii10033
|
||||
!C0 U+0420 afii10034
|
||||
!C1 U+0421 afii10035
|
||||
!C2 U+0422 afii10036
|
||||
!C3 U+0423 afii10037
|
||||
!C4 U+0424 afii10038
|
||||
!C5 U+0425 afii10039
|
||||
!C6 U+0426 afii10040
|
||||
!C7 U+0427 afii10041
|
||||
!C8 U+0428 afii10042
|
||||
!C9 U+0429 afii10043
|
||||
!CA U+042A afii10044
|
||||
!CB U+042B afii10045
|
||||
!CC U+042C afii10046
|
||||
!CD U+042D afii10047
|
||||
!CE U+042E afii10048
|
||||
!CF U+042F afii10049
|
||||
!D0 U+0430 afii10065
|
||||
!D1 U+0431 afii10066
|
||||
!D2 U+0432 afii10067
|
||||
!D3 U+0433 afii10068
|
||||
!D4 U+0434 afii10069
|
||||
!D5 U+0435 afii10070
|
||||
!D6 U+0436 afii10072
|
||||
!D7 U+0437 afii10073
|
||||
!D8 U+0438 afii10074
|
||||
!D9 U+0439 afii10075
|
||||
!DA U+043A afii10076
|
||||
!DB U+043B afii10077
|
||||
!DC U+043C afii10078
|
||||
!DD U+043D afii10079
|
||||
!DE U+043E afii10080
|
||||
!DF U+043F afii10081
|
||||
!E0 U+0440 afii10082
|
||||
!E1 U+0441 afii10083
|
||||
!E2 U+0442 afii10084
|
||||
!E3 U+0443 afii10085
|
||||
!E4 U+0444 afii10086
|
||||
!E5 U+0445 afii10087
|
||||
!E6 U+0446 afii10088
|
||||
!E7 U+0447 afii10089
|
||||
!E8 U+0448 afii10090
|
||||
!E9 U+0449 afii10091
|
||||
!EA U+044A afii10092
|
||||
!EB U+044B afii10093
|
||||
!EC U+044C afii10094
|
||||
!ED U+044D afii10095
|
||||
!EE U+044E afii10096
|
||||
!EF U+044F afii10097
|
||||
!F0 U+2116 afii61352
|
||||
!F1 U+0451 afii10071
|
||||
!F2 U+0452 afii10099
|
||||
!F3 U+0453 afii10100
|
||||
!F4 U+0454 afii10101
|
||||
!F5 U+0455 afii10102
|
||||
!F6 U+0456 afii10103
|
||||
!F7 U+0457 afii10104
|
||||
!F8 U+0458 afii10105
|
||||
!F9 U+0459 afii10106
|
||||
!FA U+045A afii10107
|
||||
!FB U+045B afii10108
|
||||
!FC U+045C afii10109
|
||||
!FD U+00A7 section
|
||||
!FE U+045E afii10110
|
||||
!FF U+045F afii10193
|
||||
250
pdf/font/makefont/iso-8859-7.map
Executable file
250
pdf/font/makefont/iso-8859-7.map
Executable file
@@ -0,0 +1,250 @@
|
||||
!00 U+0000 .notdef
|
||||
!01 U+0001 .notdef
|
||||
!02 U+0002 .notdef
|
||||
!03 U+0003 .notdef
|
||||
!04 U+0004 .notdef
|
||||
!05 U+0005 .notdef
|
||||
!06 U+0006 .notdef
|
||||
!07 U+0007 .notdef
|
||||
!08 U+0008 .notdef
|
||||
!09 U+0009 .notdef
|
||||
!0A U+000A .notdef
|
||||
!0B U+000B .notdef
|
||||
!0C U+000C .notdef
|
||||
!0D U+000D .notdef
|
||||
!0E U+000E .notdef
|
||||
!0F U+000F .notdef
|
||||
!10 U+0010 .notdef
|
||||
!11 U+0011 .notdef
|
||||
!12 U+0012 .notdef
|
||||
!13 U+0013 .notdef
|
||||
!14 U+0014 .notdef
|
||||
!15 U+0015 .notdef
|
||||
!16 U+0016 .notdef
|
||||
!17 U+0017 .notdef
|
||||
!18 U+0018 .notdef
|
||||
!19 U+0019 .notdef
|
||||
!1A U+001A .notdef
|
||||
!1B U+001B .notdef
|
||||
!1C U+001C .notdef
|
||||
!1D U+001D .notdef
|
||||
!1E U+001E .notdef
|
||||
!1F U+001F .notdef
|
||||
!20 U+0020 space
|
||||
!21 U+0021 exclam
|
||||
!22 U+0022 quotedbl
|
||||
!23 U+0023 numbersign
|
||||
!24 U+0024 dollar
|
||||
!25 U+0025 percent
|
||||
!26 U+0026 ampersand
|
||||
!27 U+0027 quotesingle
|
||||
!28 U+0028 parenleft
|
||||
!29 U+0029 parenright
|
||||
!2A U+002A asterisk
|
||||
!2B U+002B plus
|
||||
!2C U+002C comma
|
||||
!2D U+002D hyphen
|
||||
!2E U+002E period
|
||||
!2F U+002F slash
|
||||
!30 U+0030 zero
|
||||
!31 U+0031 one
|
||||
!32 U+0032 two
|
||||
!33 U+0033 three
|
||||
!34 U+0034 four
|
||||
!35 U+0035 five
|
||||
!36 U+0036 six
|
||||
!37 U+0037 seven
|
||||
!38 U+0038 eight
|
||||
!39 U+0039 nine
|
||||
!3A U+003A colon
|
||||
!3B U+003B semicolon
|
||||
!3C U+003C less
|
||||
!3D U+003D equal
|
||||
!3E U+003E greater
|
||||
!3F U+003F question
|
||||
!40 U+0040 at
|
||||
!41 U+0041 A
|
||||
!42 U+0042 B
|
||||
!43 U+0043 C
|
||||
!44 U+0044 D
|
||||
!45 U+0045 E
|
||||
!46 U+0046 F
|
||||
!47 U+0047 G
|
||||
!48 U+0048 H
|
||||
!49 U+0049 I
|
||||
!4A U+004A J
|
||||
!4B U+004B K
|
||||
!4C U+004C L
|
||||
!4D U+004D M
|
||||
!4E U+004E N
|
||||
!4F U+004F O
|
||||
!50 U+0050 P
|
||||
!51 U+0051 Q
|
||||
!52 U+0052 R
|
||||
!53 U+0053 S
|
||||
!54 U+0054 T
|
||||
!55 U+0055 U
|
||||
!56 U+0056 V
|
||||
!57 U+0057 W
|
||||
!58 U+0058 X
|
||||
!59 U+0059 Y
|
||||
!5A U+005A Z
|
||||
!5B U+005B bracketleft
|
||||
!5C U+005C backslash
|
||||
!5D U+005D bracketright
|
||||
!5E U+005E asciicircum
|
||||
!5F U+005F underscore
|
||||
!60 U+0060 grave
|
||||
!61 U+0061 a
|
||||
!62 U+0062 b
|
||||
!63 U+0063 c
|
||||
!64 U+0064 d
|
||||
!65 U+0065 e
|
||||
!66 U+0066 f
|
||||
!67 U+0067 g
|
||||
!68 U+0068 h
|
||||
!69 U+0069 i
|
||||
!6A U+006A j
|
||||
!6B U+006B k
|
||||
!6C U+006C l
|
||||
!6D U+006D m
|
||||
!6E U+006E n
|
||||
!6F U+006F o
|
||||
!70 U+0070 p
|
||||
!71 U+0071 q
|
||||
!72 U+0072 r
|
||||
!73 U+0073 s
|
||||
!74 U+0074 t
|
||||
!75 U+0075 u
|
||||
!76 U+0076 v
|
||||
!77 U+0077 w
|
||||
!78 U+0078 x
|
||||
!79 U+0079 y
|
||||
!7A U+007A z
|
||||
!7B U+007B braceleft
|
||||
!7C U+007C bar
|
||||
!7D U+007D braceright
|
||||
!7E U+007E asciitilde
|
||||
!7F U+007F .notdef
|
||||
!80 U+0080 .notdef
|
||||
!81 U+0081 .notdef
|
||||
!82 U+0082 .notdef
|
||||
!83 U+0083 .notdef
|
||||
!84 U+0084 .notdef
|
||||
!85 U+0085 .notdef
|
||||
!86 U+0086 .notdef
|
||||
!87 U+0087 .notdef
|
||||
!88 U+0088 .notdef
|
||||
!89 U+0089 .notdef
|
||||
!8A U+008A .notdef
|
||||
!8B U+008B .notdef
|
||||
!8C U+008C .notdef
|
||||
!8D U+008D .notdef
|
||||
!8E U+008E .notdef
|
||||
!8F U+008F .notdef
|
||||
!90 U+0090 .notdef
|
||||
!91 U+0091 .notdef
|
||||
!92 U+0092 .notdef
|
||||
!93 U+0093 .notdef
|
||||
!94 U+0094 .notdef
|
||||
!95 U+0095 .notdef
|
||||
!96 U+0096 .notdef
|
||||
!97 U+0097 .notdef
|
||||
!98 U+0098 .notdef
|
||||
!99 U+0099 .notdef
|
||||
!9A U+009A .notdef
|
||||
!9B U+009B .notdef
|
||||
!9C U+009C .notdef
|
||||
!9D U+009D .notdef
|
||||
!9E U+009E .notdef
|
||||
!9F U+009F .notdef
|
||||
!A0 U+00A0 space
|
||||
!A1 U+2018 quoteleft
|
||||
!A2 U+2019 quoteright
|
||||
!A3 U+00A3 sterling
|
||||
!A6 U+00A6 brokenbar
|
||||
!A7 U+00A7 section
|
||||
!A8 U+00A8 dieresis
|
||||
!A9 U+00A9 copyright
|
||||
!AB U+00AB guillemotleft
|
||||
!AC U+00AC logicalnot
|
||||
!AD U+00AD hyphen
|
||||
!AF U+2015 afii00208
|
||||
!B0 U+00B0 degree
|
||||
!B1 U+00B1 plusminus
|
||||
!B2 U+00B2 twosuperior
|
||||
!B3 U+00B3 threesuperior
|
||||
!B4 U+0384 tonos
|
||||
!B5 U+0385 dieresistonos
|
||||
!B6 U+0386 Alphatonos
|
||||
!B7 U+00B7 periodcentered
|
||||
!B8 U+0388 Epsilontonos
|
||||
!B9 U+0389 Etatonos
|
||||
!BA U+038A Iotatonos
|
||||
!BB U+00BB guillemotright
|
||||
!BC U+038C Omicrontonos
|
||||
!BD U+00BD onehalf
|
||||
!BE U+038E Upsilontonos
|
||||
!BF U+038F Omegatonos
|
||||
!C0 U+0390 iotadieresistonos
|
||||
!C1 U+0391 Alpha
|
||||
!C2 U+0392 Beta
|
||||
!C3 U+0393 Gamma
|
||||
!C4 U+0394 Delta
|
||||
!C5 U+0395 Epsilon
|
||||
!C6 U+0396 Zeta
|
||||
!C7 U+0397 Eta
|
||||
!C8 U+0398 Theta
|
||||
!C9 U+0399 Iota
|
||||
!CA U+039A Kappa
|
||||
!CB U+039B Lambda
|
||||
!CC U+039C Mu
|
||||
!CD U+039D Nu
|
||||
!CE U+039E Xi
|
||||
!CF U+039F Omicron
|
||||
!D0 U+03A0 Pi
|
||||
!D1 U+03A1 Rho
|
||||
!D3 U+03A3 Sigma
|
||||
!D4 U+03A4 Tau
|
||||
!D5 U+03A5 Upsilon
|
||||
!D6 U+03A6 Phi
|
||||
!D7 U+03A7 Chi
|
||||
!D8 U+03A8 Psi
|
||||
!D9 U+03A9 Omega
|
||||
!DA U+03AA Iotadieresis
|
||||
!DB U+03AB Upsilondieresis
|
||||
!DC U+03AC alphatonos
|
||||
!DD U+03AD epsilontonos
|
||||
!DE U+03AE etatonos
|
||||
!DF U+03AF iotatonos
|
||||
!E0 U+03B0 upsilondieresistonos
|
||||
!E1 U+03B1 alpha
|
||||
!E2 U+03B2 beta
|
||||
!E3 U+03B3 gamma
|
||||
!E4 U+03B4 delta
|
||||
!E5 U+03B5 epsilon
|
||||
!E6 U+03B6 zeta
|
||||
!E7 U+03B7 eta
|
||||
!E8 U+03B8 theta
|
||||
!E9 U+03B9 iota
|
||||
!EA U+03BA kappa
|
||||
!EB U+03BB lambda
|
||||
!EC U+03BC mu
|
||||
!ED U+03BD nu
|
||||
!EE U+03BE xi
|
||||
!EF U+03BF omicron
|
||||
!F0 U+03C0 pi
|
||||
!F1 U+03C1 rho
|
||||
!F2 U+03C2 sigma1
|
||||
!F3 U+03C3 sigma
|
||||
!F4 U+03C4 tau
|
||||
!F5 U+03C5 upsilon
|
||||
!F6 U+03C6 phi
|
||||
!F7 U+03C7 chi
|
||||
!F8 U+03C8 psi
|
||||
!F9 U+03C9 omega
|
||||
!FA U+03CA iotadieresis
|
||||
!FB U+03CB upsilondieresis
|
||||
!FC U+03CC omicrontonos
|
||||
!FD U+03CD upsilontonos
|
||||
!FE U+03CE omegatonos
|
||||
256
pdf/font/makefont/iso-8859-9.map
Executable file
256
pdf/font/makefont/iso-8859-9.map
Executable file
@@ -0,0 +1,256 @@
|
||||
!00 U+0000 .notdef
|
||||
!01 U+0001 .notdef
|
||||
!02 U+0002 .notdef
|
||||
!03 U+0003 .notdef
|
||||
!04 U+0004 .notdef
|
||||
!05 U+0005 .notdef
|
||||
!06 U+0006 .notdef
|
||||
!07 U+0007 .notdef
|
||||
!08 U+0008 .notdef
|
||||
!09 U+0009 .notdef
|
||||
!0A U+000A .notdef
|
||||
!0B U+000B .notdef
|
||||
!0C U+000C .notdef
|
||||
!0D U+000D .notdef
|
||||
!0E U+000E .notdef
|
||||
!0F U+000F .notdef
|
||||
!10 U+0010 .notdef
|
||||
!11 U+0011 .notdef
|
||||
!12 U+0012 .notdef
|
||||
!13 U+0013 .notdef
|
||||
!14 U+0014 .notdef
|
||||
!15 U+0015 .notdef
|
||||
!16 U+0016 .notdef
|
||||
!17 U+0017 .notdef
|
||||
!18 U+0018 .notdef
|
||||
!19 U+0019 .notdef
|
||||
!1A U+001A .notdef
|
||||
!1B U+001B .notdef
|
||||
!1C U+001C .notdef
|
||||
!1D U+001D .notdef
|
||||
!1E U+001E .notdef
|
||||
!1F U+001F .notdef
|
||||
!20 U+0020 space
|
||||
!21 U+0021 exclam
|
||||
!22 U+0022 quotedbl
|
||||
!23 U+0023 numbersign
|
||||
!24 U+0024 dollar
|
||||
!25 U+0025 percent
|
||||
!26 U+0026 ampersand
|
||||
!27 U+0027 quotesingle
|
||||
!28 U+0028 parenleft
|
||||
!29 U+0029 parenright
|
||||
!2A U+002A asterisk
|
||||
!2B U+002B plus
|
||||
!2C U+002C comma
|
||||
!2D U+002D hyphen
|
||||
!2E U+002E period
|
||||
!2F U+002F slash
|
||||
!30 U+0030 zero
|
||||
!31 U+0031 one
|
||||
!32 U+0032 two
|
||||
!33 U+0033 three
|
||||
!34 U+0034 four
|
||||
!35 U+0035 five
|
||||
!36 U+0036 six
|
||||
!37 U+0037 seven
|
||||
!38 U+0038 eight
|
||||
!39 U+0039 nine
|
||||
!3A U+003A colon
|
||||
!3B U+003B semicolon
|
||||
!3C U+003C less
|
||||
!3D U+003D equal
|
||||
!3E U+003E greater
|
||||
!3F U+003F question
|
||||
!40 U+0040 at
|
||||
!41 U+0041 A
|
||||
!42 U+0042 B
|
||||
!43 U+0043 C
|
||||
!44 U+0044 D
|
||||
!45 U+0045 E
|
||||
!46 U+0046 F
|
||||
!47 U+0047 G
|
||||
!48 U+0048 H
|
||||
!49 U+0049 I
|
||||
!4A U+004A J
|
||||
!4B U+004B K
|
||||
!4C U+004C L
|
||||
!4D U+004D M
|
||||
!4E U+004E N
|
||||
!4F U+004F O
|
||||
!50 U+0050 P
|
||||
!51 U+0051 Q
|
||||
!52 U+0052 R
|
||||
!53 U+0053 S
|
||||
!54 U+0054 T
|
||||
!55 U+0055 U
|
||||
!56 U+0056 V
|
||||
!57 U+0057 W
|
||||
!58 U+0058 X
|
||||
!59 U+0059 Y
|
||||
!5A U+005A Z
|
||||
!5B U+005B bracketleft
|
||||
!5C U+005C backslash
|
||||
!5D U+005D bracketright
|
||||
!5E U+005E asciicircum
|
||||
!5F U+005F underscore
|
||||
!60 U+0060 grave
|
||||
!61 U+0061 a
|
||||
!62 U+0062 b
|
||||
!63 U+0063 c
|
||||
!64 U+0064 d
|
||||
!65 U+0065 e
|
||||
!66 U+0066 f
|
||||
!67 U+0067 g
|
||||
!68 U+0068 h
|
||||
!69 U+0069 i
|
||||
!6A U+006A j
|
||||
!6B U+006B k
|
||||
!6C U+006C l
|
||||
!6D U+006D m
|
||||
!6E U+006E n
|
||||
!6F U+006F o
|
||||
!70 U+0070 p
|
||||
!71 U+0071 q
|
||||
!72 U+0072 r
|
||||
!73 U+0073 s
|
||||
!74 U+0074 t
|
||||
!75 U+0075 u
|
||||
!76 U+0076 v
|
||||
!77 U+0077 w
|
||||
!78 U+0078 x
|
||||
!79 U+0079 y
|
||||
!7A U+007A z
|
||||
!7B U+007B braceleft
|
||||
!7C U+007C bar
|
||||
!7D U+007D braceright
|
||||
!7E U+007E asciitilde
|
||||
!7F U+007F .notdef
|
||||
!80 U+0080 .notdef
|
||||
!81 U+0081 .notdef
|
||||
!82 U+0082 .notdef
|
||||
!83 U+0083 .notdef
|
||||
!84 U+0084 .notdef
|
||||
!85 U+0085 .notdef
|
||||
!86 U+0086 .notdef
|
||||
!87 U+0087 .notdef
|
||||
!88 U+0088 .notdef
|
||||
!89 U+0089 .notdef
|
||||
!8A U+008A .notdef
|
||||
!8B U+008B .notdef
|
||||
!8C U+008C .notdef
|
||||
!8D U+008D .notdef
|
||||
!8E U+008E .notdef
|
||||
!8F U+008F .notdef
|
||||
!90 U+0090 .notdef
|
||||
!91 U+0091 .notdef
|
||||
!92 U+0092 .notdef
|
||||
!93 U+0093 .notdef
|
||||
!94 U+0094 .notdef
|
||||
!95 U+0095 .notdef
|
||||
!96 U+0096 .notdef
|
||||
!97 U+0097 .notdef
|
||||
!98 U+0098 .notdef
|
||||
!99 U+0099 .notdef
|
||||
!9A U+009A .notdef
|
||||
!9B U+009B .notdef
|
||||
!9C U+009C .notdef
|
||||
!9D U+009D .notdef
|
||||
!9E U+009E .notdef
|
||||
!9F U+009F .notdef
|
||||
!A0 U+00A0 space
|
||||
!A1 U+00A1 exclamdown
|
||||
!A2 U+00A2 cent
|
||||
!A3 U+00A3 sterling
|
||||
!A4 U+00A4 currency
|
||||
!A5 U+00A5 yen
|
||||
!A6 U+00A6 brokenbar
|
||||
!A7 U+00A7 section
|
||||
!A8 U+00A8 dieresis
|
||||
!A9 U+00A9 copyright
|
||||
!AA U+00AA ordfeminine
|
||||
!AB U+00AB guillemotleft
|
||||
!AC U+00AC logicalnot
|
||||
!AD U+00AD hyphen
|
||||
!AE U+00AE registered
|
||||
!AF U+00AF macron
|
||||
!B0 U+00B0 degree
|
||||
!B1 U+00B1 plusminus
|
||||
!B2 U+00B2 twosuperior
|
||||
!B3 U+00B3 threesuperior
|
||||
!B4 U+00B4 acute
|
||||
!B5 U+00B5 mu
|
||||
!B6 U+00B6 paragraph
|
||||
!B7 U+00B7 periodcentered
|
||||
!B8 U+00B8 cedilla
|
||||
!B9 U+00B9 onesuperior
|
||||
!BA U+00BA ordmasculine
|
||||
!BB U+00BB guillemotright
|
||||
!BC U+00BC onequarter
|
||||
!BD U+00BD onehalf
|
||||
!BE U+00BE threequarters
|
||||
!BF U+00BF questiondown
|
||||
!C0 U+00C0 Agrave
|
||||
!C1 U+00C1 Aacute
|
||||
!C2 U+00C2 Acircumflex
|
||||
!C3 U+00C3 Atilde
|
||||
!C4 U+00C4 Adieresis
|
||||
!C5 U+00C5 Aring
|
||||
!C6 U+00C6 AE
|
||||
!C7 U+00C7 Ccedilla
|
||||
!C8 U+00C8 Egrave
|
||||
!C9 U+00C9 Eacute
|
||||
!CA U+00CA Ecircumflex
|
||||
!CB U+00CB Edieresis
|
||||
!CC U+00CC Igrave
|
||||
!CD U+00CD Iacute
|
||||
!CE U+00CE Icircumflex
|
||||
!CF U+00CF Idieresis
|
||||
!D0 U+011E Gbreve
|
||||
!D1 U+00D1 Ntilde
|
||||
!D2 U+00D2 Ograve
|
||||
!D3 U+00D3 Oacute
|
||||
!D4 U+00D4 Ocircumflex
|
||||
!D5 U+00D5 Otilde
|
||||
!D6 U+00D6 Odieresis
|
||||
!D7 U+00D7 multiply
|
||||
!D8 U+00D8 Oslash
|
||||
!D9 U+00D9 Ugrave
|
||||
!DA U+00DA Uacute
|
||||
!DB U+00DB Ucircumflex
|
||||
!DC U+00DC Udieresis
|
||||
!DD U+0130 Idotaccent
|
||||
!DE U+015E Scedilla
|
||||
!DF U+00DF germandbls
|
||||
!E0 U+00E0 agrave
|
||||
!E1 U+00E1 aacute
|
||||
!E2 U+00E2 acircumflex
|
||||
!E3 U+00E3 atilde
|
||||
!E4 U+00E4 adieresis
|
||||
!E5 U+00E5 aring
|
||||
!E6 U+00E6 ae
|
||||
!E7 U+00E7 ccedilla
|
||||
!E8 U+00E8 egrave
|
||||
!E9 U+00E9 eacute
|
||||
!EA U+00EA ecircumflex
|
||||
!EB U+00EB edieresis
|
||||
!EC U+00EC igrave
|
||||
!ED U+00ED iacute
|
||||
!EE U+00EE icircumflex
|
||||
!EF U+00EF idieresis
|
||||
!F0 U+011F gbreve
|
||||
!F1 U+00F1 ntilde
|
||||
!F2 U+00F2 ograve
|
||||
!F3 U+00F3 oacute
|
||||
!F4 U+00F4 ocircumflex
|
||||
!F5 U+00F5 otilde
|
||||
!F6 U+00F6 odieresis
|
||||
!F7 U+00F7 divide
|
||||
!F8 U+00F8 oslash
|
||||
!F9 U+00F9 ugrave
|
||||
!FA U+00FA uacute
|
||||
!FB U+00FB ucircumflex
|
||||
!FC U+00FC udieresis
|
||||
!FD U+0131 dotlessi
|
||||
!FE U+015F scedilla
|
||||
!FF U+00FF ydieresis
|
||||
256
pdf/font/makefont/koi8-r.map
Executable file
256
pdf/font/makefont/koi8-r.map
Executable file
@@ -0,0 +1,256 @@
|
||||
!00 U+0000 .notdef
|
||||
!01 U+0001 .notdef
|
||||
!02 U+0002 .notdef
|
||||
!03 U+0003 .notdef
|
||||
!04 U+0004 .notdef
|
||||
!05 U+0005 .notdef
|
||||
!06 U+0006 .notdef
|
||||
!07 U+0007 .notdef
|
||||
!08 U+0008 .notdef
|
||||
!09 U+0009 .notdef
|
||||
!0A U+000A .notdef
|
||||
!0B U+000B .notdef
|
||||
!0C U+000C .notdef
|
||||
!0D U+000D .notdef
|
||||
!0E U+000E .notdef
|
||||
!0F U+000F .notdef
|
||||
!10 U+0010 .notdef
|
||||
!11 U+0011 .notdef
|
||||
!12 U+0012 .notdef
|
||||
!13 U+0013 .notdef
|
||||
!14 U+0014 .notdef
|
||||
!15 U+0015 .notdef
|
||||
!16 U+0016 .notdef
|
||||
!17 U+0017 .notdef
|
||||
!18 U+0018 .notdef
|
||||
!19 U+0019 .notdef
|
||||
!1A U+001A .notdef
|
||||
!1B U+001B .notdef
|
||||
!1C U+001C .notdef
|
||||
!1D U+001D .notdef
|
||||
!1E U+001E .notdef
|
||||
!1F U+001F .notdef
|
||||
!20 U+0020 space
|
||||
!21 U+0021 exclam
|
||||
!22 U+0022 quotedbl
|
||||
!23 U+0023 numbersign
|
||||
!24 U+0024 dollar
|
||||
!25 U+0025 percent
|
||||
!26 U+0026 ampersand
|
||||
!27 U+0027 quotesingle
|
||||
!28 U+0028 parenleft
|
||||
!29 U+0029 parenright
|
||||
!2A U+002A asterisk
|
||||
!2B U+002B plus
|
||||
!2C U+002C comma
|
||||
!2D U+002D hyphen
|
||||
!2E U+002E period
|
||||
!2F U+002F slash
|
||||
!30 U+0030 zero
|
||||
!31 U+0031 one
|
||||
!32 U+0032 two
|
||||
!33 U+0033 three
|
||||
!34 U+0034 four
|
||||
!35 U+0035 five
|
||||
!36 U+0036 six
|
||||
!37 U+0037 seven
|
||||
!38 U+0038 eight
|
||||
!39 U+0039 nine
|
||||
!3A U+003A colon
|
||||
!3B U+003B semicolon
|
||||
!3C U+003C less
|
||||
!3D U+003D equal
|
||||
!3E U+003E greater
|
||||
!3F U+003F question
|
||||
!40 U+0040 at
|
||||
!41 U+0041 A
|
||||
!42 U+0042 B
|
||||
!43 U+0043 C
|
||||
!44 U+0044 D
|
||||
!45 U+0045 E
|
||||
!46 U+0046 F
|
||||
!47 U+0047 G
|
||||
!48 U+0048 H
|
||||
!49 U+0049 I
|
||||
!4A U+004A J
|
||||
!4B U+004B K
|
||||
!4C U+004C L
|
||||
!4D U+004D M
|
||||
!4E U+004E N
|
||||
!4F U+004F O
|
||||
!50 U+0050 P
|
||||
!51 U+0051 Q
|
||||
!52 U+0052 R
|
||||
!53 U+0053 S
|
||||
!54 U+0054 T
|
||||
!55 U+0055 U
|
||||
!56 U+0056 V
|
||||
!57 U+0057 W
|
||||
!58 U+0058 X
|
||||
!59 U+0059 Y
|
||||
!5A U+005A Z
|
||||
!5B U+005B bracketleft
|
||||
!5C U+005C backslash
|
||||
!5D U+005D bracketright
|
||||
!5E U+005E asciicircum
|
||||
!5F U+005F underscore
|
||||
!60 U+0060 grave
|
||||
!61 U+0061 a
|
||||
!62 U+0062 b
|
||||
!63 U+0063 c
|
||||
!64 U+0064 d
|
||||
!65 U+0065 e
|
||||
!66 U+0066 f
|
||||
!67 U+0067 g
|
||||
!68 U+0068 h
|
||||
!69 U+0069 i
|
||||
!6A U+006A j
|
||||
!6B U+006B k
|
||||
!6C U+006C l
|
||||
!6D U+006D m
|
||||
!6E U+006E n
|
||||
!6F U+006F o
|
||||
!70 U+0070 p
|
||||
!71 U+0071 q
|
||||
!72 U+0072 r
|
||||
!73 U+0073 s
|
||||
!74 U+0074 t
|
||||
!75 U+0075 u
|
||||
!76 U+0076 v
|
||||
!77 U+0077 w
|
||||
!78 U+0078 x
|
||||
!79 U+0079 y
|
||||
!7A U+007A z
|
||||
!7B U+007B braceleft
|
||||
!7C U+007C bar
|
||||
!7D U+007D braceright
|
||||
!7E U+007E asciitilde
|
||||
!7F U+007F .notdef
|
||||
!80 U+2500 SF100000
|
||||
!81 U+2502 SF110000
|
||||
!82 U+250C SF010000
|
||||
!83 U+2510 SF030000
|
||||
!84 U+2514 SF020000
|
||||
!85 U+2518 SF040000
|
||||
!86 U+251C SF080000
|
||||
!87 U+2524 SF090000
|
||||
!88 U+252C SF060000
|
||||
!89 U+2534 SF070000
|
||||
!8A U+253C SF050000
|
||||
!8B U+2580 upblock
|
||||
!8C U+2584 dnblock
|
||||
!8D U+2588 block
|
||||
!8E U+258C lfblock
|
||||
!8F U+2590 rtblock
|
||||
!90 U+2591 ltshade
|
||||
!91 U+2592 shade
|
||||
!92 U+2593 dkshade
|
||||
!93 U+2320 integraltp
|
||||
!94 U+25A0 filledbox
|
||||
!95 U+2219 periodcentered
|
||||
!96 U+221A radical
|
||||
!97 U+2248 approxequal
|
||||
!98 U+2264 lessequal
|
||||
!99 U+2265 greaterequal
|
||||
!9A U+00A0 space
|
||||
!9B U+2321 integralbt
|
||||
!9C U+00B0 degree
|
||||
!9D U+00B2 twosuperior
|
||||
!9E U+00B7 periodcentered
|
||||
!9F U+00F7 divide
|
||||
!A0 U+2550 SF430000
|
||||
!A1 U+2551 SF240000
|
||||
!A2 U+2552 SF510000
|
||||
!A3 U+0451 afii10071
|
||||
!A4 U+2553 SF520000
|
||||
!A5 U+2554 SF390000
|
||||
!A6 U+2555 SF220000
|
||||
!A7 U+2556 SF210000
|
||||
!A8 U+2557 SF250000
|
||||
!A9 U+2558 SF500000
|
||||
!AA U+2559 SF490000
|
||||
!AB U+255A SF380000
|
||||
!AC U+255B SF280000
|
||||
!AD U+255C SF270000
|
||||
!AE U+255D SF260000
|
||||
!AF U+255E SF360000
|
||||
!B0 U+255F SF370000
|
||||
!B1 U+2560 SF420000
|
||||
!B2 U+2561 SF190000
|
||||
!B3 U+0401 afii10023
|
||||
!B4 U+2562 SF200000
|
||||
!B5 U+2563 SF230000
|
||||
!B6 U+2564 SF470000
|
||||
!B7 U+2565 SF480000
|
||||
!B8 U+2566 SF410000
|
||||
!B9 U+2567 SF450000
|
||||
!BA U+2568 SF460000
|
||||
!BB U+2569 SF400000
|
||||
!BC U+256A SF540000
|
||||
!BD U+256B SF530000
|
||||
!BE U+256C SF440000
|
||||
!BF U+00A9 copyright
|
||||
!C0 U+044E afii10096
|
||||
!C1 U+0430 afii10065
|
||||
!C2 U+0431 afii10066
|
||||
!C3 U+0446 afii10088
|
||||
!C4 U+0434 afii10069
|
||||
!C5 U+0435 afii10070
|
||||
!C6 U+0444 afii10086
|
||||
!C7 U+0433 afii10068
|
||||
!C8 U+0445 afii10087
|
||||
!C9 U+0438 afii10074
|
||||
!CA U+0439 afii10075
|
||||
!CB U+043A afii10076
|
||||
!CC U+043B afii10077
|
||||
!CD U+043C afii10078
|
||||
!CE U+043D afii10079
|
||||
!CF U+043E afii10080
|
||||
!D0 U+043F afii10081
|
||||
!D1 U+044F afii10097
|
||||
!D2 U+0440 afii10082
|
||||
!D3 U+0441 afii10083
|
||||
!D4 U+0442 afii10084
|
||||
!D5 U+0443 afii10085
|
||||
!D6 U+0436 afii10072
|
||||
!D7 U+0432 afii10067
|
||||
!D8 U+044C afii10094
|
||||
!D9 U+044B afii10093
|
||||
!DA U+0437 afii10073
|
||||
!DB U+0448 afii10090
|
||||
!DC U+044D afii10095
|
||||
!DD U+0449 afii10091
|
||||
!DE U+0447 afii10089
|
||||
!DF U+044A afii10092
|
||||
!E0 U+042E afii10048
|
||||
!E1 U+0410 afii10017
|
||||
!E2 U+0411 afii10018
|
||||
!E3 U+0426 afii10040
|
||||
!E4 U+0414 afii10021
|
||||
!E5 U+0415 afii10022
|
||||
!E6 U+0424 afii10038
|
||||
!E7 U+0413 afii10020
|
||||
!E8 U+0425 afii10039
|
||||
!E9 U+0418 afii10026
|
||||
!EA U+0419 afii10027
|
||||
!EB U+041A afii10028
|
||||
!EC U+041B afii10029
|
||||
!ED U+041C afii10030
|
||||
!EE U+041D afii10031
|
||||
!EF U+041E afii10032
|
||||
!F0 U+041F afii10033
|
||||
!F1 U+042F afii10049
|
||||
!F2 U+0420 afii10034
|
||||
!F3 U+0421 afii10035
|
||||
!F4 U+0422 afii10036
|
||||
!F5 U+0423 afii10037
|
||||
!F6 U+0416 afii10024
|
||||
!F7 U+0412 afii10019
|
||||
!F8 U+042C afii10046
|
||||
!F9 U+042B afii10045
|
||||
!FA U+0417 afii10025
|
||||
!FB U+0428 afii10042
|
||||
!FC U+042D afii10047
|
||||
!FD U+0429 afii10043
|
||||
!FE U+0427 afii10041
|
||||
!FF U+042A afii10044
|
||||
256
pdf/font/makefont/koi8-u.map
Executable file
256
pdf/font/makefont/koi8-u.map
Executable file
@@ -0,0 +1,256 @@
|
||||
!00 U+0000 .notdef
|
||||
!01 U+0001 .notdef
|
||||
!02 U+0002 .notdef
|
||||
!03 U+0003 .notdef
|
||||
!04 U+0004 .notdef
|
||||
!05 U+0005 .notdef
|
||||
!06 U+0006 .notdef
|
||||
!07 U+0007 .notdef
|
||||
!08 U+0008 .notdef
|
||||
!09 U+0009 .notdef
|
||||
!0A U+000A .notdef
|
||||
!0B U+000B .notdef
|
||||
!0C U+000C .notdef
|
||||
!0D U+000D .notdef
|
||||
!0E U+000E .notdef
|
||||
!0F U+000F .notdef
|
||||
!10 U+0010 .notdef
|
||||
!11 U+0011 .notdef
|
||||
!12 U+0012 .notdef
|
||||
!13 U+0013 .notdef
|
||||
!14 U+0014 .notdef
|
||||
!15 U+0015 .notdef
|
||||
!16 U+0016 .notdef
|
||||
!17 U+0017 .notdef
|
||||
!18 U+0018 .notdef
|
||||
!19 U+0019 .notdef
|
||||
!1A U+001A .notdef
|
||||
!1B U+001B .notdef
|
||||
!1C U+001C .notdef
|
||||
!1D U+001D .notdef
|
||||
!1E U+001E .notdef
|
||||
!1F U+001F .notdef
|
||||
!20 U+0020 space
|
||||
!21 U+0021 exclam
|
||||
!22 U+0022 quotedbl
|
||||
!23 U+0023 numbersign
|
||||
!24 U+0024 dollar
|
||||
!25 U+0025 percent
|
||||
!26 U+0026 ampersand
|
||||
!27 U+0027 quotesingle
|
||||
!28 U+0028 parenleft
|
||||
!29 U+0029 parenright
|
||||
!2A U+002A asterisk
|
||||
!2B U+002B plus
|
||||
!2C U+002C comma
|
||||
!2D U+002D hyphen
|
||||
!2E U+002E period
|
||||
!2F U+002F slash
|
||||
!30 U+0030 zero
|
||||
!31 U+0031 one
|
||||
!32 U+0032 two
|
||||
!33 U+0033 three
|
||||
!34 U+0034 four
|
||||
!35 U+0035 five
|
||||
!36 U+0036 six
|
||||
!37 U+0037 seven
|
||||
!38 U+0038 eight
|
||||
!39 U+0039 nine
|
||||
!3A U+003A colon
|
||||
!3B U+003B semicolon
|
||||
!3C U+003C less
|
||||
!3D U+003D equal
|
||||
!3E U+003E greater
|
||||
!3F U+003F question
|
||||
!40 U+0040 at
|
||||
!41 U+0041 A
|
||||
!42 U+0042 B
|
||||
!43 U+0043 C
|
||||
!44 U+0044 D
|
||||
!45 U+0045 E
|
||||
!46 U+0046 F
|
||||
!47 U+0047 G
|
||||
!48 U+0048 H
|
||||
!49 U+0049 I
|
||||
!4A U+004A J
|
||||
!4B U+004B K
|
||||
!4C U+004C L
|
||||
!4D U+004D M
|
||||
!4E U+004E N
|
||||
!4F U+004F O
|
||||
!50 U+0050 P
|
||||
!51 U+0051 Q
|
||||
!52 U+0052 R
|
||||
!53 U+0053 S
|
||||
!54 U+0054 T
|
||||
!55 U+0055 U
|
||||
!56 U+0056 V
|
||||
!57 U+0057 W
|
||||
!58 U+0058 X
|
||||
!59 U+0059 Y
|
||||
!5A U+005A Z
|
||||
!5B U+005B bracketleft
|
||||
!5C U+005C backslash
|
||||
!5D U+005D bracketright
|
||||
!5E U+005E asciicircum
|
||||
!5F U+005F underscore
|
||||
!60 U+0060 grave
|
||||
!61 U+0061 a
|
||||
!62 U+0062 b
|
||||
!63 U+0063 c
|
||||
!64 U+0064 d
|
||||
!65 U+0065 e
|
||||
!66 U+0066 f
|
||||
!67 U+0067 g
|
||||
!68 U+0068 h
|
||||
!69 U+0069 i
|
||||
!6A U+006A j
|
||||
!6B U+006B k
|
||||
!6C U+006C l
|
||||
!6D U+006D m
|
||||
!6E U+006E n
|
||||
!6F U+006F o
|
||||
!70 U+0070 p
|
||||
!71 U+0071 q
|
||||
!72 U+0072 r
|
||||
!73 U+0073 s
|
||||
!74 U+0074 t
|
||||
!75 U+0075 u
|
||||
!76 U+0076 v
|
||||
!77 U+0077 w
|
||||
!78 U+0078 x
|
||||
!79 U+0079 y
|
||||
!7A U+007A z
|
||||
!7B U+007B braceleft
|
||||
!7C U+007C bar
|
||||
!7D U+007D braceright
|
||||
!7E U+007E asciitilde
|
||||
!7F U+007F .notdef
|
||||
!80 U+2500 SF100000
|
||||
!81 U+2502 SF110000
|
||||
!82 U+250C SF010000
|
||||
!83 U+2510 SF030000
|
||||
!84 U+2514 SF020000
|
||||
!85 U+2518 SF040000
|
||||
!86 U+251C SF080000
|
||||
!87 U+2524 SF090000
|
||||
!88 U+252C SF060000
|
||||
!89 U+2534 SF070000
|
||||
!8A U+253C SF050000
|
||||
!8B U+2580 upblock
|
||||
!8C U+2584 dnblock
|
||||
!8D U+2588 block
|
||||
!8E U+258C lfblock
|
||||
!8F U+2590 rtblock
|
||||
!90 U+2591 ltshade
|
||||
!91 U+2592 shade
|
||||
!92 U+2593 dkshade
|
||||
!93 U+2320 integraltp
|
||||
!94 U+25A0 filledbox
|
||||
!95 U+2022 bullet
|
||||
!96 U+221A radical
|
||||
!97 U+2248 approxequal
|
||||
!98 U+2264 lessequal
|
||||
!99 U+2265 greaterequal
|
||||
!9A U+00A0 space
|
||||
!9B U+2321 integralbt
|
||||
!9C U+00B0 degree
|
||||
!9D U+00B2 twosuperior
|
||||
!9E U+00B7 periodcentered
|
||||
!9F U+00F7 divide
|
||||
!A0 U+2550 SF430000
|
||||
!A1 U+2551 SF240000
|
||||
!A2 U+2552 SF510000
|
||||
!A3 U+0451 afii10071
|
||||
!A4 U+0454 afii10101
|
||||
!A5 U+2554 SF390000
|
||||
!A6 U+0456 afii10103
|
||||
!A7 U+0457 afii10104
|
||||
!A8 U+2557 SF250000
|
||||
!A9 U+2558 SF500000
|
||||
!AA U+2559 SF490000
|
||||
!AB U+255A SF380000
|
||||
!AC U+255B SF280000
|
||||
!AD U+0491 afii10098
|
||||
!AE U+255D SF260000
|
||||
!AF U+255E SF360000
|
||||
!B0 U+255F SF370000
|
||||
!B1 U+2560 SF420000
|
||||
!B2 U+2561 SF190000
|
||||
!B3 U+0401 afii10023
|
||||
!B4 U+0404 afii10053
|
||||
!B5 U+2563 SF230000
|
||||
!B6 U+0406 afii10055
|
||||
!B7 U+0407 afii10056
|
||||
!B8 U+2566 SF410000
|
||||
!B9 U+2567 SF450000
|
||||
!BA U+2568 SF460000
|
||||
!BB U+2569 SF400000
|
||||
!BC U+256A SF540000
|
||||
!BD U+0490 afii10050
|
||||
!BE U+256C SF440000
|
||||
!BF U+00A9 copyright
|
||||
!C0 U+044E afii10096
|
||||
!C1 U+0430 afii10065
|
||||
!C2 U+0431 afii10066
|
||||
!C3 U+0446 afii10088
|
||||
!C4 U+0434 afii10069
|
||||
!C5 U+0435 afii10070
|
||||
!C6 U+0444 afii10086
|
||||
!C7 U+0433 afii10068
|
||||
!C8 U+0445 afii10087
|
||||
!C9 U+0438 afii10074
|
||||
!CA U+0439 afii10075
|
||||
!CB U+043A afii10076
|
||||
!CC U+043B afii10077
|
||||
!CD U+043C afii10078
|
||||
!CE U+043D afii10079
|
||||
!CF U+043E afii10080
|
||||
!D0 U+043F afii10081
|
||||
!D1 U+044F afii10097
|
||||
!D2 U+0440 afii10082
|
||||
!D3 U+0441 afii10083
|
||||
!D4 U+0442 afii10084
|
||||
!D5 U+0443 afii10085
|
||||
!D6 U+0436 afii10072
|
||||
!D7 U+0432 afii10067
|
||||
!D8 U+044C afii10094
|
||||
!D9 U+044B afii10093
|
||||
!DA U+0437 afii10073
|
||||
!DB U+0448 afii10090
|
||||
!DC U+044D afii10095
|
||||
!DD U+0449 afii10091
|
||||
!DE U+0447 afii10089
|
||||
!DF U+044A afii10092
|
||||
!E0 U+042E afii10048
|
||||
!E1 U+0410 afii10017
|
||||
!E2 U+0411 afii10018
|
||||
!E3 U+0426 afii10040
|
||||
!E4 U+0414 afii10021
|
||||
!E5 U+0415 afii10022
|
||||
!E6 U+0424 afii10038
|
||||
!E7 U+0413 afii10020
|
||||
!E8 U+0425 afii10039
|
||||
!E9 U+0418 afii10026
|
||||
!EA U+0419 afii10027
|
||||
!EB U+041A afii10028
|
||||
!EC U+041B afii10029
|
||||
!ED U+041C afii10030
|
||||
!EE U+041D afii10031
|
||||
!EF U+041E afii10032
|
||||
!F0 U+041F afii10033
|
||||
!F1 U+042F afii10049
|
||||
!F2 U+0420 afii10034
|
||||
!F3 U+0421 afii10035
|
||||
!F4 U+0422 afii10036
|
||||
!F5 U+0423 afii10037
|
||||
!F6 U+0416 afii10024
|
||||
!F7 U+0412 afii10019
|
||||
!F8 U+042C afii10046
|
||||
!F9 U+042B afii10045
|
||||
!FA U+0417 afii10025
|
||||
!FB U+0428 afii10042
|
||||
!FC U+042D afii10047
|
||||
!FD U+0429 afii10043
|
||||
!FE U+0427 afii10041
|
||||
!FF U+042A afii10044
|
||||
419
pdf/font/makefont/makefont.php
Executable file
419
pdf/font/makefont/makefont.php
Executable file
@@ -0,0 +1,419 @@
|
||||
<?php
|
||||
/*******************************************************************************
|
||||
* Utility to generate font definition files *
|
||||
* *
|
||||
* Version: 1.14 *
|
||||
* Date: 2008-08-03 *
|
||||
* Author: Olivier PLATHEY *
|
||||
*******************************************************************************/
|
||||
|
||||
function ReadMap($enc)
|
||||
{
|
||||
//Read a map file
|
||||
$file=dirname(__FILE__).'/'.strtolower($enc).'.map';
|
||||
$a=file($file);
|
||||
if(empty($a))
|
||||
die('<b>Error:</b> encoding not found: '.$enc);
|
||||
$cc2gn=array();
|
||||
foreach($a as $l)
|
||||
{
|
||||
if($l[0]=='!')
|
||||
{
|
||||
$e=preg_split('/[ \\t]+/',rtrim($l));
|
||||
$cc=hexdec(substr($e[0],1));
|
||||
$gn=$e[2];
|
||||
$cc2gn[$cc]=$gn;
|
||||
}
|
||||
}
|
||||
for($i=0;$i<=255;$i++)
|
||||
{
|
||||
if(!isset($cc2gn[$i]))
|
||||
$cc2gn[$i]='.notdef';
|
||||
}
|
||||
return $cc2gn;
|
||||
}
|
||||
|
||||
function ReadAFM($file, &$map)
|
||||
{
|
||||
//Read a font metric file
|
||||
$a=file($file);
|
||||
if(empty($a))
|
||||
die('File not found');
|
||||
$widths=array();
|
||||
$fm=array();
|
||||
$fix=array('Edot'=>'Edotaccent','edot'=>'edotaccent','Idot'=>'Idotaccent','Zdot'=>'Zdotaccent','zdot'=>'zdotaccent',
|
||||
'Odblacute'=>'Ohungarumlaut','odblacute'=>'ohungarumlaut','Udblacute'=>'Uhungarumlaut','udblacute'=>'uhungarumlaut',
|
||||
'Gcedilla'=>'Gcommaaccent','gcedilla'=>'gcommaaccent','Kcedilla'=>'Kcommaaccent','kcedilla'=>'kcommaaccent',
|
||||
'Lcedilla'=>'Lcommaaccent','lcedilla'=>'lcommaaccent','Ncedilla'=>'Ncommaaccent','ncedilla'=>'ncommaaccent',
|
||||
'Rcedilla'=>'Rcommaaccent','rcedilla'=>'rcommaaccent','Scedilla'=>'Scommaaccent','scedilla'=>'scommaaccent',
|
||||
'Tcedilla'=>'Tcommaaccent','tcedilla'=>'tcommaaccent','Dslash'=>'Dcroat','dslash'=>'dcroat','Dmacron'=>'Dcroat','dmacron'=>'dcroat',
|
||||
'combininggraveaccent'=>'gravecomb','combininghookabove'=>'hookabovecomb','combiningtildeaccent'=>'tildecomb',
|
||||
'combiningacuteaccent'=>'acutecomb','combiningdotbelow'=>'dotbelowcomb','dongsign'=>'dong');
|
||||
foreach($a as $l)
|
||||
{
|
||||
$e=explode(' ',rtrim($l));
|
||||
if(count($e)<2)
|
||||
continue;
|
||||
$code=$e[0];
|
||||
$param=$e[1];
|
||||
if($code=='C')
|
||||
{
|
||||
//Character metrics
|
||||
$cc=(int)$e[1];
|
||||
$w=$e[4];
|
||||
$gn=$e[7];
|
||||
if(substr($gn,-4)=='20AC')
|
||||
$gn='Euro';
|
||||
if(isset($fix[$gn]))
|
||||
{
|
||||
//Fix incorrect glyph name
|
||||
foreach($map as $c=>$n)
|
||||
{
|
||||
if($n==$fix[$gn])
|
||||
$map[$c]=$gn;
|
||||
}
|
||||
}
|
||||
if(empty($map))
|
||||
{
|
||||
//Symbolic font: use built-in encoding
|
||||
$widths[$cc]=$w;
|
||||
}
|
||||
else
|
||||
{
|
||||
$widths[$gn]=$w;
|
||||
if($gn=='X')
|
||||
$fm['CapXHeight']=$e[13];
|
||||
}
|
||||
if($gn=='.notdef')
|
||||
$fm['MissingWidth']=$w;
|
||||
}
|
||||
elseif($code=='FontName')
|
||||
$fm['FontName']=$param;
|
||||
elseif($code=='Weight')
|
||||
$fm['Weight']=$param;
|
||||
elseif($code=='ItalicAngle')
|
||||
$fm['ItalicAngle']=(double)$param;
|
||||
elseif($code=='Ascender')
|
||||
$fm['Ascender']=(int)$param;
|
||||
elseif($code=='Descender')
|
||||
$fm['Descender']=(int)$param;
|
||||
elseif($code=='UnderlineThickness')
|
||||
$fm['UnderlineThickness']=(int)$param;
|
||||
elseif($code=='UnderlinePosition')
|
||||
$fm['UnderlinePosition']=(int)$param;
|
||||
elseif($code=='IsFixedPitch')
|
||||
$fm['IsFixedPitch']=($param=='true');
|
||||
elseif($code=='FontBBox')
|
||||
$fm['FontBBox']=array($e[1],$e[2],$e[3],$e[4]);
|
||||
elseif($code=='CapHeight')
|
||||
$fm['CapHeight']=(int)$param;
|
||||
elseif($code=='StdVW')
|
||||
$fm['StdVW']=(int)$param;
|
||||
}
|
||||
if(!isset($fm['FontName']))
|
||||
die('FontName not found');
|
||||
if(!empty($map))
|
||||
{
|
||||
if(!isset($widths['.notdef']))
|
||||
$widths['.notdef']=600;
|
||||
if(!isset($widths['Delta']) && isset($widths['increment']))
|
||||
$widths['Delta']=$widths['increment'];
|
||||
//Order widths according to map
|
||||
for($i=0;$i<=255;$i++)
|
||||
{
|
||||
if(!isset($widths[$map[$i]]))
|
||||
{
|
||||
echo '<b>Warning:</b> character '.$map[$i].' is missing<br>';
|
||||
$widths[$i]=$widths['.notdef'];
|
||||
}
|
||||
else
|
||||
$widths[$i]=$widths[$map[$i]];
|
||||
}
|
||||
}
|
||||
$fm['Widths']=$widths;
|
||||
return $fm;
|
||||
}
|
||||
|
||||
function MakeFontDescriptor($fm, $symbolic)
|
||||
{
|
||||
//Ascent
|
||||
$asc=(isset($fm['Ascender']) ? $fm['Ascender'] : 1000);
|
||||
$fd="array('Ascent'=>".$asc;
|
||||
//Descent
|
||||
$desc=(isset($fm['Descender']) ? $fm['Descender'] : -200);
|
||||
$fd.=",'Descent'=>".$desc;
|
||||
//CapHeight
|
||||
if(isset($fm['CapHeight']))
|
||||
$ch=$fm['CapHeight'];
|
||||
elseif(isset($fm['CapXHeight']))
|
||||
$ch=$fm['CapXHeight'];
|
||||
else
|
||||
$ch=$asc;
|
||||
$fd.=",'CapHeight'=>".$ch;
|
||||
//Flags
|
||||
$flags=0;
|
||||
if(isset($fm['IsFixedPitch']) && $fm['IsFixedPitch'])
|
||||
$flags+=1<<0;
|
||||
if($symbolic)
|
||||
$flags+=1<<2;
|
||||
if(!$symbolic)
|
||||
$flags+=1<<5;
|
||||
if(isset($fm['ItalicAngle']) && $fm['ItalicAngle']!=0)
|
||||
$flags+=1<<6;
|
||||
$fd.=",'Flags'=>".$flags;
|
||||
//FontBBox
|
||||
if(isset($fm['FontBBox']))
|
||||
$fbb=$fm['FontBBox'];
|
||||
else
|
||||
$fbb=array(0,$desc-100,1000,$asc+100);
|
||||
$fd.=",'FontBBox'=>'[".$fbb[0].' '.$fbb[1].' '.$fbb[2].' '.$fbb[3]."]'";
|
||||
//ItalicAngle
|
||||
$ia=(isset($fm['ItalicAngle']) ? $fm['ItalicAngle'] : 0);
|
||||
$fd.=",'ItalicAngle'=>".$ia;
|
||||
//StemV
|
||||
if(isset($fm['StdVW']))
|
||||
$stemv=$fm['StdVW'];
|
||||
elseif(isset($fm['Weight']) && preg_match('/bold|black/i',$fm['Weight']))
|
||||
$stemv=120;
|
||||
else
|
||||
$stemv=70;
|
||||
$fd.=",'StemV'=>".$stemv;
|
||||
//MissingWidth
|
||||
if(isset($fm['MissingWidth']))
|
||||
$fd.=",'MissingWidth'=>".$fm['MissingWidth'];
|
||||
$fd.=')';
|
||||
return $fd;
|
||||
}
|
||||
|
||||
function MakeWidthArray($fm)
|
||||
{
|
||||
//Make character width array
|
||||
$s="array(\n\t";
|
||||
$cw=$fm['Widths'];
|
||||
for($i=0;$i<=255;$i++)
|
||||
{
|
||||
if(chr($i)=="'")
|
||||
$s.="'\\''";
|
||||
elseif(chr($i)=="\\")
|
||||
$s.="'\\\\'";
|
||||
elseif($i>=32 && $i<=126)
|
||||
$s.="'".chr($i)."'";
|
||||
else
|
||||
$s.="chr($i)";
|
||||
$s.='=>'.$fm['Widths'][$i];
|
||||
if($i<255)
|
||||
$s.=',';
|
||||
if(($i+1)%22==0)
|
||||
$s.="\n\t";
|
||||
}
|
||||
$s.=')';
|
||||
return $s;
|
||||
}
|
||||
|
||||
function MakeFontEncoding($map)
|
||||
{
|
||||
//Build differences from reference encoding
|
||||
$ref=ReadMap('cp1252');
|
||||
$s='';
|
||||
$last=0;
|
||||
for($i=32;$i<=255;$i++)
|
||||
{
|
||||
if($map[$i]!=$ref[$i])
|
||||
{
|
||||
if($i!=$last+1)
|
||||
$s.=$i.' ';
|
||||
$last=$i;
|
||||
$s.='/'.$map[$i].' ';
|
||||
}
|
||||
}
|
||||
return rtrim($s);
|
||||
}
|
||||
|
||||
function SaveToFile($file, $s, $mode)
|
||||
{
|
||||
$f=fopen($file,'w'.$mode);
|
||||
if(!$f)
|
||||
die('Can\'t write to file '.$file);
|
||||
fwrite($f,$s,strlen($s));
|
||||
fclose($f);
|
||||
}
|
||||
|
||||
function ReadShort($f)
|
||||
{
|
||||
$a=unpack('n1n',fread($f,2));
|
||||
return $a['n'];
|
||||
}
|
||||
|
||||
function ReadLong($f)
|
||||
{
|
||||
$a=unpack('N1N',fread($f,4));
|
||||
return $a['N'];
|
||||
}
|
||||
|
||||
function CheckTTF($file)
|
||||
{
|
||||
//Check if font license allows embedding
|
||||
$f=fopen($file,'rb');
|
||||
if(!$f)
|
||||
die('<b>Error:</b> Can\'t open '.$file);
|
||||
//Extract number of tables
|
||||
fseek($f,4,SEEK_CUR);
|
||||
$nb=ReadShort($f);
|
||||
fseek($f,6,SEEK_CUR);
|
||||
//Seek OS/2 table
|
||||
$found=false;
|
||||
for($i=0;$i<$nb;$i++)
|
||||
{
|
||||
if(fread($f,4)=='OS/2')
|
||||
{
|
||||
$found=true;
|
||||
break;
|
||||
}
|
||||
fseek($f,12,SEEK_CUR);
|
||||
}
|
||||
if(!$found)
|
||||
{
|
||||
fclose($f);
|
||||
return;
|
||||
}
|
||||
fseek($f,4,SEEK_CUR);
|
||||
$offset=ReadLong($f);
|
||||
fseek($f,$offset,SEEK_SET);
|
||||
//Extract fsType flags
|
||||
fseek($f,8,SEEK_CUR);
|
||||
$fsType=ReadShort($f);
|
||||
$rl=($fsType & 0x02)!=0;
|
||||
$pp=($fsType & 0x04)!=0;
|
||||
$e=($fsType & 0x08)!=0;
|
||||
fclose($f);
|
||||
if($rl && !$pp && !$e)
|
||||
echo '<b>Warning:</b> font license does not allow embedding';
|
||||
}
|
||||
|
||||
/*******************************************************************************
|
||||
* fontfile: path to TTF file (or empty string if not to be embedded) *
|
||||
* afmfile: path to AFM file *
|
||||
* enc: font encoding (or empty string for symbolic fonts) *
|
||||
* patch: optional patch for encoding *
|
||||
* type: font type if fontfile is empty *
|
||||
*******************************************************************************/
|
||||
function MakeFont($fontfile, $afmfile, $enc='cp1252', $patch=array(), $type='TrueType')
|
||||
{
|
||||
//Generate a font definition file
|
||||
if(get_magic_quotes_runtime())
|
||||
@set_magic_quotes_runtime(0);
|
||||
ini_set('auto_detect_line_endings','1');
|
||||
if($enc)
|
||||
{
|
||||
$map=ReadMap($enc);
|
||||
foreach($patch as $cc=>$gn)
|
||||
$map[$cc]=$gn;
|
||||
}
|
||||
else
|
||||
$map=array();
|
||||
if(!file_exists($afmfile))
|
||||
die('<b>Error:</b> AFM file not found: '.$afmfile);
|
||||
$fm=ReadAFM($afmfile,$map);
|
||||
if($enc)
|
||||
$diff=MakeFontEncoding($map);
|
||||
else
|
||||
$diff='';
|
||||
$fd=MakeFontDescriptor($fm,empty($map));
|
||||
//Find font type
|
||||
if($fontfile)
|
||||
{
|
||||
$ext=strtolower(substr($fontfile,-3));
|
||||
if($ext=='ttf')
|
||||
$type='TrueType';
|
||||
elseif($ext=='pfb')
|
||||
$type='Type1';
|
||||
else
|
||||
die('<b>Error:</b> unrecognized font file extension: '.$ext);
|
||||
}
|
||||
else
|
||||
{
|
||||
if($type!='TrueType' && $type!='Type1')
|
||||
die('<b>Error:</b> incorrect font type: '.$type);
|
||||
}
|
||||
//Start generation
|
||||
$s='<?php'."\n";
|
||||
$s.='$type=\''.$type."';\n";
|
||||
$s.='$name=\''.$fm['FontName']."';\n";
|
||||
$s.='$desc='.$fd.";\n";
|
||||
if(!isset($fm['UnderlinePosition']))
|
||||
$fm['UnderlinePosition']=-100;
|
||||
if(!isset($fm['UnderlineThickness']))
|
||||
$fm['UnderlineThickness']=50;
|
||||
$s.='$up='.$fm['UnderlinePosition'].";\n";
|
||||
$s.='$ut='.$fm['UnderlineThickness'].";\n";
|
||||
$w=MakeWidthArray($fm);
|
||||
$s.='$cw='.$w.";\n";
|
||||
$s.='$enc=\''.$enc."';\n";
|
||||
$s.='$diff=\''.$diff."';\n";
|
||||
$basename=substr(basename($afmfile),0,-4);
|
||||
if($fontfile)
|
||||
{
|
||||
//Embedded font
|
||||
if(!file_exists($fontfile))
|
||||
die('<b>Error:</b> font file not found: '.$fontfile);
|
||||
if($type=='TrueType')
|
||||
CheckTTF($fontfile);
|
||||
$f=fopen($fontfile,'rb');
|
||||
if(!$f)
|
||||
die('<b>Error:</b> Can\'t open '.$fontfile);
|
||||
$file=fread($f,filesize($fontfile));
|
||||
fclose($f);
|
||||
if($type=='Type1')
|
||||
{
|
||||
//Find first two sections and discard third one
|
||||
$header=(ord($file[0])==128);
|
||||
if($header)
|
||||
{
|
||||
//Strip first binary header
|
||||
$file=substr($file,6);
|
||||
}
|
||||
$pos=strpos($file,'eexec');
|
||||
if(!$pos)
|
||||
die('<b>Error:</b> font file does not seem to be valid Type1');
|
||||
$size1=$pos+6;
|
||||
if($header && ord($file[$size1])==128)
|
||||
{
|
||||
//Strip second binary header
|
||||
$file=substr($file,0,$size1).substr($file,$size1+6);
|
||||
}
|
||||
$pos=strpos($file,'00000000');
|
||||
if(!$pos)
|
||||
die('<b>Error:</b> font file does not seem to be valid Type1');
|
||||
$size2=$pos-$size1;
|
||||
$file=substr($file,0,$size1+$size2);
|
||||
}
|
||||
if(function_exists('gzcompress'))
|
||||
{
|
||||
$cmp=$basename.'.z';
|
||||
SaveToFile($cmp,gzcompress($file),'b');
|
||||
$s.='$file=\''.$cmp."';\n";
|
||||
echo 'Font file compressed ('.$cmp.')<br>';
|
||||
}
|
||||
else
|
||||
{
|
||||
$s.='$file=\''.basename($fontfile)."';\n";
|
||||
echo '<b>Notice:</b> font file could not be compressed (zlib extension not available)<br>';
|
||||
}
|
||||
if($type=='Type1')
|
||||
{
|
||||
$s.='$size1='.$size1.";\n";
|
||||
$s.='$size2='.$size2.";\n";
|
||||
}
|
||||
else
|
||||
$s.='$originalsize='.filesize($fontfile).";\n";
|
||||
}
|
||||
else
|
||||
{
|
||||
//Not embedded font
|
||||
$s.='$file='."'';\n";
|
||||
}
|
||||
$s.="?>\n";
|
||||
SaveToFile($basename.'.php',$s,'t');
|
||||
echo 'Font definition file generated ('.$basename.'.php'.')<br>';
|
||||
}
|
||||
?>
|
||||
1549
pdf/font/makefont/verdana.afm
Executable file
1549
pdf/font/makefont/verdana.afm
Executable file
File diff suppressed because it is too large
Load Diff
BIN
pdf/font/makefont/verdana.ttf
Executable file
BIN
pdf/font/makefont/verdana.ttf
Executable file
Binary file not shown.
15
pdf/font/symbol.php
Executable file
15
pdf/font/symbol.php
Executable file
@@ -0,0 +1,15 @@
|
||||
<?php
|
||||
$fpdf_charwidths['symbol']=array(
|
||||
chr(0)=>250,chr(1)=>250,chr(2)=>250,chr(3)=>250,chr(4)=>250,chr(5)=>250,chr(6)=>250,chr(7)=>250,chr(8)=>250,chr(9)=>250,chr(10)=>250,chr(11)=>250,chr(12)=>250,chr(13)=>250,chr(14)=>250,chr(15)=>250,chr(16)=>250,chr(17)=>250,chr(18)=>250,chr(19)=>250,chr(20)=>250,chr(21)=>250,
|
||||
chr(22)=>250,chr(23)=>250,chr(24)=>250,chr(25)=>250,chr(26)=>250,chr(27)=>250,chr(28)=>250,chr(29)=>250,chr(30)=>250,chr(31)=>250,' '=>250,'!'=>333,'"'=>713,'#'=>500,'$'=>549,'%'=>833,'&'=>778,'\''=>439,'('=>333,')'=>333,'*'=>500,'+'=>549,
|
||||
','=>250,'-'=>549,'.'=>250,'/'=>278,'0'=>500,'1'=>500,'2'=>500,'3'=>500,'4'=>500,'5'=>500,'6'=>500,'7'=>500,'8'=>500,'9'=>500,':'=>278,';'=>278,'<'=>549,'='=>549,'>'=>549,'?'=>444,'@'=>549,'A'=>722,
|
||||
'B'=>667,'C'=>722,'D'=>612,'E'=>611,'F'=>763,'G'=>603,'H'=>722,'I'=>333,'J'=>631,'K'=>722,'L'=>686,'M'=>889,'N'=>722,'O'=>722,'P'=>768,'Q'=>741,'R'=>556,'S'=>592,'T'=>611,'U'=>690,'V'=>439,'W'=>768,
|
||||
'X'=>645,'Y'=>795,'Z'=>611,'['=>333,'\\'=>863,']'=>333,'^'=>658,'_'=>500,'`'=>500,'a'=>631,'b'=>549,'c'=>549,'d'=>494,'e'=>439,'f'=>521,'g'=>411,'h'=>603,'i'=>329,'j'=>603,'k'=>549,'l'=>549,'m'=>576,
|
||||
'n'=>521,'o'=>549,'p'=>549,'q'=>521,'r'=>549,'s'=>603,'t'=>439,'u'=>576,'v'=>713,'w'=>686,'x'=>493,'y'=>686,'z'=>494,'{'=>480,'|'=>200,'}'=>480,'~'=>549,chr(127)=>0,chr(128)=>0,chr(129)=>0,chr(130)=>0,chr(131)=>0,
|
||||
chr(132)=>0,chr(133)=>0,chr(134)=>0,chr(135)=>0,chr(136)=>0,chr(137)=>0,chr(138)=>0,chr(139)=>0,chr(140)=>0,chr(141)=>0,chr(142)=>0,chr(143)=>0,chr(144)=>0,chr(145)=>0,chr(146)=>0,chr(147)=>0,chr(148)=>0,chr(149)=>0,chr(150)=>0,chr(151)=>0,chr(152)=>0,chr(153)=>0,
|
||||
chr(154)=>0,chr(155)=>0,chr(156)=>0,chr(157)=>0,chr(158)=>0,chr(159)=>0,chr(160)=>750,chr(161)=>620,chr(162)=>247,chr(163)=>549,chr(164)=>167,chr(165)=>713,chr(166)=>500,chr(167)=>753,chr(168)=>753,chr(169)=>753,chr(170)=>753,chr(171)=>1042,chr(172)=>987,chr(173)=>603,chr(174)=>987,chr(175)=>603,
|
||||
chr(176)=>400,chr(177)=>549,chr(178)=>411,chr(179)=>549,chr(180)=>549,chr(181)=>713,chr(182)=>494,chr(183)=>460,chr(184)=>549,chr(185)=>549,chr(186)=>549,chr(187)=>549,chr(188)=>1000,chr(189)=>603,chr(190)=>1000,chr(191)=>658,chr(192)=>823,chr(193)=>686,chr(194)=>795,chr(195)=>987,chr(196)=>768,chr(197)=>768,
|
||||
chr(198)=>823,chr(199)=>768,chr(200)=>768,chr(201)=>713,chr(202)=>713,chr(203)=>713,chr(204)=>713,chr(205)=>713,chr(206)=>713,chr(207)=>713,chr(208)=>768,chr(209)=>713,chr(210)=>790,chr(211)=>790,chr(212)=>890,chr(213)=>823,chr(214)=>549,chr(215)=>250,chr(216)=>713,chr(217)=>603,chr(218)=>603,chr(219)=>1042,
|
||||
chr(220)=>987,chr(221)=>603,chr(222)=>987,chr(223)=>603,chr(224)=>494,chr(225)=>329,chr(226)=>790,chr(227)=>790,chr(228)=>786,chr(229)=>713,chr(230)=>384,chr(231)=>384,chr(232)=>384,chr(233)=>384,chr(234)=>384,chr(235)=>384,chr(236)=>494,chr(237)=>494,chr(238)=>494,chr(239)=>494,chr(240)=>0,chr(241)=>329,
|
||||
chr(242)=>274,chr(243)=>686,chr(244)=>686,chr(245)=>686,chr(246)=>384,chr(247)=>384,chr(248)=>384,chr(249)=>384,chr(250)=>384,chr(251)=>384,chr(252)=>494,chr(253)=>494,chr(254)=>494,chr(255)=>0);
|
||||
?>
|
||||
15
pdf/font/times.php
Executable file
15
pdf/font/times.php
Executable file
@@ -0,0 +1,15 @@
|
||||
<?php
|
||||
$fpdf_charwidths['times']=array(
|
||||
chr(0)=>250,chr(1)=>250,chr(2)=>250,chr(3)=>250,chr(4)=>250,chr(5)=>250,chr(6)=>250,chr(7)=>250,chr(8)=>250,chr(9)=>250,chr(10)=>250,chr(11)=>250,chr(12)=>250,chr(13)=>250,chr(14)=>250,chr(15)=>250,chr(16)=>250,chr(17)=>250,chr(18)=>250,chr(19)=>250,chr(20)=>250,chr(21)=>250,
|
||||
chr(22)=>250,chr(23)=>250,chr(24)=>250,chr(25)=>250,chr(26)=>250,chr(27)=>250,chr(28)=>250,chr(29)=>250,chr(30)=>250,chr(31)=>250,' '=>250,'!'=>333,'"'=>408,'#'=>500,'$'=>500,'%'=>833,'&'=>778,'\''=>180,'('=>333,')'=>333,'*'=>500,'+'=>564,
|
||||
','=>250,'-'=>333,'.'=>250,'/'=>278,'0'=>500,'1'=>500,'2'=>500,'3'=>500,'4'=>500,'5'=>500,'6'=>500,'7'=>500,'8'=>500,'9'=>500,':'=>278,';'=>278,'<'=>564,'='=>564,'>'=>564,'?'=>444,'@'=>921,'A'=>722,
|
||||
'B'=>667,'C'=>667,'D'=>722,'E'=>611,'F'=>556,'G'=>722,'H'=>722,'I'=>333,'J'=>389,'K'=>722,'L'=>611,'M'=>889,'N'=>722,'O'=>722,'P'=>556,'Q'=>722,'R'=>667,'S'=>556,'T'=>611,'U'=>722,'V'=>722,'W'=>944,
|
||||
'X'=>722,'Y'=>722,'Z'=>611,'['=>333,'\\'=>278,']'=>333,'^'=>469,'_'=>500,'`'=>333,'a'=>444,'b'=>500,'c'=>444,'d'=>500,'e'=>444,'f'=>333,'g'=>500,'h'=>500,'i'=>278,'j'=>278,'k'=>500,'l'=>278,'m'=>778,
|
||||
'n'=>500,'o'=>500,'p'=>500,'q'=>500,'r'=>333,'s'=>389,'t'=>278,'u'=>500,'v'=>500,'w'=>722,'x'=>500,'y'=>500,'z'=>444,'{'=>480,'|'=>200,'}'=>480,'~'=>541,chr(127)=>350,chr(128)=>500,chr(129)=>350,chr(130)=>333,chr(131)=>500,
|
||||
chr(132)=>444,chr(133)=>1000,chr(134)=>500,chr(135)=>500,chr(136)=>333,chr(137)=>1000,chr(138)=>556,chr(139)=>333,chr(140)=>889,chr(141)=>350,chr(142)=>611,chr(143)=>350,chr(144)=>350,chr(145)=>333,chr(146)=>333,chr(147)=>444,chr(148)=>444,chr(149)=>350,chr(150)=>500,chr(151)=>1000,chr(152)=>333,chr(153)=>980,
|
||||
chr(154)=>389,chr(155)=>333,chr(156)=>722,chr(157)=>350,chr(158)=>444,chr(159)=>722,chr(160)=>250,chr(161)=>333,chr(162)=>500,chr(163)=>500,chr(164)=>500,chr(165)=>500,chr(166)=>200,chr(167)=>500,chr(168)=>333,chr(169)=>760,chr(170)=>276,chr(171)=>500,chr(172)=>564,chr(173)=>333,chr(174)=>760,chr(175)=>333,
|
||||
chr(176)=>400,chr(177)=>564,chr(178)=>300,chr(179)=>300,chr(180)=>333,chr(181)=>500,chr(182)=>453,chr(183)=>250,chr(184)=>333,chr(185)=>300,chr(186)=>310,chr(187)=>500,chr(188)=>750,chr(189)=>750,chr(190)=>750,chr(191)=>444,chr(192)=>722,chr(193)=>722,chr(194)=>722,chr(195)=>722,chr(196)=>722,chr(197)=>722,
|
||||
chr(198)=>889,chr(199)=>667,chr(200)=>611,chr(201)=>611,chr(202)=>611,chr(203)=>611,chr(204)=>333,chr(205)=>333,chr(206)=>333,chr(207)=>333,chr(208)=>722,chr(209)=>722,chr(210)=>722,chr(211)=>722,chr(212)=>722,chr(213)=>722,chr(214)=>722,chr(215)=>564,chr(216)=>722,chr(217)=>722,chr(218)=>722,chr(219)=>722,
|
||||
chr(220)=>722,chr(221)=>722,chr(222)=>556,chr(223)=>500,chr(224)=>444,chr(225)=>444,chr(226)=>444,chr(227)=>444,chr(228)=>444,chr(229)=>444,chr(230)=>667,chr(231)=>444,chr(232)=>444,chr(233)=>444,chr(234)=>444,chr(235)=>444,chr(236)=>278,chr(237)=>278,chr(238)=>278,chr(239)=>278,chr(240)=>500,chr(241)=>500,
|
||||
chr(242)=>500,chr(243)=>500,chr(244)=>500,chr(245)=>500,chr(246)=>500,chr(247)=>564,chr(248)=>500,chr(249)=>500,chr(250)=>500,chr(251)=>500,chr(252)=>500,chr(253)=>500,chr(254)=>500,chr(255)=>500);
|
||||
?>
|
||||
15
pdf/font/timesb.php
Executable file
15
pdf/font/timesb.php
Executable file
@@ -0,0 +1,15 @@
|
||||
<?php
|
||||
$fpdf_charwidths['timesB']=array(
|
||||
chr(0)=>250,chr(1)=>250,chr(2)=>250,chr(3)=>250,chr(4)=>250,chr(5)=>250,chr(6)=>250,chr(7)=>250,chr(8)=>250,chr(9)=>250,chr(10)=>250,chr(11)=>250,chr(12)=>250,chr(13)=>250,chr(14)=>250,chr(15)=>250,chr(16)=>250,chr(17)=>250,chr(18)=>250,chr(19)=>250,chr(20)=>250,chr(21)=>250,
|
||||
chr(22)=>250,chr(23)=>250,chr(24)=>250,chr(25)=>250,chr(26)=>250,chr(27)=>250,chr(28)=>250,chr(29)=>250,chr(30)=>250,chr(31)=>250,' '=>250,'!'=>333,'"'=>555,'#'=>500,'$'=>500,'%'=>1000,'&'=>833,'\''=>278,'('=>333,')'=>333,'*'=>500,'+'=>570,
|
||||
','=>250,'-'=>333,'.'=>250,'/'=>278,'0'=>500,'1'=>500,'2'=>500,'3'=>500,'4'=>500,'5'=>500,'6'=>500,'7'=>500,'8'=>500,'9'=>500,':'=>333,';'=>333,'<'=>570,'='=>570,'>'=>570,'?'=>500,'@'=>930,'A'=>722,
|
||||
'B'=>667,'C'=>722,'D'=>722,'E'=>667,'F'=>611,'G'=>778,'H'=>778,'I'=>389,'J'=>500,'K'=>778,'L'=>667,'M'=>944,'N'=>722,'O'=>778,'P'=>611,'Q'=>778,'R'=>722,'S'=>556,'T'=>667,'U'=>722,'V'=>722,'W'=>1000,
|
||||
'X'=>722,'Y'=>722,'Z'=>667,'['=>333,'\\'=>278,']'=>333,'^'=>581,'_'=>500,'`'=>333,'a'=>500,'b'=>556,'c'=>444,'d'=>556,'e'=>444,'f'=>333,'g'=>500,'h'=>556,'i'=>278,'j'=>333,'k'=>556,'l'=>278,'m'=>833,
|
||||
'n'=>556,'o'=>500,'p'=>556,'q'=>556,'r'=>444,'s'=>389,'t'=>333,'u'=>556,'v'=>500,'w'=>722,'x'=>500,'y'=>500,'z'=>444,'{'=>394,'|'=>220,'}'=>394,'~'=>520,chr(127)=>350,chr(128)=>500,chr(129)=>350,chr(130)=>333,chr(131)=>500,
|
||||
chr(132)=>500,chr(133)=>1000,chr(134)=>500,chr(135)=>500,chr(136)=>333,chr(137)=>1000,chr(138)=>556,chr(139)=>333,chr(140)=>1000,chr(141)=>350,chr(142)=>667,chr(143)=>350,chr(144)=>350,chr(145)=>333,chr(146)=>333,chr(147)=>500,chr(148)=>500,chr(149)=>350,chr(150)=>500,chr(151)=>1000,chr(152)=>333,chr(153)=>1000,
|
||||
chr(154)=>389,chr(155)=>333,chr(156)=>722,chr(157)=>350,chr(158)=>444,chr(159)=>722,chr(160)=>250,chr(161)=>333,chr(162)=>500,chr(163)=>500,chr(164)=>500,chr(165)=>500,chr(166)=>220,chr(167)=>500,chr(168)=>333,chr(169)=>747,chr(170)=>300,chr(171)=>500,chr(172)=>570,chr(173)=>333,chr(174)=>747,chr(175)=>333,
|
||||
chr(176)=>400,chr(177)=>570,chr(178)=>300,chr(179)=>300,chr(180)=>333,chr(181)=>556,chr(182)=>540,chr(183)=>250,chr(184)=>333,chr(185)=>300,chr(186)=>330,chr(187)=>500,chr(188)=>750,chr(189)=>750,chr(190)=>750,chr(191)=>500,chr(192)=>722,chr(193)=>722,chr(194)=>722,chr(195)=>722,chr(196)=>722,chr(197)=>722,
|
||||
chr(198)=>1000,chr(199)=>722,chr(200)=>667,chr(201)=>667,chr(202)=>667,chr(203)=>667,chr(204)=>389,chr(205)=>389,chr(206)=>389,chr(207)=>389,chr(208)=>722,chr(209)=>722,chr(210)=>778,chr(211)=>778,chr(212)=>778,chr(213)=>778,chr(214)=>778,chr(215)=>570,chr(216)=>778,chr(217)=>722,chr(218)=>722,chr(219)=>722,
|
||||
chr(220)=>722,chr(221)=>722,chr(222)=>611,chr(223)=>556,chr(224)=>500,chr(225)=>500,chr(226)=>500,chr(227)=>500,chr(228)=>500,chr(229)=>500,chr(230)=>722,chr(231)=>444,chr(232)=>444,chr(233)=>444,chr(234)=>444,chr(235)=>444,chr(236)=>278,chr(237)=>278,chr(238)=>278,chr(239)=>278,chr(240)=>500,chr(241)=>556,
|
||||
chr(242)=>500,chr(243)=>500,chr(244)=>500,chr(245)=>500,chr(246)=>500,chr(247)=>570,chr(248)=>500,chr(249)=>556,chr(250)=>556,chr(251)=>556,chr(252)=>556,chr(253)=>500,chr(254)=>556,chr(255)=>500);
|
||||
?>
|
||||
15
pdf/font/timesbi.php
Executable file
15
pdf/font/timesbi.php
Executable file
@@ -0,0 +1,15 @@
|
||||
<?php
|
||||
$fpdf_charwidths['timesBI']=array(
|
||||
chr(0)=>250,chr(1)=>250,chr(2)=>250,chr(3)=>250,chr(4)=>250,chr(5)=>250,chr(6)=>250,chr(7)=>250,chr(8)=>250,chr(9)=>250,chr(10)=>250,chr(11)=>250,chr(12)=>250,chr(13)=>250,chr(14)=>250,chr(15)=>250,chr(16)=>250,chr(17)=>250,chr(18)=>250,chr(19)=>250,chr(20)=>250,chr(21)=>250,
|
||||
chr(22)=>250,chr(23)=>250,chr(24)=>250,chr(25)=>250,chr(26)=>250,chr(27)=>250,chr(28)=>250,chr(29)=>250,chr(30)=>250,chr(31)=>250,' '=>250,'!'=>389,'"'=>555,'#'=>500,'$'=>500,'%'=>833,'&'=>778,'\''=>278,'('=>333,')'=>333,'*'=>500,'+'=>570,
|
||||
','=>250,'-'=>333,'.'=>250,'/'=>278,'0'=>500,'1'=>500,'2'=>500,'3'=>500,'4'=>500,'5'=>500,'6'=>500,'7'=>500,'8'=>500,'9'=>500,':'=>333,';'=>333,'<'=>570,'='=>570,'>'=>570,'?'=>500,'@'=>832,'A'=>667,
|
||||
'B'=>667,'C'=>667,'D'=>722,'E'=>667,'F'=>667,'G'=>722,'H'=>778,'I'=>389,'J'=>500,'K'=>667,'L'=>611,'M'=>889,'N'=>722,'O'=>722,'P'=>611,'Q'=>722,'R'=>667,'S'=>556,'T'=>611,'U'=>722,'V'=>667,'W'=>889,
|
||||
'X'=>667,'Y'=>611,'Z'=>611,'['=>333,'\\'=>278,']'=>333,'^'=>570,'_'=>500,'`'=>333,'a'=>500,'b'=>500,'c'=>444,'d'=>500,'e'=>444,'f'=>333,'g'=>500,'h'=>556,'i'=>278,'j'=>278,'k'=>500,'l'=>278,'m'=>778,
|
||||
'n'=>556,'o'=>500,'p'=>500,'q'=>500,'r'=>389,'s'=>389,'t'=>278,'u'=>556,'v'=>444,'w'=>667,'x'=>500,'y'=>444,'z'=>389,'{'=>348,'|'=>220,'}'=>348,'~'=>570,chr(127)=>350,chr(128)=>500,chr(129)=>350,chr(130)=>333,chr(131)=>500,
|
||||
chr(132)=>500,chr(133)=>1000,chr(134)=>500,chr(135)=>500,chr(136)=>333,chr(137)=>1000,chr(138)=>556,chr(139)=>333,chr(140)=>944,chr(141)=>350,chr(142)=>611,chr(143)=>350,chr(144)=>350,chr(145)=>333,chr(146)=>333,chr(147)=>500,chr(148)=>500,chr(149)=>350,chr(150)=>500,chr(151)=>1000,chr(152)=>333,chr(153)=>1000,
|
||||
chr(154)=>389,chr(155)=>333,chr(156)=>722,chr(157)=>350,chr(158)=>389,chr(159)=>611,chr(160)=>250,chr(161)=>389,chr(162)=>500,chr(163)=>500,chr(164)=>500,chr(165)=>500,chr(166)=>220,chr(167)=>500,chr(168)=>333,chr(169)=>747,chr(170)=>266,chr(171)=>500,chr(172)=>606,chr(173)=>333,chr(174)=>747,chr(175)=>333,
|
||||
chr(176)=>400,chr(177)=>570,chr(178)=>300,chr(179)=>300,chr(180)=>333,chr(181)=>576,chr(182)=>500,chr(183)=>250,chr(184)=>333,chr(185)=>300,chr(186)=>300,chr(187)=>500,chr(188)=>750,chr(189)=>750,chr(190)=>750,chr(191)=>500,chr(192)=>667,chr(193)=>667,chr(194)=>667,chr(195)=>667,chr(196)=>667,chr(197)=>667,
|
||||
chr(198)=>944,chr(199)=>667,chr(200)=>667,chr(201)=>667,chr(202)=>667,chr(203)=>667,chr(204)=>389,chr(205)=>389,chr(206)=>389,chr(207)=>389,chr(208)=>722,chr(209)=>722,chr(210)=>722,chr(211)=>722,chr(212)=>722,chr(213)=>722,chr(214)=>722,chr(215)=>570,chr(216)=>722,chr(217)=>722,chr(218)=>722,chr(219)=>722,
|
||||
chr(220)=>722,chr(221)=>611,chr(222)=>611,chr(223)=>500,chr(224)=>500,chr(225)=>500,chr(226)=>500,chr(227)=>500,chr(228)=>500,chr(229)=>500,chr(230)=>722,chr(231)=>444,chr(232)=>444,chr(233)=>444,chr(234)=>444,chr(235)=>444,chr(236)=>278,chr(237)=>278,chr(238)=>278,chr(239)=>278,chr(240)=>500,chr(241)=>556,
|
||||
chr(242)=>500,chr(243)=>500,chr(244)=>500,chr(245)=>500,chr(246)=>500,chr(247)=>570,chr(248)=>500,chr(249)=>556,chr(250)=>556,chr(251)=>556,chr(252)=>556,chr(253)=>444,chr(254)=>500,chr(255)=>444);
|
||||
?>
|
||||
15
pdf/font/timesi.php
Executable file
15
pdf/font/timesi.php
Executable file
@@ -0,0 +1,15 @@
|
||||
<?php
|
||||
$fpdf_charwidths['timesI']=array(
|
||||
chr(0)=>250,chr(1)=>250,chr(2)=>250,chr(3)=>250,chr(4)=>250,chr(5)=>250,chr(6)=>250,chr(7)=>250,chr(8)=>250,chr(9)=>250,chr(10)=>250,chr(11)=>250,chr(12)=>250,chr(13)=>250,chr(14)=>250,chr(15)=>250,chr(16)=>250,chr(17)=>250,chr(18)=>250,chr(19)=>250,chr(20)=>250,chr(21)=>250,
|
||||
chr(22)=>250,chr(23)=>250,chr(24)=>250,chr(25)=>250,chr(26)=>250,chr(27)=>250,chr(28)=>250,chr(29)=>250,chr(30)=>250,chr(31)=>250,' '=>250,'!'=>333,'"'=>420,'#'=>500,'$'=>500,'%'=>833,'&'=>778,'\''=>214,'('=>333,')'=>333,'*'=>500,'+'=>675,
|
||||
','=>250,'-'=>333,'.'=>250,'/'=>278,'0'=>500,'1'=>500,'2'=>500,'3'=>500,'4'=>500,'5'=>500,'6'=>500,'7'=>500,'8'=>500,'9'=>500,':'=>333,';'=>333,'<'=>675,'='=>675,'>'=>675,'?'=>500,'@'=>920,'A'=>611,
|
||||
'B'=>611,'C'=>667,'D'=>722,'E'=>611,'F'=>611,'G'=>722,'H'=>722,'I'=>333,'J'=>444,'K'=>667,'L'=>556,'M'=>833,'N'=>667,'O'=>722,'P'=>611,'Q'=>722,'R'=>611,'S'=>500,'T'=>556,'U'=>722,'V'=>611,'W'=>833,
|
||||
'X'=>611,'Y'=>556,'Z'=>556,'['=>389,'\\'=>278,']'=>389,'^'=>422,'_'=>500,'`'=>333,'a'=>500,'b'=>500,'c'=>444,'d'=>500,'e'=>444,'f'=>278,'g'=>500,'h'=>500,'i'=>278,'j'=>278,'k'=>444,'l'=>278,'m'=>722,
|
||||
'n'=>500,'o'=>500,'p'=>500,'q'=>500,'r'=>389,'s'=>389,'t'=>278,'u'=>500,'v'=>444,'w'=>667,'x'=>444,'y'=>444,'z'=>389,'{'=>400,'|'=>275,'}'=>400,'~'=>541,chr(127)=>350,chr(128)=>500,chr(129)=>350,chr(130)=>333,chr(131)=>500,
|
||||
chr(132)=>556,chr(133)=>889,chr(134)=>500,chr(135)=>500,chr(136)=>333,chr(137)=>1000,chr(138)=>500,chr(139)=>333,chr(140)=>944,chr(141)=>350,chr(142)=>556,chr(143)=>350,chr(144)=>350,chr(145)=>333,chr(146)=>333,chr(147)=>556,chr(148)=>556,chr(149)=>350,chr(150)=>500,chr(151)=>889,chr(152)=>333,chr(153)=>980,
|
||||
chr(154)=>389,chr(155)=>333,chr(156)=>667,chr(157)=>350,chr(158)=>389,chr(159)=>556,chr(160)=>250,chr(161)=>389,chr(162)=>500,chr(163)=>500,chr(164)=>500,chr(165)=>500,chr(166)=>275,chr(167)=>500,chr(168)=>333,chr(169)=>760,chr(170)=>276,chr(171)=>500,chr(172)=>675,chr(173)=>333,chr(174)=>760,chr(175)=>333,
|
||||
chr(176)=>400,chr(177)=>675,chr(178)=>300,chr(179)=>300,chr(180)=>333,chr(181)=>500,chr(182)=>523,chr(183)=>250,chr(184)=>333,chr(185)=>300,chr(186)=>310,chr(187)=>500,chr(188)=>750,chr(189)=>750,chr(190)=>750,chr(191)=>500,chr(192)=>611,chr(193)=>611,chr(194)=>611,chr(195)=>611,chr(196)=>611,chr(197)=>611,
|
||||
chr(198)=>889,chr(199)=>667,chr(200)=>611,chr(201)=>611,chr(202)=>611,chr(203)=>611,chr(204)=>333,chr(205)=>333,chr(206)=>333,chr(207)=>333,chr(208)=>722,chr(209)=>667,chr(210)=>722,chr(211)=>722,chr(212)=>722,chr(213)=>722,chr(214)=>722,chr(215)=>675,chr(216)=>722,chr(217)=>722,chr(218)=>722,chr(219)=>722,
|
||||
chr(220)=>722,chr(221)=>556,chr(222)=>611,chr(223)=>500,chr(224)=>500,chr(225)=>500,chr(226)=>500,chr(227)=>500,chr(228)=>500,chr(229)=>500,chr(230)=>667,chr(231)=>444,chr(232)=>444,chr(233)=>444,chr(234)=>444,chr(235)=>444,chr(236)=>278,chr(237)=>278,chr(238)=>278,chr(239)=>278,chr(240)=>500,chr(241)=>500,
|
||||
chr(242)=>500,chr(243)=>500,chr(244)=>500,chr(245)=>500,chr(246)=>500,chr(247)=>675,chr(248)=>500,chr(249)=>500,chr(250)=>500,chr(251)=>500,chr(252)=>500,chr(253)=>444,chr(254)=>500,chr(255)=>444);
|
||||
?>
|
||||
24
pdf/font/verdana.php
Executable file
24
pdf/font/verdana.php
Executable file
@@ -0,0 +1,24 @@
|
||||
<?php
|
||||
$type='TrueType';
|
||||
$name='Verdana';
|
||||
$desc=array('Ascent'=>1005,'Descent'=>-210,'CapHeight'=>727,'Flags'=>32,'FontBBox'=>'[-560 -303 1447 1051]','ItalicAngle'=>0,'StemV'=>70,'MissingWidth'=>1000);
|
||||
$up=-88;
|
||||
$ut=59;
|
||||
$cw=array(
|
||||
chr(0)=>1000,chr(1)=>1000,chr(2)=>1000,chr(3)=>1000,chr(4)=>1000,chr(5)=>1000,chr(6)=>1000,chr(7)=>1000,chr(8)=>1000,chr(9)=>1000,chr(10)=>1000,chr(11)=>1000,chr(12)=>1000,chr(13)=>1000,chr(14)=>1000,chr(15)=>1000,chr(16)=>1000,chr(17)=>1000,chr(18)=>1000,chr(19)=>1000,chr(20)=>1000,chr(21)=>1000,
|
||||
chr(22)=>1000,chr(23)=>1000,chr(24)=>1000,chr(25)=>1000,chr(26)=>1000,chr(27)=>1000,chr(28)=>1000,chr(29)=>1000,chr(30)=>1000,chr(31)=>1000,' '=>352,'!'=>394,'"'=>459,'#'=>818,'$'=>636,'%'=>1076,'&'=>727,'\''=>269,'('=>454,')'=>454,'*'=>636,'+'=>818,
|
||||
','=>364,'-'=>454,'.'=>364,'/'=>454,'0'=>636,'1'=>636,'2'=>636,'3'=>636,'4'=>636,'5'=>636,'6'=>636,'7'=>636,'8'=>636,'9'=>636,':'=>454,';'=>454,'<'=>818,'='=>818,'>'=>818,'?'=>545,'@'=>1000,'A'=>684,
|
||||
'B'=>686,'C'=>698,'D'=>771,'E'=>632,'F'=>575,'G'=>775,'H'=>751,'I'=>421,'J'=>455,'K'=>693,'L'=>557,'M'=>843,'N'=>748,'O'=>787,'P'=>603,'Q'=>787,'R'=>695,'S'=>684,'T'=>616,'U'=>732,'V'=>684,'W'=>989,
|
||||
'X'=>685,'Y'=>615,'Z'=>685,'['=>454,'\\'=>454,']'=>454,'^'=>818,'_'=>636,'`'=>636,'a'=>601,'b'=>623,'c'=>521,'d'=>623,'e'=>596,'f'=>352,'g'=>623,'h'=>633,'i'=>274,'j'=>344,'k'=>592,'l'=>274,'m'=>973,
|
||||
'n'=>633,'o'=>607,'p'=>623,'q'=>623,'r'=>427,'s'=>521,'t'=>394,'u'=>633,'v'=>592,'w'=>818,'x'=>592,'y'=>592,'z'=>525,'{'=>635,'|'=>454,'}'=>635,'~'=>818,chr(127)=>1000,chr(128)=>636,chr(129)=>1000,chr(130)=>269,chr(131)=>636,
|
||||
chr(132)=>459,chr(133)=>818,chr(134)=>636,chr(135)=>636,chr(136)=>636,chr(137)=>1521,chr(138)=>684,chr(139)=>454,chr(140)=>1070,chr(141)=>1000,chr(142)=>685,chr(143)=>1000,chr(144)=>1000,chr(145)=>269,chr(146)=>269,chr(147)=>459,chr(148)=>459,chr(149)=>545,chr(150)=>636,chr(151)=>1000,chr(152)=>636,chr(153)=>977,
|
||||
chr(154)=>521,chr(155)=>454,chr(156)=>981,chr(157)=>1000,chr(158)=>525,chr(159)=>615,chr(160)=>352,chr(161)=>394,chr(162)=>636,chr(163)=>636,chr(164)=>636,chr(165)=>636,chr(166)=>454,chr(167)=>636,chr(168)=>636,chr(169)=>1000,chr(170)=>545,chr(171)=>645,chr(172)=>818,chr(173)=>454,chr(174)=>1000,chr(175)=>636,
|
||||
chr(176)=>542,chr(177)=>818,chr(178)=>1000,chr(179)=>1000,chr(180)=>636,chr(181)=>640,chr(182)=>636,chr(183)=>364,chr(184)=>636,chr(185)=>1000,chr(186)=>545,chr(187)=>645,chr(188)=>1000,chr(189)=>1000,chr(190)=>1000,chr(191)=>545,chr(192)=>684,chr(193)=>684,chr(194)=>684,chr(195)=>684,chr(196)=>684,chr(197)=>684,
|
||||
chr(198)=>984,chr(199)=>698,chr(200)=>632,chr(201)=>632,chr(202)=>632,chr(203)=>632,chr(204)=>421,chr(205)=>421,chr(206)=>421,chr(207)=>421,chr(208)=>775,chr(209)=>748,chr(210)=>787,chr(211)=>787,chr(212)=>787,chr(213)=>787,chr(214)=>787,chr(215)=>818,chr(216)=>787,chr(217)=>732,chr(218)=>732,chr(219)=>732,
|
||||
chr(220)=>732,chr(221)=>615,chr(222)=>605,chr(223)=>620,chr(224)=>601,chr(225)=>601,chr(226)=>601,chr(227)=>601,chr(228)=>601,chr(229)=>601,chr(230)=>955,chr(231)=>521,chr(232)=>596,chr(233)=>596,chr(234)=>596,chr(235)=>596,chr(236)=>274,chr(237)=>274,chr(238)=>274,chr(239)=>274,chr(240)=>612,chr(241)=>633,
|
||||
chr(242)=>607,chr(243)=>607,chr(244)=>607,chr(245)=>607,chr(246)=>607,chr(247)=>818,chr(248)=>607,chr(249)=>633,chr(250)=>633,chr(251)=>633,chr(252)=>633,chr(253)=>592,chr(254)=>623,chr(255)=>592);
|
||||
$enc='cp1252';
|
||||
$diff='';
|
||||
$file='verdana.z';
|
||||
$originalsize=189144;
|
||||
?>
|
||||
BIN
pdf/font/verdana.z
Executable file
BIN
pdf/font/verdana.z
Executable file
Binary file not shown.
15
pdf/font/zapfdingbats.php
Executable file
15
pdf/font/zapfdingbats.php
Executable file
@@ -0,0 +1,15 @@
|
||||
<?php
|
||||
$fpdf_charwidths['zapfdingbats']=array(
|
||||
chr(0)=>0,chr(1)=>0,chr(2)=>0,chr(3)=>0,chr(4)=>0,chr(5)=>0,chr(6)=>0,chr(7)=>0,chr(8)=>0,chr(9)=>0,chr(10)=>0,chr(11)=>0,chr(12)=>0,chr(13)=>0,chr(14)=>0,chr(15)=>0,chr(16)=>0,chr(17)=>0,chr(18)=>0,chr(19)=>0,chr(20)=>0,chr(21)=>0,
|
||||
chr(22)=>0,chr(23)=>0,chr(24)=>0,chr(25)=>0,chr(26)=>0,chr(27)=>0,chr(28)=>0,chr(29)=>0,chr(30)=>0,chr(31)=>0,' '=>278,'!'=>974,'"'=>961,'#'=>974,'$'=>980,'%'=>719,'&'=>789,'\''=>790,'('=>791,')'=>690,'*'=>960,'+'=>939,
|
||||
','=>549,'-'=>855,'.'=>911,'/'=>933,'0'=>911,'1'=>945,'2'=>974,'3'=>755,'4'=>846,'5'=>762,'6'=>761,'7'=>571,'8'=>677,'9'=>763,':'=>760,';'=>759,'<'=>754,'='=>494,'>'=>552,'?'=>537,'@'=>577,'A'=>692,
|
||||
'B'=>786,'C'=>788,'D'=>788,'E'=>790,'F'=>793,'G'=>794,'H'=>816,'I'=>823,'J'=>789,'K'=>841,'L'=>823,'M'=>833,'N'=>816,'O'=>831,'P'=>923,'Q'=>744,'R'=>723,'S'=>749,'T'=>790,'U'=>792,'V'=>695,'W'=>776,
|
||||
'X'=>768,'Y'=>792,'Z'=>759,'['=>707,'\\'=>708,']'=>682,'^'=>701,'_'=>826,'`'=>815,'a'=>789,'b'=>789,'c'=>707,'d'=>687,'e'=>696,'f'=>689,'g'=>786,'h'=>787,'i'=>713,'j'=>791,'k'=>785,'l'=>791,'m'=>873,
|
||||
'n'=>761,'o'=>762,'p'=>762,'q'=>759,'r'=>759,'s'=>892,'t'=>892,'u'=>788,'v'=>784,'w'=>438,'x'=>138,'y'=>277,'z'=>415,'{'=>392,'|'=>392,'}'=>668,'~'=>668,chr(127)=>0,chr(128)=>390,chr(129)=>390,chr(130)=>317,chr(131)=>317,
|
||||
chr(132)=>276,chr(133)=>276,chr(134)=>509,chr(135)=>509,chr(136)=>410,chr(137)=>410,chr(138)=>234,chr(139)=>234,chr(140)=>334,chr(141)=>334,chr(142)=>0,chr(143)=>0,chr(144)=>0,chr(145)=>0,chr(146)=>0,chr(147)=>0,chr(148)=>0,chr(149)=>0,chr(150)=>0,chr(151)=>0,chr(152)=>0,chr(153)=>0,
|
||||
chr(154)=>0,chr(155)=>0,chr(156)=>0,chr(157)=>0,chr(158)=>0,chr(159)=>0,chr(160)=>0,chr(161)=>732,chr(162)=>544,chr(163)=>544,chr(164)=>910,chr(165)=>667,chr(166)=>760,chr(167)=>760,chr(168)=>776,chr(169)=>595,chr(170)=>694,chr(171)=>626,chr(172)=>788,chr(173)=>788,chr(174)=>788,chr(175)=>788,
|
||||
chr(176)=>788,chr(177)=>788,chr(178)=>788,chr(179)=>788,chr(180)=>788,chr(181)=>788,chr(182)=>788,chr(183)=>788,chr(184)=>788,chr(185)=>788,chr(186)=>788,chr(187)=>788,chr(188)=>788,chr(189)=>788,chr(190)=>788,chr(191)=>788,chr(192)=>788,chr(193)=>788,chr(194)=>788,chr(195)=>788,chr(196)=>788,chr(197)=>788,
|
||||
chr(198)=>788,chr(199)=>788,chr(200)=>788,chr(201)=>788,chr(202)=>788,chr(203)=>788,chr(204)=>788,chr(205)=>788,chr(206)=>788,chr(207)=>788,chr(208)=>788,chr(209)=>788,chr(210)=>788,chr(211)=>788,chr(212)=>894,chr(213)=>838,chr(214)=>1016,chr(215)=>458,chr(216)=>748,chr(217)=>924,chr(218)=>748,chr(219)=>918,
|
||||
chr(220)=>927,chr(221)=>928,chr(222)=>928,chr(223)=>834,chr(224)=>873,chr(225)=>828,chr(226)=>924,chr(227)=>924,chr(228)=>917,chr(229)=>930,chr(230)=>931,chr(231)=>463,chr(232)=>883,chr(233)=>836,chr(234)=>836,chr(235)=>867,chr(236)=>867,chr(237)=>696,chr(238)=>696,chr(239)=>874,chr(240)=>0,chr(241)=>874,
|
||||
chr(242)=>760,chr(243)=>946,chr(244)=>771,chr(245)=>865,chr(246)=>771,chr(247)=>888,chr(248)=>967,chr(249)=>888,chr(250)=>831,chr(251)=>873,chr(252)=>927,chr(253)=>970,chr(254)=>918,chr(255)=>0);
|
||||
?>
|
||||
21
pdf/fpdf.css
Executable file
21
pdf/fpdf.css
Executable file
@@ -0,0 +1,21 @@
|
||||
body {font-family:"Times New Roman",serif}
|
||||
h1 {font:bold 135% Arial,sans-serif; color:#4000A0; margin-bottom:0.9em}
|
||||
h2 {font:bold 95% Arial,sans-serif; color:#900000; margin-top:1.5em; margin-bottom:1em}
|
||||
dl.param dt {text-decoration:underline}
|
||||
dl.param dd {margin-top:1em; margin-bottom:1em}
|
||||
dl.param ul {margin-top:1em; margin-bottom:1em}
|
||||
tt, code, kbd {font-family:"Courier New",Courier,monospace; font-size:82%}
|
||||
div.source {margin-top:1.4em; margin-bottom:1.3em}
|
||||
div.source pre {display:table; border:1px solid #24246A; width:100%; margin:0em; font-family:inherit; font-size:100%}
|
||||
div.source code {display:block; border:1px solid #C5C5EC; background-color:#F0F5FF; padding:6px; color:#000000}
|
||||
div.doc-source {margin-top:1.4em; margin-bottom:1.3em}
|
||||
div.doc-source pre {display:table; width:100%; margin:0em; font-family:inherit; font-size:100%}
|
||||
div.doc-source code {display:block; background-color:#E0E0E0; padding:4px}
|
||||
.kw {color:#000080; font-weight:bold}
|
||||
.str {color:#CC0000}
|
||||
.cmt {color:#008000}
|
||||
p.demo {text-align:center; margin-top:-0.9em}
|
||||
a.demo {text-decoration:none; font-weight:bold; color:#0000CC}
|
||||
a.demo:link {text-decoration:none; font-weight:bold; color:#0000CC}
|
||||
a.demo:hover {text-decoration:none; font-weight:bold; color:#0000FF}
|
||||
a.demo:active {text-decoration:none; font-weight:bold; color:#0000FF}
|
||||
1732
pdf/fpdf.php
Executable file
1732
pdf/fpdf.php
Executable file
File diff suppressed because it is too large
Load Diff
449
pdf/fpdf_tpl.php
Executable file
449
pdf/fpdf_tpl.php
Executable file
@@ -0,0 +1,449 @@
|
||||
<?php
|
||||
//
|
||||
// FPDF_TPL - Version 1.2
|
||||
//
|
||||
// Copyright 2004-2010 Setasign - Jan Slabon
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
//
|
||||
|
||||
class FPDF_TPL extends FPDF {
|
||||
/**
|
||||
* Array of Tpl-Data
|
||||
* @var array
|
||||
*/
|
||||
var $tpls = array();
|
||||
|
||||
/**
|
||||
* Current Template-ID
|
||||
* @var int
|
||||
*/
|
||||
var $tpl = 0;
|
||||
|
||||
/**
|
||||
* "In Template"-Flag
|
||||
* @var boolean
|
||||
*/
|
||||
var $_intpl = false;
|
||||
|
||||
/**
|
||||
* Nameprefix of Templates used in Resources-Dictonary
|
||||
* @var string A String defining the Prefix used as Template-Object-Names. Have to beginn with an /
|
||||
*/
|
||||
var $tplprefix = "/TPL";
|
||||
|
||||
/**
|
||||
* Resources used By Templates and Pages
|
||||
* @var array
|
||||
*/
|
||||
var $_res = array();
|
||||
|
||||
/**
|
||||
* Last used Template data
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
var $lastUsedTemplateData = array();
|
||||
|
||||
/**
|
||||
* Start a Template
|
||||
*
|
||||
* This method starts a template. You can give own coordinates to build an own sized
|
||||
* Template. Pay attention, that the margins are adapted to the new templatesize.
|
||||
* If you want to write outside the template, for example to build a clipped Template,
|
||||
* you have to set the Margins and "Cursor"-Position manual after beginTemplate-Call.
|
||||
*
|
||||
* If no parameter is given, the template uses the current page-size.
|
||||
* The Method returns an ID of the current Template. This ID is used later for using this template.
|
||||
* Warning: A created Template is used in PDF at all events. Still if you don't use it after creation!
|
||||
*
|
||||
* @param int $x The x-coordinate given in user-unit
|
||||
* @param int $y The y-coordinate given in user-unit
|
||||
* @param int $w The width given in user-unit
|
||||
* @param int $h The height given in user-unit
|
||||
* @return int The ID of new created Template
|
||||
*/
|
||||
function beginTemplate($x = null, $y = null, $w = null, $h = null) {
|
||||
if (is_subclass_of($this, 'TCPDF')) {
|
||||
$this->Error('This method is only usable with FPDF. Use TCPDF methods startTemplate() instead.');
|
||||
return;
|
||||
}
|
||||
|
||||
if ($this->page <= 0)
|
||||
$this->error("You have to add a page to fpdf first!");
|
||||
|
||||
if ($x == null)
|
||||
$x = 0;
|
||||
if ($y == null)
|
||||
$y = 0;
|
||||
if ($w == null)
|
||||
$w = $this->w;
|
||||
if ($h == null)
|
||||
$h = $this->h;
|
||||
|
||||
// Save settings
|
||||
$this->tpl++;
|
||||
$tpl =& $this->tpls[$this->tpl];
|
||||
$tpl = array(
|
||||
'o_x' => $this->x,
|
||||
'o_y' => $this->y,
|
||||
'o_AutoPageBreak' => $this->AutoPageBreak,
|
||||
'o_bMargin' => $this->bMargin,
|
||||
'o_tMargin' => $this->tMargin,
|
||||
'o_lMargin' => $this->lMargin,
|
||||
'o_rMargin' => $this->rMargin,
|
||||
'o_h' => $this->h,
|
||||
'o_w' => $this->w,
|
||||
'buffer' => '',
|
||||
'x' => $x,
|
||||
'y' => $y,
|
||||
'w' => $w,
|
||||
'h' => $h
|
||||
);
|
||||
|
||||
$this->SetAutoPageBreak(false);
|
||||
|
||||
// Define own high and width to calculate possitions correct
|
||||
$this->h = $h;
|
||||
$this->w = $w;
|
||||
|
||||
$this->_intpl = true;
|
||||
$this->SetXY($x + $this->lMargin, $y + $this->tMargin);
|
||||
$this->SetRightMargin($this->w - $w + $this->rMargin);
|
||||
|
||||
return $this->tpl;
|
||||
}
|
||||
|
||||
/**
|
||||
* End Template
|
||||
*
|
||||
* This method ends a template and reset initiated variables on beginTemplate.
|
||||
*
|
||||
* @return mixed If a template is opened, the ID is returned. If not a false is returned.
|
||||
*/
|
||||
function endTemplate() {
|
||||
if (is_subclass_of($this, 'TCPDF')) {
|
||||
$args = func_get_args();
|
||||
return call_user_func_array(array($this, 'TCPDF::endTemplate'), $args);
|
||||
}
|
||||
|
||||
if ($this->_intpl) {
|
||||
$this->_intpl = false;
|
||||
$tpl =& $this->tpls[$this->tpl];
|
||||
$this->SetXY($tpl['o_x'], $tpl['o_y']);
|
||||
$this->tMargin = $tpl['o_tMargin'];
|
||||
$this->lMargin = $tpl['o_lMargin'];
|
||||
$this->rMargin = $tpl['o_rMargin'];
|
||||
$this->h = $tpl['o_h'];
|
||||
$this->w = $tpl['o_w'];
|
||||
$this->SetAutoPageBreak($tpl['o_AutoPageBreak'], $tpl['o_bMargin']);
|
||||
|
||||
return $this->tpl;
|
||||
} else {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Use a Template in current Page or other Template
|
||||
*
|
||||
* You can use a template in a page or in another template.
|
||||
* You can give the used template a new size like you use the Image()-method.
|
||||
* All parameters are optional. The width or height is calculated automaticaly
|
||||
* if one is given. If no parameter is given the origin size as defined in
|
||||
* beginTemplate() is used.
|
||||
* The calculated or used width and height are returned as an array.
|
||||
*
|
||||
* @param int $tplidx A valid template-Id
|
||||
* @param int $_x The x-position
|
||||
* @param int $_y The y-position
|
||||
* @param int $_w The new width of the template
|
||||
* @param int $_h The new height of the template
|
||||
* @retrun array The height and width of the template
|
||||
*/
|
||||
function useTemplate($tplidx, $_x = null, $_y = null, $_w = 0, $_h = 0) {
|
||||
if ($this->page <= 0)
|
||||
$this->error('You have to add a page first!');
|
||||
|
||||
if (!isset($this->tpls[$tplidx]))
|
||||
$this->error('Template does not exist!');
|
||||
|
||||
if ($this->_intpl) {
|
||||
$this->_res['tpl'][$this->tpl]['tpls'][$tplidx] =& $this->tpls[$tplidx];
|
||||
}
|
||||
|
||||
$tpl =& $this->tpls[$tplidx];
|
||||
$w = $tpl['w'];
|
||||
$h = $tpl['h'];
|
||||
|
||||
if ($_x == null)
|
||||
$_x = 0;
|
||||
if ($_y == null)
|
||||
$_y = 0;
|
||||
|
||||
$_x += $tpl['x'];
|
||||
$_y += $tpl['y'];
|
||||
|
||||
$wh = $this->getTemplateSize($tplidx, $_w, $_h);
|
||||
$_w = $wh['w'];
|
||||
$_h = $wh['h'];
|
||||
|
||||
$tData = array(
|
||||
'x' => $this->x,
|
||||
'y' => $this->y,
|
||||
'w' => $_w,
|
||||
'h' => $_h,
|
||||
'scaleX' => ($_w / $w),
|
||||
'scaleY' => ($_h / $h),
|
||||
'tx' => $_x,
|
||||
'ty' => ($this->h - $_y - $_h),
|
||||
'lty' => ($this->h - $_y - $_h) - ($this->h - $h) * ($_h / $h)
|
||||
);
|
||||
|
||||
$this->_out(sprintf('q %.4F 0 0 %.4F %.4F %.4F cm', $tData['scaleX'], $tData['scaleY'], $tData['tx'] * $this->k, $tData['ty'] * $this->k)); // Translate
|
||||
$this->_out(sprintf('%s%d Do Q', $this->tplprefix, $tplidx));
|
||||
|
||||
// reset font in the outer graphic state
|
||||
if ($this->FontFamily) {
|
||||
$family = $this->FontFamily;
|
||||
$this->FontFamily = '';
|
||||
$this->SetFont($family);
|
||||
}
|
||||
|
||||
$this->lastUsedTemplateData = $tData;
|
||||
|
||||
return array('w' => $_w, 'h' => $_h);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get The calculated Size of a Template
|
||||
*
|
||||
* If one size is given, this method calculates the other one.
|
||||
*
|
||||
* @param int $tplidx A valid template-Id
|
||||
* @param int $_w The width of the template
|
||||
* @param int $_h The height of the template
|
||||
* @return array The height and width of the template
|
||||
*/
|
||||
function getTemplateSize($tplidx, $_w = 0, $_h = 0) {
|
||||
if (!$this->tpls[$tplidx])
|
||||
return false;
|
||||
|
||||
$tpl =& $this->tpls[$tplidx];
|
||||
$w = $tpl['w'];
|
||||
$h = $tpl['h'];
|
||||
|
||||
if ($_w == 0 and $_h == 0) {
|
||||
$_w = $w;
|
||||
$_h = $h;
|
||||
}
|
||||
|
||||
if($_w == 0)
|
||||
$_w = $_h * $w / $h;
|
||||
if($_h == 0)
|
||||
$_h = $_w * $h / $w;
|
||||
|
||||
return array("w" => $_w, "h" => $_h);
|
||||
}
|
||||
|
||||
/**
|
||||
* See FPDF/TCPDF-Documentation ;-)
|
||||
*/
|
||||
public function SetFont($family, $style = '', $size = 0) {
|
||||
if (is_subclass_of($this, 'TCPDF')) {
|
||||
$args = func_get_args();
|
||||
return call_user_func_array(array($this, 'TCPDF::SetFont'), $args);
|
||||
}
|
||||
|
||||
/**
|
||||
* force the resetting of font changes in a template
|
||||
*/
|
||||
if ($this->_intpl)
|
||||
$this->FontFamily = '';
|
||||
|
||||
parent::SetFont($family, $style, $size);
|
||||
|
||||
$fontkey = $this->FontFamily . $this->FontStyle;
|
||||
|
||||
if ($this->_intpl) {
|
||||
$this->_res['tpl'][$this->tpl]['fonts'][$fontkey] =& $this->fonts[$fontkey];
|
||||
} else {
|
||||
$this->_res['page'][$this->page]['fonts'][$fontkey] =& $this->fonts[$fontkey];
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* See FPDF/TCPDF-Documentation ;-)
|
||||
*/
|
||||
function Image($file, $x = null, $y = null, $w = 0, $h = 0, $type = '', $link = '') {
|
||||
if (is_subclass_of($this, 'TCPDF')) {
|
||||
$args = func_get_args();
|
||||
return call_user_func_array(array($this, 'TCPDF::Image'), $args);
|
||||
}
|
||||
|
||||
$ret = parent::Image($file, $x, $y, $w, $h, $type, $link);
|
||||
if ($this->_intpl) {
|
||||
$this->_res['tpl'][$this->tpl]['images'][$file] =& $this->images[$file];
|
||||
} else {
|
||||
$this->_res['page'][$this->page]['images'][$file] =& $this->images[$file];
|
||||
}
|
||||
|
||||
return $ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* See FPDF-Documentation ;-)
|
||||
*
|
||||
* AddPage is not available when you're "in" a template.
|
||||
*/
|
||||
function AddPage($orientation = '', $format = '') {
|
||||
if (is_subclass_of($this, 'TCPDF')) {
|
||||
$args = func_get_args();
|
||||
return call_user_func_array(array($this, 'TCPDF::AddPage'), $args);
|
||||
}
|
||||
|
||||
if ($this->_intpl)
|
||||
$this->Error('Adding pages in templates isn\'t possible!');
|
||||
|
||||
parent::AddPage($orientation, $format);
|
||||
}
|
||||
|
||||
/**
|
||||
* Preserve adding Links in Templates ...won't work
|
||||
*/
|
||||
function Link($x, $y, $w, $h, $link) {
|
||||
if (is_subclass_of($this, 'TCPDF')) {
|
||||
$args = func_get_args();
|
||||
return call_user_func_array(array($this, 'TCPDF::Link'), $args);
|
||||
}
|
||||
|
||||
if ($this->_intpl)
|
||||
$this->Error('Using links in templates aren\'t possible!');
|
||||
|
||||
parent::Link($x, $y, $w, $h, $link);
|
||||
}
|
||||
|
||||
function AddLink() {
|
||||
if (is_subclass_of($this, 'TCPDF')) {
|
||||
$args = func_get_args();
|
||||
return call_user_func_array(array($this, 'TCPDF::AddLink'), $args);
|
||||
}
|
||||
|
||||
if ($this->_intpl)
|
||||
$this->Error('Adding links in templates aren\'t possible!');
|
||||
return parent::AddLink();
|
||||
}
|
||||
|
||||
function SetLink($link, $y = 0, $page = -1) {
|
||||
if (is_subclass_of($this, 'TCPDF')) {
|
||||
$args = func_get_args();
|
||||
return call_user_func_array(array($this, 'TCPDF::SetLink'), $args);
|
||||
}
|
||||
|
||||
if ($this->_intpl)
|
||||
$this->Error('Setting links in templates aren\'t possible!');
|
||||
parent::SetLink($link, $y, $page);
|
||||
}
|
||||
|
||||
/**
|
||||
* Private Method that writes the form xobjects
|
||||
*/
|
||||
function _putformxobjects() {
|
||||
$filter=($this->compress) ? '/Filter /FlateDecode ' : '';
|
||||
reset($this->tpls);
|
||||
foreach($this->tpls AS $tplidx => $tpl) {
|
||||
|
||||
$p=($this->compress) ? gzcompress($tpl['buffer']) : $tpl['buffer'];
|
||||
$this->_newobj();
|
||||
$this->tpls[$tplidx]['n'] = $this->n;
|
||||
$this->_out('<<'.$filter.'/Type /XObject');
|
||||
$this->_out('/Subtype /Form');
|
||||
$this->_out('/FormType 1');
|
||||
$this->_out(sprintf('/BBox [%.2F %.2F %.2F %.2F]',
|
||||
// llx
|
||||
$tpl['x'] * $this->k,
|
||||
// lly
|
||||
-$tpl['y'] * $this->k,
|
||||
// urx
|
||||
($tpl['w'] + $tpl['x']) * $this->k,
|
||||
// ury
|
||||
($tpl['h'] - $tpl['y']) * $this->k
|
||||
));
|
||||
|
||||
if ($tpl['x'] != 0 || $tpl['y'] != 0) {
|
||||
$this->_out(sprintf('/Matrix [1 0 0 1 %.5F %.5F]',
|
||||
-$tpl['x'] * $this->k * 2, $tpl['y'] * $this->k * 2
|
||||
));
|
||||
}
|
||||
|
||||
$this->_out('/Resources ');
|
||||
|
||||
$this->_out('<</ProcSet [/PDF /Text /ImageB /ImageC /ImageI]');
|
||||
if (isset($this->_res['tpl'][$tplidx]['fonts']) && count($this->_res['tpl'][$tplidx]['fonts'])) {
|
||||
$this->_out('/Font <<');
|
||||
foreach($this->_res['tpl'][$tplidx]['fonts'] as $font)
|
||||
$this->_out('/F' . $font['i'] . ' ' . $font['n'] . ' 0 R');
|
||||
$this->_out('>>');
|
||||
}
|
||||
if(isset($this->_res['tpl'][$tplidx]['images']) && count($this->_res['tpl'][$tplidx]['images']) ||
|
||||
isset($this->_res['tpl'][$tplidx]['tpls']) && count($this->_res['tpl'][$tplidx]['tpls']))
|
||||
{
|
||||
$this->_out('/XObject <<');
|
||||
if (isset($this->_res['tpl'][$tplidx]['images']) && count($this->_res['tpl'][$tplidx]['images'])) {
|
||||
foreach($this->_res['tpl'][$tplidx]['images'] as $image)
|
||||
$this->_out('/I' . $image['i'] . ' ' . $image['n'] . ' 0 R');
|
||||
}
|
||||
if (isset($this->_res['tpl'][$tplidx]['tpls']) && count($this->_res['tpl'][$tplidx]['tpls'])) {
|
||||
foreach($this->_res['tpl'][$tplidx]['tpls'] as $i => $tpl)
|
||||
$this->_out($this->tplprefix . $i . ' ' . $tpl['n'] . ' 0 R');
|
||||
}
|
||||
$this->_out('>>');
|
||||
}
|
||||
$this->_out('>>');
|
||||
|
||||
$this->_out('/Length ' . strlen($p) . ' >>');
|
||||
$this->_putstream($p);
|
||||
$this->_out('endobj');
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Overwritten to add _putformxobjects() after _putimages()
|
||||
*
|
||||
*/
|
||||
function _putimages() {
|
||||
parent::_putimages();
|
||||
$this->_putformxobjects();
|
||||
}
|
||||
|
||||
function _putxobjectdict() {
|
||||
parent::_putxobjectdict();
|
||||
|
||||
if (count($this->tpls)) {
|
||||
foreach($this->tpls as $tplidx => $tpl) {
|
||||
$this->_out(sprintf('%s%d %d 0 R', $this->tplprefix, $tplidx, $tpl['n']));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Private Method
|
||||
*/
|
||||
function _out($s) {
|
||||
if ($this->state == 2 && $this->_intpl) {
|
||||
$this->tpls[$this->tpl]['buffer'] .= $s . "\n";
|
||||
} else {
|
||||
parent::_out($s);
|
||||
}
|
||||
}
|
||||
}
|
||||
542
pdf/fpdi.php
Executable file
542
pdf/fpdi.php
Executable file
@@ -0,0 +1,542 @@
|
||||
<?php
|
||||
//
|
||||
// FPDI - Version 1.4.1
|
||||
//
|
||||
// Copyright 2004-2011 Setasign - Jan Slabon
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
//
|
||||
|
||||
define('FPDI_VERSION', '1.4.1');
|
||||
|
||||
// Check for TCPDF and remap TCPDF to FPDF
|
||||
if (class_exists('TCPDF', false)) {
|
||||
require_once('fpdi2tcpdf_bridge.php');
|
||||
}
|
||||
|
||||
require_once('fpdf_tpl.php');
|
||||
require_once('fpdi_pdf_parser.php');
|
||||
|
||||
|
||||
class FPDI extends FPDF_TPL {
|
||||
/**
|
||||
* Actual filename
|
||||
* @var string
|
||||
*/
|
||||
var $current_filename;
|
||||
|
||||
/**
|
||||
* Parser-Objects
|
||||
* @var array
|
||||
*/
|
||||
var $parsers;
|
||||
|
||||
/**
|
||||
* Current parser
|
||||
* @var object
|
||||
*/
|
||||
var $current_parser;
|
||||
|
||||
/**
|
||||
* object stack
|
||||
* @var array
|
||||
*/
|
||||
var $_obj_stack;
|
||||
|
||||
/**
|
||||
* done object stack
|
||||
* @var array
|
||||
*/
|
||||
var $_don_obj_stack;
|
||||
|
||||
/**
|
||||
* Current Object Id.
|
||||
* @var integer
|
||||
*/
|
||||
var $_current_obj_id;
|
||||
|
||||
/**
|
||||
* The name of the last imported page box
|
||||
* @var string
|
||||
*/
|
||||
var $lastUsedPageBox;
|
||||
|
||||
/**
|
||||
* Cache for imported pages/template ids
|
||||
* @var array
|
||||
*/
|
||||
var $_importedPages = array();
|
||||
|
||||
/**
|
||||
* Set a source-file
|
||||
*
|
||||
* @param string $filename a valid filename
|
||||
* @return int number of available pages
|
||||
*/
|
||||
function setSourceFile($filename) {
|
||||
$this->current_filename = $filename;
|
||||
|
||||
if (!isset($this->parsers[$filename]))
|
||||
$this->parsers[$filename] = $this->_getPdfParser($filename);
|
||||
$this->current_parser =& $this->parsers[$filename];
|
||||
|
||||
return $this->parsers[$filename]->getPageCount();
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns a PDF parser object
|
||||
*
|
||||
* @param string $filename
|
||||
* @return fpdi_pdf_parser
|
||||
*/
|
||||
function _getPdfParser($filename) {
|
||||
return new fpdi_pdf_parser($filename, $this);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the current PDF version
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
function getPDFVersion() {
|
||||
return $this->PDFVersion;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the PDF version
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
function setPDFVersion($version = '1.3') {
|
||||
$this->PDFVersion = $version;
|
||||
}
|
||||
|
||||
/**
|
||||
* Import a page
|
||||
*
|
||||
* @param int $pageno pagenumber
|
||||
* @return int Index of imported page - to use with fpdf_tpl::useTemplate()
|
||||
*/
|
||||
function importPage($pageno, $boxName = '/CropBox') {
|
||||
if ($this->_intpl) {
|
||||
return $this->error('Please import the desired pages before creating a new template.');
|
||||
}
|
||||
|
||||
$fn = $this->current_filename;
|
||||
|
||||
// check if page already imported
|
||||
$pageKey = $fn . '-' . ((int)$pageno) . $boxName;
|
||||
if (isset($this->_importedPages[$pageKey]))
|
||||
return $this->_importedPages[$pageKey];
|
||||
|
||||
$parser =& $this->parsers[$fn];
|
||||
$parser->setPageno($pageno);
|
||||
|
||||
if (!in_array($boxName, $parser->availableBoxes))
|
||||
return $this->Error(sprintf('Unknown box: %s', $boxName));
|
||||
$pageboxes = $parser->getPageBoxes($pageno, $this->k);
|
||||
|
||||
/**
|
||||
* MediaBox
|
||||
* CropBox: Default -> MediaBox
|
||||
* BleedBox: Default -> CropBox
|
||||
* TrimBox: Default -> CropBox
|
||||
* ArtBox: Default -> CropBox
|
||||
*/
|
||||
if (!isset($pageboxes[$boxName]) && ($boxName == '/BleedBox' || $boxName == '/TrimBox' || $boxName == '/ArtBox'))
|
||||
$boxName = '/CropBox';
|
||||
if (!isset($pageboxes[$boxName]) && $boxName == '/CropBox')
|
||||
$boxName = '/MediaBox';
|
||||
|
||||
if (!isset($pageboxes[$boxName]))
|
||||
return false;
|
||||
$this->lastUsedPageBox = $boxName;
|
||||
|
||||
$box = $pageboxes[$boxName];
|
||||
|
||||
$this->tpl++;
|
||||
$this->tpls[$this->tpl] = array();
|
||||
$tpl =& $this->tpls[$this->tpl];
|
||||
$tpl['parser'] =& $parser;
|
||||
$tpl['resources'] = $parser->getPageResources();
|
||||
$tpl['buffer'] = $parser->getContent();
|
||||
$tpl['box'] = $box;
|
||||
|
||||
// To build an array that can be used by PDF_TPL::useTemplate()
|
||||
$this->tpls[$this->tpl] = array_merge($this->tpls[$this->tpl], $box);
|
||||
|
||||
// An imported page will start at 0,0 everytime. Translation will be set in _putformxobjects()
|
||||
$tpl['x'] = 0;
|
||||
$tpl['y'] = 0;
|
||||
|
||||
// handle rotated pages
|
||||
$rotation = $parser->getPageRotation($pageno);
|
||||
$tpl['_rotationAngle'] = 0;
|
||||
if (isset($rotation[1]) && ($angle = $rotation[1] % 360) != 0) {
|
||||
$steps = $angle / 90;
|
||||
|
||||
$_w = $tpl['w'];
|
||||
$_h = $tpl['h'];
|
||||
$tpl['w'] = $steps % 2 == 0 ? $_w : $_h;
|
||||
$tpl['h'] = $steps % 2 == 0 ? $_h : $_w;
|
||||
|
||||
if ($angle < 0)
|
||||
$angle += 360;
|
||||
|
||||
$tpl['_rotationAngle'] = $angle * -1;
|
||||
}
|
||||
|
||||
$this->_importedPages[$pageKey] = $this->tpl;
|
||||
|
||||
return $this->tpl;
|
||||
}
|
||||
|
||||
function getLastUsedPageBox() {
|
||||
return $this->lastUsedPageBox;
|
||||
}
|
||||
|
||||
function useTemplate($tplidx, $_x = null, $_y = null, $_w = 0, $_h = 0, $adjustPageSize = false) {
|
||||
if ($adjustPageSize == true && is_null($_x) && is_null($_y)) {
|
||||
$size = $this->getTemplateSize($tplidx, $_w, $_h);
|
||||
$format = array($size['w'], $size['h']);
|
||||
if (is_subclass_of($this, 'TCPDF')) {
|
||||
$this->setPageFormat($format, $format[0] > $format[1] ? 'L' : 'P');
|
||||
} else {
|
||||
if ($format[0] != $this->CurPageFormat[0] || $format[1] != $this->CurPageFormat[1]) {
|
||||
$this->w = $format[0];
|
||||
$this->h = $format[1];
|
||||
$this->wPt = $this->w * $this->k;
|
||||
$this->hPt = $this->h * $this->k;
|
||||
$this->PageBreakTrigger = $this->h - $this->bMargin;
|
||||
$this->CurPageFormat = $format;
|
||||
$this->PageSizes[$this->page] = array($this->wPt, $this->hPt);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$this->_out('q 0 J 1 w 0 j 0 G 0 g'); // reset standard values
|
||||
$s = parent::useTemplate($tplidx, $_x, $_y, $_w, $_h);
|
||||
$this->_out('Q');
|
||||
|
||||
return $s;
|
||||
}
|
||||
|
||||
/**
|
||||
* Private method, that rebuilds all needed objects of source files
|
||||
*/
|
||||
function _putimportedobjects() {
|
||||
if (is_array($this->parsers) && count($this->parsers) > 0) {
|
||||
foreach($this->parsers AS $filename => $p) {
|
||||
$this->current_parser =& $this->parsers[$filename];
|
||||
if (isset($this->_obj_stack[$filename]) && is_array($this->_obj_stack[$filename])) {
|
||||
while(($n = key($this->_obj_stack[$filename])) !== null) {
|
||||
$nObj = $this->current_parser->pdf_resolve_object($this->current_parser->c, $this->_obj_stack[$filename][$n][1]);
|
||||
|
||||
$this->_newobj($this->_obj_stack[$filename][$n][0]);
|
||||
|
||||
if ($nObj[0] == PDF_TYPE_STREAM) {
|
||||
$this->pdf_write_value($nObj);
|
||||
} else {
|
||||
$this->pdf_write_value($nObj[1]);
|
||||
}
|
||||
|
||||
$this->_out('endobj');
|
||||
$this->_obj_stack[$filename][$n] = null; // free memory
|
||||
unset($this->_obj_stack[$filename][$n]);
|
||||
reset($this->_obj_stack[$filename]);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Private Method that writes the form xobjects
|
||||
*/
|
||||
function _putformxobjects() {
|
||||
$filter=($this->compress) ? '/Filter /FlateDecode ' : '';
|
||||
reset($this->tpls);
|
||||
foreach($this->tpls AS $tplidx => $tpl) {
|
||||
$p=($this->compress) ? gzcompress($tpl['buffer']) : $tpl['buffer'];
|
||||
$this->_newobj();
|
||||
$cN = $this->n; // TCPDF/Protection: rem current "n"
|
||||
|
||||
$this->tpls[$tplidx]['n'] = $this->n;
|
||||
$this->_out('<<' . $filter . '/Type /XObject');
|
||||
$this->_out('/Subtype /Form');
|
||||
$this->_out('/FormType 1');
|
||||
|
||||
$this->_out(sprintf('/BBox [%.2F %.2F %.2F %.2F]',
|
||||
(isset($tpl['box']['llx']) ? $tpl['box']['llx'] : $tpl['x']) * $this->k,
|
||||
(isset($tpl['box']['lly']) ? $tpl['box']['lly'] : -$tpl['y']) * $this->k,
|
||||
(isset($tpl['box']['urx']) ? $tpl['box']['urx'] : $tpl['w'] + $tpl['x']) * $this->k,
|
||||
(isset($tpl['box']['ury']) ? $tpl['box']['ury'] : $tpl['h'] - $tpl['y']) * $this->k
|
||||
));
|
||||
|
||||
$c = 1;
|
||||
$s = 0;
|
||||
$tx = 0;
|
||||
$ty = 0;
|
||||
|
||||
if (isset($tpl['box'])) {
|
||||
$tx = -$tpl['box']['llx'];
|
||||
$ty = -$tpl['box']['lly'];
|
||||
|
||||
if ($tpl['_rotationAngle'] <> 0) {
|
||||
$angle = $tpl['_rotationAngle'] * M_PI/180;
|
||||
$c=cos($angle);
|
||||
$s=sin($angle);
|
||||
|
||||
switch($tpl['_rotationAngle']) {
|
||||
case -90:
|
||||
$tx = -$tpl['box']['lly'];
|
||||
$ty = $tpl['box']['urx'];
|
||||
break;
|
||||
case -180:
|
||||
$tx = $tpl['box']['urx'];
|
||||
$ty = $tpl['box']['ury'];
|
||||
break;
|
||||
case -270:
|
||||
$tx = $tpl['box']['ury'];
|
||||
$ty = -$tpl['box']['llx'];
|
||||
break;
|
||||
}
|
||||
}
|
||||
} else if ($tpl['x'] != 0 || $tpl['y'] != 0) {
|
||||
$tx = -$tpl['x']*2;
|
||||
$ty = $tpl['y']*2;
|
||||
}
|
||||
|
||||
$tx *= $this->k;
|
||||
$ty *= $this->k;
|
||||
|
||||
if ($c != 1 || $s != 0 || $tx != 0 || $ty != 0) {
|
||||
$this->_out(sprintf('/Matrix [%.5F %.5F %.5F %.5F %.5F %.5F]',
|
||||
$c, $s, -$s, $c, $tx, $ty
|
||||
));
|
||||
}
|
||||
|
||||
$this->_out('/Resources ');
|
||||
|
||||
if (isset($tpl['resources'])) {
|
||||
$this->current_parser =& $tpl['parser'];
|
||||
$this->pdf_write_value($tpl['resources']); // "n" will be changed
|
||||
} else {
|
||||
$this->_out('<</ProcSet [/PDF /Text /ImageB /ImageC /ImageI]');
|
||||
if (isset($this->_res['tpl'][$tplidx]['fonts']) && count($this->_res['tpl'][$tplidx]['fonts'])) {
|
||||
$this->_out('/Font <<');
|
||||
foreach($this->_res['tpl'][$tplidx]['fonts'] as $font)
|
||||
$this->_out('/F' . $font['i'] . ' ' . $font['n'] . ' 0 R');
|
||||
$this->_out('>>');
|
||||
}
|
||||
if(isset($this->_res['tpl'][$tplidx]['images']) && count($this->_res['tpl'][$tplidx]['images']) ||
|
||||
isset($this->_res['tpl'][$tplidx]['tpls']) && count($this->_res['tpl'][$tplidx]['tpls']))
|
||||
{
|
||||
$this->_out('/XObject <<');
|
||||
if (isset($this->_res['tpl'][$tplidx]['images']) && count($this->_res['tpl'][$tplidx]['images'])) {
|
||||
foreach($this->_res['tpl'][$tplidx]['images'] as $image)
|
||||
$this->_out('/I' . $image['i'] . ' ' . $image['n'] . ' 0 R');
|
||||
}
|
||||
if (isset($this->_res['tpl'][$tplidx]['tpls']) && count($this->_res['tpl'][$tplidx]['tpls'])) {
|
||||
foreach($this->_res['tpl'][$tplidx]['tpls'] as $i => $tpl)
|
||||
$this->_out($this->tplprefix . $i . ' ' . $tpl['n'] . ' 0 R');
|
||||
}
|
||||
$this->_out('>>');
|
||||
}
|
||||
$this->_out('>>');
|
||||
}
|
||||
|
||||
$nN = $this->n; // TCPDF: rem new "n"
|
||||
$this->n = $cN; // TCPDF: reset to current "n"
|
||||
$this->_out('/Length ' . strlen($p) . ' >>');
|
||||
$this->_putstream($p);
|
||||
$this->_out('endobj');
|
||||
$this->n = $nN; // TCPDF: reset to new "n"
|
||||
}
|
||||
|
||||
$this->_putimportedobjects();
|
||||
}
|
||||
|
||||
/**
|
||||
* Rewritten to handle existing own defined objects
|
||||
*/
|
||||
function _newobj($obj_id = false, $onlynewobj = false) {
|
||||
if (!$obj_id) {
|
||||
$obj_id = ++$this->n;
|
||||
}
|
||||
|
||||
//Begin a new object
|
||||
if (!$onlynewobj) {
|
||||
$this->offsets[$obj_id] = is_subclass_of($this, 'TCPDF') ? $this->bufferlen : strlen($this->buffer);
|
||||
$this->_out($obj_id . ' 0 obj');
|
||||
$this->_current_obj_id = $obj_id; // for later use with encryption
|
||||
}
|
||||
|
||||
return $obj_id;
|
||||
}
|
||||
|
||||
/**
|
||||
* Writes a value
|
||||
* Needed to rebuild the source document
|
||||
*
|
||||
* @param mixed $value A PDF-Value. Structure of values see cases in this method
|
||||
*/
|
||||
function pdf_write_value(&$value)
|
||||
{
|
||||
if (is_subclass_of($this, 'TCPDF')) {
|
||||
parent::pdf_write_value($value);
|
||||
}
|
||||
|
||||
switch ($value[0]) {
|
||||
|
||||
case PDF_TYPE_TOKEN:
|
||||
$this->_straightOut($value[1] . ' ');
|
||||
break;
|
||||
case PDF_TYPE_NUMERIC:
|
||||
case PDF_TYPE_REAL:
|
||||
if (is_float($value[1]) && $value[1] != 0) {
|
||||
$this->_straightOut(rtrim(rtrim(sprintf('%F', $value[1]), '0'), '.') . ' ');
|
||||
} else {
|
||||
$this->_straightOut($value[1] . ' ');
|
||||
}
|
||||
break;
|
||||
|
||||
case PDF_TYPE_ARRAY:
|
||||
|
||||
// An array. Output the proper
|
||||
// structure and move on.
|
||||
|
||||
$this->_straightOut('[');
|
||||
for ($i = 0; $i < count($value[1]); $i++) {
|
||||
$this->pdf_write_value($value[1][$i]);
|
||||
}
|
||||
|
||||
$this->_out(']');
|
||||
break;
|
||||
|
||||
case PDF_TYPE_DICTIONARY:
|
||||
|
||||
// A dictionary.
|
||||
$this->_straightOut('<<');
|
||||
|
||||
reset ($value[1]);
|
||||
|
||||
while (list($k, $v) = each($value[1])) {
|
||||
$this->_straightOut($k . ' ');
|
||||
$this->pdf_write_value($v);
|
||||
}
|
||||
|
||||
$this->_straightOut('>>');
|
||||
break;
|
||||
|
||||
case PDF_TYPE_OBJREF:
|
||||
|
||||
// An indirect object reference
|
||||
// Fill the object stack if needed
|
||||
$cpfn =& $this->current_parser->filename;
|
||||
|
||||
if (!isset($this->_don_obj_stack[$cpfn][$value[1]])) {
|
||||
$this->_newobj(false, true);
|
||||
$this->_obj_stack[$cpfn][$value[1]] = array($this->n, $value);
|
||||
$this->_don_obj_stack[$cpfn][$value[1]] = array($this->n, $value); // Value is maybee obsolete!!!
|
||||
}
|
||||
$objid = $this->_don_obj_stack[$cpfn][$value[1]][0];
|
||||
|
||||
$this->_out($objid . ' 0 R');
|
||||
break;
|
||||
|
||||
case PDF_TYPE_STRING:
|
||||
|
||||
// A string.
|
||||
$this->_straightOut('(' . $value[1] . ')');
|
||||
|
||||
break;
|
||||
|
||||
case PDF_TYPE_STREAM:
|
||||
|
||||
// A stream. First, output the
|
||||
// stream dictionary, then the
|
||||
// stream data itself.
|
||||
$this->pdf_write_value($value[1]);
|
||||
$this->_out('stream');
|
||||
$this->_out($value[2][1]);
|
||||
$this->_out('endstream');
|
||||
break;
|
||||
|
||||
case PDF_TYPE_HEX:
|
||||
$this->_straightOut('<' . $value[1] . '>');
|
||||
break;
|
||||
|
||||
case PDF_TYPE_BOOLEAN:
|
||||
$this->_straightOut($value[1] ? 'true ' : 'false ');
|
||||
break;
|
||||
|
||||
case PDF_TYPE_NULL:
|
||||
// The null object.
|
||||
|
||||
$this->_straightOut('null ');
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Modified so not each call will add a newline to the output.
|
||||
*/
|
||||
function _straightOut($s) {
|
||||
if (!is_subclass_of($this, 'TCPDF')) {
|
||||
if($this->state==2)
|
||||
$this->pages[$this->page] .= $s;
|
||||
else
|
||||
$this->buffer .= $s;
|
||||
} else {
|
||||
if ($this->state == 2) {
|
||||
if (isset($this->footerlen[$this->page]) AND ($this->footerlen[$this->page] > 0)) {
|
||||
// puts data before page footer
|
||||
$page = substr($this->getPageBuffer($this->page), 0, -$this->footerlen[$this->page]);
|
||||
$footer = substr($this->getPageBuffer($this->page), -$this->footerlen[$this->page]);
|
||||
$this->setPageBuffer($this->page, $page . ' ' . $s . "\n" . $footer);
|
||||
} else {
|
||||
$this->setPageBuffer($this->page, $s, true);
|
||||
}
|
||||
} else {
|
||||
$this->setBuffer($s);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* rewritten to close opened parsers
|
||||
*
|
||||
*/
|
||||
function _enddoc() {
|
||||
parent::_enddoc();
|
||||
$this->_closeParsers();
|
||||
}
|
||||
|
||||
/**
|
||||
* close all files opened by parsers
|
||||
*/
|
||||
function _closeParsers() {
|
||||
if ($this->state > 2 && count($this->parsers) > 0) {
|
||||
foreach ($this->parsers as $k => $_){
|
||||
$this->parsers[$k]->closeFile();
|
||||
$this->parsers[$k] = null;
|
||||
unset($this->parsers[$k]);
|
||||
}
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
}
|
||||
}
|
||||
163
pdf/fpdi2tcpdf_bridge.php
Executable file
163
pdf/fpdi2tcpdf_bridge.php
Executable file
@@ -0,0 +1,163 @@
|
||||
<?php
|
||||
//
|
||||
// FPDI - Version 1.4.1
|
||||
//
|
||||
// Copyright 2004-2011 Setasign - Jan Slabon
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
//
|
||||
|
||||
/**
|
||||
* This class is used as a bridge between TCPDF and FPDI
|
||||
* and will create the possibility to use both FPDF and TCPDF
|
||||
* via one FPDI version.
|
||||
*
|
||||
* We'll simply remap TCPDF to FPDF again.
|
||||
*
|
||||
* It'll be loaded and extended by FPDF_TPL.
|
||||
*/
|
||||
class FPDF extends TCPDF {
|
||||
|
||||
function _putstream($s) {
|
||||
$this->_out($this->_getstream($s));
|
||||
}
|
||||
|
||||
function _getxobjectdict() {
|
||||
$out = parent::_getxobjectdict();
|
||||
if (count($this->tpls)) {
|
||||
foreach($this->tpls as $tplidx => $tpl) {
|
||||
$out .= sprintf('%s%d %d 0 R', $this->tplprefix, $tplidx, $tpl['n']);
|
||||
}
|
||||
}
|
||||
|
||||
return $out;
|
||||
}
|
||||
|
||||
/**
|
||||
* Encryption of imported data by FPDI
|
||||
*
|
||||
* @param array $value
|
||||
*/
|
||||
function pdf_write_value(&$value) {
|
||||
switch ($value[0]) {
|
||||
case PDF_TYPE_STRING:
|
||||
if ($this->encrypted) {
|
||||
$value[1] = $this->_unescape($value[1]);
|
||||
$value[1] = $this->_RC4($this->_objectkey($this->_current_obj_id), $value[1]);
|
||||
$value[1] = $this->_escape($value[1]);
|
||||
}
|
||||
break;
|
||||
|
||||
case PDF_TYPE_STREAM:
|
||||
if ($this->encrypted) {
|
||||
$value[2][1] = $this->_RC4($this->_objectkey($this->_current_obj_id), $value[2][1]);
|
||||
}
|
||||
break;
|
||||
|
||||
case PDF_TYPE_HEX:
|
||||
if ($this->encrypted) {
|
||||
$value[1] = $this->hex2str($value[1]);
|
||||
$value[1] = $this->_RC4($this->_objectkey($this->_current_obj_id), $value[1]);
|
||||
|
||||
// remake hexstring of encrypted string
|
||||
$value[1] = $this->str2hex($value[1]);
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Unescapes a PDF string
|
||||
*
|
||||
* @param string $s
|
||||
* @return string
|
||||
*/
|
||||
function _unescape($s) {
|
||||
$out = '';
|
||||
for ($count = 0, $n = strlen($s); $count < $n; $count++) {
|
||||
if ($s[$count] != '\\' || $count == $n-1) {
|
||||
$out .= $s[$count];
|
||||
} else {
|
||||
switch ($s[++$count]) {
|
||||
case ')':
|
||||
case '(':
|
||||
case '\\':
|
||||
$out .= $s[$count];
|
||||
break;
|
||||
case 'f':
|
||||
$out .= chr(0x0C);
|
||||
break;
|
||||
case 'b':
|
||||
$out .= chr(0x08);
|
||||
break;
|
||||
case 't':
|
||||
$out .= chr(0x09);
|
||||
break;
|
||||
case 'r':
|
||||
$out .= chr(0x0D);
|
||||
break;
|
||||
case 'n':
|
||||
$out .= chr(0x0A);
|
||||
break;
|
||||
case "\r":
|
||||
if ($count != $n-1 && $s[$count+1] == "\n")
|
||||
$count++;
|
||||
break;
|
||||
case "\n":
|
||||
break;
|
||||
default:
|
||||
// Octal-Values
|
||||
if (ord($s[$count]) >= ord('0') &&
|
||||
ord($s[$count]) <= ord('9')) {
|
||||
$oct = ''. $s[$count];
|
||||
|
||||
if (ord($s[$count+1]) >= ord('0') &&
|
||||
ord($s[$count+1]) <= ord('9')) {
|
||||
$oct .= $s[++$count];
|
||||
|
||||
if (ord($s[$count+1]) >= ord('0') &&
|
||||
ord($s[$count+1]) <= ord('9')) {
|
||||
$oct .= $s[++$count];
|
||||
}
|
||||
}
|
||||
|
||||
$out .= chr(octdec($oct));
|
||||
} else {
|
||||
$out .= $s[$count];
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
return $out;
|
||||
}
|
||||
|
||||
/**
|
||||
* Hexadecimal to string
|
||||
*
|
||||
* @param string $hex
|
||||
* @return string
|
||||
*/
|
||||
function hex2str($hex) {
|
||||
return pack('H*', str_replace(array("\r", "\n", ' '), '', $hex));
|
||||
}
|
||||
|
||||
/**
|
||||
* String to hexadecimal
|
||||
*
|
||||
* @param string $str
|
||||
* @return string
|
||||
*/
|
||||
function str2hex($str) {
|
||||
return current(unpack('H*', $str));
|
||||
}
|
||||
}
|
||||
409
pdf/fpdi_pdf_parser.php
Executable file
409
pdf/fpdi_pdf_parser.php
Executable file
@@ -0,0 +1,409 @@
|
||||
<?php
|
||||
//
|
||||
// FPDI - Version 1.4.1
|
||||
//
|
||||
// Copyright 2004-2011 Setasign - Jan Slabon
|
||||
//
|
||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
||||
// you may not use this file except in compliance with the License.
|
||||
// You may obtain a copy of the License at
|
||||
//
|
||||
// http://www.apache.org/licenses/LICENSE-2.0
|
||||
//
|
||||
// Unless required by applicable law or agreed to in writing, software
|
||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
// See the License for the specific language governing permissions and
|
||||
// limitations under the License.
|
||||
//
|
||||
|
||||
require_once('pdf_parser.php');
|
||||
|
||||
class fpdi_pdf_parser extends pdf_parser {
|
||||
|
||||
/**
|
||||
* Pages
|
||||
* Index beginns at 0
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
var $pages;
|
||||
|
||||
/**
|
||||
* Page count
|
||||
* @var integer
|
||||
*/
|
||||
var $page_count;
|
||||
|
||||
/**
|
||||
* actual page number
|
||||
* @var integer
|
||||
*/
|
||||
var $pageno;
|
||||
|
||||
/**
|
||||
* PDF Version of imported Document
|
||||
* @var string
|
||||
*/
|
||||
var $pdfVersion;
|
||||
|
||||
/**
|
||||
* FPDI Reference
|
||||
* @var object
|
||||
*/
|
||||
var $fpdi;
|
||||
|
||||
/**
|
||||
* Available BoxTypes
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
var $availableBoxes = array('/MediaBox', '/CropBox', '/BleedBox', '/TrimBox', '/ArtBox');
|
||||
|
||||
/**
|
||||
* Constructor
|
||||
*
|
||||
* @param string $filename Source-Filename
|
||||
* @param object $fpdi Object of type fpdi
|
||||
*/
|
||||
function fpdi_pdf_parser($filename, &$fpdi) {
|
||||
$this->fpdi =& $fpdi;
|
||||
|
||||
parent::pdf_parser($filename);
|
||||
|
||||
// resolve Pages-Dictonary
|
||||
$pages = $this->pdf_resolve_object($this->c, $this->root[1][1]['/Pages']);
|
||||
|
||||
// Read pages
|
||||
$this->read_pages($this->c, $pages, $this->pages);
|
||||
|
||||
// count pages;
|
||||
$this->page_count = count($this->pages);
|
||||
}
|
||||
|
||||
/**
|
||||
* Overwrite parent::error()
|
||||
*
|
||||
* @param string $msg Error-Message
|
||||
*/
|
||||
function error($msg) {
|
||||
$this->fpdi->error($msg);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get pagecount from sourcefile
|
||||
*
|
||||
* @return int
|
||||
*/
|
||||
function getPageCount() {
|
||||
return $this->page_count;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Set pageno
|
||||
*
|
||||
* @param int $pageno Pagenumber to use
|
||||
*/
|
||||
function setPageno($pageno) {
|
||||
$pageno = ((int) $pageno) - 1;
|
||||
|
||||
if ($pageno < 0 || $pageno >= $this->getPageCount()) {
|
||||
$this->fpdi->error('Pagenumber is wrong!');
|
||||
}
|
||||
|
||||
$this->pageno = $pageno;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get page-resources from current page
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
function getPageResources() {
|
||||
return $this->_getPageResources($this->pages[$this->pageno]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get page-resources from /Page
|
||||
*
|
||||
* @param array $obj Array of pdf-data
|
||||
*/
|
||||
function _getPageResources ($obj) { // $obj = /Page
|
||||
$obj = $this->pdf_resolve_object($this->c, $obj);
|
||||
|
||||
// If the current object has a resources
|
||||
// dictionary associated with it, we use
|
||||
// it. Otherwise, we move back to its
|
||||
// parent object.
|
||||
if (isset ($obj[1][1]['/Resources'])) {
|
||||
$res = $this->pdf_resolve_object($this->c, $obj[1][1]['/Resources']);
|
||||
if ($res[0] == PDF_TYPE_OBJECT)
|
||||
return $res[1];
|
||||
return $res;
|
||||
} else {
|
||||
if (!isset ($obj[1][1]['/Parent'])) {
|
||||
return false;
|
||||
} else {
|
||||
$res = $this->_getPageResources($obj[1][1]['/Parent']);
|
||||
if ($res[0] == PDF_TYPE_OBJECT)
|
||||
return $res[1];
|
||||
return $res;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get content of current page
|
||||
*
|
||||
* If more /Contents is an array, the streams are concated
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
function getContent() {
|
||||
$buffer = '';
|
||||
|
||||
if (isset($this->pages[$this->pageno][1][1]['/Contents'])) {
|
||||
$contents = $this->_getPageContent($this->pages[$this->pageno][1][1]['/Contents']);
|
||||
foreach($contents AS $tmp_content) {
|
||||
$buffer .= $this->_rebuildContentStream($tmp_content) . ' ';
|
||||
}
|
||||
}
|
||||
|
||||
return $buffer;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Resolve all content-objects
|
||||
*
|
||||
* @param array $content_ref
|
||||
* @return array
|
||||
*/
|
||||
function _getPageContent($content_ref) {
|
||||
$contents = array();
|
||||
|
||||
if ($content_ref[0] == PDF_TYPE_OBJREF) {
|
||||
$content = $this->pdf_resolve_object($this->c, $content_ref);
|
||||
if ($content[1][0] == PDF_TYPE_ARRAY) {
|
||||
$contents = $this->_getPageContent($content[1]);
|
||||
} else {
|
||||
$contents[] = $content;
|
||||
}
|
||||
} else if ($content_ref[0] == PDF_TYPE_ARRAY) {
|
||||
foreach ($content_ref[1] AS $tmp_content_ref) {
|
||||
$contents = array_merge($contents,$this->_getPageContent($tmp_content_ref));
|
||||
}
|
||||
}
|
||||
|
||||
return $contents;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Rebuild content-streams
|
||||
*
|
||||
* @param array $obj
|
||||
* @return string
|
||||
*/
|
||||
function _rebuildContentStream($obj) {
|
||||
$filters = array();
|
||||
|
||||
if (isset($obj[1][1]['/Filter'])) {
|
||||
$_filter = $obj[1][1]['/Filter'];
|
||||
|
||||
if ($_filter[0] == PDF_TYPE_OBJREF) {
|
||||
$tmpFilter = $this->pdf_resolve_object($this->c, $_filter);
|
||||
$_filter = $tmpFilter[1];
|
||||
}
|
||||
|
||||
if ($_filter[0] == PDF_TYPE_TOKEN) {
|
||||
$filters[] = $_filter;
|
||||
} else if ($_filter[0] == PDF_TYPE_ARRAY) {
|
||||
$filters = $_filter[1];
|
||||
}
|
||||
}
|
||||
|
||||
$stream = $obj[2][1];
|
||||
|
||||
foreach ($filters AS $_filter) {
|
||||
switch ($_filter[1]) {
|
||||
case '/FlateDecode':
|
||||
case '/Fl':
|
||||
// $stream .= "\x0F\x0D"; // in an errorious stream this suffix could work
|
||||
// $stream .= "\x0A";
|
||||
// $stream .= "\x0D";
|
||||
if (function_exists('gzuncompress')) {
|
||||
$stream = (strlen($stream) > 0) ? @gzuncompress($stream) : '';
|
||||
} else {
|
||||
$this->error(sprintf('To handle %s filter, please compile php with zlib support.',$_filter[1]));
|
||||
}
|
||||
|
||||
if ($stream === false) {
|
||||
$this->error('Error while decompressing stream.');
|
||||
}
|
||||
break;
|
||||
case '/LZWDecode':
|
||||
include_once('filters/FilterLZW_FPDI.php');
|
||||
$decoder = new FilterLZW_FPDI($this->fpdi);
|
||||
$stream = $decoder->decode($stream);
|
||||
break;
|
||||
case '/ASCII85Decode':
|
||||
include_once('filters/FilterASCII85_FPDI.php');
|
||||
$decoder = new FilterASCII85_FPDI($this->fpdi);
|
||||
$stream = $decoder->decode($stream);
|
||||
break;
|
||||
case null:
|
||||
$stream = $stream;
|
||||
break;
|
||||
default:
|
||||
$this->error(sprintf('Unsupported Filter: %s',$_filter[1]));
|
||||
}
|
||||
}
|
||||
|
||||
return $stream;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get a Box from a page
|
||||
* Arrayformat is same as used by fpdf_tpl
|
||||
*
|
||||
* @param array $page a /Page
|
||||
* @param string $box_index Type of Box @see $availableBoxes
|
||||
* @param float Scale factor from user space units to points
|
||||
* @return array
|
||||
*/
|
||||
function getPageBox($page, $box_index, $k) {
|
||||
$page = $this->pdf_resolve_object($this->c, $page);
|
||||
$box = null;
|
||||
if (isset($page[1][1][$box_index]))
|
||||
$box =& $page[1][1][$box_index];
|
||||
|
||||
if (!is_null($box) && $box[0] == PDF_TYPE_OBJREF) {
|
||||
$tmp_box = $this->pdf_resolve_object($this->c, $box);
|
||||
$box = $tmp_box[1];
|
||||
}
|
||||
|
||||
if (!is_null($box) && $box[0] == PDF_TYPE_ARRAY) {
|
||||
$b =& $box[1];
|
||||
return array('x' => $b[0][1]/$k,
|
||||
'y' => $b[1][1]/$k,
|
||||
'w' => abs($b[0][1]-$b[2][1])/$k,
|
||||
'h' => abs($b[1][1]-$b[3][1])/$k,
|
||||
'llx' => min($b[0][1], $b[2][1])/$k,
|
||||
'lly' => min($b[1][1], $b[3][1])/$k,
|
||||
'urx' => max($b[0][1], $b[2][1])/$k,
|
||||
'ury' => max($b[1][1], $b[3][1])/$k,
|
||||
);
|
||||
} else if (!isset ($page[1][1]['/Parent'])) {
|
||||
return false;
|
||||
} else {
|
||||
return $this->getPageBox($this->pdf_resolve_object($this->c, $page[1][1]['/Parent']), $box_index, $k);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Get all page boxes by page no
|
||||
*
|
||||
* @param int The page number
|
||||
* @param float Scale factor from user space units to points
|
||||
* @return array
|
||||
*/
|
||||
function getPageBoxes($pageno, $k) {
|
||||
return $this->_getPageBoxes($this->pages[$pageno-1], $k);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get all boxes from /Page
|
||||
*
|
||||
* @param array a /Page
|
||||
* @return array
|
||||
*/
|
||||
function _getPageBoxes($page, $k) {
|
||||
$boxes = array();
|
||||
|
||||
foreach($this->availableBoxes AS $box) {
|
||||
if ($_box = $this->getPageBox($page, $box, $k)) {
|
||||
$boxes[$box] = $_box;
|
||||
}
|
||||
}
|
||||
|
||||
return $boxes;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the page rotation by pageno
|
||||
*
|
||||
* @param integer $pageno
|
||||
* @return array
|
||||
*/
|
||||
function getPageRotation($pageno) {
|
||||
return $this->_getPageRotation($this->pages[$pageno-1]);
|
||||
}
|
||||
|
||||
function _getPageRotation($obj) { // $obj = /Page
|
||||
$obj = $this->pdf_resolve_object($this->c, $obj);
|
||||
if (isset ($obj[1][1]['/Rotate'])) {
|
||||
$res = $this->pdf_resolve_object($this->c, $obj[1][1]['/Rotate']);
|
||||
if ($res[0] == PDF_TYPE_OBJECT)
|
||||
return $res[1];
|
||||
return $res;
|
||||
} else {
|
||||
if (!isset ($obj[1][1]['/Parent'])) {
|
||||
return false;
|
||||
} else {
|
||||
$res = $this->_getPageRotation($obj[1][1]['/Parent']);
|
||||
if ($res[0] == PDF_TYPE_OBJECT)
|
||||
return $res[1];
|
||||
return $res;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Read all /Page(es)
|
||||
*
|
||||
* @param object pdf_context
|
||||
* @param array /Pages
|
||||
* @param array the result-array
|
||||
*/
|
||||
function read_pages(&$c, &$pages, &$result) {
|
||||
// Get the kids dictionary
|
||||
$_kids = $this->pdf_resolve_object ($c, $pages[1][1]['/Kids']);
|
||||
|
||||
if (!is_array($_kids))
|
||||
$this->error('Cannot find /Kids in current /Page-Dictionary');
|
||||
|
||||
if ($_kids[1][0] == PDF_TYPE_ARRAY) {
|
||||
$kids = $_kids[1][1];
|
||||
} else {
|
||||
$kids = $_kids[1];
|
||||
}
|
||||
|
||||
foreach ($kids as $v) {
|
||||
$pg = $this->pdf_resolve_object ($c, $v);
|
||||
if ($pg[1][1]['/Type'][1] === '/Pages') {
|
||||
// If one of the kids is an embedded
|
||||
// /Pages array, resolve it as well.
|
||||
$this->read_pages($c, $pg, $result);
|
||||
} else {
|
||||
$result[] = $pg;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* Get PDF-Version
|
||||
*
|
||||
* And reset the PDF Version used in FPDI if needed
|
||||
*/
|
||||
function getPDFVersion() {
|
||||
parent::getPDFVersion();
|
||||
$this->fpdi->setPDFVersion(max($this->fpdi->getPDFVersion(), $this->pdfVersion));
|
||||
}
|
||||
|
||||
}
|
||||
85
pdf/include/absolute_positioner.cls.php
Executable file
85
pdf/include/absolute_positioner.cls.php
Executable file
@@ -0,0 +1,85 @@
|
||||
<?php
|
||||
/**
|
||||
* DOMPDF - PHP5 HTML to PDF renderer
|
||||
*
|
||||
* File: $RCSfile: absolute_positioner.cls.php,v $
|
||||
* Created on: 2004-06-08
|
||||
*
|
||||
* Copyright (c) 2004 - Benj Carson <benjcarson@digitaljunkies.ca>
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with this library in the file LICENSE.LGPL; if not, write to the
|
||||
* Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
* 02111-1307 USA
|
||||
*
|
||||
* Alternatively, you may distribute this software under the terms of the
|
||||
* PHP License, version 3.0 or later. A copy of this license should have
|
||||
* been distributed with this file in the file LICENSE.PHP . If this is not
|
||||
* the case, you can obtain a copy at http://www.php.net/license/3_0.txt.
|
||||
*
|
||||
* The latest version of DOMPDF might be available at:
|
||||
* http://www.dompdf.com/
|
||||
*
|
||||
* @link http://www.dompdf.com/
|
||||
* @copyright 2004 Benj Carson
|
||||
* @author Benj Carson <benjcarson@digitaljunkies.ca>
|
||||
* @package dompdf
|
||||
|
||||
*/
|
||||
|
||||
/* $Id */
|
||||
|
||||
/**
|
||||
* Positions absolutly positioned frames
|
||||
*/
|
||||
class Absolute_Positioner extends Positioner {
|
||||
|
||||
function __construct(Frame_Decorator $frame) { parent::__construct($frame); }
|
||||
|
||||
function position() {
|
||||
|
||||
$frame = $this->_frame;
|
||||
$style = $frame->get_style();
|
||||
$cb = $frame->get_containing_block();
|
||||
|
||||
$top = $style->length_in_pt($style->top, $cb["h"]);
|
||||
$right = $style->length_in_pt($style->right, $cb["w"]);
|
||||
$bottom = $style->length_in_pt($style->bottom, $cb["h"]);
|
||||
$left = $style->length_in_pt($style->left, $cb["w"]);
|
||||
|
||||
$p = $frame->find_positionned_parent();
|
||||
|
||||
if ( $p ) {
|
||||
// Get the parent's padding box (see http://www.w3.org/TR/CSS21/visuren.html#propdef-top)
|
||||
list($x, $y, $w, $h) = $p->get_padding_box();
|
||||
} else {
|
||||
$x = $cb["x"];
|
||||
$y = $cb["y"];
|
||||
}
|
||||
|
||||
if ( $top !== "auto" ) {
|
||||
$y += $top;
|
||||
} else if ( $bottom !== "auto" ) {
|
||||
// FIXME: need to know this frame's height before we can do this correctly
|
||||
}
|
||||
|
||||
if ( $left !== "auto" ) {
|
||||
$x += $left;
|
||||
} else if ( $right !== "auto" ) {
|
||||
// FIXME: need to know this frame's width before we can do this correctly
|
||||
}
|
||||
|
||||
$frame->set_position($x, $y);
|
||||
|
||||
}
|
||||
}
|
||||
890
pdf/include/abstract_renderer.cls.php
Executable file
890
pdf/include/abstract_renderer.cls.php
Executable file
@@ -0,0 +1,890 @@
|
||||
<?php
|
||||
/**
|
||||
* DOMPDF - PHP5 HTML to PDF renderer
|
||||
*
|
||||
* File: $RCSfile: abstract_renderer.cls.php,v $
|
||||
* Created on: 2004-06-01
|
||||
*
|
||||
* Copyright (c) 2004 - Benj Carson <benjcarson@digitaljunkies.ca>
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with this library in the file LICENSE.LGPL; if not, write to the
|
||||
* Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
* 02111-1307 USA
|
||||
*
|
||||
* Alternatively, you may distribute this software under the terms of the
|
||||
* PHP License, version 3.0 or later. A copy of this license should have
|
||||
* been distributed with this file in the file LICENSE.PHP . If this is not
|
||||
* the case, you can obtain a copy at http://www.php.net/license/3_0.txt.
|
||||
*
|
||||
* The latest version of DOMPDF might be available at:
|
||||
* http://www.dompdf.com/
|
||||
*
|
||||
* @link http://www.dompdf.com/
|
||||
* @copyright 2004 Benj Carson
|
||||
* @author Benj Carson <benjcarson@digitaljunkies.ca>
|
||||
* @contributor Helmut Tischer <htischer@weihenstephan.org>
|
||||
* @package dompdf
|
||||
*
|
||||
* Changes
|
||||
* @contributor Helmut Tischer <htischer@weihenstephan.org>
|
||||
* @version 0.5.1.htischer.20090507
|
||||
* - On background image
|
||||
* - Clip invisible areas from background images, then merge identical
|
||||
* image/size/offset to a single image.
|
||||
* - Fix rounding of background image size.
|
||||
* - Fix background image position given as percent
|
||||
* - Check if identical image is already cached by cpdf. Then do not create
|
||||
* duplicates to save memory and CPU time
|
||||
* - Fix skipping of image repetition if area is too small
|
||||
* - Do not create temporary files, but pass gd object directly
|
||||
*/
|
||||
|
||||
/* $Id: abstract_renderer.cls.php 361 2011-02-16 21:03:05Z fabien.menager $ */
|
||||
|
||||
/**
|
||||
* Base renderer class
|
||||
*
|
||||
* @access private
|
||||
* @package dompdf
|
||||
*/
|
||||
abstract class Abstract_Renderer {
|
||||
|
||||
/**
|
||||
* Rendering backend
|
||||
*
|
||||
* @var Canvas
|
||||
*/
|
||||
protected $_canvas;
|
||||
|
||||
/**
|
||||
* Current dompdf instance
|
||||
*
|
||||
* @var DOMPDF
|
||||
*/
|
||||
protected $_dompdf;
|
||||
|
||||
/**
|
||||
* Class constructor
|
||||
*
|
||||
* @param DOMPDF $dompdf The current dompdf instance
|
||||
*/
|
||||
function __construct(DOMPDF $dompdf) {
|
||||
$this->_dompdf = $dompdf;
|
||||
$this->_canvas = $dompdf->get_canvas();
|
||||
}
|
||||
|
||||
/**
|
||||
* Render a frame.
|
||||
*
|
||||
* Specialized in child classes
|
||||
*
|
||||
* @param Frame $frame The frame to render
|
||||
*/
|
||||
abstract function render(Frame $frame);
|
||||
|
||||
//........................................................................
|
||||
|
||||
/**
|
||||
* Render a background image over a rectangular area
|
||||
*
|
||||
* @param string $img The background image to load
|
||||
* @param float $x The left edge of the rectangular area
|
||||
* @param float $y The top edge of the rectangular area
|
||||
* @param float $width The width of the rectangular area
|
||||
* @param float $height The height of the rectangular area
|
||||
* @param Style $style The associated Style object
|
||||
*/
|
||||
protected function _background_image($url, $x, $y, $width, $height, $style) {
|
||||
$sheet = $style->get_stylesheet();
|
||||
|
||||
// Skip degenerate cases
|
||||
if ( $width == 0 || $height == 0 )
|
||||
return;
|
||||
|
||||
//debugpng
|
||||
if (DEBUGPNG) print '[_background_image '.$url.']';
|
||||
|
||||
list($img, $ext) = Image_Cache::resolve_url($url,
|
||||
$sheet->get_protocol(),
|
||||
$sheet->get_host(),
|
||||
$sheet->get_base_path());
|
||||
|
||||
// Bail if the image is no good
|
||||
if ( $img === DOMPDF_LIB_DIR . "/res/broken_image.png" )
|
||||
return;
|
||||
|
||||
//Try to optimize away reading and composing of same background multiple times
|
||||
//Postponing read with imagecreatefrom ...()
|
||||
//final composition paramters and name not known yet
|
||||
//Therefore read dimension directly from file, instead of creating gd object first.
|
||||
//$img_w = imagesx($src); $img_h = imagesy($src);
|
||||
|
||||
list($img_w, $img_h) = dompdf_getimagesize($img);
|
||||
if (!isset($img_w) || $img_w == 0 || !isset($img_h) || $img_h == 0) {
|
||||
return;
|
||||
}
|
||||
|
||||
$repeat = $style->background_repeat;
|
||||
$bg_color = $style->background_color;
|
||||
|
||||
//Increase background resolution and dependent box size according to image resolution to be placed in
|
||||
//Then image can be copied in without resize
|
||||
$bg_width = round((float)($width * DOMPDF_DPI) / 72);
|
||||
$bg_height = round((float)($height * DOMPDF_DPI) / 72);
|
||||
|
||||
//Need %bg_x, $bg_y as background pos, where img starts, converted to pixel
|
||||
|
||||
list($bg_x, $bg_y) = $style->background_position;
|
||||
|
||||
if ( is_percent($bg_x) ) {
|
||||
// The point $bg_x % from the left edge of the image is placed
|
||||
// $bg_x % from the left edge of the background rectangle
|
||||
$p = ((float)$bg_x)/100.0;
|
||||
$x1 = $p * $img_w;
|
||||
$x2 = $p * $bg_width;
|
||||
|
||||
$bg_x = round($x2 - $x1);
|
||||
} else {
|
||||
$bg_x = round((float)($style->length_in_pt($bg_x)*DOMPDF_DPI) / 72);
|
||||
}
|
||||
|
||||
if ( is_percent($bg_y) ) {
|
||||
// The point $bg_y % from the left edge of the image is placed
|
||||
// $bg_y % from the left edge of the background rectangle
|
||||
$p = ((float)$bg_y)/100.0;
|
||||
$y1 = $p * $img_h;
|
||||
$y2 = $p * $bg_height;
|
||||
|
||||
$bg_y = round($y2 - $y1);
|
||||
} else {
|
||||
$bg_y = round((float)($style->length_in_pt($bg_y)*DOMPDF_DPI) / 72);
|
||||
}
|
||||
|
||||
//clip background to the image area on partial repeat. Nothing to do if img off area
|
||||
//On repeat, normalize start position to the tile at immediate left/top or 0/0 of area
|
||||
//On no repeat with positive offset: move size/start to have offset==0
|
||||
//Handle x/y Dimensions separately
|
||||
|
||||
if ( $repeat !== "repeat" && $repeat !== "repeat-x" ) {
|
||||
//No repeat x
|
||||
if ($bg_x < 0) {
|
||||
$bg_width = $img_w + $bg_x;
|
||||
} else {
|
||||
$x += ($bg_x * 72)/DOMPDF_DPI;
|
||||
$bg_width = $bg_width - $bg_x;
|
||||
if ($bg_width > $img_w) {
|
||||
$bg_width = $img_w;
|
||||
}
|
||||
$bg_x = 0;
|
||||
}
|
||||
if ($bg_width <= 0) {
|
||||
return;
|
||||
}
|
||||
$width = (float)($bg_width * 72)/DOMPDF_DPI;
|
||||
} else {
|
||||
//repeat x
|
||||
if ($bg_x < 0) {
|
||||
$bg_x = - ((-$bg_x) % $img_w);
|
||||
} else {
|
||||
$bg_x = $bg_x % $img_w;
|
||||
if ($bg_x > 0) {
|
||||
$bg_x -= $img_w;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ( $repeat !== "repeat" && $repeat !== "repeat-y" ) {
|
||||
//no repeat y
|
||||
if ($bg_y < 0) {
|
||||
$bg_height = $img_h + $bg_y;
|
||||
} else {
|
||||
$y += ($bg_y * 72)/DOMPDF_DPI;
|
||||
$bg_height = $bg_height - $bg_y;
|
||||
if ($bg_height > $img_h) {
|
||||
$bg_height = $img_h;
|
||||
}
|
||||
$bg_y = 0;
|
||||
}
|
||||
if ($bg_height <= 0) {
|
||||
return;
|
||||
}
|
||||
$height = (float)($bg_height * 72)/DOMPDF_DPI;
|
||||
} else {
|
||||
//repeat y
|
||||
if ($bg_y < 0) {
|
||||
$bg_y = - ((-$bg_y) % $img_h);
|
||||
} else {
|
||||
$bg_y = $bg_y % $img_h;
|
||||
if ($bg_y > 0) {
|
||||
$bg_y -= $img_h;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
//Optimization, if repeat has no effect
|
||||
if ( $repeat === "repeat" && $bg_y <= 0 && $img_h+$bg_y >= $bg_height ) {
|
||||
$repeat = "repeat-x";
|
||||
}
|
||||
if ( $repeat === "repeat" && $bg_x <= 0 && $img_w+$bg_x >= $bg_width ) {
|
||||
$repeat = "repeat-y";
|
||||
}
|
||||
if ( ($repeat === "repeat-x" && $bg_x <= 0 && $img_w+$bg_x >= $bg_width) ||
|
||||
($repeat === "repeat-y" && $bg_y <= 0 && $img_h+$bg_y >= $bg_height) ) {
|
||||
$repeat = "no-repeat";
|
||||
}
|
||||
|
||||
//Use filename as indicator only
|
||||
//different names for different variants to have different copies in the pdf
|
||||
//This is not dependent of background color of box! .'_'.(is_array($bg_color) ? $bg_color["hex"] : $bg_color)
|
||||
//Note: Here, bg_* are the start values, not end values after going through the tile loops!
|
||||
|
||||
$filedummy = $img;
|
||||
|
||||
/*
|
||||
//Make shorter strings with limited characters for cache associative array index - needed?
|
||||
//Strip common base path - server root, explicite temp, default temp; remove unwanted characters;
|
||||
$filedummy = strtr($filedummy,"\\:","//");
|
||||
$p = strtr($_SERVER["DOCUMENT_ROOT"],"\\:","//");
|
||||
$l = strlen($p);
|
||||
if ( substr($filedummy,0,$l) == $p) {
|
||||
$filedummy = substr($filedummy,$l);
|
||||
} else {
|
||||
$p = strtr(DOMPDF_TEMP_DIR,"\\:","//");
|
||||
$l = strlen($p);
|
||||
if ( substr($filedummy,0,$l) == $p) {
|
||||
$filedummy = substr($filedummy,$l);
|
||||
} else {
|
||||
$p = strtr(sys_get_temp_dir(),"\\:","//");
|
||||
$l = strlen($p);
|
||||
if ( substr($filedummy,0,$l) == $p) {
|
||||
$filedummy = substr($filedummy,$l);
|
||||
}
|
||||
}
|
||||
}
|
||||
*/
|
||||
|
||||
$filedummy .= '_'.$bg_width.'_'.$bg_height.'_'.$bg_x.'_'.$bg_y.'_'.$repeat;
|
||||
//debugpng
|
||||
//if (DEBUGPNG) print '<pre>[_background_image name '.$filedummy.']</pre>';
|
||||
|
||||
//Optimization to avoid multiple times rendering the same image.
|
||||
//If check functions are existing and identical image already cached,
|
||||
//then skip creation of duplicate, because it is not needed by addImagePng
|
||||
if ( method_exists( $this->_canvas, "get_cpdf" ) &&
|
||||
method_exists( $this->_canvas->get_cpdf(), "addImagePng" ) &&
|
||||
method_exists( $this->_canvas->get_cpdf(), "image_iscached" ) &&
|
||||
$this->_canvas->get_cpdf()->image_iscached($filedummy) ) {
|
||||
$bg = null;
|
||||
|
||||
//debugpng
|
||||
//if (DEBUGPNG) print '[_background_image skip]';
|
||||
}
|
||||
|
||||
else {
|
||||
|
||||
// Create a new image to fit over the background rectangle
|
||||
$bg = imagecreatetruecolor($bg_width, $bg_height);
|
||||
|
||||
//anyway default
|
||||
//imagealphablending($img, true);
|
||||
|
||||
switch (strtolower($ext)) {
|
||||
case "png":
|
||||
$src = imagecreatefrompng($img);
|
||||
break;
|
||||
|
||||
case "jpg":
|
||||
case "jpeg":
|
||||
$src = imagecreatefromjpeg($img);
|
||||
break;
|
||||
|
||||
case "gif":
|
||||
$src = imagecreatefromgif($img);
|
||||
break;
|
||||
|
||||
case "bmp":
|
||||
$src = imagecreatefrombmp($img);
|
||||
break;
|
||||
|
||||
default: return; // Unsupported image type
|
||||
}
|
||||
|
||||
if ($src == null) {
|
||||
return;
|
||||
}
|
||||
|
||||
//Background color if box is not relevant here
|
||||
//Non transparent image: box clipped to real size. Background non relevant.
|
||||
//Transparent image: The image controls the transparency and lets shine through whatever background.
|
||||
//However on transparent imaage preset the composed image with the transparency color,
|
||||
//to keep the transparency when copying over the non transparent parts of the tiles.
|
||||
$ti = imagecolortransparent($src);
|
||||
|
||||
if ($ti >= 0) {
|
||||
$tc = imagecolorsforindex($src,$ti);
|
||||
$ti = imagecolorallocate($bg,$tc['red'],$tc['green'],$tc['blue']);
|
||||
imagefill($bg,0,0,$ti);
|
||||
imagecolortransparent($bg, $ti);
|
||||
}
|
||||
|
||||
//This has only an effect for the non repeatable dimension.
|
||||
//compute start of src and dest coordinates of the single copy
|
||||
if ( $bg_x < 0 ) {
|
||||
$dst_x = 0;
|
||||
$src_x = -$bg_x;
|
||||
} else {
|
||||
$src_x = 0;
|
||||
$dst_x = $bg_x;
|
||||
}
|
||||
|
||||
if ( $bg_y < 0 ) {
|
||||
$dst_y = 0;
|
||||
$src_y = -$bg_y;
|
||||
} else {
|
||||
$src_y = 0;
|
||||
$dst_y = $bg_y;
|
||||
}
|
||||
|
||||
//For historical reasons exchange meanings of variables:
|
||||
//start_* will be the start values, while bg_* will be the temporary start values in the loops
|
||||
$start_x = $bg_x;
|
||||
$start_y = $bg_y;
|
||||
|
||||
// Copy regions from the source image to the background
|
||||
if ( $repeat === "no-repeat" ) {
|
||||
|
||||
// Simply place the image on the background
|
||||
imagecopy($bg, $src, $dst_x, $dst_y, $src_x, $src_y, $img_w, $img_h);
|
||||
|
||||
} else if ( $repeat === "repeat-x" ) {
|
||||
|
||||
for ( $bg_x = $start_x; $bg_x < $bg_width; $bg_x += $img_w ) {
|
||||
if ( $bg_x < 0 ) {
|
||||
$dst_x = 0;
|
||||
$src_x = -$bg_x;
|
||||
$w = $img_w + $bg_x;
|
||||
} else {
|
||||
$dst_x = $bg_x;
|
||||
$src_x = 0;
|
||||
$w = $img_w;
|
||||
}
|
||||
imagecopy($bg, $src, $dst_x, $dst_y, $src_x, $src_y, $w, $img_h);
|
||||
}
|
||||
|
||||
} else if ( $repeat === "repeat-y" ) {
|
||||
|
||||
for ( $bg_y = $start_y; $bg_y < $bg_height; $bg_y += $img_h ) {
|
||||
if ( $bg_y < 0 ) {
|
||||
$dst_y = 0;
|
||||
$src_y = -$bg_y;
|
||||
$h = $img_h + $bg_y;
|
||||
} else {
|
||||
$dst_y = $bg_y;
|
||||
$src_y = 0;
|
||||
$h = $img_h;
|
||||
}
|
||||
imagecopy($bg, $src, $dst_x, $dst_y, $src_x, $src_y, $img_w, $h);
|
||||
|
||||
}
|
||||
|
||||
} else if ( $repeat === "repeat" ) {
|
||||
|
||||
for ( $bg_y = $start_y; $bg_y < $bg_height; $bg_y += $img_h ) {
|
||||
for ( $bg_x = $start_x; $bg_x < $bg_width; $bg_x += $img_w ) {
|
||||
|
||||
if ( $bg_x < 0 ) {
|
||||
$dst_x = 0;
|
||||
$src_x = -$bg_x;
|
||||
$w = $img_w + $bg_x;
|
||||
} else {
|
||||
$dst_x = $bg_x;
|
||||
$src_x = 0;
|
||||
$w = $img_w;
|
||||
}
|
||||
|
||||
if ( $bg_y < 0 ) {
|
||||
$dst_y = 0;
|
||||
$src_y = -$bg_y;
|
||||
$h = $img_h + $bg_y;
|
||||
} else {
|
||||
$dst_y = $bg_y;
|
||||
$src_y = 0;
|
||||
$h = $img_h;
|
||||
}
|
||||
imagecopy($bg, $src, $dst_x, $dst_y, $src_x, $src_y, $w, $h);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
else {
|
||||
print 'Unknown repeat!';
|
||||
}
|
||||
|
||||
imagedestroy($src);
|
||||
|
||||
} /* End optimize away creation of duplicates */
|
||||
|
||||
//img: image url string
|
||||
//img_w, img_h: original image size in px
|
||||
//width, height: box size in pt
|
||||
//bg_width, bg_height: box size in px
|
||||
//x, y: left/top edge of box on page in pt
|
||||
//start_x, start_y: placement of image relativ to pattern
|
||||
//$repeat: repeat mode
|
||||
//$bg: GD object of result image
|
||||
//$src: GD object of original image
|
||||
//When using cpdf and optimization to direct png creation from gd object is available,
|
||||
//don't create temp file, but place gd object directly into the pdf
|
||||
if ( method_exists( $this->_canvas, "get_cpdf" ) &&
|
||||
method_exists( $this->_canvas->get_cpdf(), "addImagePng" ) ) {
|
||||
// Note: CPDF_Adapter image converts y position
|
||||
$this->_canvas->get_cpdf()->addImagePng($filedummy, $x, $this->_canvas->get_height() - $y - $height, $width, $height, $bg);
|
||||
}
|
||||
|
||||
else {
|
||||
$tmp_file = tempnam(DOMPDF_TEMP_DIR, "bg_dompdf_img_").'.png';
|
||||
//debugpng
|
||||
if (DEBUGPNG) print '[_background_image '.$tmp_file.']';
|
||||
|
||||
imagepng($bg, $tmp_file);
|
||||
$this->_canvas->image($tmp_file, "png", $x, $y, $width, $height);
|
||||
imagedestroy($bg);
|
||||
|
||||
//debugpng
|
||||
if (DEBUGPNG) print '[_background_image unlink '.$tmp_file.']';
|
||||
|
||||
if (!DEBUGKEEPTEMP)
|
||||
unlink($tmp_file);
|
||||
}
|
||||
}
|
||||
|
||||
protected function _get_dash_pattern($style, $width) {
|
||||
$pattern = array();
|
||||
|
||||
switch ($style) {
|
||||
default:
|
||||
/*case "solid":
|
||||
case "double":
|
||||
case "groove":
|
||||
case "inset":
|
||||
case "outset":
|
||||
case "ridge":*/
|
||||
case "none": break;
|
||||
|
||||
case "dotted":
|
||||
if ( $width < 2 )
|
||||
$pattern = array($width, 2);
|
||||
else
|
||||
$pattern = array($width);
|
||||
break;
|
||||
|
||||
case "dashed":
|
||||
$pattern = array(3 * $width);
|
||||
break;
|
||||
}
|
||||
|
||||
return $pattern;
|
||||
}
|
||||
|
||||
protected function _border_none($x, $y, $length, $color, $widths, $side, $corner_style = "bevel") {
|
||||
return;
|
||||
}
|
||||
|
||||
// Border rendering functions
|
||||
protected function _border_dotted($x, $y, $length, $color, $widths, $side, $corner_style = "bevel") {
|
||||
list($top, $right, $bottom, $left) = $widths;
|
||||
|
||||
$pattern = $this->_get_dash_pattern("dotted", $$side);
|
||||
|
||||
switch ($side) {
|
||||
|
||||
case "top":
|
||||
$delta = $top / 2;
|
||||
case "bottom":
|
||||
$delta = isset($delta) ? $delta : -$bottom / 2;
|
||||
$this->_canvas->line($x, $y + $delta, $x + $length, $y + $delta, $color, $$side, $pattern);
|
||||
break;
|
||||
|
||||
case "left":
|
||||
$delta = $left / 2;
|
||||
case "right":
|
||||
$delta = isset($delta) ? $delta : - $right / 2;
|
||||
$this->_canvas->line($x + $delta, $y, $x + $delta, $y + $length, $color, $$side, $pattern);
|
||||
break;
|
||||
|
||||
default:
|
||||
return;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
protected function _border_dashed($x, $y, $length, $color, $widths, $side, $corner_style = "bevel") {
|
||||
list($top, $right, $bottom, $left) = $widths;
|
||||
|
||||
$pattern = $this->_get_dash_pattern("dashed", $$side);
|
||||
|
||||
switch ($side) {
|
||||
|
||||
case "top":
|
||||
$delta = $top / 2;
|
||||
case "bottom":
|
||||
$delta = isset($delta) ? $delta : -$bottom / 2;
|
||||
$this->_canvas->line($x, $y + $delta, $x + $length, $y + $delta, $color, $$side, $pattern);
|
||||
break;
|
||||
|
||||
case "left":
|
||||
$delta = $left / 2;
|
||||
case "right":
|
||||
$delta = isset($delta) ? $delta : - $right / 2;
|
||||
$this->_canvas->line($x + $delta, $y, $x + $delta, $y + $length, $color, $$side, $pattern);
|
||||
break;
|
||||
|
||||
default:
|
||||
return;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
protected function _border_solid($x, $y, $length, $color, $widths, $side, $corner_style = "bevel") {
|
||||
list($top, $right, $bottom, $left) = $widths;
|
||||
|
||||
// All this polygon business is for beveled corners...
|
||||
switch ($side) {
|
||||
|
||||
case "top":
|
||||
if ( $corner_style === "bevel" ) {
|
||||
|
||||
$points = array($x, $y,
|
||||
$x + $length, $y,
|
||||
$x + $length - $right, $y + $top,
|
||||
$x + $left, $y + $top);
|
||||
$this->_canvas->polygon($points, $color, null, null, true);
|
||||
} else
|
||||
$this->_canvas->filled_rectangle($x, $y, $length, $top, $color);
|
||||
|
||||
break;
|
||||
|
||||
case "bottom":
|
||||
if ( $corner_style === "bevel" ) {
|
||||
$points = array($x, $y,
|
||||
$x + $length, $y,
|
||||
$x + $length - $right, $y - $bottom,
|
||||
$x + $left, $y - $bottom);
|
||||
$this->_canvas->polygon($points, $color, null, null, true);
|
||||
} else
|
||||
$this->_canvas->filled_rectangle($x, $y - $bottom, $length, $bottom, $color);
|
||||
|
||||
break;
|
||||
|
||||
case "left":
|
||||
if ( $corner_style === "bevel" ) {
|
||||
$points = array($x, $y,
|
||||
$x, $y + $length,
|
||||
$x + $left, $y + $length - $bottom,
|
||||
$x + $left, $y + $top);
|
||||
$this->_canvas->polygon($points, $color, null, null, true);
|
||||
} else
|
||||
$this->_canvas->filled_rectangle($x, $y, $left, $length, $color);
|
||||
|
||||
break;
|
||||
|
||||
case "right":
|
||||
if ( $corner_style === "bevel" ) {
|
||||
$points = array($x, $y,
|
||||
$x, $y + $length,
|
||||
$x - $right, $y + $length - $bottom,
|
||||
$x - $right, $y + $top);
|
||||
$this->_canvas->polygon($points, $color, null, null, true);
|
||||
} else
|
||||
$this->_canvas->filled_rectangle($x - $right, $y, $right, $length, $color);
|
||||
|
||||
break;
|
||||
|
||||
default:
|
||||
return;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
protected function _border_double($x, $y, $length, $color, $widths, $side, $corner_style = "bevel") {
|
||||
list($top, $right, $bottom, $left) = $widths;
|
||||
|
||||
$line_width = $$side / 4;
|
||||
|
||||
// We draw the outermost edge first. Points are ordered: outer left,
|
||||
// outer right, inner right, inner left, or outer top, outer bottom,
|
||||
// inner bottom, inner top.
|
||||
switch ($side) {
|
||||
|
||||
case "top":
|
||||
if ( $corner_style === "bevel" ) {
|
||||
$left_line_width = $left / 4;
|
||||
$right_line_width = $right / 4;
|
||||
|
||||
$points = array($x, $y,
|
||||
$x + $length, $y,
|
||||
$x + $length - $right_line_width, $y + $line_width,
|
||||
$x + $left_line_width, $y + $line_width,);
|
||||
$this->_canvas->polygon($points, $color, null, null, true);
|
||||
|
||||
$points = array($x + $left - $left_line_width, $y + $top - $line_width,
|
||||
$x + $length - $right + $right_line_width, $y + $top - $line_width,
|
||||
$x + $length - $right, $y + $top,
|
||||
$x + $left, $y + $top);
|
||||
$this->_canvas->polygon($points, $color, null, null, true);
|
||||
|
||||
} else {
|
||||
$this->_canvas->filled_rectangle($x, $y, $length, $line_width, $color);
|
||||
$this->_canvas->filled_rectangle($x, $y + $top - $line_width, $length, $line_width, $color);
|
||||
|
||||
}
|
||||
break;
|
||||
|
||||
case "bottom":
|
||||
if ( $corner_style === "bevel" ) {
|
||||
$left_line_width = $left / 4;
|
||||
$right_line_width = $right / 4;
|
||||
|
||||
$points = array($x, $y,
|
||||
$x + $length, $y,
|
||||
$x + $length - $right_line_width, $y - $line_width,
|
||||
$x + $left_line_width, $y - $line_width);
|
||||
$this->_canvas->polygon($points, $color, null, null, true);
|
||||
|
||||
$points = array($x + $left - $left_line_width, $y - $bottom + $line_width,
|
||||
$x + $length - $right + $right_line_width, $y - $bottom + $line_width,
|
||||
$x + $length - $right, $y - $bottom,
|
||||
$x + $left, $y - $bottom);
|
||||
$this->_canvas->polygon($points, $color, null, null, true);
|
||||
|
||||
} else {
|
||||
$this->_canvas->filled_rectangle($x, $y - $line_width, $length, $line_width, $color);
|
||||
$this->_canvas->filled_rectangle($x, $y - $bottom, $length, $line_width, $color);
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case "left":
|
||||
if ( $corner_style === "bevel" ) {
|
||||
$top_line_width = $top / 4;
|
||||
$bottom_line_width = $bottom / 4;
|
||||
|
||||
$points = array($x, $y,
|
||||
$x, $y + $length,
|
||||
$x + $line_width, $y + $length - $bottom_line_width,
|
||||
$x + $line_width, $y + $top_line_width);
|
||||
$this->_canvas->polygon($points, $color, null, null, true);
|
||||
|
||||
$points = array($x + $left - $line_width, $y + $top - $top_line_width,
|
||||
$x + $left - $line_width, $y + $length - $bottom + $bottom_line_width,
|
||||
$x + $left, $y + $length - $bottom,
|
||||
$x + $left, $y + $top);
|
||||
$this->_canvas->polygon($points, $color, null, null, true);
|
||||
|
||||
} else {
|
||||
$this->_canvas->filled_rectangle($x, $y, $line_width, $length, $color);
|
||||
$this->_canvas->filled_rectangle($x + $left - $line_width, $y, $line_width, $length, $color);
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
case "right":
|
||||
if ( $corner_style === "bevel" ) {
|
||||
$top_line_width = $top / 4;
|
||||
$bottom_line_width = $bottom / 4;
|
||||
|
||||
|
||||
$points = array($x, $y,
|
||||
$x, $y + $length,
|
||||
$x - $line_width, $y + $length - $bottom_line_width,
|
||||
$x - $line_width, $y + $top_line_width);
|
||||
$this->_canvas->polygon($points, $color, null, null, true);
|
||||
|
||||
$points = array($x - $right + $line_width, $y + $top - $top_line_width,
|
||||
$x - $right + $line_width, $y + $length - $bottom + $bottom_line_width,
|
||||
$x - $right, $y + $length - $bottom,
|
||||
$x - $right, $y + $top);
|
||||
$this->_canvas->polygon($points, $color, null, null, true);
|
||||
|
||||
} else {
|
||||
$this->_canvas->filled_rectangle($x - $line_width, $y, $line_width, $length, $color);
|
||||
$this->_canvas->filled_rectangle($x - $right, $y, $line_width, $length, $color);
|
||||
}
|
||||
|
||||
break;
|
||||
|
||||
default:
|
||||
return;
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
protected function _border_groove($x, $y, $length, $color, $widths, $side, $corner_style = "bevel") {
|
||||
list($top, $right, $bottom, $left) = $widths;
|
||||
|
||||
$half_widths = array($top / 2, $right / 2, $bottom / 2, $left / 2);
|
||||
|
||||
$this->_border_inset($x, $y, $length, $color, $half_widths, $side);
|
||||
|
||||
switch ($side) {
|
||||
|
||||
case "top":
|
||||
$x += $left / 2;
|
||||
$y += $top / 2;
|
||||
$length -= $left / 2 + $right / 2;
|
||||
break;
|
||||
|
||||
case "bottom":
|
||||
$x += $left / 2;
|
||||
$y -= $bottom / 2;
|
||||
$length -= $left / 2 + $right / 2;
|
||||
break;
|
||||
|
||||
case "left":
|
||||
$x += $left / 2;
|
||||
$y += $top / 2;
|
||||
$length -= $top / 2 + $bottom / 2;
|
||||
break;
|
||||
|
||||
case "right":
|
||||
$x -= $right / 2;
|
||||
$y += $top / 2;
|
||||
$length -= $top / 2 + $bottom / 2;
|
||||
break;
|
||||
|
||||
default:
|
||||
return;
|
||||
|
||||
}
|
||||
|
||||
$this->_border_outset($x, $y, $length, $color, $half_widths, $side);
|
||||
|
||||
}
|
||||
|
||||
protected function _border_ridge($x, $y, $length, $color, $widths, $side, $corner_style = "bevel") {
|
||||
list($top, $right, $bottom, $left) = $widths;
|
||||
|
||||
$half_widths = array($top / 2, $right / 2, $bottom / 2, $left / 2);
|
||||
|
||||
$this->_border_outset($x, $y, $length, $color, $half_widths, $side);
|
||||
|
||||
switch ($side) {
|
||||
|
||||
case "top":
|
||||
$x += $left / 2;
|
||||
$y += $top / 2;
|
||||
$length -= $left / 2 + $right / 2;
|
||||
break;
|
||||
|
||||
case "bottom":
|
||||
$x += $left / 2;
|
||||
$y -= $bottom / 2;
|
||||
$length -= $left / 2 + $right / 2;
|
||||
break;
|
||||
|
||||
case "left":
|
||||
$x += $left / 2;
|
||||
$y += $top / 2;
|
||||
$length -= $top / 2 + $bottom / 2;
|
||||
break;
|
||||
|
||||
case "right":
|
||||
$x -= $right / 2;
|
||||
$y += $top / 2;
|
||||
$length -= $top / 2 + $bottom / 2;
|
||||
break;
|
||||
|
||||
default:
|
||||
return;
|
||||
|
||||
}
|
||||
|
||||
$this->_border_inset($x, $y, $length, $color, $half_widths, $side);
|
||||
|
||||
}
|
||||
|
||||
protected function _tint($c) {
|
||||
if ( !is_numeric($c) )
|
||||
return $c;
|
||||
|
||||
return min(1, $c + 0.16);
|
||||
}
|
||||
|
||||
protected function _shade($c) {
|
||||
if ( !is_numeric($c) )
|
||||
return $c;
|
||||
|
||||
return max(0, $c - 0.33);
|
||||
}
|
||||
|
||||
protected function _border_inset($x, $y, $length, $color, $widths, $side, $corner_style = "bevel") {
|
||||
list($top, $right, $bottom, $left) = $widths;
|
||||
|
||||
switch ($side) {
|
||||
|
||||
case "top":
|
||||
case "left":
|
||||
$shade = array_map(array($this, "_shade"), $color);
|
||||
$this->_border_solid($x, $y, $length, $shade, $widths, $side);
|
||||
break;
|
||||
|
||||
case "bottom":
|
||||
case "right":
|
||||
$tint = array_map(array($this, "_tint"), $color);
|
||||
$this->_border_solid($x, $y, $length, $tint, $widths, $side);
|
||||
break;
|
||||
|
||||
default:
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
protected function _border_outset($x, $y, $length, $color, $widths, $side, $corner_style = "bevel") {
|
||||
list($top, $right, $bottom, $left) = $widths;
|
||||
|
||||
switch ($side) {
|
||||
case "top":
|
||||
case "left":
|
||||
$tint = array_map(array($this, "_tint"), $color);
|
||||
$this->_border_solid($x, $y, $length, $tint, $widths, $side);
|
||||
break;
|
||||
|
||||
case "bottom":
|
||||
case "right":
|
||||
$shade = array_map(array($this, "_shade"), $color);
|
||||
$this->_border_solid($x, $y, $length, $shade, $widths, $side);
|
||||
break;
|
||||
|
||||
default:
|
||||
return;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
protected function _set_opacity($opacity) {
|
||||
if ( is_numeric($opacity) && $opacity <= 1.0 && $opacity >= 0.0 ) {
|
||||
$this->_canvas->set_opacity( $opacity );
|
||||
}
|
||||
}
|
||||
|
||||
protected function _debug_layout($box, $color = "red", $style = array()) {
|
||||
$this->_canvas->rectangle($box[0], $box[1], $box[2], $box[3], CSS_Color::parse($color), 0.1, $style);
|
||||
}
|
||||
//........................................................................
|
||||
}
|
||||
481
pdf/include/attribute_translator.cls.php
Executable file
481
pdf/include/attribute_translator.cls.php
Executable file
@@ -0,0 +1,481 @@
|
||||
<?php
|
||||
/**
|
||||
* DOMPDF - PHP5 HTML to PDF renderer
|
||||
*
|
||||
* File: $RCSfile: attribute_translator.cls.php,v $
|
||||
* Created on: 2004-09-13
|
||||
*
|
||||
* Copyright (c) 2004 - Benj Carson <benjcarson@digitaljunkies.ca>
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with this library in the file LICENSE.LGPL; if not, write to the
|
||||
* Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
* 02111-1307 USA
|
||||
*
|
||||
* Alternatively, you may distribute this software under the terms of the
|
||||
* PHP License, version 3.0 or later. A copy of this license should have
|
||||
* been distributed with this file in the file LICENSE.PHP . If this is not
|
||||
* the case, you can obtain a copy at http://www.php.net/license/3_0.txt.
|
||||
*
|
||||
* The latest version of DOMPDF might be available at:
|
||||
* http://www.dompdf.com/
|
||||
*
|
||||
* @link http://www.dompdf.com/
|
||||
* @copyright 2004 Benj Carson
|
||||
* @author Benj Carson <benjcarson@digitaljunkies.ca>
|
||||
* @package dompdf
|
||||
|
||||
*/
|
||||
|
||||
/* $Id: attribute_translator.cls.php 346 2011-01-09 13:23:22Z fabien.menager $ */
|
||||
|
||||
/**
|
||||
* Translates HTML 4.0 attributes into CSS rules
|
||||
*
|
||||
* @access private
|
||||
* @package dompdf
|
||||
*/
|
||||
class Attribute_Translator {
|
||||
|
||||
// Munged data originally from
|
||||
// http://www.w3.org/TR/REC-html40/index/attributes.html
|
||||
//
|
||||
// thank you var_export() :D
|
||||
static private $__ATTRIBUTE_LOOKUP = array(
|
||||
//'caption' => array ( 'align' => '', ),
|
||||
'img' => array(
|
||||
'align' => array(
|
||||
'bottom' => 'vertical-align: baseline;',
|
||||
'middle' => 'vertical-align: middle;',
|
||||
'top' => 'vertical-align: top;',
|
||||
'left' => 'float: left;',
|
||||
'right' => 'float: right;'
|
||||
),
|
||||
'border' => 'border-width: %0.2F px;',
|
||||
'height' => 'height: %s px;',
|
||||
'hspace' => 'padding-left: %1$0.2F px; padding-right: %1$0.2F px;',
|
||||
'vspace' => 'padding-top: %1$0.2F px; padding-bottom: %1$0.2F px;',
|
||||
'width' => 'width: %s px;',
|
||||
),
|
||||
'table' => array(
|
||||
'align' => array(
|
||||
'left' => 'margin-left: 0; margin-right: auto;',
|
||||
'center' => 'margin-left: auto; margin-right: auto;',
|
||||
'right' => 'margin-left: auto; margin-right: 0;'
|
||||
),
|
||||
'bgcolor' => 'background-color: %s;',
|
||||
'border' => '!set_table_border',
|
||||
'cellpadding' => '!set_table_cellpadding',
|
||||
'cellspacing' => 'border-spacing: %0.2F; border-collapse: separate;',
|
||||
'frame' => array(
|
||||
'void' => 'border-style: none;',
|
||||
'above' => 'border-top-style: solid;',
|
||||
'below' => 'border-bottom-style: solid;',
|
||||
'hsides' => 'border-left-style: solid; border-right-style: solid;',
|
||||
'vsides' => 'border-top-style: solid; border-bottom-style: solid;',
|
||||
'lhs' => 'border-left-style: solid;',
|
||||
'rhs' => 'border-right-style: solid;',
|
||||
'box' => 'border-style: solid;',
|
||||
'border' => 'border-style: solid;'
|
||||
),
|
||||
'rules' => '!set_table_rules',
|
||||
'width' => 'width: %s;',
|
||||
),
|
||||
'hr' => array(
|
||||
'align' => '!set_hr_align', // Need to grab width to set 'left' & 'right' correctly
|
||||
'noshade' => 'border-style: solid;',
|
||||
'size' => 'border-width: %0.2F px;',
|
||||
'width' => 'width: %s;',
|
||||
),
|
||||
'div' => array(
|
||||
'align' => 'text-align: %s;',
|
||||
),
|
||||
'h1' => array(
|
||||
'align' => 'text-align: %s;',
|
||||
),
|
||||
'h2' => array(
|
||||
'align' => 'text-align: %s;',
|
||||
),
|
||||
'h3' => array(
|
||||
'align' => 'text-align: %s;',
|
||||
),
|
||||
'h4' => array(
|
||||
'align' => 'text-align: %s;',
|
||||
),
|
||||
'h5' => array(
|
||||
'align' => 'text-align: %s;',
|
||||
),
|
||||
'h6' => array(
|
||||
'align' => 'text-align: %s;',
|
||||
),
|
||||
'p' => array(
|
||||
'align' => 'text-align: %s;',
|
||||
),
|
||||
// 'col' => array(
|
||||
// 'align' => '',
|
||||
// 'valign' => '',
|
||||
// ),
|
||||
// 'colgroup' => array(
|
||||
// 'align' => '',
|
||||
// 'valign' => '',
|
||||
// ),
|
||||
'tbody' => array(
|
||||
'align' => '!set_table_row_align',
|
||||
'valign' => '!set_table_row_valign',
|
||||
),
|
||||
'td' => array(
|
||||
'align' => 'text-align: %s;',
|
||||
'bgcolor' => 'background-color: %s;',
|
||||
'height' => 'height: %s;',
|
||||
'nowrap' => 'white-space: nowrap;',
|
||||
'valign' => 'vertical-align: %s;',
|
||||
'width' => 'width: %s;',
|
||||
),
|
||||
'tfoot' => array(
|
||||
'align' => '!set_table_row_align',
|
||||
'valign' => '!set_table_row_valign',
|
||||
),
|
||||
'th' => array(
|
||||
'align' => 'text-align: %s;',
|
||||
'bgcolor' => 'background-color: %s;',
|
||||
'height' => 'height: %s;',
|
||||
'nowrap' => 'white-space: nowrap;',
|
||||
'valign' => 'vertical-align: %s;',
|
||||
'width' => 'width: %s;',
|
||||
),
|
||||
'thead' => array(
|
||||
'align' => '!set_table_row_align',
|
||||
'valign' => '!set_table_row_valign',
|
||||
),
|
||||
'tr' => array(
|
||||
'align' => '!set_table_row_align',
|
||||
'bgcolor' => '!set_table_row_bgcolor',
|
||||
'valign' => '!set_table_row_valign',
|
||||
),
|
||||
'body' => array(
|
||||
'background' => 'background-image: url(%s);',
|
||||
'bgcolor' => 'background-color: %s;',
|
||||
'link' => '!set_body_link',
|
||||
'text' => 'color: %s;',
|
||||
),
|
||||
'br' => array(
|
||||
'clear' => 'clear: %s;',
|
||||
),
|
||||
'basefont' => array(
|
||||
'color' => 'color: %s;',
|
||||
'face' => 'font-family: %s;',
|
||||
'size' => '!set_basefont_size',
|
||||
),
|
||||
'font' => array(
|
||||
'color' => 'color: %s;',
|
||||
'face' => 'font-family: %s;',
|
||||
'size' => '!set_font_size',
|
||||
),
|
||||
'dir' => array(
|
||||
'compact' => 'margin: 0.5em 0;',
|
||||
),
|
||||
'dl' => array(
|
||||
'compact' => 'margin: 0.5em 0;',
|
||||
),
|
||||
'menu' => array(
|
||||
'compact' => 'margin: 0.5em 0;',
|
||||
),
|
||||
'ol' => array(
|
||||
'compact' => 'margin: 0.5em 0;',
|
||||
'start' => 'counter-reset: -dompdf-default-counter %d;',
|
||||
'type' => 'list-style-type: %s;',
|
||||
),
|
||||
'ul' => array(
|
||||
'compact' => 'margin: 0.5em 0;',
|
||||
'type' => 'list-style-type: %s;',
|
||||
),
|
||||
'li' => array(
|
||||
'type' => 'list-style-type: %s;',
|
||||
'value' => 'counter-reset: -dompdf-default-counter %d;',
|
||||
),
|
||||
'pre' => array(
|
||||
'width' => 'width: %s;',
|
||||
),
|
||||
);
|
||||
|
||||
|
||||
static protected $_last_basefont_size = 3;
|
||||
static protected $_font_size_lookup = array(
|
||||
// For basefont support
|
||||
-3 => "4pt",
|
||||
-2 => "5pt",
|
||||
-1 => "6pt",
|
||||
0 => "7pt",
|
||||
|
||||
1 => "8pt",
|
||||
2 => "10pt",
|
||||
3 => "12pt",
|
||||
4 => "14pt",
|
||||
5 => "18pt",
|
||||
6 => "24pt",
|
||||
7 => "34pt",
|
||||
|
||||
// For basefont support
|
||||
8 => "48pt",
|
||||
9 => "44pt",
|
||||
10 => "52pt",
|
||||
11 => "60pt",
|
||||
);
|
||||
|
||||
|
||||
static function translate_attributes($frame) {
|
||||
$node = $frame->get_node();
|
||||
$tag = $node->tagName;
|
||||
|
||||
if ( !isset(self::$__ATTRIBUTE_LOOKUP[$tag]) )
|
||||
return;
|
||||
|
||||
$valid_attrs = self::$__ATTRIBUTE_LOOKUP[$tag];
|
||||
$attrs = $node->attributes;
|
||||
$style = rtrim($node->getAttribute("style"), "; ");
|
||||
if ( $style != "" )
|
||||
$style .= ";";
|
||||
|
||||
foreach ($attrs as $attr => $attr_node ) {
|
||||
if ( !isset($valid_attrs[$attr]) )
|
||||
continue;
|
||||
|
||||
$value = $attr_node->value;
|
||||
|
||||
$target = $valid_attrs[$attr];
|
||||
|
||||
// Look up $value in $target, if $target is an array:
|
||||
if ( is_array($target) ) {
|
||||
|
||||
if ( isset($target[$value]) )
|
||||
$style .= " " . self::_resolve_target($node, $target[$value], $value);
|
||||
|
||||
} else {
|
||||
// otherwise use target directly
|
||||
$style .= " " . self::_resolve_target($node, $target, $value);
|
||||
}
|
||||
}
|
||||
if ( !is_null($style) ) {
|
||||
$style = ltrim($style);
|
||||
$node->setAttribute("style", $style);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
static protected function _resolve_target($node, $target, $value) {
|
||||
if ( $target[0] === "!" ) {
|
||||
// Function call
|
||||
$func = "_" . mb_substr($target, 1);
|
||||
return self::$func($node, $value);
|
||||
}
|
||||
|
||||
return $value ? sprintf($target, $value) : "";
|
||||
}
|
||||
|
||||
//.....................................................................
|
||||
|
||||
static protected function _set_table_cellpadding($node, $value) {
|
||||
$td_list = $node->getElementsByTagName("td");
|
||||
foreach ($td_list as $td) {
|
||||
$style = rtrim($td->getAttribute("style"), ";");
|
||||
$style .= "; padding: $value" . "px;";
|
||||
$style = ltrim($style, ";");
|
||||
$td->setAttribute("style", $style);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
static protected function _set_table_border($node, $value) {
|
||||
$td_list = $node->getElementsByTagName("td");
|
||||
foreach ($td_list as $td) {
|
||||
$style = $td->getAttribute("style");
|
||||
if ( strpos($style, "border") !== false )
|
||||
continue;
|
||||
$style = rtrim($style, ";");
|
||||
$style .= "; border-width: " . ($value > 0 ? 1 : 0) . "pt; border-style: inset;";
|
||||
$style = ltrim($style, ";");
|
||||
$td->setAttribute("style", $style);
|
||||
}
|
||||
|
||||
$th_list = $node->getElementsByTagName("th");
|
||||
foreach ($th_list as $th) {
|
||||
$style = $th->getAttribute("style");
|
||||
if ( strpos($style, "border") !== false )
|
||||
continue;
|
||||
$style = rtrim($style, ";");
|
||||
$style .= "; border-width: " . ($value > 0 ? 1 : 0) . "pt; border-style: inset;";
|
||||
$style = ltrim($style, ";");
|
||||
$th->setAttribute("style", $style);
|
||||
}
|
||||
|
||||
$style = rtrim($node->getAttribute("style"),";");
|
||||
$style .= "; border-width: $value" . "px; ";
|
||||
return ltrim($style, "; ");
|
||||
}
|
||||
|
||||
static protected function _set_table_cellspacing($node, $value) {
|
||||
$style = rtrim($node->getAttribute($style), ";");
|
||||
|
||||
if ( $value == 0 )
|
||||
$style .= "; border-collapse: collapse;";
|
||||
|
||||
else
|
||||
$style = "; border-collapse: separate;";
|
||||
|
||||
return ltrim($style, ";");
|
||||
}
|
||||
|
||||
static protected function _set_table_rules($node, $value) {
|
||||
$new_style = "; border-collapse: collapse;";
|
||||
switch ($value) {
|
||||
case "none":
|
||||
$new_style .= "border-style: none;";
|
||||
break;
|
||||
|
||||
case "groups":
|
||||
// FIXME: unsupported
|
||||
return;
|
||||
|
||||
case "rows":
|
||||
$new_style .= "border-style: solid none solid none; border-width: 1px; ";
|
||||
break;
|
||||
|
||||
case "cols":
|
||||
$new_style .= "border-style: none solid none solid; border-width: 1px; ";
|
||||
break;
|
||||
|
||||
case "all":
|
||||
$new_style .= "border-style: solid; border-width: 1px; ";
|
||||
break;
|
||||
|
||||
default:
|
||||
// Invalid value
|
||||
return null;
|
||||
}
|
||||
|
||||
$td_list = $node->getElementsByTagName("td");
|
||||
|
||||
foreach ($td_list as $td) {
|
||||
$style = $td->getAttribute("style");
|
||||
$style .= $new_style;
|
||||
$td->setAttribute("style", $style);
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
static protected function _set_hr_align($node, $value) {
|
||||
$style = rtrim($node->getAttribute("style"),";");
|
||||
$width = $node->getAttribute("width");
|
||||
if ( $width == "" )
|
||||
$width = "100%";
|
||||
|
||||
$remainder = 100 - (double)rtrim($width, "% ");
|
||||
|
||||
switch ($value) {
|
||||
case "left":
|
||||
$style .= "; margin-right: $remainder %;";
|
||||
break;
|
||||
|
||||
case "right":
|
||||
$style .= "; margin-left: $remainder %;";
|
||||
break;
|
||||
|
||||
case "center":
|
||||
$style .= "; margin-left: auto; margin-right: auto;";
|
||||
break;
|
||||
|
||||
default:
|
||||
return null;
|
||||
}
|
||||
return ltrim($style, "; ");
|
||||
}
|
||||
|
||||
static protected function _set_table_row_align($node, $value) {
|
||||
|
||||
$td_list = $node->getElementsByTagName("td");
|
||||
|
||||
foreach ($td_list as $td) {
|
||||
$style = rtrim($td->getAttribute("style"), ";");
|
||||
$style .= "; text-align: $value;";
|
||||
$style = ltrim($style, "; ");
|
||||
$td->setAttribute("style", $style);
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
static protected function _set_table_row_valign($node, $value) {
|
||||
|
||||
$td_list = $node->getElementsByTagName("td");
|
||||
|
||||
foreach ($td_list as $td) {
|
||||
$style = rtrim($td->getAttribute("style"), ";");
|
||||
$style .= "; vertical-align: $value;";
|
||||
$style = ltrim($style, "; ");
|
||||
$td->setAttribute("style", $style);
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
static protected function _set_table_row_bgcolor($node, $value) {
|
||||
|
||||
$td_list = $node->getElementsByTagName("td");
|
||||
|
||||
foreach ($td_list as $td) {
|
||||
$style = rtrim($td->getAttribute("style"), ";");
|
||||
$style .= "; background-color: $value;";
|
||||
$style = ltrim($style, "; ");
|
||||
$td->setAttribute("style", $style);
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
static protected function _set_body_link($node, $value) {
|
||||
|
||||
$a_list = $node->getElementsByTagName("a");
|
||||
|
||||
foreach ($a_list as $a) {
|
||||
$style = rtrim($a->getAttribute("style"), ";");
|
||||
$style .= "; color: $value;";
|
||||
$style = ltrim($style, "; ");
|
||||
$a->setAttribute("style", $style);
|
||||
}
|
||||
|
||||
return null;
|
||||
}
|
||||
|
||||
static protected function _set_basefont_size($node, $value) {
|
||||
// FIXME: ? we don't actually set the font size of anything here, just
|
||||
// the base size for later modification by <font> tags.
|
||||
self::$_last_basefont_size = $value;
|
||||
return null;
|
||||
}
|
||||
|
||||
static protected function _set_font_size($node, $value) {
|
||||
$style = $node->getAttribute("style");
|
||||
|
||||
if ( $value[0] === "-" || $value[0] === "+" )
|
||||
$value = self::$_last_basefont_size + (int)$value;
|
||||
|
||||
if ( isset(self::$_font_size_lookup[$value]) )
|
||||
$style .= "; font-size: " . self::$_font_size_lookup[$value] . ";";
|
||||
else
|
||||
$style .= "; font-size: $value;";
|
||||
|
||||
return ltrim($style, "; ");
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
354
pdf/include/block_frame_decorator.cls.php
Executable file
354
pdf/include/block_frame_decorator.cls.php
Executable file
@@ -0,0 +1,354 @@
|
||||
<?php
|
||||
/**
|
||||
* DOMPDF - PHP5 HTML to PDF renderer
|
||||
*
|
||||
* File: $RCSfile: block_frame_decorator.cls.php,v $
|
||||
* Created on: 2004-06-02
|
||||
*
|
||||
* Copyright (c) 2004 - Benj Carson <benjcarson@digitaljunkies.ca>
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with this library in the file LICENSE.LGPL; if not, write to the
|
||||
* Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
* 02111-1307 USA
|
||||
*
|
||||
* Alternatively, you may distribute this software under the terms of the
|
||||
* PHP License, version 3.0 or later. A copy of this license should have
|
||||
* been distributed with this file in the file LICENSE.PHP . If this is not
|
||||
* the case, you can obtain a copy at http://www.php.net/license/3_0.txt.
|
||||
*
|
||||
* The latest version of DOMPDF might be available at:
|
||||
* http://www.dompdf.com/
|
||||
*
|
||||
* @link http://www.dompdf.com/
|
||||
* @copyright 2004 Benj Carson
|
||||
* @author Benj Carson <benjcarson@digitaljunkies.ca>
|
||||
* @package dompdf
|
||||
|
||||
*/
|
||||
|
||||
/* $Id: block_frame_decorator.cls.php 358 2011-01-30 22:22:47Z fabien.menager $ */
|
||||
|
||||
/**
|
||||
* Decorates frames for block layout
|
||||
*
|
||||
* @access private
|
||||
* @package dompdf
|
||||
*/
|
||||
class Block_Frame_Decorator extends Frame_Decorator {
|
||||
|
||||
const DEFAULT_COUNTER = "-dompdf-default-counter";
|
||||
|
||||
protected $_lines; // array( [num] => array([frames] => array(<frame list>),
|
||||
// y, w, h) )
|
||||
protected $_counters; // array([id] => counter_value) (for generated content)
|
||||
protected $_cl; // current line index
|
||||
|
||||
static protected $_initial_line_state = array(
|
||||
"frames" => array(),
|
||||
"wc" => 0,
|
||||
"y" => null,
|
||||
"w" => 0,
|
||||
"h" => 0,
|
||||
"left" => 0,
|
||||
"right" => 0,
|
||||
"tallest_frame" => null,
|
||||
"br" => false,
|
||||
);
|
||||
|
||||
//........................................................................
|
||||
|
||||
function __construct(Frame $frame, DOMPDF $dompdf) {
|
||||
parent::__construct($frame, $dompdf);
|
||||
|
||||
$this->_lines = array(self::$_initial_line_state);
|
||||
|
||||
$this->_counters = array(self::DEFAULT_COUNTER => 0);
|
||||
$this->_cl = 0;
|
||||
}
|
||||
|
||||
//........................................................................
|
||||
|
||||
function reset() {
|
||||
parent::reset();
|
||||
|
||||
$this->_lines = array(self::$_initial_line_state);
|
||||
|
||||
$this->_counters = array(self::DEFAULT_COUNTER => 0);
|
||||
$this->_cl = 0;
|
||||
}
|
||||
|
||||
//........................................................................
|
||||
|
||||
// Accessor methods
|
||||
|
||||
function get_current_line($i = null) {
|
||||
$cl = $this->_lines[$this->_cl];
|
||||
if ( isset($i) )
|
||||
return $cl[$i];
|
||||
return $cl;
|
||||
}
|
||||
|
||||
function get_current_line_number() {
|
||||
return $this->_cl;
|
||||
}
|
||||
|
||||
function get_lines() { return $this->_lines; }
|
||||
|
||||
//........................................................................
|
||||
|
||||
// Set methods
|
||||
function set_current_line($y = null, $w = null, $h = null, $tallest_frame = null, $left = null, $right = null) {
|
||||
$this->set_line($this->_cl, $y, $w, $h, $tallest_frame, $left, $right);
|
||||
}
|
||||
|
||||
function clear_line($i) {
|
||||
if ( isset($this->_lines[$i]) )
|
||||
unset($this->_lines[$i]);
|
||||
}
|
||||
|
||||
function set_line($lineno, $y = null, $w = null, $h = null, $tallest_frame = null, $left = null, $right = null) {
|
||||
|
||||
if ( is_array($y) )
|
||||
extract($y);
|
||||
|
||||
if (is_numeric($y))
|
||||
$this->_lines[$lineno]["y"] = $y;
|
||||
|
||||
if (is_numeric($w))
|
||||
$this->_lines[$lineno]["w"] = $w;
|
||||
|
||||
if (is_numeric($h))
|
||||
$this->_lines[$lineno]["h"] = $h;
|
||||
|
||||
if ($tallest_frame && $tallest_frame instanceof Frame)
|
||||
$this->_lines[$lineno]["tallest_frame"] = $tallest_frame;
|
||||
|
||||
if (is_numeric($left))
|
||||
$this->_lines[$lineno]["left"] = $left;
|
||||
|
||||
if (is_numeric($right))
|
||||
$this->_lines[$lineno]["right"] = $right;
|
||||
}
|
||||
|
||||
|
||||
function add_frame_to_line(Frame $frame) {
|
||||
$style = $frame->get_style();
|
||||
|
||||
if ( in_array($style->position, array("absolute", "fixed")) ||
|
||||
(DOMPDF_ENABLE_CSS_FLOAT && $style->float !== "none") ) {
|
||||
return;
|
||||
}
|
||||
|
||||
$frame->set_containing_line($this->_lines[$this->_cl]);
|
||||
|
||||
/*
|
||||
// Adds a new line after a block, only if certain conditions are met
|
||||
if ((($frame instanceof Inline_Frame_Decorator && $frame->get_node()->nodeName !== "br") ||
|
||||
$frame instanceof Text_Frame_Decorator && trim($frame->get_text())) &&
|
||||
($frame->get_prev_sibling() && $frame->get_prev_sibling()->get_style()->display === "block" &&
|
||||
$this->_lines[$this->_cl]["w"] > 0 )) {
|
||||
|
||||
$this->maximize_line_height( $style->length_in_pt($style->line_height), $frame );
|
||||
$this->add_line();
|
||||
|
||||
// Add each child of the inline frame to the line individually
|
||||
foreach ($frame->get_children() as $child)
|
||||
$this->add_frame_to_line( $child );
|
||||
}
|
||||
else*/
|
||||
|
||||
// Handle inline frames (which are effectively wrappers)
|
||||
if ( $frame instanceof Inline_Frame_Decorator ) {
|
||||
|
||||
// Handle line breaks
|
||||
if ( $frame->get_node()->nodeName === "br" ) {
|
||||
$this->maximize_line_height( $style->length_in_pt($style->line_height), $frame );
|
||||
$this->add_line(true);
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
// Trim leading text if this is an empty line. Kinda a hack to put it here,
|
||||
// but what can you do...
|
||||
if ( $this->_lines[$this->_cl]["w"] == 0 &&
|
||||
$frame->get_node()->nodeName === "#text" &&
|
||||
($style->white_space !== "pre" ||
|
||||
$style->white_space !== "pre-wrap") ) {
|
||||
|
||||
$frame->set_text( ltrim($frame->get_text()) );
|
||||
$frame->recalculate_width();
|
||||
}
|
||||
|
||||
$w = $frame->get_margin_width();
|
||||
|
||||
if ( $w == 0 )
|
||||
return;
|
||||
|
||||
// Debugging code:
|
||||
/*
|
||||
pre_r("\n<h3>Adding frame to line:</h3>");
|
||||
|
||||
// pre_r("Me: " . $this->get_node()->nodeName . " (" . spl_object_hash($this->get_node()) . ")");
|
||||
// pre_r("Node: " . $frame->get_node()->nodeName . " (" . spl_object_hash($frame->get_node()) . ")");
|
||||
if ( $frame->get_node()->nodeName === "#text" )
|
||||
pre_r('"'.$frame->get_node()->nodeValue.'"');
|
||||
|
||||
pre_r("Line width: " . $this->_lines[$this->_cl]["w"]);
|
||||
pre_r("Frame: " . get_class($frame));
|
||||
pre_r("Frame width: " . $w);
|
||||
pre_r("Frame height: " . $frame->get_margin_height());
|
||||
pre_r("Containing block width: " . $this->get_containing_block("w"));
|
||||
*/
|
||||
// End debugging
|
||||
|
||||
$line = $this->_lines[$this->_cl];
|
||||
if ( $line["left"] + $line["w"] + $line["right"] + $w > $this->get_containing_block("w"))
|
||||
$this->add_line();
|
||||
|
||||
$frame->position();
|
||||
|
||||
$current_line = &$this->_lines[$this->_cl];
|
||||
|
||||
$current_line["frames"][] = $frame;
|
||||
|
||||
if ( $frame->get_node()->nodeName === "#text")
|
||||
$current_line["wc"] += count(preg_split("/\s+/", trim($frame->get_text())));
|
||||
|
||||
$this->increase_line_width($w);
|
||||
|
||||
$this->maximize_line_height($frame->get_margin_height(), $frame);
|
||||
}
|
||||
|
||||
function remove_frames_from_line(Frame $frame) {
|
||||
// Search backwards through the lines for $frame
|
||||
$i = $this->_cl;
|
||||
|
||||
while ($i >= 0) {
|
||||
if ( ($j = in_array($frame, $this->_lines[$i]["frames"], true)) !== false )
|
||||
break;
|
||||
$i--;
|
||||
}
|
||||
|
||||
if ( $j === false )
|
||||
return;
|
||||
|
||||
// Remove $frame and all frames that follow
|
||||
while ($j < count($this->_lines[$i]["frames"])) {
|
||||
$f = $this->_lines[$i]["frames"][$j];
|
||||
$this->_lines[$i]["frames"][$j] = null;
|
||||
unset($this->_lines[$i]["frames"][$j]);
|
||||
$j++;
|
||||
$this->_lines[$i]["w"] -= $f->get_margin_width();
|
||||
}
|
||||
|
||||
// Recalculate the height of the line
|
||||
$h = 0;
|
||||
foreach ($this->_lines[$i]["frames"] as $f)
|
||||
$h = max( $h, $f->get_margin_height() );
|
||||
|
||||
$this->_lines[$i]["h"] = $h;
|
||||
|
||||
// Remove all lines that follow
|
||||
while ($this->_cl > $i) {
|
||||
$this->_lines[ $this->_cl ] = null;
|
||||
unset($this->_lines[ $this->_cl ]);
|
||||
$this->_cl--;
|
||||
}
|
||||
}
|
||||
|
||||
function increase_line_width($w) {
|
||||
$this->_lines[ $this->_cl ]["w"] += $w;
|
||||
}
|
||||
|
||||
function maximize_line_height($val, Frame $frame) {
|
||||
if ( $val > $this->_lines[ $this->_cl ]["h"] ) {
|
||||
$this->_lines[ $this->_cl ]["tallest_frame"] = $frame;
|
||||
$this->_lines[ $this->_cl ]["h"] = $val;
|
||||
}
|
||||
}
|
||||
|
||||
function add_line($br = false) {
|
||||
|
||||
// if ( $this->_lines[$this->_cl]["h"] == 0 ) //count($this->_lines[$i]["frames"]) == 0 ||
|
||||
// return;
|
||||
|
||||
$this->_lines[$this->_cl]["br"] = $br;
|
||||
$y = $this->_lines[$this->_cl]["y"] + $this->_lines[$this->_cl]["h"];
|
||||
|
||||
$new_line = self::$_initial_line_state;
|
||||
$new_line["y"] = $y;
|
||||
|
||||
$this->_lines[ ++$this->_cl ] = $new_line;
|
||||
}
|
||||
|
||||
//........................................................................
|
||||
|
||||
function reset_counter($id = self::DEFAULT_COUNTER, $value = 0) {
|
||||
$this->_counters[$id] = $value;
|
||||
}
|
||||
|
||||
function increment_counter($id = self::DEFAULT_COUNTER, $increment = 1) {
|
||||
if ( !isset($this->_counters[$id]) )
|
||||
$this->_counters[$id] = $increment;
|
||||
else
|
||||
$this->_counters[$id] += $increment;
|
||||
}
|
||||
|
||||
// TODO: What version is the best : this one or the one in List_Bullet_Renderer ?
|
||||
function counter_value($id = self::DEFAULT_COUNTER, $type = "decimal") {
|
||||
$type = mb_strtolower($type);
|
||||
|
||||
if ( $id === "page" ) {
|
||||
$value = $this->get_dompdf()->get_canvas()->get_page_number();
|
||||
}
|
||||
elseif ( !isset($this->_counters[$id]) ) {
|
||||
$this->_counters[$id] = 0;
|
||||
$value = 0;
|
||||
}
|
||||
else {
|
||||
$value = $this->_counters[$id];
|
||||
}
|
||||
|
||||
switch ($type) {
|
||||
|
||||
default:
|
||||
case "decimal":
|
||||
return $value;
|
||||
|
||||
case "decimal-leading-zero":
|
||||
return str_pad($value, 2, "0");
|
||||
|
||||
case "lower-roman":
|
||||
return dec2roman($value);
|
||||
|
||||
case "upper-roman":
|
||||
return mb_strtoupper(dec2roman($value));
|
||||
|
||||
case "lower-latin":
|
||||
case "lower-alpha":
|
||||
return chr( ($value % 26) + ord('a') - 1);
|
||||
|
||||
case "upper-latin":
|
||||
case "upper-alpha":
|
||||
return chr( ($value % 26) + ord('A') - 1);
|
||||
|
||||
case "lower-greek":
|
||||
return unichr($value + 944);
|
||||
|
||||
case "upper-greek":
|
||||
return unichr($value + 912);
|
||||
}
|
||||
}
|
||||
}
|
||||
756
pdf/include/block_frame_reflower.cls.php
Executable file
756
pdf/include/block_frame_reflower.cls.php
Executable file
@@ -0,0 +1,756 @@
|
||||
<?php
|
||||
/**
|
||||
* DOMPDF - PHP5 HTML to PDF renderer
|
||||
*
|
||||
* File: $RCSfile: block_frame_reflower.cls.php,v $
|
||||
* Created on: 2004-06-17
|
||||
*
|
||||
* Copyright (c) 2004 - Benj Carson <benjcarson@digitaljunkies.ca>
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with this library in the file LICENSE.LGPL; if not, write to the
|
||||
* Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
* 02111-1307 USA
|
||||
*
|
||||
* Alternatively, you may distribute this software under the terms of the
|
||||
* PHP License, version 3.0 or later. A copy of this license should have
|
||||
* been distributed with this file in the file LICENSE.PHP . If this is not
|
||||
* the case, you can obtain a copy at http://www.php.net/license/3_0.txt.
|
||||
*
|
||||
* The latest version of DOMPDF might be available at:
|
||||
* http://www.dompdf.com/
|
||||
*
|
||||
* @link http://www.dompdf.com/
|
||||
* @copyright 2004 Benj Carson
|
||||
* @author Benj Carson <benjcarson@digitaljunkies.ca>
|
||||
* @package dompdf
|
||||
|
||||
*/
|
||||
|
||||
/* $Id: block_frame_reflower.cls.php 358 2011-01-30 22:22:47Z fabien.menager $ */
|
||||
|
||||
/**
|
||||
* Reflows block frames
|
||||
*
|
||||
* @access private
|
||||
* @package dompdf
|
||||
*/
|
||||
class Block_Frame_Reflower extends Frame_Reflower {
|
||||
// Minimum line width to justify, as fraction of available width
|
||||
const MIN_JUSTIFY_WIDTH = 0.80;
|
||||
|
||||
/**
|
||||
* @var Block_Frame_Decorator
|
||||
*/
|
||||
protected $_frame;
|
||||
|
||||
function __construct(Block_Frame_Decorator $frame) { parent::__construct($frame); }
|
||||
|
||||
/**
|
||||
* Calculate the ideal used value for the width property as per:
|
||||
* http://www.w3.org/TR/CSS21/visudet.html#Computing_widths_and_margins
|
||||
*
|
||||
* @param float $width
|
||||
* @return array
|
||||
*/
|
||||
protected function _calculate_width($width) {
|
||||
$style = $this->_frame->get_style();
|
||||
$w = $this->_frame->get_containing_block("w");
|
||||
|
||||
if( $style->position === "fixed" )
|
||||
$w = $this->_frame->get_parent()->get_containing_block("w");
|
||||
|
||||
$rm = $style->length_in_pt($style->margin_right, $w);
|
||||
$lm = $style->length_in_pt($style->margin_left, $w);
|
||||
|
||||
$left = $style->length_in_pt($style->left, $w);
|
||||
$right = $style->length_in_pt($style->right, $w);
|
||||
|
||||
// Handle 'auto' values
|
||||
$dims = array($style->border_left_width,
|
||||
$style->border_right_width,
|
||||
$style->padding_left,
|
||||
$style->padding_right,
|
||||
$width !== "auto" ? $width : 0,
|
||||
$rm !== "auto" ? $rm : 0,
|
||||
$lm !== "auto" ? $lm : 0);
|
||||
|
||||
// absolutely positioned boxes take the 'left' and 'right' properties into account
|
||||
if ( $style->position === "absolute" || $style->position === "fixed" ) {
|
||||
$absolute = true;
|
||||
$dims[] = $left !== "auto" ? $left : 0;
|
||||
$dims[] = $right !== "auto" ? $right : 0;
|
||||
} else {
|
||||
$absolute = false;
|
||||
}
|
||||
|
||||
$sum = $style->length_in_pt($dims, $w);
|
||||
|
||||
// Compare to the containing block
|
||||
$diff = $w - $sum;
|
||||
|
||||
if ( $diff > 0 ) {
|
||||
|
||||
if ( $absolute ) {
|
||||
|
||||
// resolve auto properties: see
|
||||
// http://www.w3.org/TR/CSS21/visudet.html#abs-non-replaced-width
|
||||
|
||||
if ( $width === "auto" && $left === "auto" && $right === "auto" ) {
|
||||
|
||||
if ( $lm === "auto" )
|
||||
$lm = 0;
|
||||
if ( $rm === "auto" )
|
||||
$rm = 0;
|
||||
|
||||
// Technically, the width should be "shrink-to-fit" i.e. based on the
|
||||
// preferred width of the content... a little too costly here as a
|
||||
// special case. Just get the width to take up the slack:
|
||||
$left = 0;
|
||||
$right = 0;
|
||||
$width = $diff;
|
||||
|
||||
} else if ( $width === "auto" ) {
|
||||
|
||||
if ( $lm === "auto" )
|
||||
$lm = 0;
|
||||
if ( $rm === "auto" )
|
||||
$rm = 0;
|
||||
if ( $left === "auto" )
|
||||
$left = 0;
|
||||
if ( $right === "auto" )
|
||||
$right = 0;
|
||||
|
||||
$width = $diff;
|
||||
|
||||
} else if ( $left === "auto" ) {
|
||||
|
||||
if ( $lm === "auto" )
|
||||
$lm = 0;
|
||||
if ( $rm === "auto" )
|
||||
$rm = 0;
|
||||
if ( $right === "auto" )
|
||||
$right = 0;
|
||||
|
||||
$left = $diff;
|
||||
|
||||
} else if ( $right === "auto" ) {
|
||||
|
||||
if ( $lm === "auto" )
|
||||
$lm = 0;
|
||||
if ( $rm === "auto" )
|
||||
$rm = 0;
|
||||
|
||||
$right = $diff;
|
||||
}
|
||||
|
||||
} else {
|
||||
|
||||
// Find auto properties and get them to take up the slack
|
||||
if ( $width === "auto" )
|
||||
$width = $diff;
|
||||
|
||||
else if ( $lm === "auto" && $rm === "auto" )
|
||||
$lm = $rm = round($diff / 2);
|
||||
|
||||
else if ( $lm === "auto" )
|
||||
$lm = $diff;
|
||||
|
||||
else if ( $rm === "auto" )
|
||||
$rm = $diff;
|
||||
}
|
||||
|
||||
} else if ($diff < 0) {
|
||||
|
||||
// We are over constrained--set margin-right to the difference
|
||||
$rm = $diff;
|
||||
|
||||
}
|
||||
|
||||
return array("width"=> $width, "margin_left" => $lm, "margin_right" => $rm, "left" => $left, "right" => $right);
|
||||
}
|
||||
|
||||
/**
|
||||
* Call the above function, but resolve max/min widths
|
||||
* @return array
|
||||
*/
|
||||
protected function _calculate_restricted_width() {
|
||||
$frame = $this->_frame;
|
||||
$style = $frame->get_style();
|
||||
$cb = $frame->get_containing_block();
|
||||
|
||||
if ( $style->position === "fixed" )
|
||||
$cb = $frame->get_root()->get_containing_block();
|
||||
|
||||
//if ( $style->position === "absolute" )
|
||||
// $cb = $frame->find_positionned_parent()->get_containing_block();
|
||||
|
||||
if ( !isset($cb["w"]) )
|
||||
throw new DOMPDF_Exception("Box property calculation requires containing block width");
|
||||
|
||||
// Treat width 100% as auto
|
||||
if ( $style->width === "100%" ) {
|
||||
$width = "auto";
|
||||
}
|
||||
else {
|
||||
$width = $style->length_in_pt($style->width, $cb["w"]);
|
||||
}
|
||||
extract($this->_calculate_width($width));
|
||||
|
||||
// Handle min/max width
|
||||
$min_width = $style->length_in_pt($style->min_width, $cb["w"]);
|
||||
$max_width = $style->length_in_pt($style->max_width, $cb["w"]);
|
||||
|
||||
if ( $max_width !== "none" && $min_width > $max_width)
|
||||
// Swap 'em
|
||||
list($max_width, $min_width) = array($min_width, $max_width);
|
||||
|
||||
if ( $max_width !== "none" && $width > $max_width )
|
||||
extract($this->_calculate_width($max_width));
|
||||
|
||||
if ( $width < $min_width )
|
||||
extract($this->_calculate_width($min_width));
|
||||
|
||||
return array($width, $margin_left, $margin_right, $left, $right);
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Determine the unrestricted height of content within the block
|
||||
* by adding each line's height
|
||||
* @return float
|
||||
*/
|
||||
protected function _calculate_content_height() {
|
||||
$height = 0;
|
||||
|
||||
foreach ($this->_frame->get_lines() as $line) {
|
||||
$height += $line["h"];
|
||||
}
|
||||
|
||||
return $height;
|
||||
}
|
||||
|
||||
/**
|
||||
* Determine the frame's restricted height
|
||||
* @return array
|
||||
*/
|
||||
protected function _calculate_restricted_height() {
|
||||
$style = $this->_frame->get_style();
|
||||
$content_height = $this->_calculate_content_height();
|
||||
$cb = $this->_frame->get_containing_block();
|
||||
|
||||
$height = $style->length_in_pt($style->height, $cb["h"]);
|
||||
|
||||
$top = $style->length_in_pt($style->top, $cb["h"]);
|
||||
$bottom = $style->length_in_pt($style->bottom, $cb["h"]);
|
||||
|
||||
$margin_top = $style->length_in_pt($style->margin_top, $cb["h"]);
|
||||
$margin_bottom = $style->length_in_pt($style->margin_bottom, $cb["h"]);
|
||||
|
||||
if ( $style->position === "absolute" || $style->position === "fixed" ) {
|
||||
|
||||
// see http://www.w3.org/TR/CSS21/visudet.html#abs-non-replaced-height
|
||||
|
||||
$dims = array($top !== "auto" ? $top : 0,
|
||||
$style->margin_top !== "auto" ? $style->margin_top : 0,
|
||||
$style->padding_top,
|
||||
$style->border_top_width,
|
||||
$height !== "auto" ? $height : 0,
|
||||
$style->border_bottom_width,
|
||||
$style->padding_bottom,
|
||||
$style->margin_bottom !== "auto" ? $style->margin_bottom : 0,
|
||||
$bottom !== "auto" ? $bottom : 0);
|
||||
|
||||
$sum = $style->length_in_pt($dims, $cb["h"]);
|
||||
|
||||
$diff = $cb["h"] - $sum;
|
||||
|
||||
if ( $diff > 0 ) {
|
||||
|
||||
if ( $height === "auto" && $top === "auto" && $bottom === "auto" ) {
|
||||
|
||||
if ( $margin_top === "auto" )
|
||||
$margin_top = 0;
|
||||
if ( $margin_bottom === "auto" )
|
||||
$margin_bottom = 0;
|
||||
|
||||
$height = $diff;
|
||||
|
||||
} else if ( $height === "auto" && $top === "auto" ) {
|
||||
|
||||
if ( $margin_top === "auto" )
|
||||
$margin_top = 0;
|
||||
if ( $margin_bottom === "auto" )
|
||||
$margin_bottom = 0;
|
||||
|
||||
$height = $content_height;
|
||||
$top = $diff - $content_height;
|
||||
|
||||
} else if ( $height === "auto" && $bottom === "auto" ) {
|
||||
|
||||
if ( $margin_top === "auto" )
|
||||
$margin_top = 0;
|
||||
if ( $margin_bottom === "auto" )
|
||||
$margin_bottom = 0;
|
||||
|
||||
$height = $content_height;
|
||||
$bottom = $diff - $content_height;
|
||||
|
||||
} else if ( $top === "auto" && $bottom === "auto" ) {
|
||||
|
||||
if ( $margin_top === "auto" )
|
||||
$margin_top = 0;
|
||||
if ( $margin_bottom === "auto" )
|
||||
$margin_bottom = 0;
|
||||
|
||||
$bottom = $diff;
|
||||
|
||||
} else if ( $top === "auto" ) {
|
||||
|
||||
if ( $margin_top === "auto" )
|
||||
$margin_top = 0;
|
||||
if ( $margin_bottom === "auto" )
|
||||
$margin_bottom = 0;
|
||||
|
||||
$top = $diff;
|
||||
|
||||
} else if ( $height === "auto" ) {
|
||||
|
||||
if ( $margin_top === "auto" )
|
||||
$margin_top = 0;
|
||||
if ( $margin_bottom === "auto" )
|
||||
$margin_bottom = 0;
|
||||
|
||||
$height = $diff;
|
||||
|
||||
} else if ( $bottom === "auto" ) {
|
||||
|
||||
if ( $margin_top === "auto" )
|
||||
$margin_top = 0;
|
||||
if ( $margin_bottom === "auto" )
|
||||
$margin_bottom = 0;
|
||||
|
||||
$bottom = $diff;
|
||||
|
||||
} else {
|
||||
|
||||
if ( $style->overflow === "visible" ) {
|
||||
|
||||
// set all autos to zero
|
||||
if ( $margin_top === "auto" )
|
||||
$margin_top = 0;
|
||||
if ( $margin_bottom === "auto" )
|
||||
$margin_bottom = 0;
|
||||
if ( $top === "auto" )
|
||||
$top = 0;
|
||||
if ( $bottom === "auto" )
|
||||
$bottom = 0;
|
||||
if ( $height === "auto" )
|
||||
$height = $content_height;
|
||||
|
||||
}
|
||||
|
||||
// FIXME: overflow hidden
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
} else {
|
||||
|
||||
// Expand the height if overflow is visible
|
||||
if ( $height === "auto" && $content_height > $height /* && $style->overflow === "visible" */)
|
||||
$height = $content_height;
|
||||
|
||||
// FIXME: this should probably be moved to a seperate function as per
|
||||
// _calculate_restricted_width
|
||||
|
||||
// Only handle min/max height if the height is independent of the frame's content
|
||||
if ( !($style->overflow === "visible" ||
|
||||
($style->overflow === "hidden" && $height === "auto")) ) {
|
||||
|
||||
$min_height = $style->min_height;
|
||||
$max_height = $style->max_height;
|
||||
|
||||
if ( isset($cb["h"]) ) {
|
||||
$min_height = $style->length_in_pt($min_height, $cb["h"]);
|
||||
$max_height = $style->length_in_pt($max_height, $cb["h"]);
|
||||
|
||||
} else if ( isset($cb["w"]) ) {
|
||||
|
||||
if ( mb_strpos($min_height, "%") !== false )
|
||||
$min_height = 0;
|
||||
else
|
||||
$min_height = $style->length_in_pt($min_height, $cb["w"]);
|
||||
|
||||
if ( mb_strpos($max_height, "%") !== false )
|
||||
$max_height = "none";
|
||||
else
|
||||
$max_height = $style->length_in_pt($max_height, $cb["w"]);
|
||||
}
|
||||
|
||||
if ( $max_height !== "none" && $min_height > $max_height )
|
||||
// Swap 'em
|
||||
list($max_height, $min_height) = array($min_height, $max_height);
|
||||
|
||||
if ( $max_height !== "none" && $height > $max_height )
|
||||
$height = $max_height;
|
||||
|
||||
if ( $height < $min_height )
|
||||
$height = $min_height;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
return array($height, $margin_top, $margin_bottom, $top, $bottom);
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Adjust the justification of each of our lines.
|
||||
* http://www.w3.org/TR/CSS21/text.html#propdef-text-align
|
||||
*/
|
||||
protected function _text_align() {
|
||||
$style = $this->_frame->get_style();
|
||||
$w = $this->_frame->get_containing_block("w");
|
||||
$width = $style->length_in_pt($style->width, $w);
|
||||
switch ($style->text_align) {
|
||||
|
||||
default:
|
||||
case "left":
|
||||
foreach ($this->_frame->get_lines() as $line) {
|
||||
if ( !$line["left"] ) continue;
|
||||
foreach($line["frames"] as $frame) {
|
||||
if ( $frame instanceof Block_Frame_Decorator) continue;
|
||||
$frame->set_position( $frame->get_position("x") + $line["left"] );
|
||||
}
|
||||
}
|
||||
return;
|
||||
|
||||
case "right":
|
||||
foreach ($this->_frame->get_lines() as $line) {
|
||||
// Move each child over by $dx
|
||||
$dx = $width - $line["w"] - $line["right"];
|
||||
|
||||
foreach($line["frames"] as $frame) {
|
||||
// Block frames are not aligned by text-align
|
||||
if ($frame instanceof Block_Frame_Decorator) continue;
|
||||
|
||||
$frame->set_position( $frame->get_position("x") + $dx );
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
|
||||
case "justify":
|
||||
// We justify all lines except the last one
|
||||
$lines = $this->_frame->get_lines(); // needs to be a variable (strict standards)
|
||||
$lines = array_splice($lines, 0, -1);
|
||||
|
||||
foreach($lines as $i => $line) {
|
||||
if ( $line["br"] ) {
|
||||
unset($lines[$i]);
|
||||
}
|
||||
}
|
||||
|
||||
// One space character's width. Will be used to get a more accurate spacing
|
||||
$space_width = Font_Metrics::get_text_width(" ", $style->font_family, $style->font_size);
|
||||
|
||||
foreach ($lines as $i => $line) {
|
||||
if ( $line["left"] ) {
|
||||
foreach($line["frames"] as $frame) {
|
||||
if ( !$frame instanceof Text_Frame_Decorator )
|
||||
continue;
|
||||
|
||||
$frame->set_position( $frame->get_position("x") + $line["left"] );
|
||||
}
|
||||
}
|
||||
|
||||
// Only set the spacing if the line is long enough. This is really
|
||||
// just an aesthetic choice ;)
|
||||
//if ( $line["left"] + $line["w"] + $line["right"] > self::MIN_JUSTIFY_WIDTH * $width ) {
|
||||
|
||||
// Set the spacing for each child
|
||||
if ( $line["wc"] > 1 )
|
||||
$spacing = ($width - ($line["left"] + $line["w"] + $line["right"]) + $space_width) / ($line["wc"] - 1);
|
||||
else
|
||||
$spacing = 0;
|
||||
|
||||
$dx = 0;
|
||||
foreach($line["frames"] as $frame) {
|
||||
if ( !$frame instanceof Text_Frame_Decorator )
|
||||
continue;
|
||||
|
||||
$text = $frame->get_text();
|
||||
$spaces = mb_substr_count($text, " ");
|
||||
|
||||
$char_spacing = $style->length_in_pt($style->letter_spacing);
|
||||
$_spacing = $spacing + $char_spacing;
|
||||
|
||||
$frame->set_position( $frame->get_position("x") + $dx );
|
||||
$frame->set_text_spacing($_spacing);
|
||||
|
||||
$dx += $spaces * $_spacing;
|
||||
}
|
||||
|
||||
// The line (should) now occupy the entire width
|
||||
$this->_frame->set_line($i, null, $width);
|
||||
|
||||
//}
|
||||
}
|
||||
break;
|
||||
|
||||
case "center":
|
||||
case "centre":
|
||||
foreach ($this->_frame->get_lines() as $line) {
|
||||
// Centre each line by moving each frame in the line by:
|
||||
$dx = ($width + $line["left"] - $line["w"] - $line["right"] ) / 2;
|
||||
|
||||
foreach ($line["frames"] as $frame) {
|
||||
// Block frames are not aligned by text-align
|
||||
if ($frame instanceof Block_Frame_Decorator) continue;
|
||||
|
||||
$frame->set_position( $frame->get_position("x") + $dx );
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Align inline children vertically.
|
||||
* Aligns each child vertically after each line is reflowed
|
||||
*/
|
||||
function vertical_align() {
|
||||
|
||||
foreach ( $this->_frame->get_lines() as $i => $line ) {
|
||||
|
||||
$height = $line["h"];
|
||||
|
||||
foreach ( $line["frames"] as $frame ) {
|
||||
$style = $frame->get_style();
|
||||
|
||||
if ( $style->display !== "inline" && $style->display !== "text" )
|
||||
continue;
|
||||
|
||||
// FIXME?
|
||||
if ( $this instanceof Table_Cell_Frame_Reflower )
|
||||
$align = $frame->get_frame()->get_style()->vertical_align;
|
||||
else
|
||||
$align = $frame->get_frame()->get_parent()->get_style()->vertical_align;
|
||||
|
||||
$frame_h = $frame->get_margin_height();
|
||||
$y = $line["y"];
|
||||
|
||||
switch ($align) {
|
||||
|
||||
case "baseline":
|
||||
$y += $height - $frame_h;
|
||||
break;
|
||||
|
||||
case "middle":
|
||||
$y += ($height + $frame_h) / 2;
|
||||
break;
|
||||
|
||||
case "sub":
|
||||
$y += 0.2 * $height;
|
||||
break;
|
||||
|
||||
case "super":
|
||||
$y += -0.3 * $height;
|
||||
break;
|
||||
|
||||
case "text-top":
|
||||
case "top": // Not strictly accurate, but good enough for now
|
||||
break;
|
||||
|
||||
case "text-bottom":
|
||||
case "bottom":
|
||||
$y += $height - $frame_h;
|
||||
break;
|
||||
}
|
||||
|
||||
$x = $frame->get_position("x");
|
||||
$frame->set_position($x, $y);
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
function reflow(Frame_Decorator $block = null) {
|
||||
|
||||
// Check if a page break is forced
|
||||
$page = $this->_frame->get_root();
|
||||
$page->check_forced_page_break($this->_frame);
|
||||
|
||||
// Bail if the page is full
|
||||
if ( $page->is_full() )
|
||||
return;
|
||||
|
||||
// Generated content
|
||||
$this->_set_content();
|
||||
|
||||
// Collapse margins if required
|
||||
$this->_collapse_margins();
|
||||
|
||||
$style = $this->_frame->get_style();
|
||||
$cb = $this->_frame->get_containing_block();
|
||||
|
||||
if ( $style->counter_increment && ($increment = $style->counter_increment) !== "none" )
|
||||
$this->_frame->increment_counter($increment);
|
||||
|
||||
if ( $style->position === "fixed" )
|
||||
$cb = $this->_frame->get_root()->get_containing_block();
|
||||
|
||||
// Determine the constraints imposed by this frame: calculate the width
|
||||
// of the content area:
|
||||
list($w, $left_margin, $right_margin, $left, $right) = $this->_calculate_restricted_width();
|
||||
|
||||
// Store the calculated properties
|
||||
$style->width = $w . "pt";
|
||||
$style->margin_left = $left_margin."pt";
|
||||
$style->margin_right = $right_margin."pt";
|
||||
$style->left = $left ."pt";
|
||||
$style->right = $right . "pt";
|
||||
|
||||
// Update the position
|
||||
$this->_frame->position();
|
||||
list($x, $y) = $this->_frame->get_position();
|
||||
|
||||
// Adjust the first line based on the text-indent property
|
||||
$indent = $style->length_in_pt($style->text_indent, $cb["w"]);
|
||||
$this->_frame->increase_line_width($indent);
|
||||
|
||||
// Determine the content edge
|
||||
$top = $style->length_in_pt(array($style->margin_top,
|
||||
$style->padding_top,
|
||||
$style->border_top_width), $cb["h"]);
|
||||
|
||||
$bottom = $style->length_in_pt(array($style->border_bottom_width,
|
||||
$style->margin_bottom,
|
||||
$style->padding_bottom), $cb["h"]);
|
||||
|
||||
$cb_x = $x + $left_margin + $style->length_in_pt(array($style->border_left_width,
|
||||
$style->padding_left), $cb["w"]);
|
||||
|
||||
$cb_y = $y + $top;
|
||||
|
||||
$cb_h = ($cb["h"] + $cb["y"]) - $bottom - $cb_y;
|
||||
|
||||
// Set the y position of the first line in this block
|
||||
$this->_frame->set_current_line($cb_y);
|
||||
|
||||
$floating_children = array();
|
||||
|
||||
// Set the containing blocks and reflow each child
|
||||
foreach ( $this->_frame->get_children() as $child ) {
|
||||
|
||||
// Bail out if the page is full
|
||||
if ( $page->is_full() )
|
||||
break;
|
||||
|
||||
// Floating siblings
|
||||
if ( DOMPDF_ENABLE_CSS_FLOAT && count($floating_children) ) {
|
||||
$offset_left = 0;
|
||||
$offset_right = 0;
|
||||
|
||||
// We need to reflow the child to know its initial x position
|
||||
$child->set_containing_block($cb_x, $cb_y, $w, $cb_h);
|
||||
$child->reflow($this->_frame);
|
||||
|
||||
$current_line = $this->_frame->get_current_line();
|
||||
|
||||
foreach ( $floating_children as $child_key => $floating_child ) {
|
||||
$float = $floating_child->get_style()->float;
|
||||
$floating_width = $floating_child->get_margin_width();
|
||||
$floating_x = $floating_child->get_position("x");
|
||||
|
||||
if ( $float === "left" ) {
|
||||
if ($current_line["left"] + $child->get_position("x") > $floating_x + $floating_width) continue;
|
||||
}
|
||||
else {
|
||||
if ($current_line["left"] + $child->get_position("x") + $child->get_margin_width() < $w - $floating_width - $current_line["right"]) continue;
|
||||
}
|
||||
|
||||
// If the child is still shifted by the floating element
|
||||
if ( $floating_child->get_position("y") + $floating_child->get_margin_height() > $current_line["y"] ) {
|
||||
if ( $float === "left" )
|
||||
$offset_left += $floating_width;
|
||||
else
|
||||
$offset_right += $floating_width;
|
||||
}
|
||||
|
||||
// else, the floating element won't shift anymore
|
||||
else {
|
||||
unset($floating_children[$child_key]);
|
||||
}
|
||||
}
|
||||
|
||||
if ( $offset_left )
|
||||
$this->_frame->set_current_line(array("left" => $offset_left));
|
||||
|
||||
if ( $offset_right )
|
||||
$this->_frame->set_current_line(array("right" => $offset_right));
|
||||
}
|
||||
|
||||
$child->set_containing_block($cb_x, $cb_y, $w, $cb_h);
|
||||
$child->reflow($this->_frame);
|
||||
|
||||
// Don't add the child to the line if a page break has occurred
|
||||
if ( $page->check_page_break($child) )
|
||||
break;
|
||||
|
||||
$child_style = $child->get_style();
|
||||
|
||||
if ( DOMPDF_ENABLE_CSS_FLOAT && $child_style->float !== "none") {
|
||||
$floating_children[] = $child;
|
||||
|
||||
// Remove next frame's beginning whitespace
|
||||
$next = $child->get_next_sibling();
|
||||
if ( $next && $next instanceof Text_Frame_Decorator) {
|
||||
$next->set_text(ltrim($next->get_text()));
|
||||
}
|
||||
|
||||
$float_x = $cb_x;
|
||||
$float_y = $this->_frame->get_current_line("y");
|
||||
|
||||
$child_style = $child->get_style();
|
||||
|
||||
switch( $child_style->float ) {
|
||||
case "left": break;
|
||||
case "right":
|
||||
$width = $w;
|
||||
$float_x += ($width - $child->get_margin_width());
|
||||
break;
|
||||
}
|
||||
|
||||
$child->set_position($float_x, $float_y);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// Determine our height
|
||||
list($height, $margin_top, $margin_bottom, $top, $bottom) = $this->_calculate_restricted_height();
|
||||
$style->height = $height;
|
||||
$style->margin_top = $margin_top;
|
||||
$style->margin_bottom = $margin_bottom;
|
||||
$style->top = $top;
|
||||
$style->bottom = $bottom;
|
||||
|
||||
$this->_text_align();
|
||||
$this->vertical_align();
|
||||
|
||||
if ( $block ) {
|
||||
$block->add_frame_to_line($this->_frame);
|
||||
}
|
||||
}
|
||||
}
|
||||
86
pdf/include/block_positioner.cls.php
Executable file
86
pdf/include/block_positioner.cls.php
Executable file
@@ -0,0 +1,86 @@
|
||||
<?php
|
||||
/**
|
||||
* DOMPDF - PHP5 HTML to PDF renderer
|
||||
*
|
||||
* File: $RCSfile: block_positioner.cls.php,v $
|
||||
* Created on: 2004-06-08
|
||||
*
|
||||
* Copyright (c) 2004 - Benj Carson <benjcarson@digitaljunkies.ca>
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with this library in the file LICENSE.LGPL; if not, write to the
|
||||
* Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
* 02111-1307 USA
|
||||
*
|
||||
* Alternatively, you may distribute this software under the terms of the
|
||||
* PHP License, version 3.0 or later. A copy of this license should have
|
||||
* been distributed with this file in the file LICENSE.PHP . If this is not
|
||||
* the case, you can obtain a copy at http://www.php.net/license/3_0.txt.
|
||||
*
|
||||
* The latest version of DOMPDF might be available at:
|
||||
* http://www.dompdf.com/
|
||||
*
|
||||
* @link http://www.dompdf.com/
|
||||
* @copyright 2004 Benj Carson
|
||||
* @author Benj Carson <benjcarson@digitaljunkies.ca>
|
||||
* @package dompdf
|
||||
|
||||
*/
|
||||
|
||||
/* $Id: block_positioner.cls.php 356 2011-01-28 08:56:10Z fabien.menager $ */
|
||||
|
||||
/**
|
||||
* Positions block frames
|
||||
*
|
||||
* @access private
|
||||
* @package dompdf
|
||||
*/
|
||||
class Block_Positioner extends Positioner {
|
||||
|
||||
|
||||
function __construct(Frame_Decorator $frame) { parent::__construct($frame); }
|
||||
|
||||
//........................................................................
|
||||
|
||||
function position() {
|
||||
$frame = $this->_frame;
|
||||
$style = $frame->get_style();
|
||||
$cb = $frame->get_containing_block();
|
||||
$p = $frame->find_block_parent();
|
||||
|
||||
if ( $p ) {
|
||||
$float = $style->float;
|
||||
if ( !DOMPDF_ENABLE_CSS_FLOAT || !$float || $float === "none" ) {
|
||||
$p->add_line();
|
||||
}
|
||||
$y = $p->get_current_line("y");
|
||||
|
||||
} else
|
||||
$y = $cb["y"];
|
||||
|
||||
$x = $cb["x"];
|
||||
|
||||
// Relative positionning
|
||||
if ( $style->position === "relative" ) {
|
||||
$top = $style->length_in_pt($style->top, $cb["h"]);
|
||||
//$right = $style->length_in_pt($style->right, $cb["w"]);
|
||||
//$bottom = $style->length_in_pt($style->bottom, $cb["h"]);
|
||||
$left = $style->length_in_pt($style->left, $cb["w"]);
|
||||
|
||||
$x += $left;
|
||||
$y += $top;
|
||||
}
|
||||
|
||||
$frame->set_position($x, $y);
|
||||
}
|
||||
}
|
||||
211
pdf/include/block_renderer.cls.php
Executable file
211
pdf/include/block_renderer.cls.php
Executable file
@@ -0,0 +1,211 @@
|
||||
<?php
|
||||
/**
|
||||
* DOMPDF - PHP5 HTML to PDF renderer
|
||||
*
|
||||
* File: $RCSfile: block_renderer.cls.php,v $
|
||||
* Created on: 2004-06-03
|
||||
*
|
||||
* Copyright (c) 2004 - Benj Carson <benjcarson@digitaljunkies.ca>
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with this library in the file LICENSE.LGPL; if not, write to the
|
||||
* Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
* 02111-1307 USA
|
||||
*
|
||||
* Alternatively, you may distribute this software under the terms of the
|
||||
* PHP License, version 3.0 or later. A copy of this license should have
|
||||
* been distributed with this file in the file LICENSE.PHP . If this is not
|
||||
* the case, you can obtain a copy at http://www.php.net/license/3_0.txt.
|
||||
*
|
||||
* The latest version of DOMPDF might be available at:
|
||||
* http://www.dompdf.com/
|
||||
*
|
||||
* @link http://www.dompdf.com/
|
||||
* @copyright 2004 Benj Carson
|
||||
* @author Benj Carson <benjcarson@digitaljunkies.ca>
|
||||
* @package dompdf
|
||||
|
||||
*/
|
||||
|
||||
/* $Id: block_renderer.cls.php 346 2011-01-09 13:23:22Z fabien.menager $ */
|
||||
|
||||
/**
|
||||
* Renders block frames
|
||||
*
|
||||
* @access private
|
||||
* @package dompdf
|
||||
*/
|
||||
class Block_Renderer extends Abstract_Renderer {
|
||||
|
||||
//........................................................................
|
||||
|
||||
function render(Frame $frame) {
|
||||
$style = $frame->get_style();
|
||||
list($x, $y, $w, $h) = $frame->get_padding_box();
|
||||
|
||||
$this->_set_opacity( $frame->get_opacity( $style->opacity ) );
|
||||
|
||||
// Draw our background, border and content
|
||||
if ( ($bg = $style->background_color) !== "transparent" ) {
|
||||
$this->_canvas->filled_rectangle( $x, $y, $w, $h, $bg );
|
||||
}
|
||||
|
||||
if ( ($url = $style->background_image) && $url !== "none" )
|
||||
$this->_background_image($url, $x, $y, $w, $h, $style);
|
||||
|
||||
$this->_render_border($frame);
|
||||
$this->_render_outline($frame);
|
||||
|
||||
if (DEBUG_LAYOUT && DEBUG_LAYOUT_BLOCKS) {
|
||||
$this->_debug_layout($frame->get_border_box(), "red");
|
||||
if (DEBUG_LAYOUT_PADDINGBOX) {
|
||||
$this->_debug_layout($frame->get_padding_box(), "red", array(0.5, 0.5));
|
||||
}
|
||||
}
|
||||
|
||||
if (DEBUG_LAYOUT && DEBUG_LAYOUT_LINES && $frame->get_decorator()) {
|
||||
foreach ($frame->get_decorator()->get_lines() as $line) {
|
||||
$frame->_debug_layout(array($line["x"], $line["y"], $line["w"], $line["h"]), "orange");
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
protected function _render_border(Frame_Decorator $frame, $corner_style = "bevel") {
|
||||
$style = $frame->get_style();
|
||||
$bbox = $frame->get_border_box();
|
||||
$bp = $style->get_border_properties();
|
||||
|
||||
// If all the borders are "solid" with the same color and style, we'd better draw a rectangle
|
||||
if (
|
||||
in_array($bp["top"]["style"], array("solid", "dashed", "dotted")) &&
|
||||
$bp["top"] == $bp["right"] &&
|
||||
$bp["right"] == $bp["bottom"] &&
|
||||
$bp["bottom"] == $bp["left"]
|
||||
) {
|
||||
$props = $bp["top"];
|
||||
if ( $props["color"] === "transparent" || $props["width"] <= 0 ) return;
|
||||
|
||||
list($x, $y, $w, $h) = $bbox;
|
||||
$width = $style->length_in_pt($props["width"]);
|
||||
$pattern = $this->_get_dash_pattern($props["style"], $width);
|
||||
$this->_canvas->rectangle($x + $width / 2, $y + $width / 2, $w - $width, $h - $width, $props["color"], $width, $pattern);
|
||||
return;
|
||||
}
|
||||
|
||||
$widths = array($style->length_in_pt($bp["top"]["width"]),
|
||||
$style->length_in_pt($bp["right"]["width"]),
|
||||
$style->length_in_pt($bp["bottom"]["width"]),
|
||||
$style->length_in_pt($bp["left"]["width"]));
|
||||
|
||||
foreach ($bp as $side => $props) {
|
||||
list($x, $y, $w, $h) = $bbox;
|
||||
|
||||
if ( !$props["style"] ||
|
||||
$props["style"] === "none" ||
|
||||
$props["width"] <= 0 ||
|
||||
$props["color"] == "transparent" )
|
||||
continue;
|
||||
|
||||
switch($side) {
|
||||
case "top":
|
||||
$length = $w;
|
||||
break;
|
||||
|
||||
case "bottom":
|
||||
$length = $w;
|
||||
$y += $h;
|
||||
break;
|
||||
|
||||
case "left":
|
||||
$length = $h;
|
||||
break;
|
||||
|
||||
case "right":
|
||||
$length = $h;
|
||||
$x += $w;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
$method = "_border_" . $props["style"];
|
||||
|
||||
$this->$method($x, $y, $length, $props["color"], $widths, $side, $corner_style);
|
||||
}
|
||||
}
|
||||
|
||||
protected function _render_outline(Frame_Decorator $frame, $corner_style = "bevel") {
|
||||
$style = $frame->get_style();
|
||||
|
||||
$props = array(
|
||||
"width" => $style->outline_width,
|
||||
"style" => $style->outline_style,
|
||||
"color" => $style->outline_color,
|
||||
);
|
||||
|
||||
if ( !$props["style"] || $props["style"] === "none" || $props["width"] <= 0 )
|
||||
return;
|
||||
|
||||
$bbox = $frame->get_border_box();
|
||||
$offset = $style->length_in_pt($props["width"]);
|
||||
$pattern = $this->_get_dash_pattern($props["style"], $offset);
|
||||
|
||||
// If the outline style is "solid" we'd better draw a rectangle
|
||||
if ( in_array($props["style"], array("solid", "dashed", "dotted")) ) {
|
||||
$bbox[0] -= $offset / 2;
|
||||
$bbox[1] -= $offset / 2;
|
||||
$bbox[2] += $offset;
|
||||
$bbox[3] += $offset;
|
||||
|
||||
list($x, $y, $w, $h) = $bbox;
|
||||
$this->_canvas->rectangle($x, $y, $w, $h, $props["color"], $offset, $pattern);
|
||||
return;
|
||||
}
|
||||
|
||||
$bbox[0] -= $offset;
|
||||
$bbox[1] -= $offset;
|
||||
$bbox[2] += $offset * 2;
|
||||
$bbox[3] += $offset * 2;
|
||||
|
||||
$method = "_border_" . $props["style"];
|
||||
$widths = array_fill(0, 4, $props["width"]);
|
||||
$sides = array("top", "right", "left", "bottom");
|
||||
|
||||
foreach ($sides as $side) {
|
||||
list($x, $y, $w, $h) = $bbox;
|
||||
|
||||
switch($side) {
|
||||
case "top":
|
||||
$length = $w;
|
||||
break;
|
||||
|
||||
case "bottom":
|
||||
$length = $w;
|
||||
$y += $h;
|
||||
break;
|
||||
|
||||
case "left":
|
||||
$length = $h;
|
||||
break;
|
||||
|
||||
case "right":
|
||||
$length = $h;
|
||||
$x += $w;
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
$this->$method($x, $y, $length, $props["color"], $widths, $side, $corner_style);
|
||||
}
|
||||
}
|
||||
}
|
||||
186
pdf/include/cached_pdf_decorator.cls.php
Executable file
186
pdf/include/cached_pdf_decorator.cls.php
Executable file
@@ -0,0 +1,186 @@
|
||||
<?php
|
||||
/**
|
||||
* DOMPDF - PHP5 HTML to PDF renderer
|
||||
*
|
||||
* File: $RCSfile: cached_pdf_decorator.cls.php,v $
|
||||
* Created on: 2004-07-23
|
||||
*
|
||||
* Copyright (c) 2004 - Benj Carson <benjcarson@digitaljunkies.ca>
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with this library in the file LICENSE.LGPL; if not, write to the
|
||||
* Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
* 02111-1307 USA
|
||||
*
|
||||
* Alternatively, you may distribute this software under the terms of the
|
||||
* PHP License, version 3.0 or later. A copy of this license should have
|
||||
* been distributed with this file in the file LICENSE.PHP . If this is not
|
||||
* the case, you can obtain a copy at http://www.php.net/license/3_0.txt.
|
||||
*
|
||||
* The latest version of DOMPDF might be available at:
|
||||
* http://www.dompdf.com/
|
||||
*
|
||||
* @link http://www.dompdf.com/
|
||||
* @copyright 2004 Benj Carson
|
||||
* @author Benj Carson <benjcarson@digitaljunkies.ca>
|
||||
* @package dompdf
|
||||
|
||||
*/
|
||||
|
||||
/* $Id: cached_pdf_decorator.cls.php 216 2010-03-11 22:49:18Z ryan.masten $ */
|
||||
|
||||
/**
|
||||
* Caching canvas implementation
|
||||
*
|
||||
* Each rendered page is serialized and stored in the {@link Page_Cache}.
|
||||
* This is useful for static forms/pages that do not need to be re-rendered
|
||||
* all the time.
|
||||
*
|
||||
* This class decorates normal CPDF_Adapters. It is currently completely
|
||||
* experimental.
|
||||
*
|
||||
* @access private
|
||||
* @package dompdf
|
||||
*/
|
||||
class Cached_PDF_Decorator extends CPDF_Adapter implements Canvas {
|
||||
protected $_pdf;
|
||||
protected $_cache_id;
|
||||
protected $_current_page_id;
|
||||
protected $_fonts; // fonts used in this document
|
||||
|
||||
function __construct($cache_id, CPDF_Adapter $pdf) {
|
||||
$this->_pdf = $pdf;
|
||||
$this->_cache_id = $cache_id;
|
||||
$this->_fonts = array();
|
||||
|
||||
$this->_current_page_id = $this->_pdf->open_object();
|
||||
}
|
||||
|
||||
//........................................................................
|
||||
|
||||
function get_cpdf() { return $this->_pdf->get_cpdf(); }
|
||||
|
||||
function open_object() { $this->_pdf->open_object(); }
|
||||
function reopen_object() { return $this->_pdf->reopen_object(); }
|
||||
|
||||
function close_object() { $this->_pdf->close_object(); }
|
||||
|
||||
function add_object($object, $where = 'all') { $this->_pdf->add_object($object, $where); }
|
||||
|
||||
function serialize_object($id) { $this->_pdf->serialize_object($id); }
|
||||
|
||||
function reopen_serialized_object($obj) { $this->_pdf->reopen_serialized_object($obj); }
|
||||
|
||||
//........................................................................
|
||||
|
||||
function get_width() { return $this->_pdf->get_width(); }
|
||||
function get_height() { return $this->_pdf->get_height(); }
|
||||
function get_page_number() { return $this->_pdf->get_page_number(); }
|
||||
function get_page_count() { return $this->_pdf->get_page_count(); }
|
||||
|
||||
function set_page_number($num) { $this->_pdf->set_page_number($num); }
|
||||
function set_page_count($count) { $this->_pdf->set_page_count($count); }
|
||||
|
||||
function line($x1, $y1, $x2, $y2, $color, $width, $style = array()) {
|
||||
$this->_pdf->line($x1, $y1, $x2, $y2, $color, $width, $style);
|
||||
}
|
||||
|
||||
function rectangle($x1, $y1, $w, $h, $color, $width, $style = array()) {
|
||||
$this->_pdf->rectangle($x1, $y1, $w, $h, $color, $width, $style);
|
||||
}
|
||||
|
||||
function filled_rectangle($x1, $y1, $w, $h, $color) {
|
||||
$this->_pdf->filled_rectangle($x1, $y1, $w, $h, $color);
|
||||
}
|
||||
|
||||
function polygon($points, $color, $width = null, $style = array(), $fill = false) {
|
||||
$this->_pdf->polygon($points, $color, $width, $style, $fill);
|
||||
}
|
||||
|
||||
function circle($x, $y, $r1, $color, $width = null, $style = null, $fill = false) {
|
||||
$this->_pdf->circle($x, $y, $r1, $color, $width, $style, $fill);
|
||||
}
|
||||
|
||||
function image($img_url, $x, $y, $w = null, $h = null) {
|
||||
$this->_pdf->image($img_url, $x, $y, $w, $h);
|
||||
}
|
||||
|
||||
function text($x, $y, $text, $font, $size, $color = array(0,0,0), $adjust = 0, $angle = 0) {
|
||||
$this->_fonts[$font] = true;
|
||||
$this->_pdf->text($x, $y, $text, $font, $size, $color, $adjust, $angle);
|
||||
}
|
||||
|
||||
function page_text($x, $y, $text, $font, $size, $color = array(0,0,0), $adjust = 0, $angle = 0) {
|
||||
|
||||
// We want to remove this from cached pages since it may not be correct
|
||||
$this->_pdf->close_object();
|
||||
$this->_pdf->page_text($x, $y, $text, $font, $size, $color, $adjust, $angle);
|
||||
$this->_pdf->reopen_object($this->_current_page_id);
|
||||
}
|
||||
|
||||
function page_script($script, $type = 'text/php') {
|
||||
|
||||
// We want to remove this from cached pages since it may not be correct
|
||||
$this->_pdf->close_object();
|
||||
$this->_pdf->page_script($script, $type);
|
||||
$this->_pdf->reopen_object($this->_current_page_id);
|
||||
}
|
||||
|
||||
function new_page() {
|
||||
$this->_pdf->close_object();
|
||||
|
||||
// Add the object to the current page
|
||||
$this->_pdf->add_object($this->_current_page_id, "add");
|
||||
$this->_pdf->new_page();
|
||||
|
||||
Page_Cache::store_page($this->_cache_id,
|
||||
$this->_pdf->get_page_number() - 1,
|
||||
$this->_pdf->serialize_object($this->_current_page_id));
|
||||
|
||||
$this->_current_page_id = $this->_pdf->open_object();
|
||||
return $this->_current_page_id;
|
||||
}
|
||||
|
||||
function stream($filename) {
|
||||
// Store the last page in the page cache
|
||||
if ( !is_null($this->_current_page_id) ) {
|
||||
$this->_pdf->close_object();
|
||||
$this->_pdf->add_object($this->_current_page_id, "add");
|
||||
Page_Cache::store_page($this->_cache_id,
|
||||
$this->_pdf->get_page_number(),
|
||||
$this->_pdf->serialize_object($this->_current_page_id));
|
||||
Page_Cache::store_fonts($this->_cache_id, $this->_fonts);
|
||||
$this->_current_page_id = null;
|
||||
}
|
||||
|
||||
$this->_pdf->stream($filename);
|
||||
|
||||
}
|
||||
|
||||
function &output() {
|
||||
// Store the last page in the page cache
|
||||
if ( !is_null($this->_current_page_id) ) {
|
||||
$this->_pdf->close_object();
|
||||
$this->_pdf->add_object($this->_current_page_id, "add");
|
||||
Page_Cache::store_page($this->_cache_id,
|
||||
$this->_pdf->get_page_number(),
|
||||
$this->_pdf->serialize_object($this->_current_page_id));
|
||||
$this->_current_page_id = null;
|
||||
}
|
||||
|
||||
return $this->_pdf->output();
|
||||
}
|
||||
|
||||
function get_messages() { return $this->_pdf->get_messages(); }
|
||||
|
||||
}
|
||||
328
pdf/include/canvas.cls.php
Executable file
328
pdf/include/canvas.cls.php
Executable file
@@ -0,0 +1,328 @@
|
||||
<?php
|
||||
/**
|
||||
* DOMPDF - PHP5 HTML to PDF renderer
|
||||
*
|
||||
* File: $RCSfile: canvas.cls.php,v $
|
||||
* Created on: 2004-06-06
|
||||
*
|
||||
* Copyright (c) 2004 - Benj Carson <benjcarson@digitaljunkies.ca>
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with this library in the file LICENSE.LGPL; if not, write to the
|
||||
* Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
* 02111-1307 USA
|
||||
*
|
||||
* Alternatively, you may distribute this software under the terms of the
|
||||
* PHP License, version 3.0 or later. A copy of this license should have
|
||||
* been distributed with this file in the file LICENSE.PHP . If this is not
|
||||
* the case, you can obtain a copy at http://www.php.net/license/3_0.txt.
|
||||
*
|
||||
* The latest version of DOMPDF might be available at:
|
||||
* http://www.dompdf.com/
|
||||
*
|
||||
* @link http://www.dompdf.com/
|
||||
* @copyright 2004 Benj Carson
|
||||
* @author Benj Carson <benjcarson@digitaljunkies.ca>
|
||||
* @package dompdf
|
||||
|
||||
*/
|
||||
|
||||
/* $Id: canvas.cls.php 357 2011-01-30 20:56:46Z fabien.menager $ */
|
||||
|
||||
/**
|
||||
* Main rendering interface
|
||||
*
|
||||
* Currently {@link CPDF_Adapter}, {@link PDFLib_Adapter}, {@link TCPDF_Adapter}, and {@link GD_Adapter}
|
||||
* implement this interface.
|
||||
*
|
||||
* Implementations should measure x and y increasing to the left and down,
|
||||
* respectively, with the origin in the top left corner. Implementations
|
||||
* are free to use a unit other than points for length, but I can't
|
||||
* guarantee that the results will look any good.
|
||||
*
|
||||
* @package dompdf
|
||||
*/
|
||||
interface Canvas {
|
||||
|
||||
/**
|
||||
* Returns the current page number
|
||||
*
|
||||
* @return int
|
||||
*/
|
||||
function get_page_number();
|
||||
|
||||
/**
|
||||
* Returns the total number of pages
|
||||
*
|
||||
* @return int
|
||||
*/
|
||||
function get_page_count();
|
||||
|
||||
/**
|
||||
* Sets the total number of pages
|
||||
*
|
||||
* @param int $count
|
||||
*/
|
||||
function set_page_count($count);
|
||||
|
||||
/**
|
||||
* Draws a line from x1,y1 to x2,y2
|
||||
*
|
||||
* See {@link Style::munge_colour()} for the format of the colour array.
|
||||
* See {@link Cpdf::setLineStyle()} for a description of the format of the
|
||||
* $style parameter (aka dash).
|
||||
*
|
||||
* @param float $x1
|
||||
* @param float $y1
|
||||
* @param float $x2
|
||||
* @param float $y2
|
||||
* @param array $color
|
||||
* @param float $width
|
||||
* @param array $style
|
||||
*/
|
||||
function line($x1, $y1, $x2, $y2, $color, $width, $style = null);
|
||||
|
||||
/**
|
||||
* Draws a rectangle at x1,y1 with width w and height h
|
||||
*
|
||||
* See {@link Style::munge_colour()} for the format of the colour array.
|
||||
* See {@link Cpdf::setLineStyle()} for a description of the $style
|
||||
* parameter (aka dash)
|
||||
*
|
||||
* @param float $x1
|
||||
* @param float $y1
|
||||
* @param float $w
|
||||
* @param float $h
|
||||
* @param array $color
|
||||
* @param float $width
|
||||
* @param array $style
|
||||
*/
|
||||
function rectangle($x1, $y1, $w, $h, $color, $width, $style = null);
|
||||
|
||||
/**
|
||||
* Draws a filled rectangle at x1,y1 with width w and height h
|
||||
*
|
||||
* See {@link Style::munge_colour()} for the format of the colour array.
|
||||
*
|
||||
* @param float $x1
|
||||
* @param float $y1
|
||||
* @param float $w
|
||||
* @param float $h
|
||||
* @param array $color
|
||||
*/
|
||||
function filled_rectangle($x1, $y1, $w, $h, $color);
|
||||
|
||||
/**
|
||||
* Starts a clipping rectangle at x1,y1 with width w and height h
|
||||
*
|
||||
* @param float $x1
|
||||
* @param float $y1
|
||||
* @param float $w
|
||||
* @param float $h
|
||||
*/
|
||||
function clipping_rectangle($x1, $y1, $w, $h);
|
||||
|
||||
/**
|
||||
* Ends the last clipping shape
|
||||
*/
|
||||
function clipping_end();
|
||||
|
||||
/**
|
||||
* Save current state
|
||||
*/
|
||||
function save();
|
||||
|
||||
/**
|
||||
* Restore last state
|
||||
*/
|
||||
function restore();
|
||||
|
||||
/**
|
||||
* Rotate
|
||||
*/
|
||||
function rotate($angle, $x, $y);
|
||||
|
||||
/**
|
||||
* Skew
|
||||
*/
|
||||
function skew($angle_x, $angle_y, $x, $y);
|
||||
|
||||
/**
|
||||
* Scale
|
||||
*/
|
||||
function scale($s_x, $s_y, $x, $y);
|
||||
|
||||
/**
|
||||
* Translate
|
||||
*/
|
||||
function translate($t_x, $t_y);
|
||||
|
||||
/**
|
||||
* Transform
|
||||
*/
|
||||
function transform($a, $b, $c, $d, $e, $f);
|
||||
|
||||
/**
|
||||
* Draws a polygon
|
||||
*
|
||||
* The polygon is formed by joining all the points stored in the $points
|
||||
* array. $points has the following structure:
|
||||
* <code>
|
||||
* array(0 => x1,
|
||||
* 1 => y1,
|
||||
* 2 => x2,
|
||||
* 3 => y2,
|
||||
* ...
|
||||
* );
|
||||
* </code>
|
||||
*
|
||||
* See {@link Style::munge_colour()} for the format of the colour array.
|
||||
* See {@link Cpdf::setLineStyle()} for a description of the $style
|
||||
* parameter (aka dash)
|
||||
*
|
||||
* @param array $points
|
||||
* @param array $color
|
||||
* @param float $width
|
||||
* @param array $style
|
||||
* @param bool $fill Fills the polygon if true
|
||||
*/
|
||||
function polygon($points, $color, $width = null, $style = null, $fill = false);
|
||||
|
||||
/**
|
||||
* Draws a circle at $x,$y with radius $r
|
||||
*
|
||||
* See {@link Style::munge_colour()} for the format of the colour array.
|
||||
* See {@link Cpdf::setLineStyle()} for a description of the $style
|
||||
* parameter (aka dash)
|
||||
*
|
||||
* @param float $x
|
||||
* @param float $y
|
||||
* @param float $r
|
||||
* @param array $color
|
||||
* @param float $width
|
||||
* @param array $style
|
||||
* @param bool $fill Fills the circle if true
|
||||
*/
|
||||
function circle($x, $y, $r, $color, $width = null, $style = null, $fill = false);
|
||||
|
||||
/**
|
||||
* Add an image to the pdf.
|
||||
*
|
||||
* The image is placed at the specified x and y coordinates with the
|
||||
* given width and height.
|
||||
*
|
||||
* @param string $img_url the path to the image
|
||||
* @param string $img_type the type (e.g. extension) of the image
|
||||
* @param float $x x position
|
||||
* @param float $y y position
|
||||
* @param int $w width (in pixels)
|
||||
* @param int $h height (in pixels)
|
||||
*/
|
||||
function image($img_url, $img_type, $x, $y, $w, $h);
|
||||
|
||||
/**
|
||||
* Writes text at the specified x and y coordinates
|
||||
*
|
||||
* See {@link Style::munge_colour()} for the format of the colour array.
|
||||
*
|
||||
* @param float $x
|
||||
* @param float $y
|
||||
* @param string $text the text to write
|
||||
* @param string $font the font file to use
|
||||
* @param float $size the font size, in points
|
||||
* @param array $color
|
||||
* @param float $word_space word spacing adjustment
|
||||
* @param float $char_space whar spacing adjustment
|
||||
* @param float $angle angle
|
||||
*/
|
||||
function text($x, $y, $text, $font, $size, $color = array(0,0,0), $word_space = 0, $char_space = 0, $angle = 0);
|
||||
|
||||
/**
|
||||
* Add a named destination (similar to <a name="foo">...</a> in html)
|
||||
*
|
||||
* @param string $anchorname The name of the named destination
|
||||
*/
|
||||
function add_named_dest($anchorname);
|
||||
|
||||
/**
|
||||
* Add a link to the pdf
|
||||
*
|
||||
* @param string $url The url to link to
|
||||
* @param float $x The x position of the link
|
||||
* @param float $y The y position of the link
|
||||
* @param float $width The width of the link
|
||||
* @param float $height The height of the link
|
||||
*/
|
||||
function add_link($url, $x, $y, $width, $height);
|
||||
|
||||
/**
|
||||
* Add meta information to the pdf
|
||||
*
|
||||
* @param string $label label of the value (Creator, Producer, etc.)
|
||||
* @param string $value the text to set
|
||||
*/
|
||||
function add_info($name, $value);
|
||||
|
||||
/**
|
||||
* Calculates text size, in points
|
||||
*
|
||||
* @param string $text the text to be sized
|
||||
* @param string $font the desired font
|
||||
* @param float $size the desired font size
|
||||
* @param float $spacing word spacing, if any
|
||||
* @return float
|
||||
*/
|
||||
function get_text_width($text, $font, $size, $word_spacing = 0, $char_spacing = 0);
|
||||
|
||||
/**
|
||||
* Calculates font height, in points
|
||||
*
|
||||
* @param string $font
|
||||
* @param float $size
|
||||
* @return float
|
||||
*/
|
||||
function get_font_height($font, $size);
|
||||
|
||||
/**
|
||||
* Sets the opacity
|
||||
*
|
||||
* @param float $opacity
|
||||
* @param string $mode
|
||||
* @return float
|
||||
*/
|
||||
function set_opacity($opacity, $mode = "Normal");
|
||||
|
||||
/**
|
||||
* Starts a new page
|
||||
*
|
||||
* Subsequent drawing operations will appear on the new page.
|
||||
*/
|
||||
function new_page();
|
||||
|
||||
/**
|
||||
* Streams the PDF directly to the browser
|
||||
*
|
||||
* @param string $filename the name of the PDF file
|
||||
* @param array $options associative array, 'Attachment' => 0 or 1, 'compress' => 1 or 0
|
||||
*/
|
||||
function stream($filename, $options = null);
|
||||
|
||||
/**
|
||||
* Returns the PDF as a string
|
||||
*
|
||||
* @param array $options associative array: 'compress' => 1 or 0
|
||||
* @return string
|
||||
*/
|
||||
function output($options = null);
|
||||
|
||||
}
|
||||
83
pdf/include/canvas_factory.cls.php
Executable file
83
pdf/include/canvas_factory.cls.php
Executable file
@@ -0,0 +1,83 @@
|
||||
<?php
|
||||
/**
|
||||
* DOMPDF - PHP5 HTML to PDF renderer
|
||||
*
|
||||
* File: $RCSfile: canvas_factory.cls.php,v $
|
||||
* Created on: 2004-06-02
|
||||
*
|
||||
* Copyright (c) 2004 - Benj Carson <benjcarson@digitaljunkies.ca>
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with this library in the file LICENSE.LGPL; if not, write to the
|
||||
* Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
* 02111-1307 USA
|
||||
*
|
||||
* Alternatively, you may distribute this software under the terms of the
|
||||
* PHP License, version 3.0 or later. A copy of this license should have
|
||||
* been distributed with this file in the file LICENSE.PHP . If this is not
|
||||
* the case, you can obtain a copy at http://www.php.net/license/3_0.txt.
|
||||
*
|
||||
* The latest version of DOMPDF might be available at:
|
||||
* http://www.dompdf.com/
|
||||
*
|
||||
* @link http://www.dompdf.com/
|
||||
* @copyright 2004 Benj Carson
|
||||
* @author Benj Carson <benjcarson@digitaljunkies.ca>
|
||||
* @package dompdf
|
||||
|
||||
*/
|
||||
|
||||
/* $Id: canvas_factory.cls.php 216 2010-03-11 22:49:18Z ryan.masten $ */
|
||||
|
||||
/**
|
||||
* Create canvas instances
|
||||
*
|
||||
* The canvas factory creates canvas instances based on the
|
||||
* availability of rendering backends and config options.
|
||||
*
|
||||
* @package dompdf
|
||||
*/
|
||||
class Canvas_Factory {
|
||||
|
||||
/**
|
||||
* Constructor is private: this is a static class
|
||||
*/
|
||||
private function __construct() { }
|
||||
|
||||
static function get_instance($paper = null, $orientation = null, $class = null) {
|
||||
|
||||
$backend = strtolower(DOMPDF_PDF_BACKEND);
|
||||
|
||||
if ( isset($class) && class_exists($class, false) )
|
||||
$class .= "_Adapter";
|
||||
|
||||
else if ( (DOMPDF_PDF_BACKEND === "auto" || $backend === "pdflib" ) &&
|
||||
class_exists("PDFLib", false) )
|
||||
$class = "PDFLib_Adapter";
|
||||
|
||||
else if ( (DOMPDF_PDF_BACKEND === "auto" || $backend === "cpdf") )
|
||||
$class = "CPDF_Adapter";
|
||||
|
||||
else if ( ( $backend === "tcpdf") )
|
||||
$class = "TCPDF_Adapter";
|
||||
|
||||
else if ( $backend === "gd" )
|
||||
$class = "GD_Adapter";
|
||||
|
||||
else
|
||||
$class = "CPDF_Adapter";
|
||||
|
||||
return new $class($paper, $orientation);
|
||||
|
||||
}
|
||||
}
|
||||
730
pdf/include/cellmap.cls.php
Executable file
730
pdf/include/cellmap.cls.php
Executable file
@@ -0,0 +1,730 @@
|
||||
<?php
|
||||
/**
|
||||
* DOMPDF - PHP5 HTML to PDF renderer
|
||||
*
|
||||
* File: $RCSfile: cellmap.cls.php,v $
|
||||
* Created on: 2004-07-28
|
||||
*
|
||||
* Copyright (c) 2004 - Benj Carson <benjcarson@digitaljunkies.ca>
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with this library in the file LICENSE.LGPL; if not, write to the
|
||||
* Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
* 02111-1307 USA
|
||||
*
|
||||
* Alternatively, you may distribute this software under the terms of the
|
||||
* PHP License, version 3.0 or later. A copy of this license should have
|
||||
* been distributed with this file in the file LICENSE.PHP . If this is not
|
||||
* the case, you can obtain a copy at http://www.php.net/license/3_0.txt.
|
||||
*
|
||||
* The latest version of DOMPDF might be available at:
|
||||
* http://www.dompdf.com/
|
||||
*
|
||||
* @link http://www.dompdf.com/
|
||||
* @copyright 2004 Benj Carson
|
||||
* @author Benj Carson <benjcarson@digitaljunkies.ca>
|
||||
* @package dompdf
|
||||
|
||||
*/
|
||||
|
||||
/* $Id: cellmap.cls.php 283 2010-07-19 17:57:40Z fabien.menager $ */
|
||||
|
||||
/**
|
||||
* Maps table cells to the table grid.
|
||||
*
|
||||
* This class resolves borders in tables with collapsed borders and helps
|
||||
* place row & column spanned table cells.
|
||||
*
|
||||
* @access private
|
||||
* @package dompdf
|
||||
*/
|
||||
class Cellmap {
|
||||
|
||||
/**
|
||||
* Border style weight lookup for collapsed border resolution.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
static protected $_BORDER_STYLE_SCORE = array("inset" => 1,
|
||||
"groove" => 2,
|
||||
"outset" => 3,
|
||||
"ridge" => 4,
|
||||
"dotted" => 5,
|
||||
"dashed" => 6,
|
||||
"solid" => 7,
|
||||
"double" => 8,
|
||||
"none" => 0);
|
||||
|
||||
/**
|
||||
* The table object this cellmap is attached to.
|
||||
*
|
||||
* @var Table_Frame_Decorator
|
||||
*/
|
||||
protected $_table;
|
||||
|
||||
/**
|
||||
* The total number of rows in the table
|
||||
*
|
||||
* @var int
|
||||
*/
|
||||
protected $_num_rows;
|
||||
|
||||
/**
|
||||
* The total number of columns in the table
|
||||
*
|
||||
* @var int
|
||||
*/
|
||||
protected $_num_cols;
|
||||
|
||||
/**
|
||||
* 2D array mapping <row,column> to frames
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $_cells;
|
||||
|
||||
/**
|
||||
* 1D array of column dimensions
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $_columns;
|
||||
|
||||
/**
|
||||
* 1D array of row dimensions
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $_rows;
|
||||
|
||||
/**
|
||||
* 2D array of border specs
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $_borders;
|
||||
|
||||
/**
|
||||
* 1D Array mapping frames to (multiple) <row, col> pairs, keyed on
|
||||
* frame_id.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $_frames;
|
||||
|
||||
/**
|
||||
* Current column when adding cells, 0-based
|
||||
*
|
||||
* @var int
|
||||
*/
|
||||
private $__col;
|
||||
|
||||
/**
|
||||
* Current row when adding cells, 0-based
|
||||
*
|
||||
* @var int
|
||||
*/
|
||||
private $__row;
|
||||
|
||||
//........................................................................
|
||||
|
||||
function __construct(Table_Frame_Decorator $table) {
|
||||
$this->_table = $table;
|
||||
$this->reset();
|
||||
}
|
||||
|
||||
function __destruct() {
|
||||
clear_object($this);
|
||||
}
|
||||
//........................................................................
|
||||
|
||||
function reset() {
|
||||
$this->_num_rows = 0;
|
||||
$this->_num_cols = 0;
|
||||
|
||||
$this->_cells = array();
|
||||
$this->_frames = array();
|
||||
|
||||
$this->_columns = array();
|
||||
$this->_rows = array();
|
||||
|
||||
$this->_borders = array();
|
||||
|
||||
$this->__col = $this->__row = 0;
|
||||
}
|
||||
|
||||
//........................................................................
|
||||
|
||||
function get_num_rows() { return $this->_num_rows; }
|
||||
function get_num_cols() { return $this->_num_cols; }
|
||||
|
||||
function &get_columns() {
|
||||
return $this->_columns;
|
||||
}
|
||||
|
||||
function &get_column($i) {
|
||||
if ( !isset($this->_columns[$i]) )
|
||||
$this->_columns[$i] = array("x" => 0,
|
||||
"min-width" => 0,
|
||||
"max-width" => 0,
|
||||
"used-width" => null,
|
||||
"absolute" => 0,
|
||||
"percent" => 0,
|
||||
"auto" => true);
|
||||
|
||||
return $this->_columns[$i];
|
||||
}
|
||||
|
||||
function &get_rows() {
|
||||
return $this->_rows;
|
||||
}
|
||||
|
||||
function &get_row($j) {
|
||||
if ( !isset($this->_rows[$j]) )
|
||||
$this->_rows[$j] = array("y" => 0,
|
||||
"first-column" => 0,
|
||||
"height" => null);
|
||||
return $this->_rows[$j];
|
||||
}
|
||||
|
||||
function get_border($i, $j, $h_v, $prop = null) {
|
||||
if ( !isset($this->_borders[$i][$j][$h_v]) )
|
||||
$this->_borders[$i][$j][$h_v] = array("width" => 0,
|
||||
"style" => "solid",
|
||||
"color" => "black");
|
||||
if ( isset($prop) )
|
||||
return $this->_borders[$i][$j][$h_v][$prop];
|
||||
|
||||
return $this->_borders[$i][$j][$h_v];
|
||||
}
|
||||
|
||||
function get_border_properties($i, $j) {
|
||||
|
||||
$left = $this->get_border($i, $j, "vertical");
|
||||
$right = $this->get_border($i, $j+1, "vertical");
|
||||
$top = $this->get_border($i, $j, "horizontal");
|
||||
$bottom = $this->get_border($i+1, $j, "horizontal");
|
||||
|
||||
return compact("top", "bottom", "left", "right");
|
||||
}
|
||||
|
||||
//........................................................................
|
||||
|
||||
function get_spanned_cells($frame) {
|
||||
$key = $frame->get_id();
|
||||
|
||||
if ( !isset($this->_frames[$key]) ) {
|
||||
throw new DOMPDF_Internal_Exception("Frame not found in cellmap");
|
||||
}
|
||||
|
||||
return $this->_frames[$key];
|
||||
|
||||
}
|
||||
|
||||
function frame_exists_in_cellmap($frame) {
|
||||
$key = $frame->get_id();
|
||||
return isset($this->_frames[$key]);
|
||||
}
|
||||
|
||||
function get_frame_position($frame) {
|
||||
global $_dompdf_warnings;
|
||||
|
||||
$key = $frame->get_id();
|
||||
|
||||
if ( !isset($this->_frames[$key]) ) {
|
||||
throw new DOMPDF_Internal_Exception("Frame not found in cellmap");
|
||||
}
|
||||
|
||||
$col = $this->_frames[$key]["columns"][0];
|
||||
$row = $this->_frames[$key]["rows"][0];
|
||||
|
||||
if ( !isset($this->_columns[$col])) {
|
||||
$_dompdf_warnings[] = "Frame not found in columns array. Check your table layout for missing or extra TDs.";
|
||||
$x = 0;
|
||||
} else
|
||||
$x = $this->_columns[$col]["x"];
|
||||
|
||||
if ( !isset($this->_rows[$row])) {
|
||||
$_dompdf_warnings[] = "Frame not found in row array. Check your table layout for missing or extra TDs.";
|
||||
$y = 0;
|
||||
} else
|
||||
$y = $this->_rows[$row]["y"];
|
||||
|
||||
return array($x, $y, "x" => $x, "y" => $y);
|
||||
}
|
||||
|
||||
function get_frame_width($frame) {
|
||||
$key = $frame->get_id();
|
||||
|
||||
if ( !isset($this->_frames[$key]) ) {
|
||||
throw new DOMPDF_Internal_Exception("Frame not found in cellmap");
|
||||
}
|
||||
|
||||
$cols = $this->_frames[$key]["columns"];
|
||||
$w = 0;
|
||||
foreach ($cols as $i)
|
||||
$w += $this->_columns[$i]["used-width"];
|
||||
|
||||
return $w;
|
||||
|
||||
}
|
||||
|
||||
function get_frame_height($frame) {
|
||||
$key = $frame->get_id();
|
||||
|
||||
if ( !isset($this->_frames[$key]) )
|
||||
throw new DOMPDF_Internal_Exception("Frame not found in cellmap");
|
||||
|
||||
$rows = $this->_frames[$key]["rows"];
|
||||
$h = 0;
|
||||
foreach ($rows as $i) {
|
||||
if ( !isset($this->_rows[$i]) ) {
|
||||
throw new Exception("foo");
|
||||
}
|
||||
$h += $this->_rows[$i]["height"];
|
||||
}
|
||||
return $h;
|
||||
|
||||
}
|
||||
|
||||
|
||||
//........................................................................
|
||||
|
||||
function set_column_width($j, $width) {
|
||||
$col =& $this->get_column($j);
|
||||
$col["used-width"] = $width;
|
||||
$next_col =& $this->get_column($j+1);
|
||||
$next_col["x"] = $next_col["x"] + $width;
|
||||
}
|
||||
|
||||
function set_row_height($i, $height) {
|
||||
$row =& $this->get_row($i);
|
||||
if ( $height <= $row["height"] )
|
||||
return;
|
||||
|
||||
$row["height"] = $height;
|
||||
$next_row =& $this->get_row($i+1);
|
||||
$next_row["y"] = $row["y"] + $height;
|
||||
|
||||
}
|
||||
|
||||
//........................................................................
|
||||
|
||||
|
||||
protected function _resolve_border($i, $j, $h_v, $border_spec) {
|
||||
$n_width = $border_spec["width"];
|
||||
$n_style = $border_spec["style"];
|
||||
$n_color = $border_spec["color"];
|
||||
|
||||
if ( !isset($this->_borders[$i][$j][$h_v]) ) {
|
||||
$this->_borders[$i][$j][$h_v] = $border_spec;
|
||||
return $this->_borders[$i][$j][$h_v]["width"];
|
||||
}
|
||||
|
||||
$border = &$this->_borders[$i][$j][$h_v];
|
||||
|
||||
$o_width = $border["width"];
|
||||
$o_style = $border["style"];
|
||||
$o_color = $border["color"];
|
||||
|
||||
if ( ($n_style === "hidden" ||
|
||||
$n_width > $o_width ||
|
||||
$o_style === "none")
|
||||
|
||||
or
|
||||
|
||||
($o_width == $n_width &&
|
||||
in_array($n_style, self::$_BORDER_STYLE_SCORE) &&
|
||||
self::$_BORDER_STYLE_SCORE[ $n_style ] > self::$_BORDER_STYLE_SCORE[ $o_style ]) )
|
||||
$border = $border_spec;
|
||||
|
||||
return $border["width"];
|
||||
}
|
||||
|
||||
//........................................................................
|
||||
|
||||
function add_frame(Frame $frame) {
|
||||
|
||||
$style = $frame->get_style();
|
||||
$display = $style->display;
|
||||
|
||||
$collapse = $this->_table->get_style()->border_collapse == "collapse";
|
||||
|
||||
// Recursively add the frames within tables, table-row-groups and table-rows
|
||||
if ( $display === "table-row" ||
|
||||
$display === "table" ||
|
||||
$display === "inline-table" ||
|
||||
in_array($display, Table_Frame_Decorator::$ROW_GROUPS) ) {
|
||||
|
||||
$start_row = $this->__row;
|
||||
foreach ( $frame->get_children() as $child )
|
||||
$this->add_frame( $child );
|
||||
|
||||
if ( $display === "table-row" )
|
||||
$this->add_row();
|
||||
|
||||
$num_rows = $this->__row - $start_row - 1;
|
||||
$key = $frame->get_id();
|
||||
|
||||
// Row groups always span across the entire table
|
||||
$this->_frames[$key]["columns"] = range(0,max(0,$this->_num_cols-1));
|
||||
$this->_frames[$key]["rows"] = range($start_row, max(0, $this->__row - 1));
|
||||
$this->_frames[$key]["frame"] = $frame;
|
||||
|
||||
if ( $display !== "table-row" && $collapse ) {
|
||||
|
||||
$bp = $style->get_border_properties();
|
||||
|
||||
// Resolve the borders
|
||||
for ( $i = 0; $i < $num_rows+1; $i++) {
|
||||
$this->_resolve_border($start_row + $i, 0, "vertical", $bp["left"]);
|
||||
$this->_resolve_border($start_row + $i, $this->_num_cols, "vertical", $bp["right"]);
|
||||
}
|
||||
|
||||
for ( $j = 0; $j < $this->_num_cols; $j++) {
|
||||
$this->_resolve_border($start_row, $j, "horizontal", $bp["top"]);
|
||||
$this->_resolve_border($this->__row, $j, "horizontal", $bp["bottom"]);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
$node = $frame->get_node();
|
||||
|
||||
// Determine where this cell is going
|
||||
$colspan = $node->getAttribute("colspan");
|
||||
$rowspan = $node->getAttribute("rowspan");
|
||||
|
||||
if ( !$colspan ) {
|
||||
$colspan = 1;
|
||||
$node->setAttribute("colspan",1);
|
||||
}
|
||||
|
||||
if ( !$rowspan ) {
|
||||
$rowspan = 1;
|
||||
$node->setAttribute("rowspan",1);
|
||||
}
|
||||
$key = $frame->get_id();
|
||||
|
||||
$bp = $style->get_border_properties();
|
||||
|
||||
|
||||
// Add the frame to the cellmap
|
||||
$max_left = $max_right = 0;
|
||||
|
||||
// Find the next available column (fix by Ciro Mondueri)
|
||||
$ac = $this->__col;
|
||||
while ( isset($this->_cells[$this->__row][$ac]) )
|
||||
$ac++;
|
||||
$this->__col = $ac;
|
||||
|
||||
// Rows:
|
||||
for ( $i = 0; $i < $rowspan; $i++ ) {
|
||||
$row = $this->__row + $i;
|
||||
|
||||
$this->_frames[$key]["rows"][] = $row;
|
||||
|
||||
for ( $j = 0; $j < $colspan; $j++)
|
||||
$this->_cells[$row][$this->__col + $j] = $frame;
|
||||
|
||||
if ( $collapse ) {
|
||||
// Resolve vertical borders
|
||||
$max_left = max($max_left, $this->_resolve_border($row, $this->__col, "vertical", $bp["left"]));
|
||||
$max_right = max($max_right, $this->_resolve_border($row, $this->__col + $colspan, "vertical", $bp["right"]));
|
||||
}
|
||||
}
|
||||
|
||||
$max_top = $max_bottom = 0;
|
||||
|
||||
// Columns:
|
||||
for ( $j = 0; $j < $colspan; $j++ ) {
|
||||
$col = $this->__col + $j;
|
||||
$this->_frames[$key]["columns"][] = $col;
|
||||
|
||||
if ( $collapse ) {
|
||||
// Resolve horizontal borders
|
||||
$max_top = max($max_top, $this->_resolve_border($this->__row, $col, "horizontal", $bp["top"]));
|
||||
$max_bottom = max($max_bottom, $this->_resolve_border($this->__row + $rowspan, $col, "horizontal", $bp["bottom"]));
|
||||
}
|
||||
}
|
||||
|
||||
$this->_frames[$key]["frame"] = $frame;
|
||||
|
||||
// Handle seperated border model
|
||||
if ( !$collapse ) {
|
||||
list($h, $v) = $this->_table->get_style()->border_spacing;
|
||||
|
||||
// Border spacing is effectively a margin between cells
|
||||
$v = $style->length_in_pt($v) / 2;
|
||||
$h = $style->length_in_pt($h) / 2;
|
||||
$style->margin = "$v $h";
|
||||
|
||||
// The additional 1/2 width gets added to the table proper
|
||||
|
||||
} else {
|
||||
|
||||
// Drop the frame's actual border
|
||||
$style->border_left_width = $max_left / 2;
|
||||
$style->border_right_width = $max_right / 2;
|
||||
$style->border_top_width = $max_top / 2;
|
||||
$style->border_bottom_width = $max_bottom / 2;
|
||||
$style->margin = "none";
|
||||
}
|
||||
|
||||
// Resolve the frame's width
|
||||
list($frame_min, $frame_max) = $frame->get_min_max_width();
|
||||
|
||||
$width = $style->width;
|
||||
|
||||
if ( is_percent($width) ) {
|
||||
$var = "percent";
|
||||
$val = (float)rtrim($width, "% ") / $colspan;
|
||||
|
||||
} else if ( $width !== "auto" ) {
|
||||
$var = "absolute";
|
||||
$val = $style->length_in_pt($frame_min) / $colspan;
|
||||
}
|
||||
|
||||
$min = 0;
|
||||
$max = 0;
|
||||
for ( $cs = 0; $cs < $colspan; $cs++ ) {
|
||||
|
||||
// Resolve the frame's width(s) with other cells
|
||||
$col =& $this->get_column( $this->__col + $cs );
|
||||
|
||||
// Note: $var is either 'percent' or 'absolute'. We compare the
|
||||
// requested percentage or absolute values with the existing widths
|
||||
// and adjust accordingly.
|
||||
if ( isset($var) && $val > $col[$var] ) {
|
||||
$col[$var] = $val;
|
||||
$col["auto"] = false;
|
||||
}
|
||||
|
||||
$min += $col["min-width"];
|
||||
$max += $col["max-width"];
|
||||
}
|
||||
|
||||
|
||||
if ( $frame_min > $min ) {
|
||||
// The frame needs more space. Expand each sub-column
|
||||
$inc = ($frame_min - $min) / $colspan;
|
||||
for ($c = 0; $c < $colspan; $c++) {
|
||||
$col =& $this->get_column($this->__col + $c);
|
||||
$col["min-width"] += $inc;
|
||||
}
|
||||
}
|
||||
|
||||
if ( $frame_max > $max ) {
|
||||
$inc = ($frame_max - $max) / $colspan;
|
||||
for ($c = 0; $c < $colspan; $c++) {
|
||||
$col =& $this->get_column($this->__col + $c);
|
||||
$col["max-width"] += $inc;
|
||||
}
|
||||
}
|
||||
|
||||
$this->__col += $colspan;
|
||||
if ( $this->__col > $this->_num_cols )
|
||||
$this->_num_cols = $this->__col;
|
||||
|
||||
}
|
||||
|
||||
//........................................................................
|
||||
|
||||
function add_row() {
|
||||
|
||||
$this->__row++;
|
||||
$this->_num_rows++;
|
||||
|
||||
// Find the next available column
|
||||
$i = 0;
|
||||
while ( isset($this->_cells[$this->__row][$i]) )
|
||||
$i++;
|
||||
|
||||
$this->__col = $i;
|
||||
|
||||
}
|
||||
|
||||
//........................................................................
|
||||
|
||||
/**
|
||||
* Remove a row from the cellmap.
|
||||
*
|
||||
* @param Frame
|
||||
*/
|
||||
function remove_row(Frame $row) {
|
||||
|
||||
$key = $row->get_id();
|
||||
if ( !isset($this->_frames[$key]) )
|
||||
return; // Presumably this row has alredy been removed
|
||||
|
||||
$this->_row = $this->_num_rows--;
|
||||
|
||||
$rows = $this->_frames[$key]["rows"];
|
||||
$columns = $this->_frames[$key]["columns"];
|
||||
|
||||
// Remove all frames from this row
|
||||
foreach ( $rows as $r ) {
|
||||
foreach ( $columns as $c ) {
|
||||
if ( isset($this->_cells[$r][$c]) ) {
|
||||
$id = $this->_cells[$r][$c]->get_id();
|
||||
|
||||
$this->_frames[$id] = null;
|
||||
unset($this->_frames[$id]);
|
||||
|
||||
$this->_cells[$r][$c] = null;
|
||||
unset($this->_cells[$r][$c]);
|
||||
}
|
||||
}
|
||||
$this->_rows[$r] = null;
|
||||
unset($this->_rows[$r]);
|
||||
}
|
||||
|
||||
$this->_frames[$key] = null;
|
||||
unset($this->_frames[$key]);
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Remove a row group from the cellmap.
|
||||
*
|
||||
* @param Frame $group The group to remove
|
||||
*/
|
||||
function remove_row_group(Frame $group) {
|
||||
|
||||
$key = $group->get_id();
|
||||
if ( !isset($this->_frames[$key]) )
|
||||
return; // Presumably this row has alredy been removed
|
||||
|
||||
$iter = $group->get_first_child();
|
||||
while ($iter) {
|
||||
$this->remove_row($iter);
|
||||
$iter = $iter->get_next_sibling();
|
||||
}
|
||||
|
||||
$this->_frames[$key] = null;
|
||||
unset($this->_frames[$key]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Update a row group after rows have been removed
|
||||
*
|
||||
* @param Frame $group The group to update
|
||||
* @param Frame $last_row The last row in the row group
|
||||
*/
|
||||
function update_row_group(Frame $group, Frame $last_row) {
|
||||
|
||||
$g_key = $group->get_id();
|
||||
$r_key = $last_row->get_id();
|
||||
|
||||
$r_rows = $this->_frames[$r_key]["rows"];
|
||||
$this->_frames[$g_key]["rows"] = range( $this->_frames[$g_key]["rows"][0], end($r_rows) );
|
||||
|
||||
}
|
||||
|
||||
//........................................................................
|
||||
|
||||
function assign_x_positions() {
|
||||
// Pre-condition: widths must be resolved and assigned to columns and
|
||||
// column[0]["x"] must be set.
|
||||
|
||||
$x = $this->_columns[0]["x"];
|
||||
foreach ( array_keys($this->_columns) as $j ) {
|
||||
$this->_columns[$j]["x"] = $x;
|
||||
$x += $this->_columns[$j]["used-width"];
|
||||
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
function assign_frame_heights() {
|
||||
// Pre-condition: widths and heights of each column & row must be
|
||||
// calcluated
|
||||
|
||||
foreach ( $this->_frames as $arr ) {
|
||||
$frame = $arr["frame"];
|
||||
|
||||
$h = 0;
|
||||
foreach( $arr["rows"] as $row ) {
|
||||
if ( !isset($this->_rows[$row]) )
|
||||
// The row has been removed because of a page split, so skip it.
|
||||
continue;
|
||||
$h += $this->_rows[$row]["height"];
|
||||
}
|
||||
|
||||
if ( $frame instanceof Table_Cell_Frame_Decorator )
|
||||
$frame->set_cell_height($h);
|
||||
else
|
||||
$frame->get_style()->height = $h;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
//........................................................................
|
||||
|
||||
/**
|
||||
* Re-adjust frame height if the table height is larger than its content
|
||||
*/
|
||||
function set_frame_heights($table_height, $content_height) {
|
||||
|
||||
|
||||
// Distribute the increased height proportionally amongst each row
|
||||
foreach ( $this->_frames as $arr ) {
|
||||
$frame = $arr["frame"];
|
||||
|
||||
$h = 0;
|
||||
foreach ($arr["rows"] as $row ) {
|
||||
if ( !isset($this->_rows[$row]) )
|
||||
continue;
|
||||
|
||||
$h += $this->_rows[$row]["height"];
|
||||
}
|
||||
|
||||
if ( $content_height > 0 )
|
||||
$new_height = ($h / $content_height) * $table_height;
|
||||
else
|
||||
$new_height = 0;
|
||||
|
||||
if ( $frame instanceof Table_Cell_Frame_Decorator )
|
||||
$frame->set_cell_height($new_height);
|
||||
else
|
||||
$frame->get_style()->height = $new_height;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
//........................................................................
|
||||
|
||||
// Used for debugging:
|
||||
function __toString() {
|
||||
$str = "";
|
||||
$str .= "Columns:<br/>";
|
||||
$str .= pre_r($this->_columns, true);
|
||||
$str .= "Rows:<br/>";
|
||||
$str .= pre_r($this->_rows, true);
|
||||
|
||||
$str .= "Frames:<br/>";
|
||||
$arr = array();
|
||||
foreach ( $this->_frames as $key => $val )
|
||||
$arr[$key] = array("columns" => $val["columns"], "rows" => $val["rows"]);
|
||||
|
||||
$str .= pre_r($arr, true);
|
||||
|
||||
if ( php_sapi_name() == "cli" )
|
||||
$str = strip_tags(str_replace(array("<br/>","<b>","</b>"),
|
||||
array("\n",chr(27)."[01;33m", chr(27)."[0m"),
|
||||
$str));
|
||||
return $str;
|
||||
}
|
||||
}
|
||||
919
pdf/include/cpdf_adapter.cls.php
Executable file
919
pdf/include/cpdf_adapter.cls.php
Executable file
@@ -0,0 +1,919 @@
|
||||
<?php
|
||||
/**
|
||||
* DOMPDF - PHP5 HTML to PDF renderer
|
||||
*
|
||||
* File: $RCSfile: cpdf_adapter.cls.php,v $
|
||||
* Created on: 2004-08-04
|
||||
* Modified on: 2008-01-05
|
||||
*
|
||||
* Copyright (c) 2004 - Benj Carson <benjcarson@digitaljunkies.ca>
|
||||
* Portions copyright (c) 2008 - Orion Richardson <orionr@yahoo.com>
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with this library in the file LICENSE.LGPL; if not, write to the
|
||||
* Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
* 02111-1307 USA
|
||||
*
|
||||
* Alternatively, you may distribute this software under the terms of the
|
||||
* PHP License, version 3.0 or later. A copy of this license should have
|
||||
* been distributed with this file in the file LICENSE.PHP . If this is not
|
||||
* the case, you can obtain a copy at http://www.php.net/license/3_0.txt.
|
||||
*
|
||||
* The latest version of DOMPDF might be available at:
|
||||
* http://www.dompdf.com/
|
||||
*
|
||||
* @link http://www.dompdf.com/
|
||||
* @copyright 2004 Benj Carson
|
||||
* @author Benj Carson <benjcarson@digitaljunkies.ca>
|
||||
* @contributor Orion Richardson <orionr@yahoo.com>
|
||||
* @contributor Helmut Tischer <htischer@weihenstephan.org>
|
||||
* @package dompdf
|
||||
*
|
||||
* Changes
|
||||
* @contributor Helmut Tischer <htischer@weihenstephan.org>
|
||||
* @version 0.5.1.htischer.20090507
|
||||
* - On gif to png conversion tmp file creation, clarify tmp name and add to tmp deletion list only on success
|
||||
* - On gif to png conversion, when available add direct from gd without tmp file, skip image load if already cached.
|
||||
* to safe CPU time and memory
|
||||
* @contributor Helmut Tischer <htischer@weihenstephan.org>
|
||||
* @version dompdf_trunk_with_helmut_mods.20090524
|
||||
* - Pass temp and fontcache folders to Cpdf, to making Cpdf independent from dompdf
|
||||
* @version dompdf_trunk_with_helmut_mods.20090528
|
||||
* - fix text position according to glyph baseline to match background rectangle
|
||||
*/
|
||||
|
||||
/* $Id: cpdf_adapter.cls.php 356 2011-01-28 08:56:10Z fabien.menager $ */
|
||||
|
||||
// FIXME: Need to sanity check inputs to this class
|
||||
require_once(DOMPDF_LIB_DIR . "/class.pdf.php");
|
||||
|
||||
/**
|
||||
* PDF rendering interface
|
||||
*
|
||||
* CPDF_Adapter provides a simple stateless interface to the stateful one
|
||||
* provided by the Cpdf class.
|
||||
*
|
||||
* Unless otherwise mentioned, all dimensions are in points (1/72 in). The
|
||||
* coordinate origin is in the top left corner, and y values increase
|
||||
* downwards.
|
||||
*
|
||||
* See {@link http://www.ros.co.nz/pdf/} for more complete documentation
|
||||
* on the underlying {@link Cpdf} class.
|
||||
*
|
||||
* @package dompdf
|
||||
*/
|
||||
class CPDF_Adapter implements Canvas {
|
||||
|
||||
/**
|
||||
* Dimensions of paper sizes in points
|
||||
*
|
||||
* @var array;
|
||||
*/
|
||||
static $PAPER_SIZES = array(
|
||||
"4a0" => array(0,0,4767.87,6740.79),
|
||||
"2a0" => array(0,0,3370.39,4767.87),
|
||||
"a0" => array(0,0,2383.94,3370.39),
|
||||
"a1" => array(0,0,1683.78,2383.94),
|
||||
"a2" => array(0,0,1190.55,1683.78),
|
||||
"a3" => array(0,0,841.89,1190.55),
|
||||
"a4" => array(0,0,595.28,841.89),
|
||||
"a5" => array(0,0,419.53,595.28),
|
||||
"a6" => array(0,0,297.64,419.53),
|
||||
"a7" => array(0,0,209.76,297.64),
|
||||
"a8" => array(0,0,147.40,209.76),
|
||||
"a9" => array(0,0,104.88,147.40),
|
||||
"a10" => array(0,0,73.70,104.88),
|
||||
"b0" => array(0,0,2834.65,4008.19),
|
||||
"b1" => array(0,0,2004.09,2834.65),
|
||||
"b2" => array(0,0,1417.32,2004.09),
|
||||
"b3" => array(0,0,1000.63,1417.32),
|
||||
"b4" => array(0,0,708.66,1000.63),
|
||||
"b5" => array(0,0,498.90,708.66),
|
||||
"b6" => array(0,0,354.33,498.90),
|
||||
"b7" => array(0,0,249.45,354.33),
|
||||
"b8" => array(0,0,175.75,249.45),
|
||||
"b9" => array(0,0,124.72,175.75),
|
||||
"b10" => array(0,0,87.87,124.72),
|
||||
"c0" => array(0,0,2599.37,3676.54),
|
||||
"c1" => array(0,0,1836.85,2599.37),
|
||||
"c2" => array(0,0,1298.27,1836.85),
|
||||
"c3" => array(0,0,918.43,1298.27),
|
||||
"c4" => array(0,0,649.13,918.43),
|
||||
"c5" => array(0,0,459.21,649.13),
|
||||
"c6" => array(0,0,323.15,459.21),
|
||||
"c7" => array(0,0,229.61,323.15),
|
||||
"c8" => array(0,0,161.57,229.61),
|
||||
"c9" => array(0,0,113.39,161.57),
|
||||
"c10" => array(0,0,79.37,113.39),
|
||||
"ra0" => array(0,0,2437.80,3458.27),
|
||||
"ra1" => array(0,0,1729.13,2437.80),
|
||||
"ra2" => array(0,0,1218.90,1729.13),
|
||||
"ra3" => array(0,0,864.57,1218.90),
|
||||
"ra4" => array(0,0,609.45,864.57),
|
||||
"sra0" => array(0,0,2551.18,3628.35),
|
||||
"sra1" => array(0,0,1814.17,2551.18),
|
||||
"sra2" => array(0,0,1275.59,1814.17),
|
||||
"sra3" => array(0,0,907.09,1275.59),
|
||||
"sra4" => array(0,0,637.80,907.09),
|
||||
"letter" => array(0,0,612.00,792.00),
|
||||
"legal" => array(0,0,612.00,1008.00),
|
||||
"ledger" => array(0,0,1224.00, 792.00),
|
||||
"tabloid" => array(0,0,792.00, 1224.00),
|
||||
"executive" => array(0,0,521.86,756.00),
|
||||
"folio" => array(0,0,612.00,936.00),
|
||||
"commercial #10 envelope" => array(0,0,684,297),
|
||||
"catalog #10 1/2 envelope" => array(0,0,648,864),
|
||||
"8.5x11" => array(0,0,612.00,792.00),
|
||||
"8.5x14" => array(0,0,612.00,1008.0),
|
||||
"11x17" => array(0,0,792.00, 1224.00),
|
||||
);
|
||||
|
||||
|
||||
/**
|
||||
* Instance of Cpdf class
|
||||
*
|
||||
* @var Cpdf
|
||||
*/
|
||||
private $_pdf;
|
||||
|
||||
/**
|
||||
* PDF width, in points
|
||||
*
|
||||
* @var float
|
||||
*/
|
||||
private $_width;
|
||||
|
||||
/**
|
||||
* PDF height, in points
|
||||
*
|
||||
* @var float;
|
||||
*/
|
||||
private $_height;
|
||||
|
||||
/**
|
||||
* Current page number
|
||||
*
|
||||
* @var int
|
||||
*/
|
||||
private $_page_number;
|
||||
|
||||
/**
|
||||
* Total number of pages
|
||||
*
|
||||
* @var int
|
||||
*/
|
||||
private $_page_count;
|
||||
|
||||
/**
|
||||
* Text to display on every page
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
private $_page_text;
|
||||
|
||||
/**
|
||||
* Array of pages for accesing after rendering is initially complete
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
private $_pages;
|
||||
|
||||
/**
|
||||
* Array of temporary cached images to be deleted when processing is complete
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
private $_image_cache;
|
||||
|
||||
/**
|
||||
* Class constructor
|
||||
*
|
||||
* @param mixed $paper The size of paper to use in this PDF ({@link CPDF_Adapter::$PAPER_SIZES})
|
||||
* @param string $orientation The orienation of the document (either 'landscape' or 'portrait')
|
||||
*/
|
||||
function __construct($paper = "letter", $orientation = "portrait") {
|
||||
|
||||
if ( is_array($paper) )
|
||||
$size = $paper;
|
||||
else if ( isset(self::$PAPER_SIZES[mb_strtolower($paper)]) )
|
||||
$size = self::$PAPER_SIZES[mb_strtolower($paper)];
|
||||
else
|
||||
$size = self::$PAPER_SIZES["letter"];
|
||||
|
||||
if ( mb_strtolower($orientation) === "landscape" ) {
|
||||
list($size[2], $size[3]) = array($size[3], $size[2]);
|
||||
}
|
||||
|
||||
$this->_pdf = new Cpdf($size, DOMPDF_UNICODE_ENABLED, DOMPDF_FONT_CACHE, DOMPDF_TEMP_DIR);
|
||||
$this->_pdf->addInfo("Creator", "DOMPDF");
|
||||
$time = substr_replace(date('YmdHisO'), '\'', -2, 0).'\'';
|
||||
$this->_pdf->addInfo("CreationDate", "D:$time");
|
||||
$this->_pdf->addInfo("ModDate", "D:$time");
|
||||
|
||||
$this->_width = $size[2] - $size[0];
|
||||
$this->_height= $size[3] - $size[1];
|
||||
$this->_pdf->openHere('Fit');
|
||||
|
||||
$this->_page_number = $this->_page_count = 1;
|
||||
$this->_page_text = array();
|
||||
|
||||
$this->_pages = array($this->_pdf->getFirstPageId());
|
||||
|
||||
$this->_image_cache = array();
|
||||
}
|
||||
|
||||
/**
|
||||
* Class destructor
|
||||
*
|
||||
* Deletes all temporary image files
|
||||
*/
|
||||
function __destruct() {
|
||||
foreach ($this->_image_cache as $img) {
|
||||
//debugpng
|
||||
if (DEBUGPNG) print '[__destruct unlink '.$img.']';
|
||||
if (!DEBUGKEEPTEMP)
|
||||
unlink($img);
|
||||
}
|
||||
clear_object($this);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the Cpdf instance
|
||||
*
|
||||
* @return Cpdf
|
||||
*/
|
||||
function get_cpdf() { return $this->_pdf; }
|
||||
|
||||
/**
|
||||
* Add meta information to the PDF
|
||||
*
|
||||
* @param string $label label of the value (Creator, Producer, etc.)
|
||||
* @param string $value the text to set
|
||||
*/
|
||||
function add_info($label, $value) {
|
||||
$this->_pdf->addInfo($label, $value);
|
||||
}
|
||||
|
||||
/**
|
||||
* Opens a new 'object'
|
||||
*
|
||||
* While an object is open, all drawing actions are recored in the object,
|
||||
* as opposed to being drawn on the current page. Objects can be added
|
||||
* later to a specific page or to several pages.
|
||||
*
|
||||
* The return value is an integer ID for the new object.
|
||||
*
|
||||
* @see CPDF_Adapter::close_object()
|
||||
* @see CPDF_Adapter::add_object()
|
||||
*
|
||||
* @return int
|
||||
*/
|
||||
function open_object() {
|
||||
$ret = $this->_pdf->openObject();
|
||||
$this->_pdf->saveState();
|
||||
return $ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* Reopens an existing 'object'
|
||||
*
|
||||
* @see CPDF_Adapter::open_object()
|
||||
* @param int $object the ID of a previously opened object
|
||||
*/
|
||||
function reopen_object($object) {
|
||||
$this->_pdf->reopenObject($object);
|
||||
$this->_pdf->saveState();
|
||||
}
|
||||
|
||||
/**
|
||||
* Closes the current 'object'
|
||||
*
|
||||
* @see CPDF_Adapter::open_object()
|
||||
*/
|
||||
function close_object() {
|
||||
$this->_pdf->restoreState();
|
||||
$this->_pdf->closeObject();
|
||||
}
|
||||
|
||||
/**
|
||||
* Adds a specified 'object' to the document
|
||||
*
|
||||
* $object int specifying an object created with {@link
|
||||
* CPDF_Adapter::open_object()}. $where can be one of:
|
||||
* - 'add' add to current page only
|
||||
* - 'all' add to every page from the current one onwards
|
||||
* - 'odd' add to all odd numbered pages from now on
|
||||
* - 'even' add to all even numbered pages from now on
|
||||
* - 'next' add the object to the next page only
|
||||
* - 'nextodd' add to all odd numbered pages from the next one
|
||||
* - 'nexteven' add to all even numbered pages from the next one
|
||||
*
|
||||
* @see Cpdf::addObject()
|
||||
*
|
||||
* @param int $object
|
||||
* @param string $where
|
||||
*/
|
||||
function add_object($object, $where = 'all') {
|
||||
$this->_pdf->addObject($object, $where);
|
||||
}
|
||||
|
||||
/**
|
||||
* Stops the specified 'object' from appearing in the document.
|
||||
*
|
||||
* The object will stop being displayed on the page following the current
|
||||
* one.
|
||||
*
|
||||
* @param int $object
|
||||
*/
|
||||
function stop_object($object) {
|
||||
$this->_pdf->stopObject($object);
|
||||
}
|
||||
|
||||
/**
|
||||
* @access private
|
||||
*/
|
||||
function serialize_object($id) {
|
||||
// Serialize the pdf object's current state for retrieval later
|
||||
return $this->_pdf->serializeObject($id);
|
||||
}
|
||||
|
||||
/**
|
||||
* @access private
|
||||
*/
|
||||
function reopen_serialized_object($obj) {
|
||||
return $this->_pdf->restoreSerializedObject($obj);
|
||||
}
|
||||
|
||||
//........................................................................
|
||||
|
||||
/**
|
||||
* Returns the PDF's width in points
|
||||
* @return float
|
||||
*/
|
||||
function get_width() { return $this->_width; }
|
||||
|
||||
/**
|
||||
* Returns the PDF's height in points
|
||||
* @return float
|
||||
*/
|
||||
function get_height() { return $this->_height; }
|
||||
|
||||
/**
|
||||
* Returns the current page number
|
||||
* @return int
|
||||
*/
|
||||
function get_page_number() { return $this->_page_number; }
|
||||
|
||||
/**
|
||||
* Returns the total number of pages in the document
|
||||
* @return int
|
||||
*/
|
||||
function get_page_count() { return $this->_page_count; }
|
||||
|
||||
/**
|
||||
* Sets the current page number
|
||||
*
|
||||
* @param int $num
|
||||
*/
|
||||
function set_page_number($num) { $this->_page_number = $num; }
|
||||
|
||||
/**
|
||||
* Sets the page count
|
||||
*
|
||||
* @param int $count
|
||||
*/
|
||||
function set_page_count($count) { $this->_page_count = $count; }
|
||||
|
||||
/**
|
||||
* Sets the stroke colour
|
||||
*
|
||||
* See {@link Style::set_colour()} for the format of the color array.
|
||||
* @param array $color
|
||||
*/
|
||||
protected function _set_stroke_color($color) {
|
||||
$this->_pdf->setStrokeColor($color);
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the fill colour
|
||||
*
|
||||
* See {@link Style::set_colour()} for the format of the colour array.
|
||||
* @param array $color
|
||||
*/
|
||||
protected function _set_fill_color($color) {
|
||||
$this->_pdf->setColor($color);
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets line transparency
|
||||
* @see Cpdf::setLineTransparency()
|
||||
*
|
||||
* Valid blend modes are (case-sensitive):
|
||||
*
|
||||
* Normal, Multiply, Screen, Overlay, Darken, Lighten,
|
||||
* ColorDodge, ColorBurn, HardLight, SoftLight, Difference,
|
||||
* Exclusion
|
||||
*
|
||||
* @param string $mode the blending mode to use
|
||||
* @param float $opacity 0.0 fully transparent, 1.0 fully opaque
|
||||
*/
|
||||
protected function _set_line_transparency($mode, $opacity) {
|
||||
$this->_pdf->setLineTransparency($mode, $opacity);
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets fill transparency
|
||||
* @see Cpdf::setFillTransparency()
|
||||
*
|
||||
* Valid blend modes are (case-sensitive):
|
||||
*
|
||||
* Normal, Multiply, Screen, Overlay, Darken, Lighten,
|
||||
* ColorDogde, ColorBurn, HardLight, SoftLight, Difference,
|
||||
* Exclusion
|
||||
*
|
||||
* @param string $mode the blending mode to use
|
||||
* @param float $opacity 0.0 fully transparent, 1.0 fully opaque
|
||||
*/
|
||||
protected function _set_fill_transparency($mode, $opacity) {
|
||||
$this->_pdf->setFillTransparency($mode, $opacity);
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the line style
|
||||
*
|
||||
* @see Cpdf::setLineStyle()
|
||||
*
|
||||
* @param float width
|
||||
* @param string cap
|
||||
* @param string join
|
||||
* @param array dash
|
||||
*/
|
||||
protected function _set_line_style($width, $cap, $join, $dash) {
|
||||
$this->_pdf->setLineStyle($width, $cap, $join, $dash);
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the opacity
|
||||
*
|
||||
* @param $opacity
|
||||
* @param $mode
|
||||
*/
|
||||
function set_opacity($opacity, $mode = "Normal") {
|
||||
$this->_set_line_transparency($mode, $opacity);
|
||||
$this->_set_fill_transparency($mode, $opacity);
|
||||
}
|
||||
|
||||
//........................................................................
|
||||
|
||||
|
||||
/**
|
||||
* Remaps y coords from 4th to 1st quadrant
|
||||
*
|
||||
* @param float $y
|
||||
* @return float
|
||||
*/
|
||||
protected function y($y) { return $this->_height - $y; }
|
||||
|
||||
// Canvas implementation
|
||||
|
||||
function line($x1, $y1, $x2, $y2, $color, $width, $style = array()) {
|
||||
//pre_r(compact("x1", "y1", "x2", "y2", "color", "width", "style"));
|
||||
|
||||
$this->_set_stroke_color($color);
|
||||
$this->_set_line_style($width, "butt", "", $style);
|
||||
$this->_pdf->line($x1, $this->y($y1),
|
||||
$x2, $this->y($y2));
|
||||
}
|
||||
|
||||
//........................................................................
|
||||
|
||||
/**
|
||||
* Convert a GIF or BMP image to a PNG image
|
||||
*
|
||||
* @return string The url of the newly converted image
|
||||
*/
|
||||
protected function _convert_gif_bmp_to_png($image_url, $image_type) {
|
||||
$func_name = "imagecreatefrom$image_type";
|
||||
|
||||
if ( !function_exists($func_name) ) {
|
||||
throw new DOMPDF_Exception("Function $func_name() not found. Cannot convert $image_type image: $image_url. Please install the image PHP extension.");
|
||||
}
|
||||
|
||||
set_error_handler("record_warnings");
|
||||
$im = $func_name($image_url);
|
||||
|
||||
if ( $im ) {
|
||||
imageinterlace($im, 0);
|
||||
|
||||
$filename = tempnam(DOMPDF_TEMP_DIR, "{$image_type}dompdf_img_").'.png';
|
||||
$this->_image_cache[] = $filename;
|
||||
|
||||
imagepng($im, $filename);
|
||||
imagedestroy($im);
|
||||
} else {
|
||||
$filename = DOMPDF_LIB_DIR . "/res/broken_image.png";
|
||||
|
||||
}
|
||||
|
||||
restore_error_handler();
|
||||
|
||||
return $filename;
|
||||
}
|
||||
|
||||
function rectangle($x1, $y1, $w, $h, $color, $width, $style = array()) {
|
||||
$this->_set_stroke_color($color);
|
||||
$this->_set_line_style($width, "butt", "", $style);
|
||||
$this->_pdf->rectangle($x1, $this->y($y1) - $h, $w, $h);
|
||||
}
|
||||
|
||||
//........................................................................
|
||||
|
||||
function filled_rectangle($x1, $y1, $w, $h, $color) {
|
||||
$this->_set_fill_color($color);
|
||||
$this->_pdf->filledRectangle($x1, $this->y($y1) - $h, $w, $h);
|
||||
}
|
||||
|
||||
function clipping_rectangle($x1, $y1, $w, $h) {
|
||||
$this->_pdf->clippingRectangle($x1, $this->y($y1) - $h, $w, $h);
|
||||
}
|
||||
|
||||
function clipping_end() {
|
||||
$this->_pdf->clippingEnd();
|
||||
}
|
||||
|
||||
function save() {
|
||||
$this->_pdf->saveState();
|
||||
}
|
||||
|
||||
function restore() {
|
||||
$this->_pdf->restoreState();
|
||||
}
|
||||
|
||||
function rotate($angle, $x, $y) {
|
||||
$this->_pdf->rotate($angle, $x, $y);
|
||||
}
|
||||
|
||||
function skew($angle_x, $angle_y, $x, $y) {
|
||||
$this->_pdf->skew($angle_x, $angle_y, $x, $y);
|
||||
}
|
||||
|
||||
function scale($s_x, $s_y, $x, $y) {
|
||||
$this->_pdf->scale($s_x, $s_y, $x, $y);
|
||||
}
|
||||
|
||||
function translate($t_x, $t_y) {
|
||||
$this->_pdf->translate($t_x, $t_y);
|
||||
}
|
||||
|
||||
function transform($a, $b, $c, $d, $e, $f) {
|
||||
$this->_pdf->transform(array($a, $b, $c, $d, $e, $f));
|
||||
}
|
||||
|
||||
//........................................................................
|
||||
|
||||
function polygon($points, $color, $width = null, $style = array(), $fill = false) {
|
||||
$this->_set_fill_color($color);
|
||||
$this->_set_stroke_color($color);
|
||||
|
||||
// Adjust y values
|
||||
for ( $i = 1; $i < count($points); $i += 2)
|
||||
$points[$i] = $this->y($points[$i]);
|
||||
|
||||
$this->_pdf->polygon($points, count($points) / 2, $fill);
|
||||
}
|
||||
|
||||
//........................................................................
|
||||
|
||||
function circle($x, $y, $r1, $color, $width = null, $style = null, $fill = false) {
|
||||
$this->_set_fill_color($color);
|
||||
$this->_set_stroke_color($color);
|
||||
|
||||
if ( !$fill && isset($width) )
|
||||
$this->_set_line_style($width, "round", "round", $style);
|
||||
|
||||
$this->_pdf->ellipse($x, $this->y($y), $r1, 0, 0, 8, 0, 360, 1, $fill);
|
||||
}
|
||||
|
||||
//........................................................................
|
||||
|
||||
function image($img_url, $img_type, $x, $y, $w, $h) {
|
||||
//debugpng
|
||||
if (DEBUGPNG) print '[image:'.$img_url.'|'.$img_type.']';
|
||||
|
||||
$img_type = mb_strtolower($img_type);
|
||||
|
||||
switch ($img_type) {
|
||||
case "jpeg":
|
||||
case "jpg":
|
||||
//debugpng
|
||||
if (DEBUGPNG) print '!!!jpg!!!';
|
||||
|
||||
$this->_pdf->addJpegFromFile($img_url, $x, $this->y($y) - $h, $w, $h);
|
||||
break;
|
||||
|
||||
case "png":
|
||||
//debugpng
|
||||
if (DEBUGPNG) print '!!!png!!!';
|
||||
|
||||
$this->_pdf->addPngFromFile($img_url, $x, $this->y($y) - $h, $w, $h);
|
||||
break;
|
||||
|
||||
case "gif":
|
||||
case "bmp":
|
||||
// Convert gifs or bmps to pngs
|
||||
//DEBUG_IMG_TEMP
|
||||
//if (0) {
|
||||
if ( method_exists( $this->_pdf, "addImagePng" ) ) {
|
||||
//debugpng
|
||||
if (DEBUGPNG) print "!!!$img_type addImagePng!!!";
|
||||
|
||||
//If optimization to direct png creation from gd object is available,
|
||||
//don't create temp file, but place gd object directly into the pdf
|
||||
if ( method_exists( $this->_pdf, "image_iscached" ) &&
|
||||
$this->_pdf->image_iscached($img_url) ) {
|
||||
//If same image has occured already before, no need to load because
|
||||
//duplicate will anyway be eliminated.
|
||||
$img = null;
|
||||
unset($img);
|
||||
}
|
||||
else {
|
||||
$func_name = "imagecreatefrom$img_type";
|
||||
$img = @$func_name($img_url);
|
||||
if ( !$img ) {
|
||||
return;
|
||||
}
|
||||
imageinterlace($img, false);
|
||||
}
|
||||
|
||||
$this->_pdf->addImagePng($img_url, $x, $this->y($y) - $h, $w, $h, $img);
|
||||
|
||||
if ( $img ) {
|
||||
imagedestroy($img);
|
||||
}
|
||||
}
|
||||
else {
|
||||
//debugpng
|
||||
if (DEBUGPNG) print "!!!$img_type addPngFromFile!!!";
|
||||
$img_url = $this->_convert_gif_bmp_to_png($img_url, $img_type);
|
||||
$this->_pdf->addPngFromFile($img_url, $x, $this->y($y) - $h, $w, $h);
|
||||
}
|
||||
break;
|
||||
|
||||
default:
|
||||
//debugpng
|
||||
if (DEBUGPNG) print '!!!unknown!!!';
|
||||
break;
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
//........................................................................
|
||||
|
||||
function text($x, $y, $text, $font, $size, $color = array(0,0,0), $word_space = 0, $char_space = 0, $angle = 0) {
|
||||
$pdf = $this->_pdf;
|
||||
|
||||
$pdf->setColor($color);
|
||||
|
||||
$font .= ".afm";
|
||||
$pdf->selectFont($font);
|
||||
|
||||
//Font_Metrics::get_font_height($font, $size) ==
|
||||
//$this->get_font_height($font, $size) ==
|
||||
//$this->_pdf->selectFont($font),$this->_pdf->getFontHeight($size)
|
||||
//- FontBBoxheight+FontHeightOffset, scaled to $size, in pt
|
||||
//$this->_pdf->getFontDescender($size)
|
||||
//- Descender scaled to size
|
||||
//
|
||||
//$this->_pdf->fonts[$this->_pdf->currentFont] sizes:
|
||||
//['FontBBox'][0] left, ['FontBBox'][1] bottom, ['FontBBox'][2] right, ['FontBBox'][3] top
|
||||
//Maximum extent of all glyphs of the font from the baseline point
|
||||
//['Ascender'] maximum height above baseline except accents
|
||||
//['Descender'] maximum depth below baseline, negative number means below baseline
|
||||
//['FontHeightOffset'] manual enhancement of .afm files to trim windows fonts. currently not used.
|
||||
//Values are in 1/1000 pt for a font size of 1 pt
|
||||
//
|
||||
//['FontBBox'][1] should be close to ['Descender']
|
||||
//['FontBBox'][3] should be close to ['Ascender']+Accents
|
||||
//in practice, FontBBox values are a little bigger
|
||||
//
|
||||
//The text position is referenced to the baseline, not to the lower corner of the FontBBox,
|
||||
//for what the left,top corner is given.
|
||||
//FontBBox spans also the background box for the text.
|
||||
//If the lower corner would be used as reference point, the Descents of the glyphs would
|
||||
//hang over the background box border.
|
||||
//Therefore compensate only the extent above the Baseline.
|
||||
//
|
||||
//print '<pre>['.$font.','.$size.','.$pdf->getFontHeight($size).','.$pdf->getFontDescender($size).','.$pdf->fonts[$pdf->currentFont]['FontBBox'][3].','.$pdf->fonts[$pdf->currentFont]['FontBBox'][1].','.$pdf->fonts[$pdf->currentFont]['FontHeightOffset'].','.$pdf->fonts[$pdf->currentFont]['Ascender'].','.$pdf->fonts[$pdf->currentFont]['Descender'].']</pre>';
|
||||
//
|
||||
//$pdf->addText($x, $this->y($y) - Font_Metrics::get_font_height($font, $size), $size, $text, $angle, $word_space, $char_space);
|
||||
//$pdf->addText($x, $this->y($y) - $size, $size, $text, $angle, $word_space, $char_space);
|
||||
//$pdf->addText($x, $this->y($y) - $pdf->getFontHeight($size)-$pdf->getFontDescender($size), $size, $text, $angle, $word_space, $char_space);
|
||||
$pdf->addText($x, $this->y($y) - ($pdf->fonts[$pdf->currentFont]['FontBBox'][3]*$size)/1000, $size, $text, $angle, $word_space, $char_space);
|
||||
}
|
||||
|
||||
//........................................................................
|
||||
|
||||
function javascript($code) {
|
||||
$this->_pdf->addJavascript($code);
|
||||
}
|
||||
|
||||
//........................................................................
|
||||
|
||||
/**
|
||||
* Add a named destination (similar to <a name="foo">...</a> in html)
|
||||
*
|
||||
* @param string $anchorname The name of the named destination
|
||||
*/
|
||||
function add_named_dest($anchorname) {
|
||||
$this->_pdf->addDestination($anchorname, "Fit");
|
||||
}
|
||||
|
||||
//........................................................................
|
||||
|
||||
/**
|
||||
* Add a link to the pdf
|
||||
*
|
||||
* @param string $url The url to link to
|
||||
* @param float $x The x position of the link
|
||||
* @param float $y The y position of the link
|
||||
* @param float $width The width of the link
|
||||
* @param float $height The height of the link
|
||||
*/
|
||||
function add_link($url, $x, $y, $width, $height) {
|
||||
|
||||
$y = $this->y($y) - $height;
|
||||
|
||||
if ( strpos($url, '#') === 0 ) {
|
||||
// Local link
|
||||
$name = substr($url,1);
|
||||
if ( $name )
|
||||
$this->_pdf->addInternalLink($name, $x, $y, $x + $width, $y + $height);
|
||||
|
||||
} else {
|
||||
$this->_pdf->addLink(rawurldecode($url), $x, $y, $x + $width, $y + $height);
|
||||
}
|
||||
}
|
||||
|
||||
//........................................................................
|
||||
|
||||
function get_text_width($text, $font, $size, $word_spacing = 0, $char_spacing = 0) {
|
||||
$this->_pdf->selectFont($font);
|
||||
if (!DOMPDF_UNICODE_ENABLED) {
|
||||
$text = mb_convert_encoding($text, 'Windows-1252', 'UTF-8');
|
||||
}
|
||||
return $this->_pdf->getTextWidth($size, $text, $word_spacing, $char_spacing);
|
||||
}
|
||||
|
||||
//........................................................................
|
||||
|
||||
function get_font_height($font, $size) {
|
||||
$this->_pdf->selectFont($font);
|
||||
return $this->_pdf->getFontHeight($size) * DOMPDF_FONT_HEIGHT_RATIO;
|
||||
}
|
||||
|
||||
//........................................................................
|
||||
|
||||
/**
|
||||
* Writes text at the specified x and y coordinates on every page
|
||||
*
|
||||
* The strings '{PAGE_NUM}' and '{PAGE_COUNT}' are automatically replaced
|
||||
* with their current values.
|
||||
*
|
||||
* See {@link Style::munge_colour()} for the format of the colour array.
|
||||
*
|
||||
* @param float $x
|
||||
* @param float $y
|
||||
* @param string $text the text to write
|
||||
* @param string $font the font file to use
|
||||
* @param float $size the font size, in points
|
||||
* @param array $color
|
||||
* @param float $adjust word spacing adjustment
|
||||
* @param float $angle angle to write the text at, measured CW starting from the x-axis
|
||||
*/
|
||||
function page_text($x, $y, $text, $font, $size, $color = array(0,0,0), $adjust = 0, $angle = 0) {
|
||||
$_t = "text";
|
||||
$this->_page_text[] = compact("_t", "x", "y", "text", "font", "size", "color", "adjust", "angle");
|
||||
}
|
||||
|
||||
//........................................................................
|
||||
|
||||
/**
|
||||
* Processes a script on every page
|
||||
*
|
||||
* The variables $pdf, $PAGE_NUM, and $PAGE_COUNT are available.
|
||||
*
|
||||
* This function can be used to add page numbers to all pages
|
||||
* after the first one, for example.
|
||||
*
|
||||
* @param string $code the script code
|
||||
* @param string $type the language type for script
|
||||
*/
|
||||
function page_script($code, $type = "text/php") {
|
||||
$_t = "script";
|
||||
$this->_page_text[] = compact("_t", "code", "type");
|
||||
}
|
||||
|
||||
//........................................................................
|
||||
|
||||
function new_page() {
|
||||
$this->_page_number++;
|
||||
$this->_page_count++;
|
||||
|
||||
$ret = $this->_pdf->newPage();
|
||||
$this->_pages[] = $ret;
|
||||
return $ret;
|
||||
}
|
||||
|
||||
//........................................................................
|
||||
|
||||
/**
|
||||
* Add text to each page after rendering is complete
|
||||
*/
|
||||
protected function _add_page_text() {
|
||||
|
||||
if ( !count($this->_page_text) )
|
||||
return;
|
||||
|
||||
$page_number = 1;
|
||||
$eval = null;
|
||||
|
||||
foreach ($this->_pages as $pid) {
|
||||
$this->reopen_object($pid);
|
||||
|
||||
foreach ($this->_page_text as $pt) {
|
||||
extract($pt);
|
||||
|
||||
switch ($_t) {
|
||||
|
||||
case "text":
|
||||
$text = str_replace(array("{PAGE_NUM}","{PAGE_COUNT}"),
|
||||
array($page_number, $this->_page_count), $text);
|
||||
$this->text($x, $y, $text, $font, $size, $color, $adjust, $angle);
|
||||
break;
|
||||
|
||||
case "script":
|
||||
if (!$eval) {
|
||||
$eval = new PHP_Evaluator($this);
|
||||
}
|
||||
$eval->evaluate($code, array('PAGE_NUM' => $page_number, 'PAGE_COUNT' => $this->_page_count));
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
$this->close_object();
|
||||
$page_number++;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Streams the PDF directly to the browser
|
||||
*
|
||||
* @param string $filename the name of the PDF file
|
||||
* @param array $options associative array, 'Attachment' => 0 or 1, 'compress' => 1 or 0
|
||||
*/
|
||||
function stream($filename, $options = null) {
|
||||
// Add page text
|
||||
$this->_add_page_text();
|
||||
|
||||
$options["Content-Disposition"] = $filename;
|
||||
$this->_pdf->stream($options);
|
||||
}
|
||||
|
||||
//........................................................................
|
||||
|
||||
/**
|
||||
* Returns the PDF as a string
|
||||
*
|
||||
* @param array $options Output options
|
||||
* @return string
|
||||
*/
|
||||
function output($options = null) {
|
||||
// Add page text
|
||||
$this->_add_page_text();
|
||||
|
||||
$debug = isset($options["compress"]) && $options["compress"] != 1;
|
||||
|
||||
return $this->_pdf->output($debug);
|
||||
}
|
||||
|
||||
//........................................................................
|
||||
|
||||
/**
|
||||
* Returns logging messages generated by the Cpdf class
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
function get_messages() { return $this->_pdf->messages; }
|
||||
|
||||
}
|
||||
287
pdf/include/css_color.cls.php
Executable file
287
pdf/include/css_color.cls.php
Executable file
@@ -0,0 +1,287 @@
|
||||
<?php
|
||||
/**
|
||||
* DOMPDF - PHP5 HTML to PDF renderer
|
||||
*
|
||||
* File: $RCSfile$
|
||||
* Created on: 2010-03-03
|
||||
*
|
||||
* Copyright (c) 2004 - Benj Carson <benjcarson@digitaljunkies.ca>
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with this library in the file LICENSE.LGPL; if not, write to the
|
||||
* Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
* 02111-1307 USA
|
||||
*
|
||||
* Alternatively, you may distribute this software under the terms of the
|
||||
* PHP License, version 3.0 or later. A copy of this license should have
|
||||
* been distributed with this file in the file LICENSE.PHP . If this is not
|
||||
* the case, you can obtain a copy at http://www.php.net/license/3_0.txt.
|
||||
*
|
||||
* The latest version of DOMPDF might be available at:
|
||||
* http://www.dompdf.com/
|
||||
*
|
||||
* @link http://www.dompdf.com/
|
||||
* @copyright 2004 Benj Carson
|
||||
* @author Fabien M<>nager
|
||||
* @package dompdf
|
||||
*/
|
||||
|
||||
/* $Id: css_color.cls.php 300 2010-08-11 22:01:09Z fabien.menager $ */
|
||||
|
||||
class CSS_Color {
|
||||
static $cssColorNames = array(
|
||||
"aliceblue" => "F0F8FF",
|
||||
"antiquewhite" => "FAEBD7",
|
||||
"aqua" => "00FFFF",
|
||||
"aquamarine" => "7FFFD4",
|
||||
"azure" => "F0FFFF",
|
||||
"beige" => "F5F5DC",
|
||||
"bisque" => "FFE4C4",
|
||||
"black" => "000000",
|
||||
"blanchedalmond" => "FFEBCD",
|
||||
"blue" => "0000FF",
|
||||
"blueviolet" => "8A2BE2",
|
||||
"brown" => "A52A2A",
|
||||
"burlywood" => "DEB887",
|
||||
"cadetblue" => "5F9EA0",
|
||||
"chartreuse" => "7FFF00",
|
||||
"chocolate" => "D2691E",
|
||||
"coral" => "FF7F50",
|
||||
"cornflowerblue" => "6495ED",
|
||||
"cornsilk" => "FFF8DC",
|
||||
"crimson" => "DC143C",
|
||||
"cyan" => "00FFFF",
|
||||
"darkblue" => "00008B",
|
||||
"darkcyan" => "008B8B",
|
||||
"darkgoldenrod" => "B8860B",
|
||||
"darkgray" => "A9A9A9",
|
||||
"darkgreen" => "006400",
|
||||
"darkgrey" => "A9A9A9",
|
||||
"darkkhaki" => "BDB76B",
|
||||
"darkmagenta" => "8B008B",
|
||||
"darkolivegreen" => "556B2F",
|
||||
"darkorange" => "FF8C00",
|
||||
"darkorchid" => "9932CC",
|
||||
"darkred" => "8B0000",
|
||||
"darksalmon" => "E9967A",
|
||||
"darkseagreen" => "8FBC8F",
|
||||
"darkslateblue" => "483D8B",
|
||||
"darkslategray" => "2F4F4F",
|
||||
"darkslategrey" => "2F4F4F",
|
||||
"darkturquoise" => "00CED1",
|
||||
"darkviolet" => "9400D3",
|
||||
"deeppink" => "FF1493",
|
||||
"deepskyblue" => "00BFFF",
|
||||
"dimgray" => "696969",
|
||||
"dimgrey" => "696969",
|
||||
"dodgerblue" => "1E90FF",
|
||||
"firebrick" => "B22222",
|
||||
"floralwhite" => "FFFAF0",
|
||||
"forestgreen" => "228B22",
|
||||
"fuchsia" => "FF00FF",
|
||||
"gainsboro" => "DCDCDC",
|
||||
"ghostwhite" => "F8F8FF",
|
||||
"gold" => "FFD700",
|
||||
"goldenrod" => "DAA520",
|
||||
"gray" => "808080",
|
||||
"green" => "008000",
|
||||
"greenyellow" => "ADFF2F",
|
||||
"grey" => "808080",
|
||||
"honeydew" => "F0FFF0",
|
||||
"hotpink" => "FF69B4",
|
||||
"indianred" => "CD5C5C",
|
||||
"indigo" => "4B0082",
|
||||
"ivory" => "FFFFF0",
|
||||
"khaki" => "F0E68C",
|
||||
"lavender" => "E6E6FA",
|
||||
"lavenderblush" => "FFF0F5",
|
||||
"lawngreen" => "7CFC00",
|
||||
"lemonchiffon" => "FFFACD",
|
||||
"lightblue" => "ADD8E6",
|
||||
"lightcoral" => "F08080",
|
||||
"lightcyan" => "E0FFFF",
|
||||
"lightgoldenrodyellow" => "FAFAD2",
|
||||
"lightgray" => "D3D3D3",
|
||||
"lightgreen" => "90EE90",
|
||||
"lightgrey" => "D3D3D3",
|
||||
"lightpink" => "FFB6C1",
|
||||
"lightsalmon" => "FFA07A",
|
||||
"lightseagreen" => "20B2AA",
|
||||
"lightskyblue" => "87CEFA",
|
||||
"lightslategray" => "778899",
|
||||
"lightslategrey" => "778899",
|
||||
"lightsteelblue" => "B0C4DE",
|
||||
"lightyellow" => "FFFFE0",
|
||||
"lime" => "00FF00",
|
||||
"limegreen" => "32CD32",
|
||||
"linen" => "FAF0E6",
|
||||
"magenta" => "FF00FF",
|
||||
"maroon" => "800000",
|
||||
"mediumaquamarine" => "66CDAA",
|
||||
"mediumblue" => "0000CD",
|
||||
"mediumorchid" => "BA55D3",
|
||||
"mediumpurple" => "9370DB",
|
||||
"mediumseagreen" => "3CB371",
|
||||
"mediumslateblue" => "7B68EE",
|
||||
"mediumspringgreen" => "00FA9A",
|
||||
"mediumturquoise" => "48D1CC",
|
||||
"mediumvioletred" => "C71585",
|
||||
"midnightblue" => "191970",
|
||||
"mintcream" => "F5FFFA",
|
||||
"mistyrose" => "FFE4E1",
|
||||
"moccasin" => "FFE4B5",
|
||||
"navajowhite" => "FFDEAD",
|
||||
"navy" => "000080",
|
||||
"oldlace" => "FDF5E6",
|
||||
"olive" => "808000",
|
||||
"olivedrab" => "6B8E23",
|
||||
"orange" => "FFA500",
|
||||
"orangered" => "FF4500",
|
||||
"orchid" => "DA70D6",
|
||||
"palegoldenrod" => "EEE8AA",
|
||||
"palegreen" => "98FB98",
|
||||
"paleturquoise" => "AFEEEE",
|
||||
"palevioletred" => "DB7093",
|
||||
"papayawhip" => "FFEFD5",
|
||||
"peachpuff" => "FFDAB9",
|
||||
"peru" => "CD853F",
|
||||
"pink" => "FFC0CB",
|
||||
"plum" => "DDA0DD",
|
||||
"powderblue" => "B0E0E6",
|
||||
"purple" => "800080",
|
||||
"red" => "FF0000",
|
||||
"rosybrown" => "BC8F8F",
|
||||
"royalblue" => "4169E1",
|
||||
"saddlebrown" => "8B4513",
|
||||
"salmon" => "FA8072",
|
||||
"sandybrown" => "F4A460",
|
||||
"seagreen" => "2E8B57",
|
||||
"seashell" => "FFF5EE",
|
||||
"sienna" => "A0522D",
|
||||
"silver" => "C0C0C0",
|
||||
"skyblue" => "87CEEB",
|
||||
"slateblue" => "6A5ACD",
|
||||
"slategray" => "708090",
|
||||
"slategrey" => "708090",
|
||||
"snow" => "FFFAFA",
|
||||
"springgreen" => "00FF7F",
|
||||
"steelblue" => "4682B4",
|
||||
"tan" => "D2B48C",
|
||||
"teal" => "008080",
|
||||
"thistle" => "D8BFD8",
|
||||
"tomato" => "FF6347",
|
||||
"turquoise" => "40E0D0",
|
||||
"violet" => "EE82EE",
|
||||
"wheat" => "F5DEB3",
|
||||
"white" => "FFFFFF",
|
||||
"whitesmoke" => "F5F5F5",
|
||||
"yellow" => "FFFF00",
|
||||
"yellowgreen" => "9ACD32",
|
||||
);
|
||||
|
||||
static function parse($colour) {
|
||||
if ( is_array($colour) )
|
||||
// Assume the array has the right format...
|
||||
// FIXME: should/could verify this.
|
||||
return $colour;
|
||||
|
||||
$colour = strtolower($colour);
|
||||
|
||||
if (isset(self::$cssColorNames[$colour]))
|
||||
return self::getArray(self::$cssColorNames[$colour]);
|
||||
|
||||
if ($colour === "transparent")
|
||||
return "transparent";
|
||||
|
||||
$length = mb_strlen($colour);
|
||||
|
||||
// #rgb format
|
||||
if ( $length == 4 && $colour[0] === "#" ) {
|
||||
return self::getArray($colour[1].$colour[1].$colour[2].$colour[2].$colour[3].$colour[3]);
|
||||
|
||||
// #rrggbb format
|
||||
} else if ( $length == 7 && $colour[0] === "#" ) {
|
||||
return self::getArray(mb_substr($colour, 1, 6));
|
||||
|
||||
// rgb( r,g,b ) format
|
||||
} else if ( mb_strpos($colour, "rgb") !== false ) {
|
||||
$i = mb_strpos($colour, "(");
|
||||
$j = mb_strpos($colour, ")");
|
||||
|
||||
// Bad colour value
|
||||
if ($i === false || $j === false)
|
||||
return null;
|
||||
|
||||
$triplet = explode(",", mb_substr($colour, $i+1, $j-$i-1));
|
||||
|
||||
if (count($triplet) != 3)
|
||||
return null;
|
||||
|
||||
foreach (array_keys($triplet) as $c) {
|
||||
$triplet[$c] = trim($triplet[$c]);
|
||||
|
||||
if ( $triplet[$c][mb_strlen($triplet[$c]) - 1] === "%" )
|
||||
$triplet[$c] = round($triplet[$c] * 2.55);
|
||||
}
|
||||
|
||||
return self::getArray(vsprintf("%02X%02X%02X", $triplet));
|
||||
|
||||
// cmyk( c,m,y,k ) format
|
||||
// http://www.w3.org/TR/css3-gcpm/#cmyk-colors
|
||||
} else if ( mb_strpos($colour, "cmyk") !== false ) {
|
||||
$i = mb_strpos($colour, "(");
|
||||
$j = mb_strpos($colour, ")");
|
||||
|
||||
// Bad colour value
|
||||
if ($i === false || $j === false)
|
||||
return null;
|
||||
|
||||
$values = explode(",", mb_substr($colour, $i+1, $j-$i-1));
|
||||
|
||||
if (count($values) != 4)
|
||||
return null;
|
||||
|
||||
foreach ($values as &$c) {
|
||||
$c = floatval(trim($c));
|
||||
if ($c > 1.0) $c = 1.0;
|
||||
if ($c < 0.0) $c = 0.0;
|
||||
}
|
||||
|
||||
return self::getArray($values);
|
||||
}
|
||||
}
|
||||
|
||||
static function getArray($colour) {
|
||||
$c = array(null, null, null, null, "hex" => null);
|
||||
|
||||
if (is_array($colour)) {
|
||||
$c = $colour;
|
||||
$c["c"] = $c[0];
|
||||
$c["m"] = $c[1];
|
||||
$c["y"] = $c[2];
|
||||
$c["k"] = $c[3];
|
||||
$c["hex"] = "cmyk($c[0],$c[1],$c[2],$c[3])";
|
||||
}
|
||||
else {
|
||||
$c[0] = hexdec(mb_substr($colour, 0, 2)) / 0xff;
|
||||
$c[1] = hexdec(mb_substr($colour, 2, 2)) / 0xff;
|
||||
$c[2] = hexdec(mb_substr($colour, 4, 2)) / 0xff;
|
||||
$c["r"] = $c[0];
|
||||
$c["g"] = $c[1];
|
||||
$c["b"] = $c[2];
|
||||
$c["hex"] = "#$colour";
|
||||
}
|
||||
|
||||
return $c;
|
||||
}
|
||||
}
|
||||
792
pdf/include/dompdf.cls.php
Executable file
792
pdf/include/dompdf.cls.php
Executable file
@@ -0,0 +1,792 @@
|
||||
<?php
|
||||
/**
|
||||
* DOMPDF - PHP5 HTML to PDF renderer
|
||||
*
|
||||
* File: $RCSfile: dompdf.cls.php,v $
|
||||
* Created on: 2004-06-09
|
||||
*
|
||||
* Copyright (c) 2004 - Benj Carson <benjcarson@digitaljunkies.ca>
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with this library in the file LICENSE.LGPL; if not, write to the
|
||||
* Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
* 02111-1307 USA
|
||||
*
|
||||
* Alternatively, you may distribute this software under the terms of the
|
||||
* PHP License, version 3.0 or later. A copy of this license should have
|
||||
* been distributed with this file in the file LICENSE.PHP . If this is not
|
||||
* the case, you can obtain a copy at http://www.php.net/license/3_0.txt.
|
||||
*
|
||||
* The latest version of DOMPDF might be available at:
|
||||
* http://www.dompdf.com/
|
||||
*
|
||||
* @link http://www.dompdf.com/
|
||||
* @copyright 2004 Benj Carson
|
||||
* @author Benj Carson <benjcarson@digitaljunkies.ca>
|
||||
* @package dompdf
|
||||
|
||||
*/
|
||||
|
||||
/* $Id: dompdf.cls.php 362 2011-02-16 22:17:28Z fabien.menager $ */
|
||||
|
||||
/**
|
||||
* DOMPDF - PHP5 HTML to PDF renderer
|
||||
*
|
||||
* DOMPDF loads HTML and does its best to render it as a PDF. It gets its
|
||||
* name from the new DomDocument PHP5 extension. Source HTML is first
|
||||
* parsed by a DomDocument object. DOMPDF takes the resulting DOM tree and
|
||||
* attaches a {@link Frame} object to each node. {@link Frame} objects store
|
||||
* positioning and layout information and each has a reference to a {@link
|
||||
* Style} object.
|
||||
*
|
||||
* Style information is loaded and parsed (see {@link Stylesheet}) and is
|
||||
* applied to the frames in the tree by using XPath. CSS selectors are
|
||||
* converted into XPath queries, and the computed {@link Style} objects are
|
||||
* applied to the {@link Frame}s.
|
||||
*
|
||||
* {@link Frame}s are then decorated (in the design pattern sense of the
|
||||
* word) based on their CSS display property ({@link
|
||||
* http://www.w3.org/TR/CSS21/visuren.html#propdef-display}).
|
||||
* Frame_Decorators augment the basic {@link Frame} class by adding
|
||||
* additional properties and methods specific to the particular type of
|
||||
* {@link Frame}. For example, in the CSS layout model, block frames
|
||||
* (display: block;) contain line boxes that are usually filled with text or
|
||||
* other inline frames. The Block_Frame_Decorator therefore adds a $lines
|
||||
* property as well as methods to add {@link Frame}s to lines and to add
|
||||
* additional lines. {@link Frame}s also are attached to specific
|
||||
* Positioner and {@link Frame_Reflower} objects that contain the
|
||||
* positioining and layout algorithm for a specific type of frame,
|
||||
* respectively. This is an application of the Strategy pattern.
|
||||
*
|
||||
* Layout, or reflow, proceeds recursively (post-order) starting at the root
|
||||
* of the document. Space constraints (containing block width & height) are
|
||||
* pushed down, and resolved positions and sizes bubble up. Thus, every
|
||||
* {@link Frame} in the document tree is traversed once (except for tables
|
||||
* which use a two-pass layout algorithm). If you are interested in the
|
||||
* details, see the reflow() method of the Reflower classes.
|
||||
*
|
||||
* Rendering is relatively straightforward once layout is complete. {@link
|
||||
* Frame}s are rendered using an adapted {@link Cpdf} class, originally
|
||||
* written by Wayne Munro, http://www.ros.co.nz/pdf/. (Some performance
|
||||
* related changes have been made to the original {@link Cpdf} class, and
|
||||
* the {@link CPDF_Adapter} class provides a simple, stateless interface to
|
||||
* PDF generation.) PDFLib support has now also been added, via the {@link
|
||||
* PDFLib_Adapter}.
|
||||
*
|
||||
*
|
||||
* @package dompdf
|
||||
*/
|
||||
class DOMPDF {
|
||||
|
||||
/**
|
||||
* DomDocument representing the HTML document
|
||||
*
|
||||
* @var DomDocument
|
||||
*/
|
||||
protected $_xml;
|
||||
|
||||
/**
|
||||
* Frame_Tree derived from the DOM tree
|
||||
*
|
||||
* @var Frame_Tree
|
||||
*/
|
||||
protected $_tree;
|
||||
|
||||
/**
|
||||
* Stylesheet for the document
|
||||
*
|
||||
* @var Stylesheet
|
||||
*/
|
||||
protected $_css;
|
||||
|
||||
/**
|
||||
* Actual PDF renderer
|
||||
*
|
||||
* @var Canvas
|
||||
*/
|
||||
protected $_pdf;
|
||||
|
||||
/**
|
||||
* Desired paper size ('letter', 'legal', 'A4', etc.)
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $_paper_size;
|
||||
|
||||
/**
|
||||
* Paper orientation ('portrait' or 'landscape')
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $_paper_orientation;
|
||||
|
||||
/**
|
||||
* Callbacks on new page and new element
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $_callbacks;
|
||||
|
||||
/**
|
||||
* Experimental caching capability
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
private $_cache_id;
|
||||
|
||||
/**
|
||||
* Base hostname
|
||||
*
|
||||
* Used for relative paths/urls
|
||||
* @var string
|
||||
*/
|
||||
protected $_base_host;
|
||||
|
||||
/**
|
||||
* Absolute base path
|
||||
*
|
||||
* Used for relative paths/urls
|
||||
* @var string
|
||||
*/
|
||||
protected $_base_path;
|
||||
|
||||
/**
|
||||
* Protcol used to request file (file://, http://, etc)
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $_protocol;
|
||||
|
||||
/**
|
||||
* Timestamp of the script start time
|
||||
*
|
||||
* @var int
|
||||
*/
|
||||
private $_start_time = null;
|
||||
|
||||
/**
|
||||
* @var string The system's locale
|
||||
*/
|
||||
private $_system_locale = null;
|
||||
|
||||
/**
|
||||
* @var bool Tells if the system's locale is the C standard one
|
||||
*/
|
||||
private $_locale_standard = false;
|
||||
|
||||
/**
|
||||
* Class constructor
|
||||
*/
|
||||
function __construct() {
|
||||
$this->_locale_standard = sprintf('%.1f', 1.0) == '1.0';
|
||||
|
||||
$this->save_locale();
|
||||
|
||||
$this->_messages = array();
|
||||
$this->_xml = new DOMDocument();
|
||||
$this->_xml->preserveWhiteSpace = true;
|
||||
$this->_tree = new Frame_Tree($this->_xml);
|
||||
$this->_css = new Stylesheet();
|
||||
$this->_pdf = null;
|
||||
$this->_paper_size = "letter";
|
||||
$this->_paper_orientation = "portrait";
|
||||
$this->_base_protocol = "";
|
||||
$this->_base_host = "";
|
||||
$this->_base_path = "";
|
||||
$this->_callbacks = array();
|
||||
$this->_cache_id = null;
|
||||
|
||||
$this->restore_locale();
|
||||
}
|
||||
|
||||
/**
|
||||
* Class destructor
|
||||
*/
|
||||
function __destruct() {
|
||||
clear_object($this);
|
||||
}
|
||||
|
||||
/**
|
||||
* Save the system's locale configuration and
|
||||
* set the right value for numeric formatting
|
||||
*/
|
||||
private function save_locale() {
|
||||
if ( $this->_locale_standard ) return;
|
||||
|
||||
$this->_system_locale = setlocale(LC_NUMERIC, "C");
|
||||
}
|
||||
|
||||
/**
|
||||
* Restore the system's locale configuration
|
||||
*/
|
||||
private function restore_locale() {
|
||||
if ( $this->_locale_standard ) return;
|
||||
|
||||
setlocale(LC_NUMERIC, $this->_system_locale);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the underlying {@link Frame_Tree} object
|
||||
*
|
||||
* @return Frame_Tree
|
||||
*/
|
||||
function get_tree() { return $this->_tree; }
|
||||
|
||||
/**
|
||||
* Sets the protocol to use
|
||||
* FIXME validate these
|
||||
*
|
||||
* @param string $proto
|
||||
*/
|
||||
function set_protocol($proto) { $this->_protocol = $proto; }
|
||||
|
||||
/**
|
||||
* Sets the base hostname
|
||||
*
|
||||
* @param string $host
|
||||
*/
|
||||
function set_host($host) { $this->_base_host = $host; }
|
||||
|
||||
/**
|
||||
* Sets the base path
|
||||
*
|
||||
* @param string $path
|
||||
*/
|
||||
function set_base_path($path) { $this->_base_path = $path; }
|
||||
|
||||
/**
|
||||
* Returns the protocol in use
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
function get_protocol() { return $this->_protocol; }
|
||||
|
||||
/**
|
||||
* Returns the base hostname
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
function get_host() { return $this->_base_host; }
|
||||
|
||||
/**
|
||||
* Returns the base path
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
function get_base_path() { return $this->_base_path; }
|
||||
|
||||
/**
|
||||
* Return the underlying Canvas instance (e.g. CPDF_Adapter, GD_Adapter)
|
||||
*
|
||||
* @return Canvas
|
||||
*/
|
||||
function get_canvas() { return $this->_pdf; }
|
||||
|
||||
/**
|
||||
* Returns the callbacks array
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
function get_callbacks() { return $this->_callbacks; }
|
||||
|
||||
/**
|
||||
* Loads an HTML file
|
||||
*
|
||||
* Parse errors are stored in the global array _dompdf_warnings.
|
||||
*
|
||||
* @param string $file a filename or url to load
|
||||
*/
|
||||
function load_html_file($file) {
|
||||
$this->save_locale();
|
||||
|
||||
// Store parsing warnings as messages (this is to prevent output to the
|
||||
// browser if the html is ugly and the dom extension complains,
|
||||
// preventing the pdf from being streamed.)
|
||||
if ( !$this->_protocol && !$this->_base_host && !$this->_base_path )
|
||||
list($this->_protocol, $this->_base_host, $this->_base_path) = explode_url($file);
|
||||
|
||||
if ( !DOMPDF_ENABLE_REMOTE &&
|
||||
($this->_protocol != "" && $this->_protocol !== "file://" ) )
|
||||
throw new DOMPDF_Exception("Remote file requested, but DOMPDF_ENABLE_REMOTE is false.");
|
||||
|
||||
if ($this->_protocol == "" || $this->_protocol === "file://") {
|
||||
|
||||
$realfile = realpath($file);
|
||||
if ( !$file )
|
||||
throw new DOMPDF_Exception("File '$file' not found.");
|
||||
|
||||
if ( strpos($realfile, DOMPDF_CHROOT) !== 0 )
|
||||
throw new DOMPDF_Exception("Permission denied on $file.");
|
||||
|
||||
// Exclude dot files (e.g. .htaccess)
|
||||
if ( substr(basename($realfile),0,1) === "." )
|
||||
throw new DOMPDF_Exception("Permission denied on $file.");
|
||||
|
||||
$file = $realfile;
|
||||
}
|
||||
|
||||
$contents = file_get_contents($file);
|
||||
$encoding = null;
|
||||
|
||||
// See http://the-stickman.com/web-development/php/getting-http-response-headers-when-using-file_get_contents/
|
||||
if ( isset($http_response_header) ) {
|
||||
foreach($http_response_header as $_header) {
|
||||
if ( preg_match("@Content-Type:\s*[\w/]+;\s*?charset=([^\s]+)@i", $_header, $matches) ) {
|
||||
$encoding = strtoupper($matches[1]);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$this->restore_locale();
|
||||
|
||||
$this->load_html($contents, $encoding);
|
||||
}
|
||||
|
||||
/**
|
||||
* Loads an HTML string
|
||||
*
|
||||
* Parse errors are stored in the global array _dompdf_warnings.
|
||||
*
|
||||
* @param string $str HTML text to load
|
||||
*/
|
||||
function load_html($str, $encoding = null) {
|
||||
$this->save_locale();
|
||||
|
||||
// TODO: use the $encoding variable
|
||||
// FIXME: Determine character encoding, switch to UTF8, update meta tag. Need better http/file stream encoding detection, currently relies on text or meta tag.
|
||||
mb_detect_order('auto');
|
||||
|
||||
if (mb_detect_encoding($str) !== 'UTF-8') {
|
||||
$metatags = array(
|
||||
'@<meta\s+http-equiv="Content-Type"\s+content="(?:[\w/]+)(?:;\s*?charset=([^\s"]+))?@i',
|
||||
'@<meta\s+content="(?:[\w/]+)(?:;\s*?charset=([^\s"]+))"?\s+http-equiv="Content-Type"@i',
|
||||
);
|
||||
|
||||
foreach($metatags as $metatag) {
|
||||
if (preg_match($metatag, $str, $matches)) break;
|
||||
}
|
||||
|
||||
if (mb_detect_encoding($str) == '') {
|
||||
if (isset($matches[1])) {
|
||||
$encoding = strtoupper($matches[1]);
|
||||
} else {
|
||||
$encoding = 'UTF-8';
|
||||
}
|
||||
} else {
|
||||
if (isset($matches[1])) {
|
||||
$encoding = strtoupper($matches[1]);
|
||||
} else {
|
||||
$encoding = 'auto';
|
||||
}
|
||||
}
|
||||
|
||||
if ($encoding !== 'UTF-8') {
|
||||
$str = mb_convert_encoding($str, 'UTF-8', $encoding);
|
||||
}
|
||||
|
||||
if (isset($matches[1])) {
|
||||
$str = preg_replace('/charset=([^\s"]+)/i','charset=UTF-8', $str);
|
||||
} else {
|
||||
$str = str_replace('<head>', '<head><meta http-equiv="Content-Type" content="text/html;charset=UTF-8">', $str);
|
||||
}
|
||||
}
|
||||
|
||||
// Parse embedded php, first-pass
|
||||
if ( DOMPDF_ENABLE_PHP ) {
|
||||
ob_start();
|
||||
eval("?" . ">$str");
|
||||
$str = ob_get_clean();
|
||||
}
|
||||
|
||||
// if the document contains non utf-8 with a utf-8 meta tag chars and was
|
||||
// detected as utf-8 by mbstring, problems could happen.
|
||||
// http://devzone.zend.com/article/8855
|
||||
if ( $encoding === 'UTF-8' ) {
|
||||
$str = preg_replace("/<meta([^>]+)>/", "", $str);
|
||||
}
|
||||
|
||||
// Store parsing warnings as messages
|
||||
set_error_handler("record_warnings");
|
||||
$this->_xml->loadHTML($str);
|
||||
restore_error_handler();
|
||||
|
||||
/**
|
||||
@todo Take the quirksmode into account
|
||||
// http://hsivonen.iki.fi/doctype/
|
||||
// https://developer.mozilla.org/en/mozilla's_quirks_mode
|
||||
$quirksmode = false;
|
||||
|
||||
// HTML5 <!DOCTYPE html>
|
||||
if ( !$this->_xml->doctype->publicId && !$this->_xml->doctype->systemId ) {
|
||||
$quirksmode = false;
|
||||
}
|
||||
|
||||
// not XHTML
|
||||
if ( !preg_match("/xhtml/i", $this->_xml->doctype->publicId) ) {
|
||||
$quirksmode = true;
|
||||
}
|
||||
*/
|
||||
|
||||
$this->restore_locale();
|
||||
}
|
||||
|
||||
/**
|
||||
* Builds the {@link Frame_Tree}, loads any CSS and applies the styles to
|
||||
* the {@link Frame_Tree}
|
||||
*/
|
||||
protected function _process_html() {
|
||||
$this->save_locale();
|
||||
|
||||
$this->_tree->build_tree();
|
||||
|
||||
$this->_css->load_css_file(Stylesheet::DEFAULT_STYLESHEET);
|
||||
|
||||
$acceptedmedia = Stylesheet::$ACCEPTED_GENERIC_MEDIA_TYPES;
|
||||
if ( defined("DOMPDF_DEFAULT_MEDIA_TYPE") ) {
|
||||
$acceptedmedia[] = DOMPDF_DEFAULT_MEDIA_TYPE;
|
||||
} else {
|
||||
$acceptedmedia[] = Stylesheet::$ACCEPTED_DEFAULT_MEDIA_TYPE;
|
||||
}
|
||||
|
||||
// load <link rel="STYLESHEET" ... /> tags
|
||||
$links = $this->_xml->getElementsByTagName("link");
|
||||
foreach ($links as $link) {
|
||||
if ( mb_strtolower($link->getAttribute("rel")) === "stylesheet" ||
|
||||
mb_strtolower($link->getAttribute("type")) === "text/css" ) {
|
||||
//Check if the css file is for an accepted media type
|
||||
//media not given then always valid
|
||||
$formedialist = preg_split("/[\s\n,]/", $link->getAttribute("media"),-1, PREG_SPLIT_NO_EMPTY);
|
||||
if ( count($formedialist) > 0 ) {
|
||||
$accept = false;
|
||||
foreach ( $formedialist as $type ) {
|
||||
if ( in_array(mb_strtolower(trim($type)), $acceptedmedia) ) {
|
||||
$accept = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
if (!$accept) {
|
||||
//found at least one mediatype, but none of the accepted ones
|
||||
//Skip this css file.
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
$url = $link->getAttribute("href");
|
||||
$url = build_url($this->_protocol, $this->_base_host, $this->_base_path, $url);
|
||||
|
||||
$this->_css->load_css_file($url);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// load <style> tags
|
||||
$styles = $this->_xml->getElementsByTagName("style");
|
||||
foreach ($styles as $style) {
|
||||
|
||||
// Accept all <style> tags by default (note this is contrary to W3C
|
||||
// HTML 4.0 spec:
|
||||
// http://www.w3.org/TR/REC-html40/present/styles.html#adef-media
|
||||
// which states that the default media type is 'screen'
|
||||
if ( $style->hasAttributes() &&
|
||||
($media = $style->getAttribute("media")) &&
|
||||
!in_array($media, $acceptedmedia) )
|
||||
continue;
|
||||
|
||||
$css = "";
|
||||
if ( $style->hasChildNodes() ) {
|
||||
|
||||
$child = $style->firstChild;
|
||||
while ( $child ) {
|
||||
$css .= $child->nodeValue; // Handle <style><!-- blah --></style>
|
||||
$child = $child->nextSibling;
|
||||
}
|
||||
|
||||
} else
|
||||
$css = $style->nodeValue;
|
||||
|
||||
// Set the base path of the Stylesheet to that of the file being processed
|
||||
$this->_css->set_protocol($this->_protocol);
|
||||
$this->_css->set_host($this->_base_host);
|
||||
$this->_css->set_base_path($this->_base_path);
|
||||
|
||||
$this->_css->load_css($css);
|
||||
}
|
||||
|
||||
$this->restore_locale();
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the paper size & orientation
|
||||
*
|
||||
* @param string $size 'letter', 'legal', 'A4', etc. {@link CPDF_Adapter::$PAPER_SIZES}
|
||||
* @param string $orientation 'portrait' or 'landscape'
|
||||
*/
|
||||
function set_paper($size, $orientation = "portrait") {
|
||||
$this->_paper_size = $size;
|
||||
$this->_paper_orientation = $orientation;
|
||||
}
|
||||
|
||||
/**
|
||||
* Enable experimental caching capability
|
||||
* @access private
|
||||
*/
|
||||
function enable_caching($cache_id) {
|
||||
$this->_cache_id = $cache_id;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets callbacks for events like rendering of pages and elements.
|
||||
* The callbacks array contains arrays with 'event' set to 'begin_page',
|
||||
* 'end_page', 'begin_frame', or 'end_frame' and 'f' set to a function or
|
||||
* object plus method to be called.
|
||||
*
|
||||
* The function 'f' must take an array as argument, which contains info
|
||||
* about the event.
|
||||
*
|
||||
* @param array $callbacks the set of callbacks to set
|
||||
*/
|
||||
function set_callbacks($callbacks) {
|
||||
if (is_array($callbacks)) {
|
||||
$this->_callbacks = array();
|
||||
foreach ($callbacks as $c) {
|
||||
if (is_array($c) && isset($c['event']) && isset($c['f'])) {
|
||||
$event = $c['event'];
|
||||
$f = $c['f'];
|
||||
if (is_callable($f) && is_string($event)) {
|
||||
$this->_callbacks[$event][] = $f;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Renders the HTML to PDF
|
||||
*/
|
||||
function render() {
|
||||
$this->save_locale();
|
||||
|
||||
if ( DOMPDF_LOG_OUTPUT_FILE ) {
|
||||
if ( !file_exists(DOMPDF_LOG_OUTPUT_FILE) && is_writable(dirname(DOMPDF_LOG_OUTPUT_FILE)) ) {
|
||||
touch(DOMPDF_LOG_OUTPUT_FILE);
|
||||
}
|
||||
|
||||
$this->_start_time = microtime(true);
|
||||
ob_start();
|
||||
}
|
||||
|
||||
//enable_mem_profile();
|
||||
|
||||
$this->_process_html();
|
||||
|
||||
$this->_css->apply_styles($this->_tree);
|
||||
|
||||
$root = null;
|
||||
|
||||
foreach ($this->_tree->get_frames() as $frame) {
|
||||
// Set up the root frame
|
||||
|
||||
if ( is_null($root) ) {
|
||||
$root = Frame_Factory::decorate_root( $this->_tree->get_root(), $this );
|
||||
continue;
|
||||
}
|
||||
|
||||
// Create the appropriate decorators, reflowers & positioners.
|
||||
$deco = Frame_Factory::decorate_frame($frame, $this);
|
||||
$deco->set_root($root);
|
||||
|
||||
// FIXME: handle generated content
|
||||
if ( $frame->get_style()->display === "list-item" ) {
|
||||
|
||||
// Insert a list-bullet frame
|
||||
$node = $this->_xml->createElement("bullet"); // arbitrary choice
|
||||
$b_f = new Frame($node);
|
||||
|
||||
$parent_node = $frame->get_parent()->get_node();
|
||||
|
||||
if ( !$parent_node->hasAttribute("dompdf-children-count") ) {
|
||||
$count = 0;
|
||||
foreach ($parent_node->childNodes as $_node) {
|
||||
if ( $_node instanceof DOMElement )
|
||||
$count++;
|
||||
}
|
||||
$parent_node->setAttribute("dompdf-children-count", $count);
|
||||
}
|
||||
|
||||
$index = 0;
|
||||
if ( !$parent_node->hasAttribute("dompdf-counter") ) {
|
||||
$index = 1;
|
||||
$parent_node->setAttribute("dompdf-counter", 1);
|
||||
}
|
||||
else {
|
||||
$index = $parent_node->getAttribute("dompdf-counter");
|
||||
$index++;
|
||||
$parent_node->setAttribute("dompdf-counter", $index);
|
||||
}
|
||||
|
||||
$node->setAttribute("dompdf-counter", $index);
|
||||
$style = $this->_css->create_style();
|
||||
$style->display = "-dompdf-list-bullet";
|
||||
$style->inherit($frame->get_style());
|
||||
$b_f->set_style($style);
|
||||
|
||||
$deco->prepend_child( Frame_Factory::decorate_frame($b_f, $this) );
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
$page_style = $this->_css->get_page_style();
|
||||
|
||||
if ( $page_style && is_array($page_style->size) ) {
|
||||
$this->set_paper(array(0, 0, $page_style->size[0], $page_style->size[1]));
|
||||
}
|
||||
|
||||
$this->_pdf = Canvas_Factory::get_instance($this->_paper_size, $this->_paper_orientation);
|
||||
|
||||
// Add meta information
|
||||
$title = $this->_xml->getElementsByTagName("title");
|
||||
if ( $title->length ) {
|
||||
$this->_pdf->add_info("Title", trim($title->item(0)->nodeValue));
|
||||
}
|
||||
|
||||
$metas = $this->_xml->getElementsByTagName("meta");
|
||||
$labels = array(
|
||||
"author" => "Author",
|
||||
"keywords" => "Keywords",
|
||||
"description" => "Subject",
|
||||
);
|
||||
foreach($metas as $meta) {
|
||||
$name = mb_strtolower($meta->getAttribute("name"));
|
||||
if ( isset($labels[$name]) ) {
|
||||
$this->_pdf->add_info($labels[$name], trim($meta->getAttribute("content")));
|
||||
}
|
||||
}
|
||||
|
||||
$root->set_containing_block(0, 0, $this->_pdf->get_width(), $this->_pdf->get_height());
|
||||
$root->set_renderer(new Renderer($this));
|
||||
|
||||
// This is where the magic happens:
|
||||
$root->reflow();
|
||||
|
||||
// Clean up cached images
|
||||
Image_Cache::clear();
|
||||
|
||||
global $_dompdf_warnings, $_dompdf_show_warnings;
|
||||
if ( $_dompdf_show_warnings ) {
|
||||
echo '<b>DOMPDF Warnings</b><br><pre>';
|
||||
foreach ($_dompdf_warnings as $msg)
|
||||
echo $msg . "\n";
|
||||
echo $this->get_canvas()->get_cpdf()->messages;
|
||||
echo '</pre>';
|
||||
flush();
|
||||
}
|
||||
|
||||
$this->restore_locale();
|
||||
}
|
||||
|
||||
/**
|
||||
* Add meta information to the PDF after rendering
|
||||
*/
|
||||
function add_info($label, $value) {
|
||||
if (!is_null($this->_pdf))
|
||||
$this->_pdf->add_info($label, $value);
|
||||
}
|
||||
|
||||
/**
|
||||
* Writes the output buffer in the log file
|
||||
* @return void
|
||||
*/
|
||||
private function write_log() {
|
||||
if ( !DOMPDF_LOG_OUTPUT_FILE || !is_writable(DOMPDF_LOG_OUTPUT_FILE) ) return;
|
||||
|
||||
$memory = DOMPDF_memory_usage();
|
||||
$memory = number_format($memory/1024);
|
||||
$time = number_format((microtime(true) - $this->_start_time) * 1000, 4);
|
||||
|
||||
$out = "<span style='color: #900'>$memory KB</span> ".
|
||||
"<span style='color: #090'>$time ms</span><br />";
|
||||
|
||||
$out .= ob_get_clean();
|
||||
file_put_contents(DOMPDF_LOG_OUTPUT_FILE, $out);
|
||||
}
|
||||
|
||||
/**
|
||||
* Streams the PDF to the client
|
||||
*
|
||||
* The file will open a download dialog by default. The options
|
||||
* parameter controls the output. Accepted options are:
|
||||
*
|
||||
* 'Accept-Ranges' => 1 or 0 - if this is not set to 1, then this
|
||||
* header is not included, off by default this header seems to
|
||||
* have caused some problems despite the fact that it is supposed
|
||||
* to solve them, so I am leaving it off by default.
|
||||
*
|
||||
* 'compress' = > 1 or 0 - apply content stream compression, this is
|
||||
* on (1) by default
|
||||
*
|
||||
* 'Attachment' => 1 or 0 - if 1, force the browser to open a
|
||||
* download dialog, on (1) by default
|
||||
*
|
||||
* @param string $filename the name of the streamed file
|
||||
* @param array $options header options (see above)
|
||||
*/
|
||||
function stream($filename, $options = null) {
|
||||
$this->save_locale();
|
||||
|
||||
$this->write_log();
|
||||
|
||||
if (!is_null($this->_pdf))
|
||||
$this->_pdf->stream($filename, $options);
|
||||
|
||||
$this->restore_locale();
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the PDF as a string
|
||||
*
|
||||
* The file will open a download dialog by default. The options
|
||||
* parameter controls the output. Accepted options are:
|
||||
*
|
||||
*
|
||||
* 'compress' = > 1 or 0 - apply content stream compression, this is
|
||||
* on (1) by default
|
||||
*
|
||||
*
|
||||
* @param array $options options (see above)
|
||||
* @return string
|
||||
*/
|
||||
function output($options = null) {
|
||||
$this->save_locale();
|
||||
|
||||
$this->write_log();
|
||||
|
||||
if ( is_null($this->_pdf) )
|
||||
return null;
|
||||
|
||||
$output = $this->_pdf->output( $options );
|
||||
|
||||
$this->restore_locale();
|
||||
|
||||
return $output;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the underlying HTML document as a string
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
function output_html() {
|
||||
return $this->_xml->saveHTML();
|
||||
}
|
||||
}
|
||||
60
pdf/include/dompdf_exception.cls.php
Executable file
60
pdf/include/dompdf_exception.cls.php
Executable file
@@ -0,0 +1,60 @@
|
||||
<?php
|
||||
/**
|
||||
* DOMPDF - PHP5 HTML to PDF renderer
|
||||
*
|
||||
* File: $RCSfile: dompdf_exception.cls.php,v $
|
||||
* Created on: 2004-08-07
|
||||
*
|
||||
* Copyright (c) 2004 - Benj Carson <benjcarson@digitaljunkies.ca>
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with this library in the file LICENSE.LGPL; if not, write to the
|
||||
* Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
* 02111-1307 USA
|
||||
*
|
||||
* Alternatively, you may distribute this software under the terms of the
|
||||
* PHP License, version 3.0 or later. A copy of this license should have
|
||||
* been distributed with this file in the file LICENSE.PHP . If this is not
|
||||
* the case, you can obtain a copy at http://www.php.net/license/3_0.txt.
|
||||
*
|
||||
* The latest version of DOMPDF might be available at:
|
||||
* http://www.dompdf.com/
|
||||
*
|
||||
* @link http://www.dompdf.com/
|
||||
* @copyright 2004 Benj Carson
|
||||
* @author Benj Carson <benjcarson@digitaljunkies.ca>
|
||||
* @package dompdf
|
||||
|
||||
*/
|
||||
|
||||
/* $Id: dompdf_exception.cls.php 216 2010-03-11 22:49:18Z ryan.masten $ */
|
||||
|
||||
/**
|
||||
* Standard exception thrown by DOMPDF classes
|
||||
*
|
||||
* @link http://www.zend.com/php5/articles/engine2-php5-changes.php#Heading12
|
||||
* @package dompdf
|
||||
*/
|
||||
class DOMPDF_Exception extends Exception {
|
||||
|
||||
/**
|
||||
* Class constructor
|
||||
*
|
||||
* @param string $message Error message
|
||||
* @param int $code Error code
|
||||
*/
|
||||
function __construct($message = NULL, $code = 0) {
|
||||
parent::__construct($message, $code);
|
||||
}
|
||||
|
||||
}
|
||||
59
pdf/include/dompdf_internal_exception.cls.php
Executable file
59
pdf/include/dompdf_internal_exception.cls.php
Executable file
@@ -0,0 +1,59 @@
|
||||
<?php
|
||||
/**
|
||||
* DOMPDF - PHP5 HTML to PDF renderer
|
||||
*
|
||||
* File: $RCSfile: dompdf_internal_exception.cls.php,v $
|
||||
* Created on: 2004-08-07
|
||||
*
|
||||
* Copyright (c) 2004 - Benj Carson <benjcarson@digitaljunkies.ca>
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with this library in the file LICENSE.LGPL; if not, write to the
|
||||
* Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
* 02111-1307 USA
|
||||
*
|
||||
* Alternatively, you may distribute this software under the terms of the
|
||||
* PHP License, version 3.0 or later. A copy of this license should have
|
||||
* been distributed with this file in the file LICENSE.PHP . If this is not
|
||||
* the case, you can obtain a copy at http://www.php.net/license/3_0.txt.
|
||||
*
|
||||
* The latest version of DOMPDF might be available at:
|
||||
* http://www.dompdf.com/
|
||||
*
|
||||
* @link http://www.dompdf.com/
|
||||
* @copyright 2004 Benj Carson
|
||||
* @author Benj Carson <benjcarson@digitaljunkies.ca>
|
||||
* @package dompdf
|
||||
|
||||
*/
|
||||
|
||||
/* $Id: dompdf_internal_exception.cls.php 216 2010-03-11 22:49:18Z ryan.masten $ */
|
||||
|
||||
/**
|
||||
* Exception thrown by DOMPDF classes for internal errors
|
||||
*
|
||||
* @package dompdf
|
||||
*/
|
||||
class DOMPDF_Internal_Exception extends Exception {
|
||||
|
||||
/**
|
||||
* Class constructor
|
||||
*
|
||||
* @param string $message Error message
|
||||
* @param int $code Error code
|
||||
*/
|
||||
function __construct($message = NULL, $code = 0) {
|
||||
parent::__construct($message, $code);
|
||||
}
|
||||
|
||||
}
|
||||
40
pdf/include/file.skel
Executable file
40
pdf/include/file.skel
Executable file
@@ -0,0 +1,40 @@
|
||||
<?php
|
||||
/**
|
||||
* DOMPDF - PHP5 HTML to PDF renderer
|
||||
*
|
||||
* File: $RCSfile: file.skel,v $
|
||||
* Created on: 2004-08-04
|
||||
*
|
||||
* Copyright (c) 2004 - Benj Carson <benjcarson@digitaljunkies.ca>
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with this library in the file LICENSE.LGPL; if not, write to the
|
||||
* Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
* 02111-1307 USA
|
||||
*
|
||||
* Alternatively, you may distribute this software under the terms of the
|
||||
* PHP License, version 3.0 or later. A copy of this license should have
|
||||
* been distributed with this file in the file LICENSE.PHP . If this is not
|
||||
* the case, you can obtain a copy at http://www.php.net/license/3_0.txt.
|
||||
*
|
||||
* The latest version of DOMPDF might be available at:
|
||||
* http://www.dompdf.com/
|
||||
*
|
||||
* @link http://www.dompdf.com/
|
||||
* @copyright 2004 Benj Carson
|
||||
* @author Benj Carson <benjcarson@digitaljunkies.ca>
|
||||
* @package dompdf
|
||||
* @version 0.3
|
||||
*/
|
||||
|
||||
/* $Id: file.skel 216 2010-03-11 22:49:18Z ryan.masten $ */
|
||||
117
pdf/include/fixed_positioner.cls.php
Executable file
117
pdf/include/fixed_positioner.cls.php
Executable file
@@ -0,0 +1,117 @@
|
||||
<?php
|
||||
/**
|
||||
* DOMPDF - PHP5 HTML to PDF renderer
|
||||
*
|
||||
* File: $RCSfile: absolute_positioner.cls.php,v $
|
||||
* Created on: 2004-06-08
|
||||
*
|
||||
* Copyright (c) 2004 - Benj Carson <benjcarson@digitaljunkies.ca>
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with this library in the file LICENSE.LGPL; if not, write to the
|
||||
* Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
* 02111-1307 USA
|
||||
*
|
||||
* Alternatively, you may distribute this software under the terms of the
|
||||
* PHP License, version 3.0 or later. A copy of this license should have
|
||||
* been distributed with this file in the file LICENSE.PHP . If this is not
|
||||
* the case, you can obtain a copy at http://www.php.net/license/3_0.txt.
|
||||
*
|
||||
* The latest version of DOMPDF might be available at:
|
||||
* http://www.dompdf.com/
|
||||
*
|
||||
* @link http://www.dompdf.com/
|
||||
* @copyright 2004 Benj Carson
|
||||
* @author Benj Carson <benjcarson@digitaljunkies.ca>
|
||||
* @package dompdf
|
||||
*/
|
||||
|
||||
/* $Id */
|
||||
|
||||
/**
|
||||
* Positions fixely positioned frames
|
||||
*/
|
||||
class Fixed_Positioner extends Positioner {
|
||||
|
||||
function __construct(Frame_Decorator $frame) { parent::__construct($frame); }
|
||||
|
||||
function position() {
|
||||
|
||||
$frame = $this->_frame;
|
||||
$style = $frame->get_original_style();
|
||||
$root = $frame->get_root();
|
||||
$initialcb = $root->get_containing_block();
|
||||
$initialcb_style = $root->get_style();
|
||||
|
||||
$p = $frame->find_block_parent();
|
||||
if ( $p ) {
|
||||
$p->add_line();
|
||||
}
|
||||
|
||||
// Compute the margins of the @page style
|
||||
$margin_top = $initialcb_style->length_in_pt($initialcb_style->margin_top, $initialcb["h"]);
|
||||
$margin_right = $initialcb_style->length_in_pt($initialcb_style->margin_right, $initialcb["w"]);
|
||||
$margin_bottom = $initialcb_style->length_in_pt($initialcb_style->margin_bottom, $initialcb["h"]);
|
||||
$margin_left = $initialcb_style->length_in_pt($initialcb_style->margin_left, $initialcb["w"]);
|
||||
|
||||
// The needed computed style of the element
|
||||
$height = $style->length_in_pt($style->height, $initialcb["h"]);
|
||||
$width = $style->length_in_pt($style->width, $initialcb["w"]);
|
||||
|
||||
$top = $style->length_in_pt($style->top, $initialcb["h"]);
|
||||
$right = $style->length_in_pt($style->right, $initialcb["w"]);
|
||||
$bottom = $style->length_in_pt($style->bottom, $initialcb["h"]);
|
||||
$left = $style->length_in_pt($style->left, $initialcb["w"]);
|
||||
|
||||
$y = $margin_top;
|
||||
if ( isset($top) ) {
|
||||
$y = $top + $margin_top;
|
||||
if ( $top === "auto" ) {
|
||||
$y = $margin_top;
|
||||
if ( isset($bottom) && $bottom !== "auto" ) {
|
||||
$y = $initialcb["h"] - $bottom - $margin_bottom;
|
||||
$margin_height = $this->_frame->get_margin_height();
|
||||
if ( $margin_height !== "auto" ) {
|
||||
$y -= $margin_height;
|
||||
} else {
|
||||
$y -= $height;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$x = $margin_left;
|
||||
if ( isset($left) ) {
|
||||
$x = $left + $margin_left;
|
||||
if ( $left === "auto" ) {
|
||||
$x = $margin_left;
|
||||
if ( isset($right) && $right !== "auto" ) {
|
||||
$x = $initialcb["w"] - $right - $margin_right;
|
||||
$margin_width = $this->_frame->get_margin_width();
|
||||
if ( $margin_width !== "auto" ) {
|
||||
$x -= $margin_width;
|
||||
} else {
|
||||
$x -= $width;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$frame->set_position($x, $y);
|
||||
|
||||
$children = $frame->get_children();
|
||||
foreach($children as $child) {
|
||||
$child->set_position($x, $y);
|
||||
}
|
||||
}
|
||||
}
|
||||
299
pdf/include/font_metrics.cls.php
Executable file
299
pdf/include/font_metrics.cls.php
Executable file
@@ -0,0 +1,299 @@
|
||||
<?php
|
||||
/**
|
||||
* DOMPDF - PHP5 HTML to PDF renderer
|
||||
*
|
||||
* File: $RCSfile: font_metrics.cls.php,v $
|
||||
* Created on: 2004-06-02
|
||||
*
|
||||
* Copyright (c) 2004 - Benj Carson <benjcarson@digitaljunkies.ca>
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with this library in the file LICENSE.LGPL; if not, write to the
|
||||
* Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
* 02111-1307 USA
|
||||
*
|
||||
* Alternatively, you may distribute this software under the terms of the
|
||||
* PHP License, version 3.0 or later. A copy of this license should have
|
||||
* been distributed with this file in the file LICENSE.PHP . If this is not
|
||||
* the case, you can obtain a copy at http://www.php.net/license/3_0.txt.
|
||||
*
|
||||
* The latest version of DOMPDF might be available at:
|
||||
* http://www.dompdf.com/
|
||||
*
|
||||
* @link http://www.dompdf.com/
|
||||
* @copyright 2004 Benj Carson
|
||||
* @author Benj Carson <benjcarson@digitaljunkies.ca>
|
||||
* @contributor Helmut Tischer <htischer@weihenstephan.org>
|
||||
* @package dompdf
|
||||
*
|
||||
* Changes
|
||||
* @contributor Helmut Tischer <htischer@weihenstephan.org>
|
||||
* @version 0.5.1.htischer.20090507
|
||||
* - On missing font on explicite font selection don't change subtype and don't return default font.
|
||||
* - On requesting default font and missing subtype, check similar subtypes, then any subtype, then normal. The last must exist.
|
||||
* - Add comments
|
||||
*/
|
||||
|
||||
/* $Id: font_metrics.cls.php 355 2011-01-27 07:44:54Z fabien.menager $ */
|
||||
|
||||
require_once(DOMPDF_LIB_DIR . "/class.pdf.php");
|
||||
|
||||
/**
|
||||
* Name of the font cache file
|
||||
*
|
||||
* This file must be writable by the webserver process only to update it
|
||||
* with save_font_families() after adding the .afm file references of a new font family
|
||||
* with Font_Metrics::save_font_families().
|
||||
* This is typically done only from command line with load_font.php on converting
|
||||
* ttf fonts to afm with an external tool referenced in the define _TTF2AFM
|
||||
*
|
||||
* Declared here because PHP5 prevents constants from being declared with expressions
|
||||
*/
|
||||
if (!defined("__DOMPDF_FONT_CACHE_FILE")) {
|
||||
if (file_exists(DOMPDF_FONT_DIR . "dompdf_font_family_cache")) {
|
||||
define('__DOMPDF_FONT_CACHE_FILE', DOMPDF_FONT_DIR . "dompdf_font_family_cache");
|
||||
} else {
|
||||
define('__DOMPDF_FONT_CACHE_FILE', DOMPDF_FONT_DIR . "dompdf_font_family_cache.dist.php");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* The font metrics class
|
||||
*
|
||||
* This class provides information about fonts and text. It can resolve
|
||||
* font names into actual installed font files, as well as determine the
|
||||
* size of text in a particular font and size.
|
||||
*
|
||||
* @static
|
||||
* @package dompdf
|
||||
*/
|
||||
class Font_Metrics {
|
||||
|
||||
/**
|
||||
* @see __DOMPDF_FONT_CACHE_FILE
|
||||
*/
|
||||
const CACHE_FILE = __DOMPDF_FONT_CACHE_FILE;
|
||||
|
||||
/**
|
||||
* Underlying {@link Canvas} object to perform text size calculations
|
||||
*
|
||||
* @var Canvas
|
||||
*/
|
||||
static protected $_pdf = null;
|
||||
|
||||
/**
|
||||
* Array of font family names to font files
|
||||
*
|
||||
* Usually cached by the {@link load_font.php} script
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
static protected $_font_lookup = array();
|
||||
|
||||
|
||||
/**
|
||||
* Class initialization
|
||||
*
|
||||
*/
|
||||
static function init() {
|
||||
if (!self::$_pdf) {
|
||||
self::load_font_families();
|
||||
self::$_pdf = Canvas_Factory::get_instance();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Calculates text size, in points
|
||||
*
|
||||
* @param string $text the text to be sized
|
||||
* @param string $font the desired font
|
||||
* @param float $size the desired font size
|
||||
* @param float $spacing word spacing, if any
|
||||
* @return float
|
||||
*/
|
||||
static function get_text_width($text, $font, $size, $word_spacing = 0, $char_spacing = 0) {
|
||||
return self::$_pdf->get_text_width($text, $font, $size, $word_spacing, $char_spacing);
|
||||
}
|
||||
|
||||
/**
|
||||
* Calculates font height
|
||||
*
|
||||
* @param string $font
|
||||
* @param float $size
|
||||
* @return float
|
||||
*/
|
||||
static function get_font_height($font, $size) {
|
||||
return self::$_pdf->get_font_height($font, $size);
|
||||
}
|
||||
|
||||
/**
|
||||
* Resolves a font family & subtype into an actual font file
|
||||
*
|
||||
* Subtype can be one of 'normal', 'bold', 'italic' or 'bold_italic'. If
|
||||
* the particular font family has no suitable font file, the default font
|
||||
* ({@link DOMPDF_DEFAULT_FONT}) is used. The font file returned
|
||||
* is the absolute pathname to the font file on the system.
|
||||
*
|
||||
* @param string $family
|
||||
* @param string $subtype
|
||||
* @return string
|
||||
*/
|
||||
static function get_font($family, $subtype = "normal") {
|
||||
|
||||
/* Allow calling for various fonts in search path. Therefore not immediately
|
||||
* return replacement on non match.
|
||||
* Only when called with NULL try replacement.
|
||||
* When this is also missing there is really trouble.
|
||||
* If only the subtype fails, nevertheless return failure.
|
||||
* Only on checking the fallback font, check various subtypes on same font.
|
||||
*/
|
||||
|
||||
if ( $family ) {
|
||||
$family = str_replace( array("'", '"'), "", mb_strtolower($family));
|
||||
$subtype = mb_strtolower($subtype);
|
||||
|
||||
if ( isset(self::$_font_lookup[$family][$subtype]) ) {
|
||||
return self::$_font_lookup[$family][$subtype];
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
$family = DOMPDF_DEFAULT_FONT;
|
||||
|
||||
if ( isset(self::$_font_lookup[$family][$subtype]) ) {
|
||||
return self::$_font_lookup[$family][$subtype];
|
||||
}
|
||||
|
||||
foreach ( self::$_font_lookup[$family] as $sub => $font ) {
|
||||
if (strpos($subtype, $sub) !== false) {
|
||||
return $font;
|
||||
}
|
||||
}
|
||||
|
||||
if ($subtype !== "normal") {
|
||||
foreach ( self::$_font_lookup[$family] as $sub => $font ) {
|
||||
if ($sub !== "normal") {
|
||||
return $font;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$subtype = "normal";
|
||||
|
||||
if ( isset(self::$_font_lookup[$family][$subtype]) ) {
|
||||
return self::$_font_lookup[$family][$subtype];
|
||||
}
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Saves the stored font family cache
|
||||
*
|
||||
* The name and location of the cache file are determined by {@link
|
||||
* Font_Metrics::CACHE_FILE}. This file should be writable by the
|
||||
* webserver process.
|
||||
*
|
||||
* @see Font_Metrics::load_font_families()
|
||||
*/
|
||||
static function save_font_families() {
|
||||
// replace the path to the DOMPDF font directory with "DOMPDF_FONT_DIR" (allows for more portability)
|
||||
$cache_data = var_export(self::$_font_lookup, true);
|
||||
$cache_data = str_replace('\''.DOMPDF_FONT_DIR , 'DOMPDF_FONT_DIR . \'' , $cache_data);
|
||||
$cache_data = "<"."?php return $cache_data ?".">";
|
||||
file_put_contents(self::CACHE_FILE, $cache_data);
|
||||
}
|
||||
|
||||
/**
|
||||
* Loads the stored font family cache
|
||||
*
|
||||
* @see save_font_families()
|
||||
*/
|
||||
static function load_font_families() {
|
||||
if ( !is_readable(self::CACHE_FILE) )
|
||||
return;
|
||||
|
||||
self::$_font_lookup = require_once(self::CACHE_FILE);
|
||||
|
||||
// If the font family cache is still in the old format
|
||||
if ( self::$_font_lookup === 1 ) {
|
||||
$cache_data = file_get_contents(self::CACHE_FILE);
|
||||
file_put_contents(self::CACHE_FILE, "<"."?php return $cache_data ?".">");
|
||||
self::$_font_lookup = require_once(self::CACHE_FILE);
|
||||
}
|
||||
}
|
||||
|
||||
static function get_system_fonts() {
|
||||
$files = glob("/usr/share/fonts/truetype/*.ttf") +
|
||||
glob("/usr/share/fonts/truetype/*/*.ttf") +
|
||||
glob("/usr/share/fonts/truetype/*/*/*.ttf") +
|
||||
glob("C:\\Windows\\fonts\\*.ttf") +
|
||||
glob("C:\\WinNT\\fonts\\*.ttf") +
|
||||
glob("/mnt/c_drive/WINDOWS/Fonts/");
|
||||
|
||||
new TTF_Info;
|
||||
|
||||
$names = array();
|
||||
|
||||
foreach($files as $file) {
|
||||
$info = getFontInfo($file);
|
||||
$info["path"] = $file;
|
||||
$type = $info[2];
|
||||
|
||||
if (preg_match("/regular|normal|medium|book/i", $type)) {
|
||||
$type = "normal";
|
||||
}
|
||||
elseif (preg_match("/bold/i", $type)) {
|
||||
if (preg_match("/italic|oblique/i", $type)) {
|
||||
$type = "bold_italic";
|
||||
}
|
||||
else {
|
||||
$type = "bold";
|
||||
}
|
||||
}
|
||||
elseif (preg_match("/italic|oblique/i", $type)) {
|
||||
$type = "italic";
|
||||
}
|
||||
|
||||
$names[mb_strtolower($info[1])][$type] = $file;
|
||||
}
|
||||
|
||||
$keys = array_keys($names);
|
||||
|
||||
/*$matches = array_intersect(array("times", "times new roman"), $keys);
|
||||
$names["serif"] = $names[reset($matches)];
|
||||
|
||||
$matches = array_intersect(array("helvetica", "arial", "verdana"), $keys);
|
||||
$names["sans-serif"] = $names[reset($matches)];
|
||||
|
||||
$matches = array_intersect(array("courier", "courier new"), $keys);
|
||||
$names["monospace"] = $names[reset($matches)];
|
||||
$names["fixed"] = $names[reset($matches)];*/
|
||||
|
||||
return $names;
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the current font lookup table
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
static function get_font_families() {
|
||||
return self::$_font_lookup;
|
||||
}
|
||||
|
||||
static function set_font_family($fontname, $entry) {
|
||||
self::$_font_lookup[mb_strtolower($fontname)] = $entry;
|
||||
}
|
||||
}
|
||||
|
||||
Font_Metrics::init();
|
||||
990
pdf/include/frame.cls.php
Executable file
990
pdf/include/frame.cls.php
Executable file
@@ -0,0 +1,990 @@
|
||||
<?php
|
||||
/**
|
||||
* DOMPDF - PHP5 HTML to PDF renderer
|
||||
*
|
||||
* File: $RCSfile: frame.cls.php,v $
|
||||
* Created on: 2004-06-02
|
||||
*
|
||||
* Copyright (c) 2004 - Benj Carson <benjcarson@digitaljunkies.ca>
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with this library in the file LICENSE.LGPL; if not, write to the
|
||||
* Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
* 02111-1307 USA
|
||||
*
|
||||
* Alternatively, you may distribute this software under the terms of the
|
||||
* PHP License, version 3.0 or later. A copy of this license should have
|
||||
* been distributed with this file in the file LICENSE.PHP . If this is not
|
||||
* the case, you can obtain a copy at http://www.php.net/license/3_0.txt.
|
||||
*
|
||||
* The latest version of DOMPDF might be available at:
|
||||
* http://www.dompdf.com/
|
||||
*
|
||||
* @link http://www.dompdf.com/
|
||||
* @copyright 2004 Benj Carson
|
||||
* @author Benj Carson <benjcarson@digitaljunkies.ca>
|
||||
* @package dompdf
|
||||
|
||||
*/
|
||||
|
||||
/* $Id: frame.cls.php 359 2011-02-05 12:15:06Z fabien.menager $ */
|
||||
|
||||
/**
|
||||
* The main Frame class
|
||||
*
|
||||
* This class represents a single HTML element. This class stores
|
||||
* positioning information as well as containing block location and
|
||||
* dimensions. Style information for the element is stored in a {@link
|
||||
* Style} object. Tree structure is maintained via the parent & children
|
||||
* links.
|
||||
*
|
||||
* @access protected
|
||||
* @package dompdf
|
||||
*/
|
||||
class Frame {
|
||||
|
||||
/**
|
||||
* The DOMNode object this frame represents
|
||||
*
|
||||
* @var DOMNode
|
||||
*/
|
||||
protected $_node;
|
||||
|
||||
/**
|
||||
* Unique identifier for this frame. Used to reference this frame
|
||||
* via the node.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $_id;
|
||||
|
||||
/**
|
||||
* Unique id counter
|
||||
*/
|
||||
static protected $ID_COUNTER = 0;
|
||||
|
||||
/**
|
||||
* This frame's calculated style
|
||||
*
|
||||
* @var Style
|
||||
*/
|
||||
protected $_style;
|
||||
|
||||
/**
|
||||
* This frame's original style. Needed for cases where frames are
|
||||
* split across pages.
|
||||
*
|
||||
* @var Style
|
||||
*/
|
||||
protected $_original_style;
|
||||
|
||||
/**
|
||||
* This frame's parent in the document tree.
|
||||
*
|
||||
* @var Frame
|
||||
*/
|
||||
protected $_parent;
|
||||
|
||||
/**
|
||||
* This frame's first child. All children are handled as a
|
||||
* doubly-linked list.
|
||||
*
|
||||
* @var Frame
|
||||
*/
|
||||
protected $_first_child;
|
||||
|
||||
/**
|
||||
* This frame's last child.
|
||||
*
|
||||
* @var Frame
|
||||
*/
|
||||
protected $_last_child;
|
||||
|
||||
/**
|
||||
* This frame's previous sibling in the document tree.
|
||||
*
|
||||
* @var Frame
|
||||
*/
|
||||
protected $_prev_sibling;
|
||||
|
||||
/**
|
||||
* This frame's next sibling in the document tree.
|
||||
*
|
||||
* @var Frame
|
||||
*/
|
||||
protected $_next_sibling;
|
||||
|
||||
/**
|
||||
* This frame's containing block (used in layout): array(x, y, w, h)
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $_containing_block;
|
||||
|
||||
/**
|
||||
* Position on the page of the top-left corner of the margin box of
|
||||
* this frame: array(x,y)
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $_position;
|
||||
|
||||
/**
|
||||
* Absolute opacity of this frame
|
||||
*
|
||||
* @var float
|
||||
*/
|
||||
protected $_opacity;
|
||||
|
||||
/**
|
||||
* This frame's decorator
|
||||
*
|
||||
* @var Frame_Decorator
|
||||
*/
|
||||
protected $_decorator;
|
||||
|
||||
protected $_containing_line;
|
||||
|
||||
/**
|
||||
* Tells wether the frame was already pushed to the next page
|
||||
* @var bool
|
||||
*/
|
||||
public $_already_pushed = false;
|
||||
|
||||
/**
|
||||
* Class destructor
|
||||
*/
|
||||
function __destruct() {
|
||||
clear_object($this);
|
||||
}
|
||||
|
||||
/**
|
||||
* Class constructor
|
||||
*
|
||||
* @param DOMNode $node the DOMNode this frame represents
|
||||
*/
|
||||
function __construct(DomNode $node) {
|
||||
$this->_node = $node;
|
||||
|
||||
$this->_parent = null;
|
||||
$this->_first_child = null;
|
||||
$this->_last_child = null;
|
||||
$this->_prev_sibling = $this->_next_sibling = null;
|
||||
|
||||
$this->_style = null;
|
||||
$this->_original_style = null;
|
||||
|
||||
$this->_containing_block = array(
|
||||
"x" => null,
|
||||
"y" => null,
|
||||
"w" => null,
|
||||
"h" => null,
|
||||
);
|
||||
|
||||
$this->_containing_block[0] =& $this->_containing_block["x"];
|
||||
$this->_containing_block[1] =& $this->_containing_block["y"];
|
||||
$this->_containing_block[2] =& $this->_containing_block["w"];
|
||||
$this->_containing_block[3] =& $this->_containing_block["h"];
|
||||
|
||||
$this->_position = array(
|
||||
"x" => null,
|
||||
"y" => null,
|
||||
);
|
||||
|
||||
$this->_position[0] =& $this->_position["x"];
|
||||
$this->_position[1] =& $this->_position["y"];
|
||||
|
||||
$this->_opacity = 1.0;
|
||||
$this->_decorator = null;
|
||||
|
||||
$this->set_id( self::$ID_COUNTER++ );
|
||||
}
|
||||
|
||||
/**
|
||||
* "Destructor": forcibly free all references held by this frame
|
||||
*
|
||||
* @param bool $recursive if true, call dispose on all children
|
||||
*/
|
||||
function dispose($recursive = false) {
|
||||
|
||||
if ( $recursive ) {
|
||||
while ( $child = $this->_first_child )
|
||||
$child->dispose(true);
|
||||
}
|
||||
|
||||
// Remove this frame from the tree
|
||||
if ( $this->_prev_sibling ) {
|
||||
$this->_prev_sibling->_next_sibling = $this->_next_sibling;
|
||||
}
|
||||
|
||||
if ( $this->_next_sibling ) {
|
||||
$this->_next_sibling->_prev_sibling = $this->_prev_sibling;
|
||||
}
|
||||
|
||||
if ( $this->_parent && $this->_parent->_first_child === $this ) {
|
||||
$this->_parent->_first_child = $this->_next_sibling;
|
||||
}
|
||||
|
||||
if ( $this->_parent && $this->_parent->_last_child === $this ) {
|
||||
$this->_parent->_last_child = $this->_prev_sibling;
|
||||
}
|
||||
|
||||
if ( $this->_parent ) {
|
||||
$this->_parent->get_node()->removeChild($this->_node);
|
||||
}
|
||||
|
||||
$this->_style->dispose();
|
||||
$this->_style = null;
|
||||
unset($this->_style);
|
||||
|
||||
$this->_original_style->dispose();
|
||||
$this->_original_style = null;
|
||||
unset($this->_original_style);
|
||||
|
||||
}
|
||||
|
||||
// Re-initialize the frame
|
||||
function reset() {
|
||||
$this->_position["x"] = null;
|
||||
$this->_position["y"] = null;
|
||||
|
||||
$this->_containing_block["x"] = null;
|
||||
$this->_containing_block["y"] = null;
|
||||
$this->_containing_block["w"] = null;
|
||||
$this->_containing_block["h"] = null;
|
||||
|
||||
$this->_style = null;
|
||||
unset($this->_style);
|
||||
$this->_style = clone $this->_original_style;
|
||||
}
|
||||
|
||||
//........................................................................
|
||||
|
||||
// Accessor methods
|
||||
/**
|
||||
* @return DOMNode
|
||||
*/
|
||||
function get_node() { return $this->_node; }
|
||||
|
||||
/**
|
||||
* @return string
|
||||
*/
|
||||
function get_id() { return $this->_id; }
|
||||
|
||||
/**
|
||||
* @return Style
|
||||
*/
|
||||
function get_style() { return $this->_style; }
|
||||
|
||||
/**
|
||||
* @return Style
|
||||
*/
|
||||
function get_original_style() { return $this->_original_style; }
|
||||
|
||||
/**
|
||||
* @return Frame
|
||||
*/
|
||||
function get_parent() { return $this->_parent; }
|
||||
|
||||
/**
|
||||
* @return Frame_Decorator
|
||||
*/
|
||||
function get_decorator() { return $this->_decorator; }
|
||||
|
||||
/**
|
||||
* @return Frame
|
||||
*/
|
||||
function get_first_child() { return $this->_first_child; }
|
||||
|
||||
/**
|
||||
* @return Frame
|
||||
*/
|
||||
function get_last_child() { return $this->_last_child; }
|
||||
|
||||
/**
|
||||
* @return Frame
|
||||
*/
|
||||
function get_prev_sibling() { return $this->_prev_sibling; }
|
||||
|
||||
/**
|
||||
* @return Frame
|
||||
*/
|
||||
function get_next_sibling() { return $this->_next_sibling; }
|
||||
|
||||
/**
|
||||
* @return FrameList
|
||||
*/
|
||||
function get_children() { return new FrameList($this); }
|
||||
|
||||
// Layout property accessors
|
||||
|
||||
/**
|
||||
* Containing block dimensions
|
||||
*
|
||||
* @param $i string The key of the wanted containing block's dimension (x, y, x, h)
|
||||
* @return array|float
|
||||
*/
|
||||
function get_containing_block($i = null) {
|
||||
if ( isset($i) )
|
||||
return $this->_containing_block[$i];
|
||||
return $this->_containing_block;
|
||||
}
|
||||
|
||||
/**
|
||||
* Block position
|
||||
*
|
||||
* @param $i string The key of the wanted position value (x, y)
|
||||
* @return array|float
|
||||
*/
|
||||
function get_position($i = null) {
|
||||
if ( isset($i) ) {
|
||||
return $this->_position[$i];
|
||||
}
|
||||
return $this->_position;
|
||||
}
|
||||
|
||||
//........................................................................
|
||||
|
||||
/**
|
||||
* Return the height of the margin box of the frame, in pt. Meaningless
|
||||
* unless the height has been calculated properly.
|
||||
*
|
||||
* @return float
|
||||
*/
|
||||
function get_margin_height() {
|
||||
$style = $this->_style;
|
||||
|
||||
return $style->length_in_pt(array(
|
||||
$style->height,
|
||||
$style->margin_top,
|
||||
$style->margin_bottom,
|
||||
$style->border_top_width,
|
||||
$style->border_bottom_width,
|
||||
$style->padding_top,
|
||||
$style->padding_bottom
|
||||
), $this->_containing_block["h"]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the width of the margin box of the frame, in pt. Meaningless
|
||||
* unless the width has been calculated properly.
|
||||
*
|
||||
* @return float
|
||||
*/
|
||||
function get_margin_width() {
|
||||
$style = $this->_style;
|
||||
|
||||
return $style->length_in_pt(array(
|
||||
$style->width,
|
||||
$style->margin_left,
|
||||
$style->margin_right,
|
||||
$style->border_left_width,
|
||||
$style->border_right_width,
|
||||
$style->padding_left,
|
||||
$style->padding_right
|
||||
), $this->_containing_block["w"]);
|
||||
}
|
||||
|
||||
function get_break_margins(){
|
||||
$style = $this->_style;
|
||||
|
||||
return $style->length_in_pt(array(
|
||||
//$style->height,
|
||||
$style->margin_top,
|
||||
$style->margin_bottom,
|
||||
$style->border_top_width,
|
||||
$style->border_bottom_width,
|
||||
$style->padding_top,
|
||||
$style->padding_bottom
|
||||
), $this->_containing_block["h"]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the padding box (x,y,w,h) of the frame
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
function get_padding_box() {
|
||||
$style = $this->_style;
|
||||
$cb = $this->_containing_block;
|
||||
|
||||
$x = $this->_position["x"] +
|
||||
$style->length_in_pt(array($style->margin_left,
|
||||
$style->border_left_width),
|
||||
$cb["w"]);
|
||||
|
||||
$y = $this->_position["y"] +
|
||||
$style->length_in_pt(array($style->margin_top,
|
||||
$style->border_top_width),
|
||||
$cb["h"]);
|
||||
|
||||
$w = $style->length_in_pt(array($style->padding_left,
|
||||
$style->width,
|
||||
$style->padding_right),
|
||||
$cb["w"]);
|
||||
|
||||
$h = $style->length_in_pt(array($style->padding_top,
|
||||
$style->height,
|
||||
$style->padding_bottom),
|
||||
$cb["h"]);
|
||||
|
||||
return array(0 => $x, "x" => $x,
|
||||
1 => $y, "y" => $y,
|
||||
2 => $w, "w" => $w,
|
||||
3 => $h, "h" => $h);
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the border box of the frame
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
function get_border_box() {
|
||||
$style = $this->_style;
|
||||
$cb = $this->_containing_block;
|
||||
|
||||
$x = $this->_position["x"] + $style->length_in_pt($style->margin_left, $cb["w"]);
|
||||
|
||||
$y = $this->_position["y"] + $style->length_in_pt($style->margin_top, $cb["h"]);
|
||||
|
||||
$w = $style->length_in_pt(array($style->border_left_width,
|
||||
$style->padding_left,
|
||||
$style->width,
|
||||
$style->padding_right,
|
||||
$style->border_right_width),
|
||||
$cb["w"]);
|
||||
|
||||
$h = $style->length_in_pt(array($style->border_top_width,
|
||||
$style->padding_top,
|
||||
$style->height,
|
||||
$style->padding_bottom,
|
||||
$style->border_bottom_width),
|
||||
$cb["h"]);
|
||||
|
||||
return array(0 => $x, "x" => $x,
|
||||
1 => $y, "y" => $y,
|
||||
2 => $w, "w" => $w,
|
||||
3 => $h, "h" => $h);
|
||||
}
|
||||
|
||||
function get_opacity($opacity = null) {
|
||||
if ( $opacity !== null ) {
|
||||
$this->set_opacity($opacity);
|
||||
}
|
||||
return $this->_opacity;
|
||||
}
|
||||
|
||||
function &get_containing_line() {
|
||||
return $this->_containing_line;
|
||||
}
|
||||
|
||||
//........................................................................
|
||||
|
||||
// Set methods
|
||||
function set_id($id) {
|
||||
$this->_id = $id;
|
||||
|
||||
// We can only set attributes of DOMElement objects (nodeType == 1).
|
||||
// Since these are the only objects that we can assign CSS rules to,
|
||||
// this shortcoming is okay.
|
||||
if ( $this->_node->nodeType == XML_ELEMENT_NODE )
|
||||
$this->_node->setAttribute("frame_id", $id);
|
||||
}
|
||||
|
||||
function set_style(Style $style) {
|
||||
if ( is_null($this->_style) )
|
||||
$this->_original_style = clone $style;
|
||||
|
||||
//$style->set_frame($this);
|
||||
$this->_style = $style;
|
||||
}
|
||||
|
||||
function set_decorator(Frame_Decorator $decorator) {
|
||||
$this->_decorator = $decorator;
|
||||
}
|
||||
|
||||
function set_containing_block($x = null, $y = null, $w = null, $h = null) {
|
||||
if ( is_array($x) ){
|
||||
foreach($x as $key => $val){
|
||||
$$key = $val;
|
||||
}
|
||||
}
|
||||
|
||||
if (is_numeric($x)) {
|
||||
$this->_containing_block["x"] = $x;
|
||||
}
|
||||
|
||||
if (is_numeric($y)) {
|
||||
$this->_containing_block["y"] = $y;
|
||||
}
|
||||
|
||||
if (is_numeric($w)) {
|
||||
$this->_containing_block["w"] = $w;
|
||||
}
|
||||
|
||||
if (is_numeric($h)) {
|
||||
$this->_containing_block["h"] = $h;
|
||||
}
|
||||
}
|
||||
|
||||
function set_position($x = null, $y = null) {
|
||||
if ( is_array($x) )
|
||||
extract($x);
|
||||
|
||||
if ( is_numeric($x) ) {
|
||||
$this->_position["x"] = $x;
|
||||
}
|
||||
|
||||
if ( is_numeric($y) ) {
|
||||
$this->_position["y"] = $y;
|
||||
}
|
||||
}
|
||||
|
||||
function set_opacity($opacity) {
|
||||
$parent = $this->get_parent();
|
||||
$base_opacity = (($parent && $parent->_opacity !== null) ? $parent->_opacity : 1.0);
|
||||
$this->_opacity = $base_opacity * $opacity;
|
||||
}
|
||||
|
||||
function set_containing_line(&$line) {
|
||||
$this->_containing_line = &$line;
|
||||
}
|
||||
|
||||
//........................................................................
|
||||
|
||||
/**
|
||||
* Inserts a new child at the beginning of the Frame
|
||||
*
|
||||
* @param $child Frame The new Frame to insert
|
||||
* @param $update_node boolean Whether or not to update the DOM
|
||||
*/
|
||||
function prepend_child(Frame $child, $update_node = true) {
|
||||
if ( $update_node )
|
||||
$this->_node->insertBefore($child->_node, $this->_first_child ? $this->_first_child->_node : null);
|
||||
|
||||
// Remove the child from its parent
|
||||
if ( $child->_parent )
|
||||
$child->_parent->remove_child($child, false);
|
||||
|
||||
$child->_parent = $this;
|
||||
$child->_prev_sibling = null;
|
||||
|
||||
// Handle the first child
|
||||
if ( !$this->_first_child ) {
|
||||
$this->_first_child = $child;
|
||||
$this->_last_child = $child;
|
||||
$child->_next_sibling = null;
|
||||
} else {
|
||||
$this->_first_child->_prev_sibling = $child;
|
||||
$child->_next_sibling = $this->_first_child;
|
||||
$this->_first_child = $child;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Inserts a new child at the end of the Frame
|
||||
*
|
||||
* @param $child Frame The new Frame to insert
|
||||
* @param $update_node boolean Whether or not to update the DOM
|
||||
*/
|
||||
function append_child(Frame $child, $update_node = true) {
|
||||
if ( $update_node )
|
||||
$this->_node->appendChild($child->_node);
|
||||
|
||||
// Remove the child from its parent
|
||||
if ( $child->_parent )
|
||||
$child->_parent->remove_child($child, false);
|
||||
|
||||
$child->_parent = $this;
|
||||
$child->_next_sibling = null;
|
||||
|
||||
// Handle the first child
|
||||
if ( !$this->_last_child ) {
|
||||
$this->_first_child = $child;
|
||||
$this->_last_child = $child;
|
||||
$child->_prev_sibling = null;
|
||||
} else {
|
||||
$this->_last_child->_next_sibling = $child;
|
||||
$child->_prev_sibling = $this->_last_child;
|
||||
$this->_last_child = $child;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Inserts a new child immediately before the specified frame
|
||||
*
|
||||
* @param $new_child Frame The new Frame to insert
|
||||
* @param $ref Frame The Frame after the new Frame
|
||||
* @param $update_node boolean Whether or not to update the DOM
|
||||
*/
|
||||
function insert_child_before(Frame $new_child, Frame $ref, $update_node = true) {
|
||||
if ( $ref === $this->_first_child ) {
|
||||
$this->prepend_child($new_child, $update_node);
|
||||
return;
|
||||
}
|
||||
|
||||
if ( is_null($ref) ) {
|
||||
$this->append_child($new_child, $update_node);
|
||||
return;
|
||||
}
|
||||
|
||||
if ( $ref->_parent !== $this )
|
||||
throw new DOMPDF_Exception("Reference child is not a child of this node.");
|
||||
|
||||
// Update the node
|
||||
if ( $update_node )
|
||||
$this->_node->insertBefore($new_child->_node, $ref->_node);
|
||||
|
||||
// Remove the child from its parent
|
||||
if ( $new_child->_parent )
|
||||
$new_child->_parent->remove_child($new_child, false);
|
||||
|
||||
$new_child->_parent = $this;
|
||||
$new_child->_next_sibling = $ref;
|
||||
$new_child->_prev_sibling = $ref->_prev_sibling;
|
||||
|
||||
if ( $ref->_prev_sibling )
|
||||
$ref->_prev_sibling->_next_sibling = $new_child;
|
||||
|
||||
$ref->_prev_sibling = $new_child;
|
||||
}
|
||||
|
||||
/**
|
||||
* Inserts a new child immediately after the specified frame
|
||||
*
|
||||
* @param $new_child Frame The new Frame to insert
|
||||
* @param $ref Frame The Frame before the new Frame
|
||||
* @param $update_node boolean Whether or not to update the DOM
|
||||
*/
|
||||
function insert_child_after(Frame $new_child, Frame $ref, $update_node = true) {
|
||||
if ( $ref === $this->_last_child ) {
|
||||
$this->append_child($new_child, $update_node);
|
||||
return;
|
||||
}
|
||||
|
||||
if ( is_null($ref) ) {
|
||||
$this->prepend_child($new_child, $update_node);
|
||||
return;
|
||||
}
|
||||
|
||||
if ( $ref->_parent !== $this )
|
||||
throw new DOMPDF_Exception("Reference child is not a child of this node.");
|
||||
|
||||
// Update the node
|
||||
if ( $update_node ) {
|
||||
if ( $ref->_next_sibling ) {
|
||||
$next_node = $ref->_next_sibling->_node;
|
||||
$this->_node->insertBefore($new_child->_node, $next_node);
|
||||
} else {
|
||||
$new_child->_node = $this->_node->appendChild($new_child);
|
||||
}
|
||||
}
|
||||
|
||||
// Remove the child from its parent
|
||||
if ( $new_child->_parent)
|
||||
$new_child->_parent->remove_child($new_child, false);
|
||||
|
||||
$new_child->_parent = $this;
|
||||
$new_child->_prev_sibling = $ref;
|
||||
$new_child->_next_sibling = $ref->_next_sibling;
|
||||
|
||||
if ( $ref->_next_sibling )
|
||||
$ref->_next_sibling->_prev_sibling = $new_child;
|
||||
|
||||
$ref->_next_sibling = $new_child;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Remove a child frame
|
||||
*
|
||||
* @param $child Frame
|
||||
* @param $update_node boolean Whether or not to remove the DOM node
|
||||
* @return Frame The removed child frame
|
||||
*/
|
||||
function remove_child(Frame $child, $update_node = true) {
|
||||
if ( $child->_parent !== $this )
|
||||
throw new DOMPDF_Exception("Child not found in this frame");
|
||||
|
||||
if ( $update_node )
|
||||
$this->_node->removeChild($child->_node);
|
||||
|
||||
if ( $child === $this->_first_child )
|
||||
$this->_first_child = $child->_next_sibling;
|
||||
|
||||
if ( $child === $this->_last_child )
|
||||
$this->_last_child = $child->_prev_sibling;
|
||||
|
||||
if ( $child->_prev_sibling )
|
||||
$child->_prev_sibling->_next_sibling = $child->_next_sibling;
|
||||
|
||||
if ( $child->_next_sibling )
|
||||
$child->_next_sibling->_prev_sibling = $child->_prev_sibling;
|
||||
|
||||
$child->_next_sibling = null;
|
||||
$child->_prev_sibling = null;
|
||||
$child->_parent = null;
|
||||
return $child;
|
||||
}
|
||||
|
||||
//........................................................................
|
||||
|
||||
// Debugging function:
|
||||
function __toString() {
|
||||
// Skip empty text frames
|
||||
// if ( $this->_node->nodeName === "#text" &&
|
||||
// preg_replace("/\s/", "", $this->_node->data) === "" )
|
||||
// return "";
|
||||
|
||||
|
||||
$str = "<b>" . $this->_node->nodeName . ":</b><br/>";
|
||||
//$str .= spl_object_hash($this->_node) . "<br/>";
|
||||
$str .= "Id: " .$this->get_id() . "<br/>";
|
||||
$str .= "Class: " .get_class($this) . "<br/>";
|
||||
|
||||
if ( $this->_node->nodeName === "#text" ) {
|
||||
$tmp = htmlspecialchars($this->_node->nodeValue);
|
||||
$str .= "<pre>'" . mb_substr($tmp,0,70) .
|
||||
(mb_strlen($tmp) > 70 ? "..." : "") . "'</pre>";
|
||||
} elseif ( $css_class = $this->_node->getAttribute("class") ) {
|
||||
$tmp = htmlspecialchars($css_class);
|
||||
$str .= "CSS class: '$css_class'<br/>";
|
||||
}
|
||||
|
||||
if ( $this->_parent )
|
||||
$str .= "\nParent:" . $this->_parent->_node->nodeName .
|
||||
" (" . spl_object_hash($this->_parent->_node) . ") " .
|
||||
"<br/>";
|
||||
|
||||
if ( $this->_prev_sibling )
|
||||
$str .= "Prev: " . $this->_prev_sibling->_node->nodeName .
|
||||
" (" . spl_object_hash($this->_prev_sibling->_node) . ") " .
|
||||
"<br/>";
|
||||
|
||||
if ( $this->_next_sibling )
|
||||
$str .= "Next: " . $this->_next_sibling->_node->nodeName .
|
||||
" (" . spl_object_hash($this->_next_sibling->_node) . ") " .
|
||||
"<br/>";
|
||||
|
||||
$d = $this->get_decorator();
|
||||
while ($d && $d != $d->get_decorator()) {
|
||||
$str .= "Decorator: " . get_class($d) . "<br/>";
|
||||
$d = $d->get_decorator();
|
||||
}
|
||||
|
||||
$str .= "Position: " . pre_r($this->_position, true);
|
||||
$str .= "\nContaining block: " . pre_r($this->_containing_block, true);
|
||||
$str .= "\nMargin width: " . pre_r($this->get_margin_width(), true);
|
||||
$str .= "\nMargin height: " . pre_r($this->get_margin_height(), true);
|
||||
|
||||
$str .= "\nStyle: <pre>". $this->_style->__toString() . "</pre>";
|
||||
|
||||
if ( $this->_decorator instanceof Block_Frame_Decorator ) {
|
||||
$str .= "Lines:<pre>";
|
||||
foreach ($this->_decorator->get_lines() as $line) {
|
||||
foreach ($line["frames"] as $frame) {
|
||||
if ($frame instanceof Text_Frame_Decorator) {
|
||||
$str .= "\ntext: ";
|
||||
$str .= "'". htmlspecialchars($frame->get_text()) ."'";
|
||||
} else {
|
||||
$str .= "\nBlock: " . $frame->get_node()->nodeName . " (" . spl_object_hash($frame->get_node()) . ")";
|
||||
}
|
||||
}
|
||||
|
||||
$str .=
|
||||
//"\ncount => " . $line["count"] . "\n".
|
||||
"\ny => " . $line["y"] . "\n" .
|
||||
"w => " . $line["w"] . "\n" .
|
||||
"h => " . $line["h"] . "\n" .
|
||||
"left => " . $line["left"] . "\n" .
|
||||
"right => " . $line["right"] . "\n";
|
||||
}
|
||||
$str .= "</pre>";
|
||||
}
|
||||
$str .= "\n";
|
||||
if ( php_sapi_name() === "cli" )
|
||||
$str = strip_tags(str_replace(array("<br/>","<b>","</b>"),
|
||||
array("\n","",""),
|
||||
$str));
|
||||
|
||||
return $str;
|
||||
}
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Linked-list IteratorAggregate
|
||||
*
|
||||
* @access private
|
||||
* @package dompdf
|
||||
*/
|
||||
class FrameList implements IteratorAggregate {
|
||||
protected $_frame;
|
||||
|
||||
function __construct($frame) { $this->_frame = $frame; }
|
||||
function getIterator() { return new FrameListIterator($this->_frame); }
|
||||
}
|
||||
|
||||
/**
|
||||
* Linked-list Iterator
|
||||
*
|
||||
* Returns children in order and allows for list to change during iteration,
|
||||
* provided the changes occur to or after the current element
|
||||
*
|
||||
* @access private
|
||||
* @package dompdf
|
||||
*/
|
||||
class FrameListIterator implements Iterator {
|
||||
|
||||
/**
|
||||
* @var Frame
|
||||
*/
|
||||
protected $_parent;
|
||||
|
||||
/**
|
||||
* @var Frame
|
||||
*/
|
||||
protected $_cur;
|
||||
|
||||
/**
|
||||
* @var int
|
||||
*/
|
||||
protected $_num;
|
||||
|
||||
function __construct(Frame $frame) {
|
||||
$this->_parent = $frame;
|
||||
$this->_cur = $frame->get_first_child();
|
||||
$this->_num = 0;
|
||||
}
|
||||
|
||||
function rewind() {
|
||||
$this->_cur = $this->_parent->get_first_child();
|
||||
$this->_num = 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return bool
|
||||
*/
|
||||
function valid() {
|
||||
return isset($this->_cur);// && ($this->_cur->get_prev_sibling() === $this->_prev);
|
||||
}
|
||||
|
||||
function key() { return $this->_num; }
|
||||
|
||||
/**
|
||||
* @return Frame
|
||||
*/
|
||||
function current() { return $this->_cur; }
|
||||
|
||||
/**
|
||||
* @return Frame
|
||||
*/
|
||||
function next() {
|
||||
|
||||
$ret = $this->_cur;
|
||||
if ( !$ret )
|
||||
return null;
|
||||
|
||||
$this->_cur = $this->_cur->get_next_sibling();
|
||||
$this->_num++;
|
||||
return $ret;
|
||||
}
|
||||
}
|
||||
|
||||
//------------------------------------------------------------------------
|
||||
|
||||
/**
|
||||
* Pre-order IteratorAggregate
|
||||
*
|
||||
* @access private
|
||||
* @package dompdf
|
||||
*/
|
||||
class FrameTreeList implements IteratorAggregate {
|
||||
/**
|
||||
* @var Frame
|
||||
*/
|
||||
protected $_root;
|
||||
|
||||
function __construct(Frame $root) { $this->_root = $root; }
|
||||
|
||||
/**
|
||||
* @return FrameTreeIterator
|
||||
*/
|
||||
function getIterator() { return new FrameTreeIterator($this->_root); }
|
||||
}
|
||||
|
||||
/**
|
||||
* Pre-order Iterator
|
||||
*
|
||||
* Returns frames in preorder traversal order (parent then children)
|
||||
*
|
||||
* @access private
|
||||
* @package dompdf
|
||||
*/
|
||||
class FrameTreeIterator implements Iterator {
|
||||
/**
|
||||
* @var Frame
|
||||
*/
|
||||
protected $_root;
|
||||
protected $_stack = array();
|
||||
|
||||
/**
|
||||
* @var int
|
||||
*/
|
||||
protected $_num;
|
||||
|
||||
function __construct(Frame $root) {
|
||||
$this->_stack[] = $this->_root = $root;
|
||||
$this->_num = 0;
|
||||
}
|
||||
|
||||
function rewind() {
|
||||
$this->_stack = array($this->_root);
|
||||
$this->_num = 0;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return bool
|
||||
*/
|
||||
function valid() { return count($this->_stack) > 0; }
|
||||
|
||||
/**
|
||||
* @return int
|
||||
*/
|
||||
function key() { return $this->_num; }
|
||||
|
||||
/**
|
||||
* @var Frame
|
||||
*/
|
||||
function current() { return end($this->_stack); }
|
||||
|
||||
/**
|
||||
* @var Frame
|
||||
*/
|
||||
function next() {
|
||||
$b = end($this->_stack);
|
||||
|
||||
// Pop last element
|
||||
unset($this->_stack[ key($this->_stack) ]);
|
||||
$this->_num++;
|
||||
|
||||
// Push all children onto the stack in reverse order
|
||||
if ( $c = $b->get_last_child() ) {
|
||||
$this->_stack[] = $c;
|
||||
while ( $c = $c->get_prev_sibling() )
|
||||
$this->_stack[] = $c;
|
||||
}
|
||||
return $b;
|
||||
}
|
||||
}
|
||||
483
pdf/include/frame_decorator.cls.php
Executable file
483
pdf/include/frame_decorator.cls.php
Executable file
@@ -0,0 +1,483 @@
|
||||
<?php
|
||||
/**
|
||||
* DOMPDF - PHP5 HTML to PDF renderer
|
||||
*
|
||||
* File: $RCSfile: frame_decorator.cls.php,v $
|
||||
* Created on: 2004-06-02
|
||||
*
|
||||
* Copyright (c) 2004 - Benj Carson <benjcarson@digitaljunkies.ca>
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with this library in the file LICENSE.LGPL; if not, write to the
|
||||
* Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
* 02111-1307 USA
|
||||
*
|
||||
* Alternatively, you may distribute this software under the terms of the
|
||||
* PHP License, version 3.0 or later. A copy of this license should have
|
||||
* been distributed with this file in the file LICENSE.PHP . If this is not
|
||||
* the case, you can obtain a copy at http://www.php.net/license/3_0.txt.
|
||||
*
|
||||
* The latest version of DOMPDF might be available at:
|
||||
* http://www.dompdf.com/
|
||||
*
|
||||
* @link http://www.dompdf.com/
|
||||
* @copyright 2004 Benj Carson
|
||||
* @author Benj Carson <benjcarson@digitaljunkies.ca>
|
||||
* @package dompdf
|
||||
|
||||
*/
|
||||
|
||||
/* $Id: frame_decorator.cls.php 357 2011-01-30 20:56:46Z fabien.menager $ */
|
||||
|
||||
/**
|
||||
* Base Frame_Decorator class
|
||||
*
|
||||
* @access private
|
||||
* @package dompdf
|
||||
*/
|
||||
abstract class Frame_Decorator extends Frame {
|
||||
|
||||
/**
|
||||
* The root node of the DOM tree
|
||||
*
|
||||
* @var Frame
|
||||
*/
|
||||
protected $_root;
|
||||
|
||||
/**
|
||||
* The decorated frame
|
||||
*
|
||||
* @var Frame
|
||||
*/
|
||||
protected $_frame;
|
||||
|
||||
/**
|
||||
* Positioner object used to position this frame (Strategy pattern)
|
||||
*
|
||||
* @var Positioner
|
||||
*/
|
||||
protected $_positioner;
|
||||
|
||||
/**
|
||||
* Reflower object used to calculate frame dimensions (Strategy pattern)
|
||||
*
|
||||
* @var Frame_Reflower
|
||||
*/
|
||||
protected $_reflower;
|
||||
|
||||
/**
|
||||
* Reference to the current dompdf instance
|
||||
*
|
||||
* @var DOMPDF
|
||||
*/
|
||||
protected $_dompdf;
|
||||
|
||||
/**
|
||||
* First block parent
|
||||
*
|
||||
* @var Frame_Decorator
|
||||
*/
|
||||
private $_block_parent;
|
||||
|
||||
/**
|
||||
* First positionned parent (position: relative | absolute | fixed)
|
||||
*
|
||||
* @var Frame_Decorator
|
||||
*/
|
||||
private $_positionned_parent;
|
||||
|
||||
/**
|
||||
* Class constructor
|
||||
*
|
||||
* @param Frame $frame the decoration target
|
||||
*/
|
||||
function __construct(Frame $frame, DOMPDF $dompdf) {
|
||||
$this->_frame = $frame;
|
||||
$this->_root = null;
|
||||
$this->_dompdf = $dompdf;
|
||||
$frame->set_decorator($this);
|
||||
}
|
||||
|
||||
/**
|
||||
* "Destructor": foribly free all references held by this object
|
||||
*
|
||||
* @param bool $recursive if true, call dispose on all children
|
||||
*/
|
||||
function dispose($recursive = false) {
|
||||
|
||||
if ( $recursive ) {
|
||||
while ( $child = $this->get_first_child() )
|
||||
$child->dispose(true);
|
||||
}
|
||||
|
||||
$this->_root = null;
|
||||
unset($this->_root);
|
||||
|
||||
$this->_frame->dispose(true);
|
||||
$this->_frame = null;
|
||||
unset($this->_frame);
|
||||
|
||||
$this->_positioner = null;
|
||||
unset($this->_positioner);
|
||||
|
||||
$this->_reflower = null;
|
||||
unset($this->_reflower);
|
||||
}
|
||||
|
||||
/**
|
||||
* Return a copy of this frame with $node as its node
|
||||
*
|
||||
* @param DomNode $node
|
||||
* @return Frame
|
||||
*/
|
||||
function copy(DomNode $node) {
|
||||
$frame = new Frame($node);
|
||||
$frame->set_style(clone $this->_frame->get_original_style());
|
||||
$deco = Frame_Factory::decorate_frame($frame, $this->_dompdf);
|
||||
$deco->set_root($this->_root);
|
||||
return $deco;
|
||||
}
|
||||
|
||||
/**
|
||||
* Create a deep copy: copy this node and all children
|
||||
*
|
||||
* @return Frame
|
||||
*/
|
||||
function deep_copy() {
|
||||
$frame = new Frame($this->get_node()->cloneNode());
|
||||
$frame->set_style(clone $this->_frame->get_original_style());
|
||||
$deco = Frame_Factory::decorate_frame($frame, $this->_dompdf);
|
||||
$deco->set_root($this->_root);
|
||||
|
||||
foreach ($this->get_children() as $child)
|
||||
$deco->append_child($child->deep_copy());
|
||||
|
||||
return $deco;
|
||||
}
|
||||
//........................................................................
|
||||
|
||||
/**
|
||||
* Delegate calls to decorated frame object
|
||||
*/
|
||||
function reset() {
|
||||
$this->_frame->reset();
|
||||
|
||||
// Reset all children
|
||||
foreach ($this->get_children() as $child)
|
||||
$child->reset();
|
||||
}
|
||||
|
||||
// Getters -----------
|
||||
function get_id() { return $this->_frame->get_id(); }
|
||||
|
||||
/**
|
||||
* @return Frame
|
||||
*/
|
||||
function get_frame() { return $this->_frame; }
|
||||
|
||||
/**
|
||||
* @return DomNode
|
||||
*/
|
||||
function get_node() { return $this->_frame->get_node(); }
|
||||
|
||||
/**
|
||||
* @return Style
|
||||
*/
|
||||
function get_style() { return $this->_frame->get_style(); }
|
||||
|
||||
/**
|
||||
* @return Style
|
||||
*/
|
||||
function get_original_style() { return $this->_frame->get_original_style(); }
|
||||
function get_containing_block($i = null) { return $this->_frame->get_containing_block($i); }
|
||||
function get_position($i = null) { return $this->_frame->get_position($i); }
|
||||
|
||||
/**
|
||||
* @return DOMPDF
|
||||
*/
|
||||
function get_dompdf() { return $this->_dompdf; }
|
||||
|
||||
function get_margin_height() { return $this->_frame->get_margin_height(); }
|
||||
function get_margin_width() { return $this->_frame->get_margin_width(); }
|
||||
function get_padding_box() { return $this->_frame->get_padding_box(); }
|
||||
function get_border_box() { return $this->_frame->get_border_box(); }
|
||||
|
||||
// Setters -----------
|
||||
function set_id($id) { $this->_frame->set_id($id); }
|
||||
function set_style(Style $style) { $this->_frame->set_style($style); }
|
||||
|
||||
function set_containing_block($x = null, $y = null, $w = null, $h = null) {
|
||||
$this->_frame->set_containing_block($x, $y, $w, $h);
|
||||
}
|
||||
|
||||
function set_position($x = null, $y = null) {
|
||||
$this->_frame->set_position($x, $y);
|
||||
}
|
||||
function __toString() { return $this->_frame->__toString(); }
|
||||
|
||||
function prepend_child(Frame $child, $update_node = true) {
|
||||
while ( $child instanceof Frame_Decorator )
|
||||
$child = $child->_frame;
|
||||
|
||||
$this->_frame->prepend_child($child, $update_node);
|
||||
}
|
||||
|
||||
function append_child(Frame $child, $update_node = true) {
|
||||
while ( $child instanceof Frame_Decorator )
|
||||
$child = $child->_frame;
|
||||
|
||||
$this->_frame->append_child($child, $update_node);
|
||||
}
|
||||
|
||||
function insert_child_before(Frame $new_child, Frame $ref, $update_node = true) {
|
||||
while ( $new_child instanceof Frame_Decorator )
|
||||
$new_child = $new_child->_frame;
|
||||
|
||||
if ( $ref instanceof Frame_Decorator )
|
||||
$ref = $ref->_frame;
|
||||
|
||||
$this->_frame->insert_child_before($new_child, $ref, $update_node);
|
||||
}
|
||||
|
||||
function insert_child_after(Frame $new_child, Frame $ref, $update_node = true) {
|
||||
while ( $new_child instanceof Frame_Decorator )
|
||||
$new_child = $new_child->_frame;
|
||||
|
||||
while ( $ref instanceof Frame_Decorator )
|
||||
$ref = $ref->_frame;
|
||||
|
||||
$this->_frame->insert_child_after($new_child, $ref, $update_node);
|
||||
}
|
||||
|
||||
function remove_child(Frame $child, $update_node = true) {
|
||||
while ( $child instanceof Frame_Decorator )
|
||||
$child = $new_child->_frame;
|
||||
|
||||
$this->_frame->remove_child($child, $update_node);
|
||||
}
|
||||
|
||||
//........................................................................
|
||||
|
||||
/**
|
||||
* @return Frame_Decorator
|
||||
*/
|
||||
function get_parent() {
|
||||
$p = $this->_frame->get_parent();
|
||||
if ( $p && $deco = $p->get_decorator() ) {
|
||||
while ( $tmp = $deco->get_decorator() )
|
||||
$deco = $tmp;
|
||||
return $deco;
|
||||
} else if ( $p )
|
||||
return $p;
|
||||
else
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return Frame_Decorator
|
||||
*/
|
||||
function get_first_child() {
|
||||
$c = $this->_frame->get_first_child();
|
||||
if ( $c && $deco = $c->get_decorator() ) {
|
||||
while ( $tmp = $deco->get_decorator() )
|
||||
$deco = $tmp;
|
||||
return $deco;
|
||||
} else if ( $c )
|
||||
return $c;
|
||||
else
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return Frame_Decorator
|
||||
*/
|
||||
function get_last_child() {
|
||||
$c = $this->_frame->get_last_child();
|
||||
if ( $c && $deco = $c->get_decorator() ) {
|
||||
while ( $tmp = $deco->get_decorator() )
|
||||
$deco = $tmp;
|
||||
return $deco;
|
||||
} else if ( $c )
|
||||
return $c;
|
||||
else
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return Frame_Decorator
|
||||
*/
|
||||
function get_prev_sibling() {
|
||||
$s = $this->_frame->get_prev_sibling();
|
||||
if ( $s && $deco = $s->get_decorator() ) {
|
||||
while ( $tmp = $deco->get_decorator() )
|
||||
$deco = $tmp;
|
||||
return $deco;
|
||||
} else if ( $s )
|
||||
return $s;
|
||||
else
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return Frame_Decorator
|
||||
*/
|
||||
function get_next_sibling() {
|
||||
$s = $this->_frame->get_next_sibling();
|
||||
if ( $s && $deco = $s->get_decorator() ) {
|
||||
while ( $tmp = $deco->get_decorator() )
|
||||
$deco = $tmp;
|
||||
return $deco;
|
||||
} else if ( $s )
|
||||
return $s;
|
||||
else
|
||||
return null;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return FrameList
|
||||
*/
|
||||
function get_children() {
|
||||
return new FrameList($this);
|
||||
}
|
||||
|
||||
/**
|
||||
* @return FrameTreeList
|
||||
*/
|
||||
function get_subtree() {
|
||||
return new FrameTreeList($this);
|
||||
}
|
||||
|
||||
//........................................................................
|
||||
|
||||
function set_positioner(Positioner $posn) {
|
||||
$this->_positioner = $posn;
|
||||
if ( $this->_frame instanceof Frame_Decorator )
|
||||
$this->_frame->set_positioner($posn);
|
||||
}
|
||||
|
||||
//........................................................................
|
||||
|
||||
function set_reflower(Frame_Reflower $reflower) {
|
||||
$this->_reflower = $reflower;
|
||||
if ( $this->_frame instanceof Frame_Decorator )
|
||||
$this->_frame->set_reflower( $reflower );
|
||||
}
|
||||
|
||||
function get_reflower() { return $this->_reflower; }
|
||||
|
||||
//........................................................................
|
||||
|
||||
function set_root(Frame $root) {
|
||||
$this->_root = $root;
|
||||
if ( $this->_frame instanceof Frame_Decorator )
|
||||
$this->_frame->set_root($root);
|
||||
}
|
||||
|
||||
function get_root() { return $this->_root; }
|
||||
|
||||
//........................................................................
|
||||
|
||||
/**
|
||||
* @return Frame_Decorator
|
||||
*/
|
||||
function find_block_parent() {
|
||||
//if ( $this->_block_parent ) return $this->_block_parent; // FIXME: makes dom_anchor_link example fail
|
||||
|
||||
// Find our nearest block level parent
|
||||
$p = $this->get_parent();
|
||||
|
||||
while ( $p ) {
|
||||
if ( in_array($p->get_style()->display, Style::$BLOCK_TYPES) )
|
||||
break;
|
||||
|
||||
$p = $p->get_parent();
|
||||
}
|
||||
|
||||
return $this->_block_parent = $p;
|
||||
}
|
||||
|
||||
/**
|
||||
* @return Frame_Decorator
|
||||
*/
|
||||
function find_positionned_parent() {
|
||||
//if ( $this->_positionned_parent ) return $this->_positionned_parent; // FIXME: makes dom_anchor_link example fail
|
||||
|
||||
// Find our nearest relative positionned parent
|
||||
$p = $this->get_parent();
|
||||
while ( $p ) {
|
||||
if ( in_array($p->get_style()->position, Style::$POSITIONNED_TYPES) ) {
|
||||
break;
|
||||
}
|
||||
|
||||
$p = $p->get_parent();
|
||||
}
|
||||
|
||||
if ( !$p ) {
|
||||
$p = $this->_root;
|
||||
}
|
||||
|
||||
return $this->_positionned_parent = $p;
|
||||
}
|
||||
|
||||
//........................................................................
|
||||
|
||||
/**
|
||||
* split this frame at $child.
|
||||
*
|
||||
* The current frame is cloned and $child and all children following
|
||||
* $child are added to the clone. The clone is then passed to the
|
||||
* current frame's parent->split() method.
|
||||
*
|
||||
* @param Frame $child
|
||||
* @param boolean $force_pagebreak
|
||||
*/
|
||||
function split($child = null, $force_pagebreak = false) {
|
||||
if ( is_null( $child ) ) {
|
||||
$this->get_parent()->split($this, $force_pagebreak);
|
||||
return;
|
||||
}
|
||||
|
||||
if ( $child->get_parent() !== $this )
|
||||
throw new DOMPDF_Exception("Unable to split: frame is not a child of this one.");
|
||||
|
||||
$split = $this->copy( $this->_frame->get_node()->cloneNode() );
|
||||
$split->reset();
|
||||
$this->get_parent()->insert_child_after($split, $this);
|
||||
|
||||
// Add $frame and all following siblings to the new split node
|
||||
$iter = $child;
|
||||
while ($iter) {
|
||||
$frame = $iter;
|
||||
$iter = $iter->get_next_sibling();
|
||||
$frame->reset();
|
||||
$split->append_child($frame);
|
||||
}
|
||||
|
||||
$this->get_parent()->split($split, $force_pagebreak);
|
||||
}
|
||||
|
||||
//........................................................................
|
||||
|
||||
final function position() { $this->_positioner->position(); }
|
||||
|
||||
final function reflow(Frame_Decorator $block = null) {
|
||||
// Uncomment this to see the frames before they're laid out, instead of
|
||||
// during rendering.
|
||||
//echo $this->_frame; flush();
|
||||
$this->_reflower->reflow($block);
|
||||
}
|
||||
|
||||
final function get_min_max_width() { return $this->_reflower->get_min_max_width(); }
|
||||
|
||||
//........................................................................
|
||||
}
|
||||
207
pdf/include/frame_factory.cls.php
Executable file
207
pdf/include/frame_factory.cls.php
Executable file
@@ -0,0 +1,207 @@
|
||||
<?php
|
||||
/**
|
||||
* DOMPDF - PHP5 HTML to PDF renderer
|
||||
*
|
||||
* File: $RCSfile: frame_factory.cls.php,v $
|
||||
* Created on: 2004-06-17
|
||||
*
|
||||
* Copyright (c) 2004 - Benj Carson <benjcarson@digitaljunkies.ca>
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with this library in the file LICENSE.LGPL; if not, write to the
|
||||
* Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
* 02111-1307 USA
|
||||
*
|
||||
* Alternatively, you may distribute this software under the terms of the
|
||||
* PHP License, version 3.0 or later. A copy of this license should have
|
||||
* been distributed with this file in the file LICENSE.PHP . If this is not
|
||||
* the case, you can obtain a copy at http://www.php.net/license/3_0.txt.
|
||||
*
|
||||
* The latest version of DOMPDF might be available at:
|
||||
* http://www.dompdf.com/
|
||||
*
|
||||
* @link http://www.dompdf.com/
|
||||
* @copyright 2004 Benj Carson
|
||||
* @author Benj Carson <benjcarson@digitaljunkies.ca>
|
||||
* @package dompdf
|
||||
|
||||
*/
|
||||
|
||||
/* $Id: frame_factory.cls.php 356 2011-01-28 08:56:10Z fabien.menager $ */
|
||||
|
||||
/**
|
||||
* Contains frame decorating logic
|
||||
*
|
||||
* This class is responsible for assigning the correct {@link Frame_Decorator},
|
||||
* {@link Positioner}, and {@link Frame_Reflower} objects to {@link Frame}
|
||||
* objects. This is determined primarily by the Frame's display type, but
|
||||
* also by the Frame's node's type (e.g. DomElement vs. #text)
|
||||
*
|
||||
* @access private
|
||||
* @package dompdf
|
||||
*/
|
||||
class Frame_Factory {
|
||||
|
||||
/**
|
||||
* Decorate the Frame
|
||||
*
|
||||
* @param $root Frame The frame to decorate
|
||||
* @param $dompdf DOMPDF The dompdf instance
|
||||
*/
|
||||
static function decorate_root(Frame $root, DOMPDF $dompdf) {
|
||||
$frame = new Page_Frame_Decorator($root, $dompdf);
|
||||
$frame->set_reflower( new Page_Frame_Reflower($frame) );
|
||||
$root->set_decorator($frame);
|
||||
return $frame;
|
||||
}
|
||||
|
||||
/**
|
||||
* Decorate a Frame
|
||||
*
|
||||
* @param $root Frame The frame to decorate
|
||||
* @param $dompdf DOMPDF The dompdf instance
|
||||
* @return Frame_Decorator
|
||||
* FIXME: this is admittedly a little smelly...
|
||||
*/
|
||||
static function decorate_frame(Frame $frame, DOMPDF $dompdf) {
|
||||
if ( is_null($dompdf) )
|
||||
throw new Exception("foo");
|
||||
|
||||
$style = $frame->get_style();
|
||||
|
||||
switch ($style->display) {
|
||||
|
||||
case "block":
|
||||
$positioner = "Block";
|
||||
$decorator = "Block";
|
||||
$reflower = "Block";
|
||||
break;
|
||||
|
||||
case "inline-block":
|
||||
$positioner = "Inline";
|
||||
$decorator = "Block";
|
||||
$reflower = "Block";
|
||||
break;
|
||||
|
||||
case "inline":
|
||||
$positioner = "Inline";
|
||||
if ( $frame->get_node()->nodeName === "#text" ) {
|
||||
$decorator = "Text";
|
||||
$reflower = "Text";
|
||||
}
|
||||
else {
|
||||
if ( DOMPDF_ENABLE_CSS_FLOAT && $style->float !== "none" ) {
|
||||
$decorator = "Block";
|
||||
$reflower = "Block";
|
||||
}
|
||||
else {
|
||||
$decorator = "Inline";
|
||||
$reflower = "Inline";
|
||||
}
|
||||
}
|
||||
break;
|
||||
|
||||
case "table":
|
||||
$positioner = "Block";
|
||||
$decorator = "Table";
|
||||
$reflower = "Table";
|
||||
break;
|
||||
|
||||
case "inline-table":
|
||||
$positioner = "Inline";
|
||||
$decorator = "Table";
|
||||
$reflower = "Table";
|
||||
break;
|
||||
|
||||
case "table-row-group":
|
||||
case "table-header-group":
|
||||
case "table-footer-group":
|
||||
$positioner = "Null";
|
||||
$decorator = "Table_Row_Group";
|
||||
$reflower = "Table_Row_Group";
|
||||
break;
|
||||
|
||||
case "table-row":
|
||||
$positioner = "Null";
|
||||
$decorator = "Table_Row";
|
||||
$reflower = "Table_Row";
|
||||
break;
|
||||
|
||||
case "table-cell":
|
||||
$positioner = "Table_Cell";
|
||||
$decorator = "Table_Cell";
|
||||
$reflower = "Table_Cell";
|
||||
break;
|
||||
|
||||
case "list-item":
|
||||
$positioner = "Block";
|
||||
$decorator = "Block";
|
||||
$reflower = "Block";
|
||||
break;
|
||||
|
||||
case "-dompdf-list-bullet":
|
||||
if ( $style->list_style_position === "inside" )
|
||||
$positioner = "Inline";
|
||||
else
|
||||
$positioner = "List_Bullet";
|
||||
|
||||
if ( $style->list_style_image !== "none" )
|
||||
$decorator = "List_Bullet_Image";
|
||||
else
|
||||
$decorator = "List_Bullet";
|
||||
|
||||
$reflower = "List_Bullet";
|
||||
break;
|
||||
|
||||
case "-dompdf-image":
|
||||
$positioner = "Inline";
|
||||
$decorator = "Image";
|
||||
$reflower = "Image";
|
||||
break;
|
||||
|
||||
case "-dompdf-br":
|
||||
$positioner = "Inline";
|
||||
$decorator = "Inline";
|
||||
$reflower = "Inline";
|
||||
break;
|
||||
|
||||
default:
|
||||
// FIXME: should throw some sort of warning or something?
|
||||
case "none":
|
||||
$positioner = "Null";
|
||||
$decorator = "Null";
|
||||
$reflower = "Null";
|
||||
break;
|
||||
}
|
||||
|
||||
$position = $style->position;
|
||||
|
||||
if ( $position === "absolute" )
|
||||
$positioner = "Absolute";
|
||||
|
||||
else if ( $position === "fixed" )
|
||||
$positioner = "Fixed";
|
||||
|
||||
$positioner .= "_Positioner";
|
||||
$decorator .= "_Frame_Decorator";
|
||||
$reflower .= "_Frame_Reflower";
|
||||
|
||||
$deco = new $decorator($frame, $dompdf);
|
||||
$deco->set_positioner( new $positioner($deco) );
|
||||
$reflow = new $reflower($deco);
|
||||
|
||||
$deco->set_reflower( $reflow );
|
||||
|
||||
return $deco;
|
||||
}
|
||||
}
|
||||
414
pdf/include/frame_reflower.cls.php
Executable file
414
pdf/include/frame_reflower.cls.php
Executable file
@@ -0,0 +1,414 @@
|
||||
<?php
|
||||
/**
|
||||
* DOMPDF - PHP5 HTML to PDF renderer
|
||||
*
|
||||
* File: $RCSfile: frame_reflower.cls.php,v $
|
||||
* Created on: 2004-06-17
|
||||
*
|
||||
* Copyright (c) 2004 - Benj Carson <benjcarson@digitaljunkies.ca>
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with this library in the file LICENSE.LGPL; if not, write to the
|
||||
* Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
* 02111-1307 USA
|
||||
*
|
||||
* Alternatively, you may distribute this software under the terms of the
|
||||
* PHP License, version 3.0 or later. A copy of this license should have
|
||||
* been distributed with this file in the file LICENSE.PHP . If this is not
|
||||
* the case, you can obtain a copy at http://www.php.net/license/3_0.txt.
|
||||
*
|
||||
* The latest version of DOMPDF might be available at:
|
||||
* http://www.dompdf.com/
|
||||
*
|
||||
* @link http://www.dompdf.com/
|
||||
* @copyright 2004 Benj Carson
|
||||
* @author Benj Carson <benjcarson@digitaljunkies.ca>
|
||||
* @package dompdf
|
||||
|
||||
*/
|
||||
|
||||
/* $Id: frame_reflower.cls.php 357 2011-01-30 20:56:46Z fabien.menager $ */
|
||||
|
||||
/**
|
||||
* Base reflower class
|
||||
*
|
||||
* Reflower objects are responsible for determining the width and height of
|
||||
* individual frames. They also create line and page breaks as necessary.
|
||||
*
|
||||
* @access private
|
||||
* @package dompdf
|
||||
*/
|
||||
abstract class Frame_Reflower {
|
||||
|
||||
/**
|
||||
* Frame for this reflower
|
||||
*
|
||||
* @var Frame
|
||||
*/
|
||||
protected $_frame;
|
||||
|
||||
/**
|
||||
* Cached min/max size
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $_min_max_cache;
|
||||
|
||||
function __construct(Frame $frame) {
|
||||
$this->_frame = $frame;
|
||||
$this->_min_max_cache = null;
|
||||
}
|
||||
|
||||
function dispose() {
|
||||
clear_object($this);
|
||||
}
|
||||
|
||||
protected function _collapse_margins() {
|
||||
$cb = $this->_frame->get_containing_block();
|
||||
$style = $this->_frame->get_style();
|
||||
|
||||
$t = $style->length_in_pt($style->margin_top, $cb["h"]);
|
||||
$b = $style->length_in_pt($style->margin_bottom, $cb["h"]);
|
||||
|
||||
// Handle 'auto' values
|
||||
if ( $t === "auto" ) {
|
||||
$style->margin_top = "0pt";
|
||||
$t = 0;
|
||||
}
|
||||
|
||||
if ( $b === "auto" ) {
|
||||
$style->margin_bottom = "0pt";
|
||||
$b = 0;
|
||||
}
|
||||
|
||||
// Collapse vertical margins:
|
||||
$n = $this->_frame->get_next_sibling();
|
||||
|
||||
// FIXME If there is a non-empty inline frame between the blocks, it is not taken into account
|
||||
while ( $n && !in_array($n->get_style()->display, Style::$BLOCK_TYPES) ) {
|
||||
$n = $n->get_next_sibling();
|
||||
}
|
||||
|
||||
if ( $n ) { // && !$n instanceof Page_Frame_Decorator ) {
|
||||
$b = max($b, $style->length_in_pt($n->get_style()->margin_top, $cb["h"]));
|
||||
$n->get_style()->margin_top = "0pt";
|
||||
$style->margin_bottom = $b."pt";
|
||||
}
|
||||
|
||||
// Collapse our first child's margin
|
||||
$f = $this->_frame->get_first_child();
|
||||
while ( $f && !in_array($f->get_style()->display, Style::$BLOCK_TYPES) )
|
||||
$f = $f->get_next_sibling();
|
||||
|
||||
// Margin are collapsed only between block elements
|
||||
if ( $f && in_array($f->get_style()->display, Style::$BLOCK_TYPES)) {
|
||||
$t = max( $t, $style->length_in_pt($f->get_style()->margin_top, $cb["h"]));
|
||||
$style->margin_top = $t."pt";
|
||||
$f->get_style()->margin_bottom = "0pt";
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
//........................................................................
|
||||
|
||||
abstract function reflow(Frame_Decorator $block = null);
|
||||
|
||||
//........................................................................
|
||||
|
||||
// Required for table layout: Returns an array(0 => min, 1 => max, "min"
|
||||
// => min, "max" => max) of the minimum and maximum widths of this frame.
|
||||
// This provides a basic implementation. Child classes should override
|
||||
// this if necessary.
|
||||
function get_min_max_width() {
|
||||
if ( !is_null($this->_min_max_cache) ) {
|
||||
return $this->_min_max_cache;
|
||||
}
|
||||
|
||||
$style = $this->_frame->get_style();
|
||||
|
||||
// Account for margins & padding
|
||||
$dims = array($style->padding_left,
|
||||
$style->padding_right,
|
||||
$style->border_left_width,
|
||||
$style->border_right_width,
|
||||
$style->margin_left,
|
||||
$style->margin_right);
|
||||
|
||||
$cb_w = $this->_frame->get_containing_block("w");
|
||||
$delta = $style->length_in_pt($dims, $cb_w);
|
||||
|
||||
// Handle degenerate case
|
||||
if ( !$this->_frame->get_first_child() )
|
||||
return $this->_min_max_cache = array($delta, $delta,"min" => $delta, "max" => $delta);
|
||||
|
||||
$low = array();
|
||||
$high = array();
|
||||
|
||||
for ( $iter = $this->_frame->get_children()->getIterator();
|
||||
$iter->valid();
|
||||
$iter->next() ) {
|
||||
|
||||
$inline_min = 0;
|
||||
$inline_max = 0;
|
||||
|
||||
// Add all adjacent inline widths together to calculate max width
|
||||
while ( $iter->valid() && in_array( $iter->current()->get_style()->display, Style::$INLINE_TYPES ) ) {
|
||||
|
||||
$child = $iter->current();
|
||||
|
||||
$minmax = $child->get_min_max_width();
|
||||
|
||||
if ( in_array( $iter->current()->get_style()->white_space, array("pre", "nowrap") ) )
|
||||
$inline_min += $minmax["min"];
|
||||
else
|
||||
$low[] = $minmax["min"];
|
||||
|
||||
$inline_max += $minmax["max"];
|
||||
$iter->next();
|
||||
|
||||
}
|
||||
|
||||
if ( $inline_max > 0 )
|
||||
$high[] = $inline_max;
|
||||
|
||||
if ( $inline_min > 0 )
|
||||
$low[] = $inline_min;
|
||||
|
||||
if ( $iter->valid() ) {
|
||||
list($low[], $high[]) = $iter->current()->get_min_max_width();
|
||||
continue;
|
||||
}
|
||||
|
||||
}
|
||||
$min = count($low) ? max($low) : 0;
|
||||
$max = count($high) ? max($high) : 0;
|
||||
|
||||
// Use specified width if it is greater than the minimum defined by the
|
||||
// content. If the width is a percentage ignore it for now.
|
||||
$width = $style->width;
|
||||
if ( $width !== "auto" && !is_percent($width) ) {
|
||||
$width = $style->length_in_pt($width, $cb_w);
|
||||
if ( $min < $width )
|
||||
$min = $width;
|
||||
if ( $max < $width )
|
||||
$max = $width;
|
||||
}
|
||||
|
||||
$min += $delta;
|
||||
$max += $delta;
|
||||
return $this->_min_max_cache = array($min, $max, "min"=>$min, "max"=>$max);
|
||||
}
|
||||
|
||||
/**
|
||||
* Parses a CSS string containing quotes and escaped hex characters
|
||||
*
|
||||
* @param $string string The CSS string to parse
|
||||
* @param $single_trim
|
||||
* @return string
|
||||
*/
|
||||
protected function _parse_string($string, $single_trim = false) {
|
||||
if ($single_trim) {
|
||||
$string = preg_replace("/^[\"\']/", "", $string);
|
||||
$string = preg_replace("/[\"\']$/", "", $string);
|
||||
}
|
||||
else {
|
||||
$string = trim($string, "'\"");
|
||||
}
|
||||
|
||||
$string = str_replace(array("\\\n",'\\"',"\\'"),
|
||||
array("",'"',"'"), $string);
|
||||
|
||||
// Convert escaped hex characters into ascii characters (e.g. \A => newline)
|
||||
$string = preg_replace_callback("/\\\\([0-9a-fA-F]{0,6})(\s)?(?(2)|(?=[^0-9a-fA-F]))/",
|
||||
create_function('$matches',
|
||||
'return chr(hexdec($matches[1]));'),
|
||||
$string);
|
||||
return $string;
|
||||
}
|
||||
|
||||
/**
|
||||
* Parses a CSS "quotes" property
|
||||
*
|
||||
* @return array An array of pairs of quotes
|
||||
*/
|
||||
protected function _parse_quotes() {
|
||||
|
||||
// Matches quote types
|
||||
$re = "/(\'[^\']*\')|(\"[^\"]*\")/";
|
||||
|
||||
$quotes = $this->_frame->get_style()->quotes;
|
||||
|
||||
// split on spaces, except within quotes
|
||||
if (!preg_match_all($re, "$quotes", $matches, PREG_SET_ORDER))
|
||||
return;
|
||||
|
||||
$quotes_array = array();
|
||||
foreach($matches as &$_quote){
|
||||
$quotes_array[] = $this->_parse_string($_quote[0], true);
|
||||
}
|
||||
|
||||
if ( empty($quotes_array) ) {
|
||||
$quotes_array = array('"', '"');
|
||||
}
|
||||
|
||||
return array_chunk($quotes_array, 2);
|
||||
}
|
||||
|
||||
/**
|
||||
* Parses the CSS "content" property
|
||||
*
|
||||
* @return string The resulting string
|
||||
*/
|
||||
protected function _parse_content() {
|
||||
|
||||
// Matches generated content
|
||||
$re = "/\n".
|
||||
"\s(counters?\\([^)]*\\))|\n".
|
||||
"\A(counters?\\([^)]*\\))|\n".
|
||||
"\s([\"']) ( (?:[^\"']|\\\\[\"'])+ )(?<!\\\\)\\3|\n".
|
||||
"\A([\"']) ( (?:[^\"']|\\\\[\"'])+ )(?<!\\\\)\\5|\n" .
|
||||
"\s([^\s\"']+)|\n" .
|
||||
"\A([^\s\"']+)\n".
|
||||
"/xi";
|
||||
|
||||
$content = $this->_frame->get_style()->content;
|
||||
|
||||
$quotes = $this->_parse_quotes();
|
||||
|
||||
// split on spaces, except within quotes
|
||||
if (!preg_match_all($re, $content, $matches, PREG_SET_ORDER))
|
||||
return;
|
||||
|
||||
$text = "";
|
||||
|
||||
foreach ($matches as $match) {
|
||||
|
||||
if ( isset($match[2]) && $match[2] !== "" )
|
||||
$match[1] = $match[2];
|
||||
|
||||
if ( isset($match[6]) && $match[6] !== "" )
|
||||
$match[4] = $match[6];
|
||||
|
||||
if ( isset($match[8]) && $match[8] !== "" )
|
||||
$match[7] = $match[8];
|
||||
|
||||
if ( isset($match[1]) && $match[1] !== "" ) {
|
||||
|
||||
// counters?(...)
|
||||
$match[1] = mb_strtolower(trim($match[1]));
|
||||
|
||||
// Handle counter() references:
|
||||
// http://www.w3.org/TR/CSS21/generate.html#content
|
||||
|
||||
$i = mb_strpos($match[1], ")");
|
||||
if ( $i === false )
|
||||
continue;
|
||||
|
||||
$args = explode(",", mb_substr($match[1], 8, $i - 8));
|
||||
$counter_id = $args[0];
|
||||
|
||||
if ( $match[1][7] === "(" ) {
|
||||
// counter(name [,style])
|
||||
|
||||
if ( isset($args[1]) )
|
||||
$type = trim($args[1]);
|
||||
else
|
||||
$type = null;
|
||||
|
||||
$p = $this->_frame->find_block_parent();
|
||||
|
||||
$text .= $p->counter_value($counter_id, $type);
|
||||
|
||||
} else if ( $match[1][7] === "s" ) {
|
||||
// counters(name, string [,style])
|
||||
if ( isset($args[1]) )
|
||||
$string = $this->_parse_string(trim($args[1]));
|
||||
else
|
||||
$string = "";
|
||||
|
||||
if ( isset($args[2]) )
|
||||
$type = $args[2];
|
||||
else
|
||||
$type = null;
|
||||
|
||||
$p = $this->_frame->find_block_parent();
|
||||
$tmp = "";
|
||||
while ($p) {
|
||||
$tmp = $p->counter_value($counter_id, $type) . $string . $tmp;
|
||||
$p = $p->find_block_parent();
|
||||
}
|
||||
$text .= $tmp;
|
||||
|
||||
} else
|
||||
// countertops?
|
||||
continue;
|
||||
|
||||
} else if ( isset($match[4]) && $match[4] !== "" ) {
|
||||
// String match
|
||||
$text .= $this->_parse_string($match[4]);
|
||||
|
||||
} else if ( isset($match[7]) && $match[7] !== "" ) {
|
||||
// Directive match
|
||||
|
||||
if ( $match[7] === "open-quote" ) {
|
||||
// FIXME: do something here
|
||||
$text .= $quotes[0][0];
|
||||
} else if ( $match[7] === "close-quote" ) {
|
||||
// FIXME: do something else here
|
||||
$text .= $quotes[0][1];
|
||||
} else if ( $match[7] === "no-open-quote" ) {
|
||||
// FIXME:
|
||||
} else if ( $match[7] === "no-close-quote" ) {
|
||||
// FIXME:
|
||||
} else if ( mb_strpos($match[7],"attr(") === 0 ) {
|
||||
|
||||
$i = mb_strpos($match[7],")");
|
||||
if ( $i === false )
|
||||
continue;
|
||||
|
||||
$attr = mb_substr($match[7], 5, $i - 5);
|
||||
if ( $attr == "" )
|
||||
continue;
|
||||
|
||||
$text .= $this->_frame->get_parent()->get_node()->getAttribute($attr);
|
||||
} else
|
||||
continue;
|
||||
}
|
||||
}
|
||||
|
||||
return $text;
|
||||
}
|
||||
|
||||
/**
|
||||
* Sets the generated content of a generated frame
|
||||
*/
|
||||
protected function _set_content(){
|
||||
$frame = $this->_frame;
|
||||
$style = $frame->get_style();
|
||||
|
||||
if ( $style->content && $frame->get_node()->nodeName === "dompdf_generated" ) {
|
||||
$content = $this->_parse_content();
|
||||
$node = $frame->get_node()->ownerDocument->createTextNode($content);
|
||||
|
||||
$new_style = $style->get_stylesheet()->create_style();
|
||||
$new_style->inherit($style);
|
||||
|
||||
$new_frame = new Frame($node);
|
||||
$new_frame->set_style($new_style);
|
||||
|
||||
Frame_Factory::decorate_frame($new_frame, $frame->get_dompdf());
|
||||
$new_frame->get_decorator()->set_root($frame->get_root());
|
||||
$frame->append_child($new_frame);
|
||||
}
|
||||
}
|
||||
}
|
||||
230
pdf/include/frame_tree.cls.php
Executable file
230
pdf/include/frame_tree.cls.php
Executable file
@@ -0,0 +1,230 @@
|
||||
<?php
|
||||
/**
|
||||
* DOMPDF - PHP5 HTML to PDF renderer
|
||||
*
|
||||
* File: $RCSfile: frame_tree.cls.php,v $
|
||||
* Created on: 2004-06-02
|
||||
*
|
||||
* Copyright (c) 2004 - Benj Carson <benjcarson@digitaljunkies.ca>
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with this library in the file LICENSE.LGPL; if not, write to the
|
||||
* Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
* 02111-1307 USA
|
||||
*
|
||||
* Alternatively, you may distribute this software under the terms of the
|
||||
* PHP License, version 3.0 or later. A copy of this license should have
|
||||
* been distributed with this file in the file LICENSE.PHP . If this is not
|
||||
* the case, you can obtain a copy at http://www.php.net/license/3_0.txt.
|
||||
*
|
||||
* The latest version of DOMPDF might be available at:
|
||||
* http://www.dompdf.com/
|
||||
*
|
||||
* @link http://www.dompdf.com/
|
||||
* @copyright 2004 Benj Carson
|
||||
* @author Benj Carson <benjcarson@digitaljunkies.ca>
|
||||
* @package dompdf
|
||||
|
||||
*/
|
||||
|
||||
/* $Id: frame_tree.cls.php 332 2010-11-27 14:06:34Z fabien.menager $ */
|
||||
|
||||
/**
|
||||
* Represents an entire document as a tree of frames
|
||||
*
|
||||
* The Frame_Tree consists of {@link Frame} objects each tied to specific
|
||||
* DomNode objects in a specific DomDocument. The Frame_Tree has the same
|
||||
* structure as the DomDocument, but adds additional capabalities for
|
||||
* styling and layout.
|
||||
*
|
||||
* @package dompdf
|
||||
* @access protected
|
||||
*/
|
||||
class Frame_Tree {
|
||||
|
||||
/**
|
||||
* Tags to ignore while parsing the tree
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
static protected $_HIDDEN_TAGS = array("area", "base", "basefont", "head", "style",
|
||||
"meta", "title", "colgroup",
|
||||
"noembed", "noscript", "param", "#comment");
|
||||
/**
|
||||
* The main DomDocument
|
||||
*
|
||||
* @see http://ca2.php.net/manual/en/ref.dom.php
|
||||
* @var DomDocument
|
||||
*/
|
||||
protected $_dom;
|
||||
|
||||
/**
|
||||
* The root node of the FrameTree.
|
||||
*
|
||||
* @var Frame
|
||||
*/
|
||||
protected $_root;
|
||||
|
||||
/**
|
||||
* Subtrees of absolutely positioned elements
|
||||
*
|
||||
* @var array of Frames
|
||||
*/
|
||||
protected $_absolute_frames;
|
||||
|
||||
/**
|
||||
* A mapping of {@link Frame} objects to DomNode objects
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $_registry;
|
||||
|
||||
|
||||
/**
|
||||
* Class constructor
|
||||
*
|
||||
* @param DomDocument $dom the main DomDocument object representing the current html document
|
||||
*/
|
||||
function __construct(DomDocument $dom) {
|
||||
$this->_dom = $dom;
|
||||
$this->_root = null;
|
||||
$this->_registry = array();
|
||||
}
|
||||
|
||||
function __destruct() {
|
||||
clear_object($this);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the DomDocument object representing the curent html document
|
||||
*
|
||||
* @return DomDocument
|
||||
*/
|
||||
function get_dom() { return $this->_dom; }
|
||||
|
||||
/**
|
||||
* Returns the root frame of the tree
|
||||
*
|
||||
* @return Frame
|
||||
*/
|
||||
function get_root() { return $this->_root; }
|
||||
|
||||
/**
|
||||
* Returns a specific frame given its id
|
||||
*
|
||||
* @param string $id
|
||||
* @return Frame
|
||||
*/
|
||||
function get_frame($id) { return isset($this->_registry[$id]) ? $this->_registry[$id] : null; }
|
||||
|
||||
/**
|
||||
* Returns a post-order iterator for all frames in the tree
|
||||
*
|
||||
* @return FrameTreeList
|
||||
*/
|
||||
function get_frames() { return new FrameTreeList($this->_root); }
|
||||
|
||||
/**
|
||||
* Builds the tree
|
||||
*/
|
||||
function build_tree() {
|
||||
$html = $this->_dom->getElementsByTagName("html")->item(0);
|
||||
if ( is_null($html) )
|
||||
$html = $this->_dom->firstChild;
|
||||
|
||||
if ( is_null($html) )
|
||||
throw new DOMPDF_Exception("Requested HTML document contains no data.");
|
||||
|
||||
$this->_root = $this->_build_tree_r($html);
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Recursively adds {@link Frame} objects to the tree
|
||||
*
|
||||
* Recursively build a tree of Frame objects based on a dom tree.
|
||||
* No layout information is calculated at this time, although the
|
||||
* tree may be adjusted (i.e. nodes and frames for generated content
|
||||
* and images may be created).
|
||||
*
|
||||
* @param DomNode $node the current DomNode being considered
|
||||
* @return Frame
|
||||
*/
|
||||
protected function _build_tree_r(DomNode $node) {
|
||||
|
||||
$frame = new Frame($node);
|
||||
$id = $frame->get_id();
|
||||
$this->_registry[ $id ] = $frame;
|
||||
|
||||
if ( !$node->hasChildNodes() )
|
||||
return $frame;
|
||||
|
||||
// Fixes 'cannot access undefined property for object with
|
||||
// overloaded access', fix by Stefan radulian
|
||||
// <stefan.radulian@symbion.at>
|
||||
//foreach ($node->childNodes as $child) {
|
||||
|
||||
// Store the children in an array so that the tree can be modified
|
||||
$children = array();
|
||||
for ($i = 0; $i < $node->childNodes->length; $i++)
|
||||
$children[] = $node->childNodes->item($i);
|
||||
|
||||
foreach ($children as $child) {
|
||||
$node_name = mb_strtolower($child->nodeName);
|
||||
|
||||
// Skip non-displaying nodes
|
||||
if ( in_array($node_name, self::$_HIDDEN_TAGS) ) {
|
||||
if ( $node_name !== "head" &&
|
||||
$node_name !== "style" )
|
||||
$child->parentNode->removeChild($child);
|
||||
continue;
|
||||
}
|
||||
|
||||
// Skip empty text nodes
|
||||
if ( $node_name === "#text" && $child->nodeValue == "" ) {
|
||||
$child->parentNode->removeChild($child);
|
||||
continue;
|
||||
}
|
||||
|
||||
// Skip empty image nodes
|
||||
if ( $node_name === "img" && $child->getAttribute("src") == "" ) {
|
||||
$child->parentNode->removeChild($child);
|
||||
continue;
|
||||
}
|
||||
|
||||
$frame->append_child($this->_build_tree_r($child), false);
|
||||
}
|
||||
|
||||
return $frame;
|
||||
}
|
||||
|
||||
public function insert_node(DOMNode $node, DOMNode $new_node, $pos) {
|
||||
if ($pos === "after" || !$node->firstChild)
|
||||
$node->appendChild($new_node);
|
||||
else
|
||||
$node->insertBefore($new_node, $node->firstChild);
|
||||
|
||||
$this->_build_tree_r($new_node);
|
||||
|
||||
$frame_id = $new_node->getAttribute("frame_id");
|
||||
$frame = $this->get_frame($frame_id);
|
||||
|
||||
$parent_id = $node->getAttribute("frame_id");
|
||||
$parent = $this->get_frame($parent_id);
|
||||
|
||||
if ($pos === "before")
|
||||
$parent->prepend_child($frame, false);
|
||||
else
|
||||
$parent->append_child($frame, false);
|
||||
}
|
||||
}
|
||||
942
pdf/include/functions.inc.php
Executable file
942
pdf/include/functions.inc.php
Executable file
@@ -0,0 +1,942 @@
|
||||
<?php
|
||||
/**
|
||||
* DOMPDF - PHP5 HTML to PDF renderer
|
||||
*
|
||||
* File: $RCSfile: functions.inc.php,v $
|
||||
* Created on: 2004-08-04
|
||||
*
|
||||
* Copyright (c) 2004 - Benj Carson <benjcarson@digitaljunkies.ca>
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with this library in the file LICENSE.LGPL; if not, write to the
|
||||
* Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
* 02111-1307 USA
|
||||
*
|
||||
* Alternatively, you may distribute this software under the terms of the
|
||||
* PHP License, version 3.0 or later. A copy of this license should have
|
||||
* been distributed with this file in the file LICENSE.PHP . If this is not
|
||||
* the case, you can obtain a copy at http://www.php.net/license/3_0.txt.
|
||||
*
|
||||
* The latest version of DOMPDF might be available at:
|
||||
* http://www.dompdf.com/
|
||||
*
|
||||
* @link http://www.dompdf.com/
|
||||
* @copyright 2004 Benj Carson
|
||||
* @author Benj Carson <benjcarson@digitaljunkies.ca>
|
||||
* @contributor Helmut Tischer <htischer@weihenstephan.org>
|
||||
* @package dompdf
|
||||
*
|
||||
* Changes
|
||||
* @contributor Helmut Tischer <htischer@weihenstephan.org>
|
||||
* @version 0.5.1.htischer.20090507
|
||||
* - trailing slash of base_path in build_url is no longer optional when
|
||||
* required. This allows paths not ending in a slash, e.g. on dynamically
|
||||
* created sites with page id in the url parameters.
|
||||
* @version 20090601
|
||||
* - fix windows paths
|
||||
* @version 20090610
|
||||
* - relax windows path syntax, use uniform path delimiter. Used for background images.
|
||||
*/
|
||||
|
||||
/* $Id: functions.inc.php 361 2011-02-16 21:03:05Z fabien.menager $ */
|
||||
|
||||
function def($name, $value = true) {
|
||||
if (!defined($name)) {
|
||||
define($name, $value);
|
||||
}
|
||||
}
|
||||
|
||||
if ( !function_exists("pre_r") ) {
|
||||
/**
|
||||
* print_r wrapper for html/cli output
|
||||
*
|
||||
* Wraps print_r() output in < pre > tags if the current sapi is not
|
||||
* 'cli'. Returns the output string instead of displaying it if $return is
|
||||
* true.
|
||||
*
|
||||
* @param mixed $mixed variable or expression to display
|
||||
* @param bool $return
|
||||
*
|
||||
*/
|
||||
function pre_r($mixed, $return = false) {
|
||||
if ($return)
|
||||
return "<pre>" . print_r($mixed, true) . "</pre>";
|
||||
|
||||
if ( php_sapi_name() !== "cli")
|
||||
echo ("<pre>");
|
||||
print_r($mixed);
|
||||
|
||||
if ( php_sapi_name() !== "cli")
|
||||
echo("</pre>");
|
||||
else
|
||||
echo ("\n");
|
||||
flush();
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
if ( !function_exists("pre_var_dump") ) {
|
||||
/**
|
||||
* var_dump wrapper for html/cli output
|
||||
*
|
||||
* Wraps var_dump() output in < pre > tags if the current sapi is not
|
||||
* 'cli'.
|
||||
*
|
||||
* @param mixed $mixed variable or expression to display.
|
||||
*/
|
||||
function pre_var_dump($mixed) {
|
||||
if ( php_sapi_name() !== "cli")
|
||||
echo("<pre>");
|
||||
|
||||
var_dump($mixed);
|
||||
|
||||
if ( php_sapi_name() !== "cli")
|
||||
echo("</pre>");
|
||||
}
|
||||
}
|
||||
|
||||
if ( !function_exists("d") ) {
|
||||
/**
|
||||
* generic debug function
|
||||
*
|
||||
* Takes everything and does its best to give a good debug output
|
||||
*
|
||||
* @param mixed $mixed variable or expression to display.
|
||||
*/
|
||||
function d($mixed) {
|
||||
if ( php_sapi_name() !== "cli")
|
||||
echo("<pre>");
|
||||
|
||||
// line
|
||||
if (is_array($mixed) && array_key_exists("tallest_frame", $mixed)) {
|
||||
echo "<strong>LINE</strong>:\n";
|
||||
foreach($mixed as $key => $value) {
|
||||
if (is_array($value) || is_object($value)) continue;
|
||||
echo " $key:\t".var_export($value,true)."\n";
|
||||
}
|
||||
}
|
||||
|
||||
// other
|
||||
else {
|
||||
var_export($mixed);
|
||||
}
|
||||
|
||||
if ( php_sapi_name() !== "cli")
|
||||
echo("</pre>");
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* builds a full url given a protocol, hostname, base path and url
|
||||
*
|
||||
* @param string $protocol
|
||||
* @param string $host
|
||||
* @param string $base_path
|
||||
* @param string $url
|
||||
* @return string
|
||||
*
|
||||
* Initially the trailing slash of $base_path was optional, and conditionally appended.
|
||||
* However on dynamically created sites, where the page is given as url parameter,
|
||||
* the base path might not end with an url.
|
||||
* Therefore do not append a slash, and **require** the $base_url to ending in a slash
|
||||
* when needed.
|
||||
* Vice versa, on using the local file system path of a file, make sure that the slash
|
||||
* is appended (o.k. also for Windows)
|
||||
*/
|
||||
function build_url($protocol, $host, $base_path, $url) {
|
||||
if ( mb_strlen($url) == 0 ) {
|
||||
//return $protocol . $host . rtrim($base_path, "/\\") . "/";
|
||||
return $protocol . $host . $base_path;
|
||||
}
|
||||
|
||||
// Is the url already fully qualified or a Data URI?
|
||||
if ( mb_strpos($url, "://") !== false || mb_strpos($url, "data:") === 0 )
|
||||
return $url;
|
||||
|
||||
$ret = $protocol;
|
||||
|
||||
if (!in_array(mb_strtolower($protocol), array("http://", "https://", "ftp://", "ftps://"))) {
|
||||
//On Windows local file, an abs path can begin also with a '\' or a drive letter and colon
|
||||
//drive: followed by a relative path would be a drive specific default folder.
|
||||
//not known in php app code, treat as abs path
|
||||
//($url[1] !== ':' || ($url[2]!=='\\' && $url[2]!=='/'))
|
||||
if ($url[0] !== '/' && (strtoupper(substr(PHP_OS, 0, 3)) !== 'WIN' || ($url[0] !== '\\' && $url[1] !== ':'))) {
|
||||
// For rel path and local acess we ignore the host, and run the path through realpath()
|
||||
$ret .= realpath($base_path).'/';
|
||||
}
|
||||
$ret .= $url;
|
||||
$ret = preg_replace("/\?(.*)$/", "", $ret);
|
||||
return $ret;
|
||||
}
|
||||
|
||||
//remote urls with backslash in html/css are not really correct, but lets be genereous
|
||||
if ( $url[0] === '/' || $url[0] === '\\' ) {
|
||||
// Absolute path
|
||||
$ret .= $host . $url;
|
||||
} else {
|
||||
// Relative path
|
||||
//$base_path = $base_path !== "" ? rtrim($base_path, "/\\") . "/" : "";
|
||||
$ret .= $host . $base_path . $url;
|
||||
}
|
||||
|
||||
return $ret;
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* parse a full url or pathname and return an array(protocol, host, path,
|
||||
* file + query + fragment)
|
||||
*
|
||||
* @param string $url
|
||||
* @return array
|
||||
*/
|
||||
function explode_url($url) {
|
||||
$protocol = "";
|
||||
$host = "";
|
||||
$path = "";
|
||||
$file = "";
|
||||
|
||||
$arr = parse_url($url);
|
||||
|
||||
if ( isset($arr["scheme"]) &&
|
||||
$arr["scheme"] !== "file" &&
|
||||
mb_strlen($arr["scheme"]) > 1 ) // Exclude windows drive letters...
|
||||
{
|
||||
$protocol = $arr["scheme"] . "://";
|
||||
|
||||
if ( isset($arr["user"]) ) {
|
||||
$host .= $arr["user"];
|
||||
|
||||
if ( isset($arr["pass"]) )
|
||||
$host .= "@" . $arr["pass"];
|
||||
|
||||
$host .= ":";
|
||||
}
|
||||
|
||||
if ( isset($arr["host"]) )
|
||||
$host .= $arr["host"];
|
||||
|
||||
if ( isset($arr["port"]) )
|
||||
$host .= ":" . $arr["port"];
|
||||
|
||||
if ( isset($arr["path"]) && $arr["path"] !== "" ) {
|
||||
// Do we have a trailing slash?
|
||||
if ( $arr["path"][ mb_strlen($arr["path"]) - 1 ] === "/" ) {
|
||||
$path = $arr["path"];
|
||||
$file = "";
|
||||
} else {
|
||||
$path = dirname($arr["path"]) . "/";
|
||||
$file = basename($arr["path"]);
|
||||
}
|
||||
}
|
||||
|
||||
if ( isset($arr["query"]) )
|
||||
$file .= "?" . $arr["query"];
|
||||
|
||||
if ( isset($arr["fragment"]) )
|
||||
$file .= "#" . $arr["fragment"];
|
||||
|
||||
} else {
|
||||
|
||||
$i = mb_strpos($url, "file://");
|
||||
if ( $i !== false)
|
||||
$url = mb_substr($url, $i + 7);
|
||||
|
||||
$protocol = ""; // "file://"; ? why doesn't this work... It's because of
|
||||
// network filenames like //COMPU/SHARENAME
|
||||
|
||||
$host = ""; // localhost, really
|
||||
$file = basename($url);
|
||||
|
||||
$path = dirname($url);
|
||||
|
||||
// Check that the path exists
|
||||
if ( $path !== false ) {
|
||||
$path .= '/';
|
||||
|
||||
} else {
|
||||
// generate a url to access the file if no real path found.
|
||||
$protocol = isset($_SERVER['HTTPS']) && $_SERVER['HTTPS'] === 'on' ? 'https://' : 'http://';
|
||||
|
||||
$host = isset($_SERVER["HTTP_HOST"]) ? $_SERVER["HTTP_HOST"] : php_uname("n");
|
||||
|
||||
if ( substr($arr["path"], 0, 1) === '/' ) {
|
||||
$path = dirname($arr["path"]);
|
||||
} else {
|
||||
$path = '/' . rtrim(dirname($_SERVER["SCRIPT_NAME"]), '/') . '/' . $arr["path"];
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
$ret = array($protocol, $host, $path, $file,
|
||||
"protocol" => $protocol,
|
||||
"host" => $host,
|
||||
"path" => $path,
|
||||
"file" => $file);
|
||||
return $ret;
|
||||
}
|
||||
|
||||
/**
|
||||
* converts decimal numbers to roman numerals
|
||||
*
|
||||
* @param int $num
|
||||
* @return string
|
||||
*/
|
||||
function dec2roman($num) {
|
||||
|
||||
static $ones = array("", "i", "ii", "iii", "iv", "v",
|
||||
"vi", "vii", "viii", "ix");
|
||||
static $tens = array("", "x", "xx", "xxx", "xl", "l",
|
||||
"lx", "lxx", "lxxx", "xc");
|
||||
static $hund = array("", "c", "cc", "ccc", "cd", "d",
|
||||
"dc", "dcc", "dccc", "cm");
|
||||
static $thou = array("", "m", "mm", "mmm");
|
||||
|
||||
if ( !is_numeric($num) )
|
||||
throw new DOMPDF_Exception("dec2roman() requires a numeric argument.");
|
||||
|
||||
if ( $num > 4000 || $num < 0 )
|
||||
return "(out of range)";
|
||||
|
||||
$num = strrev((string)$num);
|
||||
|
||||
$ret = "";
|
||||
switch (mb_strlen($num)) {
|
||||
case 4: $ret .= $thou[$num[3]];
|
||||
case 3: $ret .= $hund[$num[2]];
|
||||
case 2: $ret .= $tens[$num[1]];
|
||||
case 1: $ret .= $ones[$num[0]];
|
||||
default: break;
|
||||
}
|
||||
return $ret;
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Determines whether $value is a percentage or not
|
||||
*
|
||||
* @param float $value
|
||||
* @return bool
|
||||
*/
|
||||
function is_percent($value) { return false !== mb_strpos($value, "%"); }
|
||||
|
||||
/**
|
||||
* Parses a data URI scheme
|
||||
* http://en.wikipedia.org/wiki/Data_URI_scheme
|
||||
* @param string $data_uri The data URI to parse
|
||||
* @return array The result with charset, mime type and decoded data
|
||||
*/
|
||||
function parse_data_uri($data_uri) {
|
||||
if (!preg_match('/^data:(?P<mime>[a-z0-9\/+-.]+)(;charset=(?P<charset>[a-z0-9-])+)?(?P<base64>;base64)?\,(?P<data>.*)?/i', $data_uri, $match)) {
|
||||
return false;
|
||||
}
|
||||
|
||||
$match['data'] = rawurldecode($match['data']);
|
||||
$result = array(
|
||||
'charset' => $match['charset'] ? $match['charset'] : 'US-ASCII',
|
||||
'mime' => $match['mime'] ? $match['mime'] : 'text/plain',
|
||||
'data' => $match['base64'] ? base64_decode($match['data']) : $match['data'],
|
||||
);
|
||||
|
||||
return $result;
|
||||
}
|
||||
|
||||
/**
|
||||
* mb_string compatibility
|
||||
*/
|
||||
if ( !function_exists("mb_strlen") ) {
|
||||
|
||||
define('MB_OVERLOAD_MAIL', 1);
|
||||
define('MB_OVERLOAD_STRING', 2);
|
||||
define('MB_OVERLOAD_REGEX', 4);
|
||||
define('MB_CASE_UPPER', 0);
|
||||
define('MB_CASE_LOWER', 1);
|
||||
define('MB_CASE_TITLE', 2);
|
||||
|
||||
function mb_convert_encoding($data, $to_encoding, $from_encoding = 'UTF-8') {
|
||||
if (str_replace('-', '', strtolower($to_encoding)) === 'utf8') {
|
||||
return utf8_encode($data);
|
||||
} else {
|
||||
return utf8_decode($data);
|
||||
}
|
||||
}
|
||||
|
||||
function mb_detect_encoding($data, $encoding_list = array('iso-8859-1'), $strict = false) {
|
||||
return 'iso-8859-1';
|
||||
}
|
||||
|
||||
function mb_detect_order($encoding_list = array('iso-8859-1')) {
|
||||
return 'iso-8859-1';
|
||||
}
|
||||
|
||||
function mb_internal_encoding($encoding = null) {
|
||||
if (isset($encoding)) {
|
||||
return true;
|
||||
} else {
|
||||
return 'iso-8859-1';
|
||||
}
|
||||
}
|
||||
|
||||
function mb_strlen($str, $encoding = 'iso-8859-1') {
|
||||
switch (str_replace('-', '', strtolower($encoding))) {
|
||||
case "utf8": return strlen(utf8_encode($str));
|
||||
case "8bit": return strlen($str);
|
||||
default: return strlen(utf8_decode($str));
|
||||
}
|
||||
}
|
||||
|
||||
function mb_strpos($haystack, $needle, $offset = 0) {
|
||||
return strpos($haystack, $needle, $offset);
|
||||
}
|
||||
|
||||
function mb_strrpos($haystack, $needle, $offset = 0) {
|
||||
return strrpos($haystack, $needle, $offset);
|
||||
}
|
||||
|
||||
function mb_strtolower( $str ) {
|
||||
return strtolower($str);
|
||||
}
|
||||
|
||||
function mb_strtoupper( $str ) {
|
||||
return strtoupper($str);
|
||||
}
|
||||
|
||||
function mb_substr($string, $start, $length = null, $encoding = 'iso-8859-1') {
|
||||
if ( is_null($length) )
|
||||
return substr($string, $start);
|
||||
else
|
||||
return substr($string, $start, $length);
|
||||
}
|
||||
|
||||
function mb_substr_count($haystack, $needle, $encoding = 'iso-8859-1') {
|
||||
return substr_count($haystack, $needle);
|
||||
}
|
||||
|
||||
function mb_encode_numericentity($str, $convmap, $encoding) {
|
||||
return htmlspecialchars($str);
|
||||
}
|
||||
|
||||
function mb_convert_case($str, $mode = MB_CASE_UPPER, $encoding = array()) {
|
||||
switch($mode) {
|
||||
case MB_CASE_UPPER: return mb_strtoupper($str);
|
||||
case MB_CASE_LOWER: return mb_strtolower($str);
|
||||
case MB_CASE_TITLE: return ucwords(mb_strtolower($str));
|
||||
default: return $str;
|
||||
}
|
||||
}
|
||||
|
||||
function mb_list_encodings() {
|
||||
return array(
|
||||
"ISO-8859-1",
|
||||
"UTF-8",
|
||||
"8bit",
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Decoder for RLE8 compression in windows bitmaps
|
||||
* http://msdn.microsoft.com/library/default.asp?url=/library/en-us/gdi/bitmaps_6x0u.asp
|
||||
*/
|
||||
function rle8_decode ($str, $width){
|
||||
$lineWidth = $width + (3 - ($width-1) % 4);
|
||||
$out = '';
|
||||
$cnt = strlen($str);
|
||||
|
||||
for ($i = 0; $i <$cnt; $i++) {
|
||||
$o = ord($str[$i]);
|
||||
switch ($o){
|
||||
case 0: # ESCAPE
|
||||
$i++;
|
||||
switch (ord($str[$i])){
|
||||
case 0: # NEW LINE
|
||||
$padCnt = $lineWidth - strlen($out)%$lineWidth;
|
||||
if ($padCnt<$lineWidth) $out .= str_repeat(chr(0), $padCnt); # pad line
|
||||
break;
|
||||
case 1: # END OF FILE
|
||||
$padCnt = $lineWidth - strlen($out)%$lineWidth;
|
||||
if ($padCnt<$lineWidth) $out .= str_repeat(chr(0), $padCnt); # pad line
|
||||
break 3;
|
||||
case 2: # DELTA
|
||||
$i += 2;
|
||||
break;
|
||||
default: # ABSOLUTE MODE
|
||||
$num = ord($str[$i]);
|
||||
for ($j = 0; $j < $num; $j++)
|
||||
$out .= $str[++$i];
|
||||
if ($num % 2) $i++;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
$out .= str_repeat($str[++$i], $o);
|
||||
}
|
||||
}
|
||||
return $out;
|
||||
}
|
||||
|
||||
/**
|
||||
* Decoder for RLE4 compression in windows bitmaps
|
||||
* see http://msdn.microsoft.com/library/default.asp?url=/library/en-us/gdi/bitmaps_6x0u.asp
|
||||
*/
|
||||
function rle4_decode ($str, $width) {
|
||||
$w = floor($width/2) + ($width % 2);
|
||||
$lineWidth = $w + (3 - ( ($width-1) / 2) % 4);
|
||||
$pixels = array();
|
||||
$cnt = strlen($str);
|
||||
|
||||
for ($i = 0; $i < $cnt; $i++) {
|
||||
$o = ord($str[$i]);
|
||||
switch ($o) {
|
||||
case 0: # ESCAPE
|
||||
$i++;
|
||||
switch (ord($str[$i])){
|
||||
case 0: # NEW LINE
|
||||
while (count($pixels)%$lineWidth!=0)
|
||||
$pixels[]=0;
|
||||
break;
|
||||
case 1: # END OF FILE
|
||||
while (count($pixels)%$lineWidth!=0)
|
||||
$pixels[]=0;
|
||||
break 3;
|
||||
case 2: # DELTA
|
||||
$i += 2;
|
||||
break;
|
||||
default: # ABSOLUTE MODE
|
||||
$num = ord($str[$i]);
|
||||
for ($j = 0; $j < $num; $j++){
|
||||
if ($j%2 == 0){
|
||||
$c = ord($str[++$i]);
|
||||
$pixels[] = ($c & 240)>>4;
|
||||
} else
|
||||
$pixels[] = $c & 15;
|
||||
}
|
||||
if ($num % 2) $i++;
|
||||
}
|
||||
break;
|
||||
default:
|
||||
$c = ord($str[++$i]);
|
||||
for ($j = 0; $j < $o; $j++)
|
||||
$pixels[] = ($j%2==0 ? ($c & 240)>>4 : $c & 15);
|
||||
}
|
||||
}
|
||||
|
||||
$out = '';
|
||||
if (count($pixels)%2) $pixels[]=0;
|
||||
$cnt = count($pixels)/2;
|
||||
|
||||
for ($i = 0; $i < $cnt; $i++)
|
||||
$out .= chr(16*$pixels[2*$i] + $pixels[2*$i+1]);
|
||||
|
||||
return $out;
|
||||
}
|
||||
|
||||
if ( !function_exists("imagecreatefrombmp") ) {
|
||||
|
||||
/**
|
||||
* Credit goes to mgutt
|
||||
* http://www.programmierer-forum.de/function-imagecreatefrombmp-welche-variante-laeuft-t143137.htm
|
||||
* Modified by Fabien Menager to support RGB555 BMP format
|
||||
*/
|
||||
function imagecreatefrombmp($filename) {
|
||||
try {
|
||||
// version 1.00
|
||||
if (!($fh = fopen($filename, 'rb'))) {
|
||||
trigger_error('imagecreatefrombmp: Can not open ' . $filename, E_USER_WARNING);
|
||||
return false;
|
||||
}
|
||||
|
||||
// read file header
|
||||
$meta = unpack('vtype/Vfilesize/Vreserved/Voffset', fread($fh, 14));
|
||||
|
||||
// check for bitmap
|
||||
if ($meta['type'] != 19778) {
|
||||
trigger_error('imagecreatefrombmp: ' . $filename . ' is not a bitmap!', E_USER_WARNING);
|
||||
return false;
|
||||
}
|
||||
|
||||
// read image header
|
||||
$meta += unpack('Vheadersize/Vwidth/Vheight/vplanes/vbits/Vcompression/Vimagesize/Vxres/Vyres/Vcolors/Vimportant', fread($fh, 40));
|
||||
|
||||
// read additional bitfield header
|
||||
if ($meta['compression'] == 3) {
|
||||
$meta += unpack('VrMask/VgMask/VbMask', fread($fh, 12));
|
||||
}
|
||||
|
||||
//pre_r($filename);pre_r($meta);
|
||||
|
||||
// set bytes and padding
|
||||
$meta['bytes'] = $meta['bits'] / 8;
|
||||
$meta['decal'] = 4 - (4 * (($meta['width'] * $meta['bytes'] / 4)- floor($meta['width'] * $meta['bytes'] / 4)));
|
||||
if ($meta['decal'] == 4) {
|
||||
$meta['decal'] = 0;
|
||||
}
|
||||
|
||||
// obtain imagesize
|
||||
if ($meta['imagesize'] < 1) {
|
||||
$meta['imagesize'] = $meta['filesize'] - $meta['offset'];
|
||||
// in rare cases filesize is equal to offset so we need to read physical size
|
||||
if ($meta['imagesize'] < 1) {
|
||||
$meta['imagesize'] = @filesize($filename) - $meta['offset'];
|
||||
if ($meta['imagesize'] < 1) {
|
||||
trigger_error('imagecreatefrombmp: Can not obtain filesize of ' . $filename . '!', E_USER_WARNING);
|
||||
return false;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// calculate colors
|
||||
$meta['colors'] = !$meta['colors'] ? pow(2, $meta['bits']) : $meta['colors'];
|
||||
|
||||
// read color palette
|
||||
$palette = array();
|
||||
if ($meta['bits'] < 16) {
|
||||
$palette = unpack('l' . $meta['colors'], fread($fh, $meta['colors'] * 4));
|
||||
// in rare cases the color value is signed
|
||||
if ($palette[1] < 0) {
|
||||
foreach ($palette as $i => $color) {
|
||||
$palette[$i] = $color + 16777216;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// create gd image
|
||||
$im = imagecreatetruecolor($meta['width'], $meta['height']);
|
||||
$data = fread($fh, $meta['imagesize']);
|
||||
|
||||
// uncompress data
|
||||
switch ($meta['compression']) {
|
||||
case 1: $data = rle8_decode($data, $meta['width']); break;
|
||||
case 2: $data = rle4_decode($data, $meta['width']); break;
|
||||
}
|
||||
|
||||
$p = 0;
|
||||
$vide = chr(0);
|
||||
$y = $meta['height'] - 1;
|
||||
$error = 'imagecreatefrombmp: ' . $filename . ' has not enough data!';
|
||||
|
||||
// loop through the image data beginning with the lower left corner
|
||||
while ($y >= 0) {
|
||||
$x = 0;
|
||||
while ($x < $meta['width']) {
|
||||
switch ($meta['bits']) {
|
||||
case 32:
|
||||
case 24:
|
||||
if (!($part = substr($data, $p, 3 /*$meta['bytes']*/))) {
|
||||
trigger_error($error, E_USER_WARNING);
|
||||
return $im;
|
||||
}
|
||||
$color = unpack('V', $part . $vide);
|
||||
break;
|
||||
case 16:
|
||||
if (!($part = substr($data, $p, 2 /*$meta['bytes']*/))) {
|
||||
trigger_error($error, E_USER_WARNING);
|
||||
return $im;
|
||||
}
|
||||
$color = unpack('v', $part);
|
||||
|
||||
if (empty($meta['rMask']) || $meta['rMask'] != 0xf800)
|
||||
$color[1] = (($color[1] & 0x7c00) >> 7) * 65536 + (($color[1] & 0x03e0) >> 2) * 256 + (($color[1] & 0x001f) << 3); // 555
|
||||
else
|
||||
$color[1] = (($color[1] & 0xf800) >> 8) * 65536 + (($color[1] & 0x07e0) >> 3) * 256 + (($color[1] & 0x001f) << 3); // 565
|
||||
break;
|
||||
case 8:
|
||||
$color = unpack('n', $vide . substr($data, $p, 1));
|
||||
$color[1] = $palette[ $color[1] + 1 ];
|
||||
break;
|
||||
case 4:
|
||||
$color = unpack('n', $vide . substr($data, floor($p), 1));
|
||||
$color[1] = ($p * 2) % 2 == 0 ? $color[1] >> 4 : $color[1] & 0x0F;
|
||||
$color[1] = $palette[ $color[1] + 1 ];
|
||||
break;
|
||||
case 1:
|
||||
$color = unpack('n', $vide . substr($data, floor($p), 1));
|
||||
switch (($p * 8) % 8) {
|
||||
case 0: $color[1] = $color[1] >> 7; break;
|
||||
case 1: $color[1] = ($color[1] & 0x40) >> 6; break;
|
||||
case 2: $color[1] = ($color[1] & 0x20) >> 5; break;
|
||||
case 3: $color[1] = ($color[1] & 0x10) >> 4; break;
|
||||
case 4: $color[1] = ($color[1] & 0x8 ) >> 3; break;
|
||||
case 5: $color[1] = ($color[1] & 0x4 ) >> 2; break;
|
||||
case 6: $color[1] = ($color[1] & 0x2 ) >> 1; break;
|
||||
case 7: $color[1] = ($color[1] & 0x1 ); break;
|
||||
}
|
||||
$color[1] = $palette[ $color[1] + 1 ];
|
||||
break;
|
||||
default:
|
||||
trigger_error('imagecreatefrombmp: ' . $filename . ' has ' . $meta['bits'] . ' bits and this is not supported!', E_USER_WARNING);
|
||||
return false;
|
||||
}
|
||||
imagesetpixel($im, $x, $y, $color[1]);
|
||||
$x++;
|
||||
$p += $meta['bytes'];
|
||||
}
|
||||
$y--;
|
||||
$p += $meta['decal'];
|
||||
}
|
||||
fclose($fh);
|
||||
return $im;
|
||||
} catch (Exception $e) {var_dump($e);}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* getimagesize doesn't give a good size for 32bit BMP image v5
|
||||
*
|
||||
* @param string $filename
|
||||
* @return array The same format as getimagesize($filename)
|
||||
*/
|
||||
function dompdf_getimagesize($filename) {
|
||||
$size = getimagesize($filename);
|
||||
|
||||
if ( $size[0] == null || $size[1] == null ) {
|
||||
$data = file_get_contents($filename, null, null, 0, 26);
|
||||
|
||||
if ( substr($data, 0, 2) === "BM" ) {
|
||||
$meta = unpack('vtype/Vfilesize/Vreserved/Voffset/Vheadersize/Vwidth/Vheight', $data);
|
||||
$size[0] = (int)$meta['width'];
|
||||
$size[1] = (int)$meta['height'];
|
||||
}
|
||||
}
|
||||
|
||||
return $size;
|
||||
}
|
||||
|
||||
/**
|
||||
* Converts a CMYK color to RGB
|
||||
*
|
||||
* @param int $c
|
||||
* @param int $m
|
||||
* @param int $y
|
||||
* @param int $k
|
||||
* @return object
|
||||
*/
|
||||
function cmyk_to_rgb($c, $m = null, $y = null, $k = null) {
|
||||
if (is_array($c)) {
|
||||
list($c, $m, $y, $k) = $c;
|
||||
}
|
||||
|
||||
$c *= 255;
|
||||
$m *= 255;
|
||||
$y *= 255;
|
||||
$k *= 255;
|
||||
|
||||
$r = (1 - round(2.55 * ($c+$k))) ;
|
||||
$g = (1 - round(2.55 * ($m+$k))) ;
|
||||
$b = (1 - round(2.55 * ($y+$k))) ;
|
||||
|
||||
if($r<0) $r = 0;
|
||||
if($g<0) $g = 0;
|
||||
if($b<0) $b = 0;
|
||||
|
||||
return array(
|
||||
$r, $g, $b,
|
||||
"r" => $r, "g" => $g, "b" => $b
|
||||
);
|
||||
}
|
||||
|
||||
function unichr($c) {
|
||||
if ($c <= 0x7F) {
|
||||
return chr($c);
|
||||
} else if ($c <= 0x7FF) {
|
||||
return chr(0xC0 | $c >> 6) . chr(0x80 | $c & 0x3F);
|
||||
} else if ($c <= 0xFFFF) {
|
||||
return chr(0xE0 | $c >> 12) . chr(0x80 | $c >> 6 & 0x3F)
|
||||
. chr(0x80 | $c & 0x3F);
|
||||
} else if ($c <= 0x10FFFF) {
|
||||
return chr(0xF0 | $c >> 18) . chr(0x80 | $c >> 12 & 0x3F)
|
||||
. chr(0x80 | $c >> 6 & 0x3F)
|
||||
. chr(0x80 | $c & 0x3F);
|
||||
}
|
||||
return false;
|
||||
}
|
||||
|
||||
if ( !function_exists("date_default_timezone_get") ) {
|
||||
function date_default_timezone_get() {
|
||||
return "";
|
||||
}
|
||||
|
||||
function date_default_timezone_set($timezone_identifier) {
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Stores warnings in an array for display later
|
||||
*
|
||||
* This function allows warnings generated by the DomDocument parser
|
||||
* and CSS loader ({@link Stylesheet}) to be captured and displayed
|
||||
* later. Without this function, errors are displayed immediately and
|
||||
* PDF streaming is impossible.
|
||||
*
|
||||
* @see http://www.php.net/manual/en/function.set-error_handler.php
|
||||
*
|
||||
* @param int $errno
|
||||
* @param string $errstr
|
||||
* @param string $errfile
|
||||
* @param string $errline
|
||||
*/
|
||||
function record_warnings($errno, $errstr, $errfile, $errline) {
|
||||
|
||||
if ( !($errno & (E_WARNING | E_NOTICE | E_USER_NOTICE | E_USER_WARNING )) ) // Not a warning or notice
|
||||
throw new DOMPDF_Exception($errstr . " $errno");
|
||||
|
||||
global $_dompdf_warnings;
|
||||
global $_dompdf_show_warnings;
|
||||
|
||||
if ( $_dompdf_show_warnings )
|
||||
echo $errstr . "\n";
|
||||
|
||||
$_dompdf_warnings[] = $errstr;
|
||||
}
|
||||
|
||||
/**
|
||||
* Print a useful backtrace
|
||||
*/
|
||||
function bt() {
|
||||
if ( php_sapi_name() !== "cli")
|
||||
echo("<pre>");
|
||||
|
||||
$bt = debug_backtrace();
|
||||
|
||||
array_shift($bt); // remove actual bt() call
|
||||
echo "\n";
|
||||
|
||||
$i = 0;
|
||||
foreach ($bt as $call) {
|
||||
$file = basename($call["file"]) . " (" . $call["line"] . ")";
|
||||
if ( isset($call["class"]) ) {
|
||||
$func = $call["class"] . "->" . $call["function"] . "()";
|
||||
} else {
|
||||
$func = $call["function"] . "()";
|
||||
}
|
||||
|
||||
echo "#" . str_pad($i, 2, " ", STR_PAD_RIGHT) . ": " . str_pad($file.":", 42) . " $func\n";
|
||||
$i++;
|
||||
}
|
||||
echo "\n";
|
||||
|
||||
if ( php_sapi_name() !== "cli")
|
||||
echo("</pre>");
|
||||
}
|
||||
|
||||
/**
|
||||
* Print debug messages
|
||||
*
|
||||
* @param string $type The type of debug messages to print
|
||||
*/
|
||||
function dompdf_debug($type, $msg) {
|
||||
global $_DOMPDF_DEBUG_TYPES, $_dompdf_show_warnings, $_dompdf_debug;
|
||||
if ( isset($_DOMPDF_DEBUG_TYPES[$type]) && ($_dompdf_show_warnings || $_dompdf_debug) ) {
|
||||
$arr = debug_backtrace();
|
||||
|
||||
echo basename($arr[0]["file"]) . " (" . $arr[0]["line"] ."): " . $arr[1]["function"] . ": ";
|
||||
pre_r($msg);
|
||||
}
|
||||
}
|
||||
|
||||
if ( !function_exists("print_memusage") ) {
|
||||
/**
|
||||
* Dump memory usage
|
||||
*/
|
||||
function print_memusage() {
|
||||
global $memusage;
|
||||
echo ("Memory Usage\n");
|
||||
$prev = 0;
|
||||
$initial = reset($memusage);
|
||||
echo (str_pad("Initial:", 40) . $initial . "\n\n");
|
||||
|
||||
foreach ($memusage as $key=>$mem) {
|
||||
$mem -= $initial;
|
||||
echo (str_pad("$key:" , 40));
|
||||
echo (str_pad("$mem", 12) . "(diff: " . ($mem - $prev) . ")\n");
|
||||
$prev = $mem;
|
||||
}
|
||||
|
||||
echo ("\n" . str_pad("Total:", 40) . memory_get_usage()) . "\n";
|
||||
}
|
||||
}
|
||||
|
||||
if ( !function_exists("enable_mem_profile") ) {
|
||||
/**
|
||||
* Initialize memory profiling code
|
||||
*/
|
||||
function enable_mem_profile() {
|
||||
global $memusage;
|
||||
$memusage = array("Startup" => memory_get_usage());
|
||||
register_shutdown_function("print_memusage");
|
||||
}
|
||||
}
|
||||
|
||||
if ( !function_exists("mark_memusage") ) {
|
||||
/**
|
||||
* Record the current memory usage
|
||||
*
|
||||
* @param string $location a meaningful location
|
||||
*/
|
||||
function mark_memusage($location) {
|
||||
global $memusage;
|
||||
if ( isset($memusage) )
|
||||
$memusage[$location] = memory_get_usage();
|
||||
}
|
||||
}
|
||||
|
||||
if ( !function_exists('sys_get_temp_dir')) {
|
||||
/**
|
||||
* Find the current system temporary directory
|
||||
*
|
||||
* @link http://us.php.net/manual/en/function.sys-get-temp-dir.php#85261
|
||||
*/
|
||||
function sys_get_temp_dir() {
|
||||
if (!empty($_ENV['TMP'])) { return realpath($_ENV['TMP']); }
|
||||
if (!empty($_ENV['TMPDIR'])) { return realpath( $_ENV['TMPDIR']); }
|
||||
if (!empty($_ENV['TEMP'])) { return realpath( $_ENV['TEMP']); }
|
||||
$tempfile=tempnam(uniqid(rand(),TRUE),'');
|
||||
if (file_exists($tempfile)) {
|
||||
unlink($tempfile);
|
||||
return realpath(dirname($tempfile));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if ( function_exists("memory_get_peak_usage") ) {
|
||||
function DOMPDF_memory_usage(){
|
||||
return memory_get_peak_usage(true);
|
||||
}
|
||||
}
|
||||
else if ( function_exists("memory_get_peak_usage") ) {
|
||||
function DOMPDF_memory_usage(){
|
||||
return memory_get_usage(true);
|
||||
}
|
||||
}
|
||||
else {
|
||||
function DOMPDF_memory_usage(){
|
||||
return "N/A";
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Affect null to the unused objects
|
||||
* @param unknown_type $object
|
||||
*/
|
||||
function clear_object(&$object) {
|
||||
if ( is_object($object) ) {
|
||||
foreach (array_keys((array)$object) as $key) {
|
||||
clear_object($property);
|
||||
}
|
||||
foreach(get_class_vars(get_class($object)) as $property => $value) {
|
||||
clear_object($property);
|
||||
}
|
||||
}
|
||||
$object = null;
|
||||
unset($object);
|
||||
}
|
||||
840
pdf/include/gd_adapter.cls.php
Executable file
840
pdf/include/gd_adapter.cls.php
Executable file
@@ -0,0 +1,840 @@
|
||||
<?php
|
||||
/**
|
||||
* DOMPDF - PHP5 HTML to PDF renderer
|
||||
*
|
||||
* File: $RCSfile: gd_adapter.cls.php,v $
|
||||
* Created on: 2004-06-06
|
||||
*
|
||||
* Copyright (c) 2004 - Benj Carson <benjcarson@digitaljunkies.ca>
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with this library in the file LICENSE.LGPL; if not, write to the
|
||||
* Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
* 02111-1307 USA
|
||||
*
|
||||
* Alternatively, you may distribute this software under the terms of the
|
||||
* PHP License, version 3.0 or later. A copy of this license should have
|
||||
* been distributed with this file in the file LICENSE.PHP . If this is not
|
||||
* the case, you can obtain a copy at http://www.php.net/license/3_0.txt.
|
||||
*
|
||||
* The latest version of DOMPDF might be available at:
|
||||
* http://www.dompdf.com/
|
||||
*
|
||||
* @link http://www.dompdf.com/
|
||||
* @copyright 2004 Benj Carson
|
||||
* @author Benj Carson <benjcarson@digitaljunkies.ca>
|
||||
* @package dompdf
|
||||
|
||||
*/
|
||||
|
||||
/* $Id: gd_adapter.cls.php 355 2011-01-27 07:44:54Z fabien.menager $ */
|
||||
|
||||
/**
|
||||
* Image rendering interface
|
||||
*
|
||||
* Renders to an image format supported by GD (jpeg, gif, png, xpm).
|
||||
* Not super-useful day-to-day but handy nonetheless
|
||||
*
|
||||
* @package dompdf
|
||||
*/
|
||||
class GD_Adapter implements Canvas {
|
||||
|
||||
/**
|
||||
* Resoure handle for the image
|
||||
*
|
||||
* @var resource
|
||||
*/
|
||||
private $_img;
|
||||
|
||||
/**
|
||||
* Image width in pixels
|
||||
*
|
||||
* @var int
|
||||
*/
|
||||
private $_width;
|
||||
|
||||
/**
|
||||
* Image height in pixels
|
||||
*
|
||||
* @var int
|
||||
*/
|
||||
private $_height;
|
||||
|
||||
/**
|
||||
* Current page number
|
||||
*
|
||||
* @var int
|
||||
*/
|
||||
private $_page_number;
|
||||
|
||||
/**
|
||||
* Total number of pages
|
||||
*
|
||||
* @var int
|
||||
*/
|
||||
private $_page_count;
|
||||
|
||||
/**
|
||||
* Image antialias factor
|
||||
*
|
||||
* @var float
|
||||
*/
|
||||
private $_aa_factor;
|
||||
|
||||
/**
|
||||
* Allocated colors
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
private $_colors;
|
||||
|
||||
/**
|
||||
* Background color
|
||||
*
|
||||
* @var int
|
||||
*/
|
||||
private $_bg_color;
|
||||
|
||||
/**
|
||||
* Class constructor
|
||||
*
|
||||
* @param mixed $size The size of image to create: array(x1,y1,x2,y2) or "letter", "legal", etc.
|
||||
* @param string $orientation The orientation of the document (either 'landscape' or 'portrait')
|
||||
* @param float $aa_factor Anti-aliasing factor, 1 for no AA
|
||||
* @param array $bg_color Image background color: array(r,g,b,a), 0 <= r,g,b,a <= 1
|
||||
*/
|
||||
function __construct($size, $orientation = "portrait", $aa_factor = 1, $bg_color = array(1,1,1,0) ) {
|
||||
|
||||
if ( !is_array($size) ) {
|
||||
$size = strtolower($size);
|
||||
|
||||
if ( isset(CPDF_Adapter::$PAPER_SIZES[$size]) )
|
||||
$size = CPDF_Adapter::$PAPER_SIZES[$size];
|
||||
else
|
||||
$size = CPDF_Adapter::$PAPER_SIZES["letter"];
|
||||
}
|
||||
|
||||
if ( strtolower($orientation) === "landscape" ) {
|
||||
list($size[2],$size[3]) = array($size[3],$size[2]);
|
||||
}
|
||||
|
||||
if ( $aa_factor < 1 )
|
||||
$aa_factor = 1;
|
||||
|
||||
$this->_aa_factor = $aa_factor;
|
||||
|
||||
$size[2] *= $aa_factor;
|
||||
$size[3] *= $aa_factor;
|
||||
|
||||
$this->_width = $size[2] - $size[0];
|
||||
$this->_height = $size[3] - $size[1];
|
||||
|
||||
$this->_img = imagecreatetruecolor($this->_width, $this->_height);
|
||||
|
||||
if ( is_null($bg_color) || !is_array($bg_color) ) {
|
||||
// Pure white bg
|
||||
$bg_color = array(1,1,1,0);
|
||||
}
|
||||
|
||||
$this->_bg_color = $this->_allocate_color($bg_color);
|
||||
imagealphablending($this->_img, true);
|
||||
imagesavealpha($this->_img, true);
|
||||
imagefill($this->_img, 0, 0, $this->_bg_color);
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the GF image resource
|
||||
*
|
||||
* @return resource
|
||||
*/
|
||||
function get_image() { return $this->_img; }
|
||||
|
||||
/**
|
||||
* Return the image's width in pixels
|
||||
*
|
||||
* @return float
|
||||
*/
|
||||
function get_width() { return $this->_width / $this->_aa_factor; }
|
||||
|
||||
/**
|
||||
* Return the image's height in pixels
|
||||
*
|
||||
* @return float
|
||||
*/
|
||||
function get_height() { return $this->_height / $this->_aa_factor; }
|
||||
|
||||
/**
|
||||
* Returns the current page number
|
||||
* @return int
|
||||
*/
|
||||
function get_page_number() { return $this->_page_number; }
|
||||
|
||||
/**
|
||||
* Returns the total number of pages in the document
|
||||
* @return int
|
||||
*/
|
||||
function get_page_count() { return $this->_page_count; }
|
||||
|
||||
/**
|
||||
* Sets the current page number
|
||||
*
|
||||
* @param int $num
|
||||
*/
|
||||
function set_page_number($num) { $this->_page_number = $num; }
|
||||
|
||||
/**
|
||||
* Sets the page count
|
||||
*
|
||||
* @param int $count
|
||||
*/
|
||||
function set_page_count($count) { $this->_page_count = $count; }
|
||||
|
||||
/**
|
||||
* Sets the opacity
|
||||
*
|
||||
* @param $opacity
|
||||
* @param $mode
|
||||
*/
|
||||
function set_opacity($opacity, $mode = "Normal") {
|
||||
// FIXME
|
||||
}
|
||||
|
||||
/**
|
||||
* Allocate a new color. Allocate with GD as needed and store
|
||||
* previously allocated colors in $this->_colors.
|
||||
*
|
||||
* @param array $color The new current color
|
||||
* @return int The allocated color
|
||||
*/
|
||||
private function _allocate_color($color) {
|
||||
|
||||
if ( isset($color["c"]) ) {
|
||||
$color = cmyk_to_rgb($color);
|
||||
}
|
||||
|
||||
// Full opacity if no alpha set
|
||||
if ( !isset($color[3]) )
|
||||
$color[3] = 0;
|
||||
|
||||
list($r,$g,$b,$a) = $color;
|
||||
|
||||
$r *= 255;
|
||||
$g *= 255;
|
||||
$b *= 255;
|
||||
$a *= 127;
|
||||
|
||||
// Clip values
|
||||
$r = $r > 255 ? 255 : $r;
|
||||
$g = $g > 255 ? 255 : $g;
|
||||
$b = $b > 255 ? 255 : $b;
|
||||
$a = $a > 127 ? 127 : $a;
|
||||
|
||||
$r = $r < 0 ? 0 : $r;
|
||||
$g = $g < 0 ? 0 : $g;
|
||||
$b = $b < 0 ? 0 : $b;
|
||||
$a = $a < 0 ? 0 : $a;
|
||||
|
||||
$key = sprintf("#%02X%02X%02X%02X", $r, $g, $b, $a);
|
||||
|
||||
if ( isset($this->_colors[$key]) )
|
||||
return $this->_colors[$key];
|
||||
|
||||
if ( $a != 0 )
|
||||
$this->_colors[$key] = imagecolorallocatealpha($this->_img, $r, $g, $b, $a);
|
||||
else
|
||||
$this->_colors[$key] = imagecolorallocate($this->_img, $r, $g, $b);
|
||||
|
||||
return $this->_colors[$key];
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Draws a line from x1,y1 to x2,y2
|
||||
*
|
||||
* See {@link Style::munge_color()} for the format of the color array.
|
||||
* See {@link Cpdf::setLineStyle()} for a description of the format of the
|
||||
* $style parameter (aka dash).
|
||||
*
|
||||
* @param float $x1
|
||||
* @param float $y1
|
||||
* @param float $x2
|
||||
* @param float $y2
|
||||
* @param array $color
|
||||
* @param float $width
|
||||
* @param array $style
|
||||
*/
|
||||
function line($x1, $y1, $x2, $y2, $color, $width, $style = null) {
|
||||
|
||||
// Scale by the AA factor
|
||||
$x1 *= $this->_aa_factor;
|
||||
$y1 *= $this->_aa_factor;
|
||||
$x2 *= $this->_aa_factor;
|
||||
$y2 *= $this->_aa_factor;
|
||||
$width *= $this->_aa_factor;
|
||||
|
||||
$c = $this->_allocate_color($color);
|
||||
|
||||
// Convert the style array if required
|
||||
if ( !is_null($style) ) {
|
||||
$gd_style = array();
|
||||
|
||||
if ( count($style) == 1 ) {
|
||||
for ($i = 0; $i < $style[0] * $this->_aa_factor; $i++) {
|
||||
$gd_style[] = $c;
|
||||
}
|
||||
|
||||
for ($i = 0; $i < $style[0] * $this->_aa_factor; $i++) {
|
||||
$gd_style[] = $this->_bg_color;
|
||||
}
|
||||
|
||||
} else {
|
||||
|
||||
$i = 0;
|
||||
foreach ($style as $length) {
|
||||
|
||||
if ( $i % 2 == 0 ) {
|
||||
// 'On' pattern
|
||||
for ($i = 0; $i < $style[0] * $this->_aa_factor; $i++)
|
||||
$gd_style[] = $c;
|
||||
|
||||
} else {
|
||||
// Off pattern
|
||||
for ($i = 0; $i < $style[0] * $this->_aa_factor; $i++)
|
||||
$gd_style[] = $this->_bg_color;
|
||||
|
||||
}
|
||||
$i++;
|
||||
}
|
||||
}
|
||||
|
||||
imagesetstyle($this->_img, $gd_style);
|
||||
$c = IMG_COLOR_STYLED;
|
||||
}
|
||||
|
||||
imagesetthickness($this->_img, $width);
|
||||
|
||||
imageline($this->_img, $x1, $y1, $x2, $y2, $c);
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Draws a rectangle at x1,y1 with width w and height h
|
||||
*
|
||||
* See {@link Style::munge_color()} for the format of the color array.
|
||||
* See {@link Cpdf::setLineStyle()} for a description of the $style
|
||||
* parameter (aka dash)
|
||||
*
|
||||
* @param float $x1
|
||||
* @param float $y1
|
||||
* @param float $w
|
||||
* @param float $h
|
||||
* @param array $color
|
||||
* @param float $width
|
||||
* @param array $style
|
||||
*/
|
||||
function rectangle($x1, $y1, $w, $h, $color, $width, $style = null) {
|
||||
|
||||
// Scale by the AA factor
|
||||
$x1 *= $this->_aa_factor;
|
||||
$y1 *= $this->_aa_factor;
|
||||
$w *= $this->_aa_factor;
|
||||
$h *= $this->_aa_factor;
|
||||
|
||||
$c = $this->_allocate_color($color);
|
||||
|
||||
// Convert the style array if required
|
||||
if ( !is_null($style) ) {
|
||||
$gd_style = array();
|
||||
|
||||
foreach ($style as $length) {
|
||||
for ($i = 0; $i < $length; $i++) {
|
||||
$gd_style[] = $c;
|
||||
}
|
||||
}
|
||||
|
||||
imagesetstyle($this->_img, $gd_style);
|
||||
$c = IMG_COLOR_STYLED;
|
||||
}
|
||||
|
||||
imagesetthickness($this->_img, $width);
|
||||
|
||||
imagerectangle($this->_img, $x1, $y1, $x1 + $w, $y1 + $h, $c);
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Draws a filled rectangle at x1,y1 with width w and height h
|
||||
*
|
||||
* See {@link Style::munge_color()} for the format of the color array.
|
||||
*
|
||||
* @param float $x1
|
||||
* @param float $y1
|
||||
* @param float $w
|
||||
* @param float $h
|
||||
* @param array $color
|
||||
*/
|
||||
function filled_rectangle($x1, $y1, $w, $h, $color) {
|
||||
|
||||
// Scale by the AA factor
|
||||
$x1 *= $this->_aa_factor;
|
||||
$y1 *= $this->_aa_factor;
|
||||
$w *= $this->_aa_factor;
|
||||
$h *= $this->_aa_factor;
|
||||
|
||||
$c = $this->_allocate_color($color);
|
||||
|
||||
imagefilledrectangle($this->_img, $x1, $y1, $x1 + $w, $y1 + $h, $c);
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Starts a clipping rectangle at x1,y1 with width w and height h
|
||||
*
|
||||
* @param float $x1
|
||||
* @param float $y1
|
||||
* @param float $w
|
||||
* @param float $h
|
||||
*/
|
||||
function clipping_rectangle($x1, $y1, $w, $h) {
|
||||
// @todo
|
||||
}
|
||||
|
||||
/**
|
||||
* Ends the last clipping shape
|
||||
*/
|
||||
function clipping_end() {
|
||||
// @todo
|
||||
}
|
||||
|
||||
function save() {
|
||||
// @todo
|
||||
}
|
||||
|
||||
function restore() {
|
||||
// @todo
|
||||
}
|
||||
|
||||
function rotate($angle, $x, $y) {
|
||||
// @todo
|
||||
}
|
||||
|
||||
function skew($angle_x, $angle_y, $x, $y) {
|
||||
// @todo
|
||||
}
|
||||
|
||||
function scale($s_x, $s_y, $x, $y) {
|
||||
// @todo
|
||||
}
|
||||
|
||||
function translate($t_x, $t_y) {
|
||||
// @todo
|
||||
}
|
||||
|
||||
function transform($a, $b, $c, $d, $e, $f) {
|
||||
// @todo
|
||||
}
|
||||
|
||||
/**
|
||||
* Draws a polygon
|
||||
*
|
||||
* The polygon is formed by joining all the points stored in the $points
|
||||
* array. $points has the following structure:
|
||||
* <code>
|
||||
* array(0 => x1,
|
||||
* 1 => y1,
|
||||
* 2 => x2,
|
||||
* 3 => y2,
|
||||
* ...
|
||||
* );
|
||||
* </code>
|
||||
*
|
||||
* See {@link Style::munge_color()} for the format of the color array.
|
||||
* See {@link Cpdf::setLineStyle()} for a description of the $style
|
||||
* parameter (aka dash)
|
||||
*
|
||||
* @param array $points
|
||||
* @param array $color
|
||||
* @param float $width
|
||||
* @param array $style
|
||||
* @param bool $fill Fills the polygon if true
|
||||
*/
|
||||
function polygon($points, $color, $width = null, $style = null, $fill = false) {
|
||||
|
||||
// Scale each point by the AA factor
|
||||
foreach (array_keys($points) as $i)
|
||||
$points[$i] *= $this->_aa_factor;
|
||||
|
||||
$c = $this->_allocate_color($color);
|
||||
|
||||
// Convert the style array if required
|
||||
if ( !is_null($style) && !$fill ) {
|
||||
$gd_style = array();
|
||||
|
||||
foreach ($style as $length) {
|
||||
for ($i = 0; $i < $length; $i++) {
|
||||
$gd_style[] = $c;
|
||||
}
|
||||
}
|
||||
|
||||
imagesetstyle($this->_img, $gd_style);
|
||||
$c = IMG_COLOR_STYLED;
|
||||
}
|
||||
|
||||
imagesetthickness($this->_img, $width);
|
||||
|
||||
if ( $fill )
|
||||
imagefilledpolygon($this->_img, $points, count($points) / 2, $c);
|
||||
else
|
||||
imagepolygon($this->_img, $points, count($points) / 2, $c);
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Draws a circle at $x,$y with radius $r
|
||||
*
|
||||
* See {@link Style::munge_color()} for the format of the color array.
|
||||
* See {@link Cpdf::setLineStyle()} for a description of the $style
|
||||
* parameter (aka dash)
|
||||
*
|
||||
* @param float $x
|
||||
* @param float $y
|
||||
* @param float $r
|
||||
* @param array $color
|
||||
* @param float $width
|
||||
* @param array $style
|
||||
* @param bool $fill Fills the circle if true
|
||||
*/
|
||||
function circle($x, $y, $r, $color, $width = null, $style = null, $fill = false) {
|
||||
|
||||
// Scale by the AA factor
|
||||
$x *= $this->_aa_factor;
|
||||
$y *= $this->_aa_factor;
|
||||
$r *= $this->_aa_factor;
|
||||
|
||||
$c = $this->_allocate_color($color);
|
||||
|
||||
// Convert the style array if required
|
||||
if ( !is_null($style) && !$fill ) {
|
||||
$gd_style = array();
|
||||
|
||||
foreach ($style as $length) {
|
||||
for ($i = 0; $i < $length; $i++) {
|
||||
$gd_style[] = $c;
|
||||
}
|
||||
}
|
||||
|
||||
imagesetstyle($this->_img, $gd_style);
|
||||
$c = IMG_COLOR_STYLED;
|
||||
}
|
||||
|
||||
imagesetthickness($this->_img, $width);
|
||||
|
||||
if ( $fill )
|
||||
imagefilledellipse($this->_img, $x, $y, $r, $r, $c);
|
||||
else
|
||||
imageellipse($this->_img, $x, $y, $r, $r, $c);
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Add an image to the pdf.
|
||||
*
|
||||
* The image is placed at the specified x and y coordinates with the
|
||||
* given width and height.
|
||||
*
|
||||
* @param string $img_url the path to the image
|
||||
* @param string $img_type the type (e.g. extension) of the image
|
||||
* @param float $x x position
|
||||
* @param float $y y position
|
||||
* @param int $w width (in pixels)
|
||||
* @param int $h height (in pixels)
|
||||
*/
|
||||
function image($img_url, $img_type, $x, $y, $w, $h) {
|
||||
|
||||
switch ($img_type) {
|
||||
case "png":
|
||||
$src = @imagecreatefrompng($img_url);
|
||||
break;
|
||||
|
||||
case "gif":
|
||||
$src = @imagecreatefromgif($img_url);
|
||||
break;
|
||||
|
||||
case "bmp":
|
||||
$src = @imagecreatefrombmp($img_url);
|
||||
break;
|
||||
|
||||
case "jpg":
|
||||
case "jpeg":
|
||||
$src = @imagecreatefromjpeg($img_url);
|
||||
break;
|
||||
|
||||
default:
|
||||
break;
|
||||
|
||||
}
|
||||
|
||||
if ( !$src )
|
||||
return; // Probably should add to $_dompdf_errors or whatever here
|
||||
|
||||
// Scale by the AA factor
|
||||
$x *= $this->_aa_factor;
|
||||
$y *= $this->_aa_factor;
|
||||
|
||||
$w *= $this->_aa_factor;
|
||||
$h *= $this->_aa_factor;
|
||||
|
||||
$img_w = imagesx($src);
|
||||
$img_h = imagesy($src);
|
||||
|
||||
|
||||
imagecopyresampled($this->_img, $src, $x, $y, 0, 0, $w, $h, $img_w, $img_h);
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* Writes text at the specified x and y coordinates
|
||||
*
|
||||
* See {@link Style::munge_color()} for the format of the color array.
|
||||
*
|
||||
* @param float $x
|
||||
* @param float $y
|
||||
* @param string $text the text to write
|
||||
* @param string $font the font file to use
|
||||
* @param float $size the font size, in points
|
||||
* @param array $color
|
||||
* @param float $adjust word spacing adjustment
|
||||
* @param float $angle Text angle
|
||||
*/
|
||||
function text($x, $y, $text, $font, $size, $color = array(0,0,0), $word_spacing = 0, $char_spacing = 0, $angle = 0) {
|
||||
|
||||
// Scale by the AA factor
|
||||
$x *= $this->_aa_factor;
|
||||
$y *= $this->_aa_factor;
|
||||
$size *= $this->_aa_factor;
|
||||
|
||||
$h = $this->get_font_height($font, $size);
|
||||
$c = $this->_allocate_color($color);
|
||||
|
||||
$text = mb_encode_numericentity($text, array(0x0080, 0xff, 0, 0xff), 'UTF-8');
|
||||
|
||||
if ( strpos($font, '.ttf') === false )
|
||||
$font .= ".ttf";
|
||||
|
||||
// FIXME: word spacing
|
||||
@imagettftext($this->_img, $size, $angle, $x, $y + $h, $c, $font, $text);
|
||||
|
||||
}
|
||||
|
||||
function javascript($code) {
|
||||
// Not implemented
|
||||
}
|
||||
|
||||
/**
|
||||
* Add a named destination (similar to <a name="foo">...</a> in html)
|
||||
*
|
||||
* @param string $anchorname The name of the named destination
|
||||
*/
|
||||
function add_named_dest($anchorname) {
|
||||
// Not implemented
|
||||
}
|
||||
|
||||
/**
|
||||
* Add a link to the pdf
|
||||
*
|
||||
* @param string $url The url to link to
|
||||
* @param float $x The x position of the link
|
||||
* @param float $y The y position of the link
|
||||
* @param float $width The width of the link
|
||||
* @param float $height The height of the link
|
||||
*/
|
||||
function add_link($url, $x, $y, $width, $height) {
|
||||
// Not implemented
|
||||
}
|
||||
|
||||
/**
|
||||
* Add meta information to the PDF
|
||||
*
|
||||
* @param string $label label of the value (Creator, Producer, etc.)
|
||||
* @param string $value the text to set
|
||||
*/
|
||||
function add_info($label, $value) {
|
||||
// N/A
|
||||
}
|
||||
|
||||
/**
|
||||
* Calculates text size, in points
|
||||
*
|
||||
* @param string $text the text to be sized
|
||||
* @param string $font the desired font
|
||||
* @param float $size the desired font size
|
||||
* @param float $spacing word spacing, if any
|
||||
* @return float
|
||||
*/
|
||||
function get_text_width($text, $font, $size, $word_spacing = 0, $char_spacing = 0) {
|
||||
|
||||
if ( strpos($font, '.ttf') === false )
|
||||
$font .= ".ttf";
|
||||
|
||||
$text = mb_encode_numericentity($text, array(0x0080, 0xffff, 0, 0xffff), 'UTF-8');
|
||||
|
||||
// FIXME: word spacing
|
||||
list($x1,,$x2) = @imagettfbbox($size, 0, $font, $text);
|
||||
return $x2 - $x1;
|
||||
}
|
||||
|
||||
/**
|
||||
* Calculates font height, in points
|
||||
*
|
||||
* @param string $font
|
||||
* @param float $size
|
||||
* @return float
|
||||
*/
|
||||
function get_font_height($font, $size) {
|
||||
if ( strpos($font, '.ttf') === false )
|
||||
$font .= ".ttf";
|
||||
|
||||
// FIXME: word spacing
|
||||
list(,$y2,,,,$y1) = imagettfbbox($size, 0, $font, "MXjpqytfhl"); // Test string with ascenders, descenders and caps
|
||||
return ($y2 - $y1) * DOMPDF_FONT_HEIGHT_RATIO;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Starts a new page
|
||||
*
|
||||
* Subsequent drawing operations will appear on the new page.
|
||||
*/
|
||||
function new_page() {
|
||||
$this->_page_number++;
|
||||
$this->_page_count++;
|
||||
}
|
||||
|
||||
function open_object(){
|
||||
// N/A
|
||||
}
|
||||
|
||||
function close_object(){
|
||||
// N/A
|
||||
}
|
||||
|
||||
function add_object(){
|
||||
// N/A
|
||||
}
|
||||
|
||||
function page_text(){
|
||||
// N/A
|
||||
}
|
||||
|
||||
/**
|
||||
* Streams the image directly to the browser
|
||||
*
|
||||
* @param string $filename the name of the image file (ignored)
|
||||
* @param array $options associative array, 'type' => jpeg|jpg|png, 'quality' => 0 - 100 (jpeg only)
|
||||
*/
|
||||
function stream($filename, $options = null) {
|
||||
|
||||
// Perform any antialiasing
|
||||
if ( $this->_aa_factor != 1 ) {
|
||||
$dst_w = $this->_width / $this->_aa_factor;
|
||||
$dst_h = $this->_height / $this->_aa_factor;
|
||||
$dst = imagecreatetruecolor($dst_w, $dst_h);
|
||||
imagecopyresampled($dst, $this->_img, 0, 0, 0, 0,
|
||||
$dst_w, $dst_h,
|
||||
$this->_width, $this->_height);
|
||||
} else {
|
||||
$dst = $this->_img;
|
||||
}
|
||||
|
||||
if ( !isset($options["type"]) )
|
||||
$options["type"] = "png";
|
||||
|
||||
$type = strtolower($options["type"]);
|
||||
|
||||
header("Cache-Control: private");
|
||||
|
||||
switch ($type) {
|
||||
|
||||
case "jpg":
|
||||
case "jpeg":
|
||||
if ( !isset($options["quality"]) )
|
||||
$options["quality"] = 75;
|
||||
|
||||
header("Content-type: image/jpeg");
|
||||
imagejpeg($dst, '', $options["quality"]);
|
||||
break;
|
||||
|
||||
case "png":
|
||||
default:
|
||||
header("Content-type: image/png");
|
||||
imagepng($dst);
|
||||
break;
|
||||
}
|
||||
|
||||
if ( $this->_aa_factor != 1 )
|
||||
imagedestroy($dst);
|
||||
}
|
||||
|
||||
/**
|
||||
* Returns the PNG as a string
|
||||
*
|
||||
* @param array $options associative array, 'type' => jpeg|jpg|png, 'quality' => 0 - 100 (jpeg only)
|
||||
* @return string
|
||||
*/
|
||||
function output($options = null) {
|
||||
|
||||
if ( $this->_aa_factor != 1 ) {
|
||||
$dst_w = $this->_width / $this->_aa_factor;
|
||||
$dst_h = $this->_height / $this->_aa_factor;
|
||||
$dst = imagecreatetruecolor($dst_w, $dst_h);
|
||||
imagecopyresampled($dst, $this->_img, 0, 0, 0, 0,
|
||||
$dst_w, $dst_h,
|
||||
$this->_width, $this->_height);
|
||||
} else {
|
||||
$dst = $this->_img;
|
||||
}
|
||||
|
||||
if ( !isset($options["type"]) )
|
||||
$options["type"] = "png";
|
||||
|
||||
$type = $options["type"];
|
||||
|
||||
ob_start();
|
||||
|
||||
switch ($type) {
|
||||
|
||||
case "jpg":
|
||||
case "jpeg":
|
||||
if ( !isset($options["quality"]) )
|
||||
$options["quality"] = 75;
|
||||
|
||||
imagejpeg($dst, '', $options["quality"]);
|
||||
break;
|
||||
|
||||
case "png":
|
||||
default:
|
||||
imagepng($dst);
|
||||
break;
|
||||
}
|
||||
|
||||
$image = ob_get_clean();
|
||||
|
||||
if ( $this->_aa_factor != 1 )
|
||||
imagedestroy($dst);
|
||||
|
||||
return $image;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
231
pdf/include/image_cache.cls.php
Executable file
231
pdf/include/image_cache.cls.php
Executable file
@@ -0,0 +1,231 @@
|
||||
<?php
|
||||
/**
|
||||
* DOMPDF - PHP5 HTML to PDF renderer
|
||||
*
|
||||
* File: $RCSfile: image_cache.cls.php,v $
|
||||
* Created on: 2004-08-08
|
||||
*
|
||||
* Copyright (c) 2004 - Benj Carson <benjcarson@digitaljunkies.ca>
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with this library in the file LICENSE.LGPL; if not, write to the
|
||||
* Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
* 02111-1307 USA
|
||||
*
|
||||
* Alternatively, you may distribute this software under the terms of the
|
||||
* PHP License, version 3.0 or later. A copy of this license should have
|
||||
* been distributed with this file in the file LICENSE.PHP . If this is not
|
||||
* the case, you can obtain a copy at http://www.php.net/license/3_0.txt.
|
||||
*
|
||||
* The latest version of DOMPDF might be available at:
|
||||
* http://www.dompdf.com/
|
||||
*
|
||||
* @link http://www.dompdf.com/
|
||||
* @copyright 2004 Benj Carson
|
||||
* @author Benj Carson <benjcarson@digitaljunkies.ca>
|
||||
* @contributor Helmut Tischer <htischer@weihenstephan.org>
|
||||
* @package dompdf
|
||||
*
|
||||
* Changes
|
||||
* @contributor Helmut Tischer <htischer@weihenstephan.org>
|
||||
* @version 0.5.1.htischer.20090507
|
||||
* - On getting type of images don't require any file endings
|
||||
* and don't strip off url parameters,
|
||||
* to allowing dynamically generated sites with image id
|
||||
* in url parameters and not at end of url or missing file extension
|
||||
* @contributor Helmut Tischer <htischer@weihenstephan.org>
|
||||
* @version dompdf_trunk_with_helmut_mods.20090524
|
||||
* - Made debug messages more individually configurable
|
||||
* @version 20090622
|
||||
* - don't cache broken image, but refer to original broken image replacement
|
||||
*/
|
||||
|
||||
/* $Id: image_cache.cls.php 354 2011-01-24 21:59:54Z fabien.menager $ */
|
||||
|
||||
/**
|
||||
* Static class that resolves image urls and downloads and caches
|
||||
* remote images if required.
|
||||
*
|
||||
* @access private
|
||||
* @package dompdf
|
||||
*/
|
||||
class Image_Cache {
|
||||
|
||||
/**
|
||||
* Array of downloaded images. Cached so that identical images are
|
||||
* not needlessly downloaded.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
static protected $_cache = array();
|
||||
|
||||
|
||||
/**
|
||||
* Resolve and fetch an image for use.
|
||||
*
|
||||
* @param string $url The url of the image
|
||||
* @param string $proto Default protocol if none specified in $url
|
||||
* @param string $host Default host if none specified in $url
|
||||
* @param string $base_path Default path if none specified in $url
|
||||
* @return array An array with two elements: The local path to the image and the image extension
|
||||
*/
|
||||
static function resolve_url($url, $proto, $host, $base_path) {
|
||||
global $_dompdf_warnings;
|
||||
|
||||
$parsed_url = explode_url($url);
|
||||
|
||||
$DEBUGPNG=DEBUGPNG; //=DEBUGPNG; Allow override of global setting for ad hoc debug
|
||||
$full_url_dbg = '';
|
||||
|
||||
//debugpng
|
||||
if ($DEBUGPNG) print 'resolve_url('.$url.','.$proto.','.$host.','.$base_path.')('.$parsed_url['protocol'].')';
|
||||
|
||||
$remote = ($proto != "" && $proto !== "file://");
|
||||
$remote = $remote || ($parsed_url['protocol'] != "");
|
||||
|
||||
$datauri = strpos($parsed_url['protocol'], "data:") === 0;
|
||||
|
||||
if ( !DOMPDF_ENABLE_REMOTE && $remote && !$datauri ) {
|
||||
$resolved_url = DOMPDF_LIB_DIR . "/res/broken_image.png";
|
||||
$ext = "png";
|
||||
|
||||
//debugpng
|
||||
if ($DEBUGPNG) $full_url_dbg = '(blockedremote)';
|
||||
|
||||
}
|
||||
else if ( DOMPDF_ENABLE_REMOTE && $remote || $datauri ) {
|
||||
// Download remote files to a temporary directory
|
||||
$full_url = build_url($proto, $host, $base_path, $url);
|
||||
|
||||
if ( isset(self::$_cache[$full_url]) ) {
|
||||
list($resolved_url,$ext) = self::$_cache[$full_url];
|
||||
|
||||
//debugpng
|
||||
if ($DEBUGPNG) $full_url_dbg = $full_url.'(cache)';
|
||||
|
||||
} else {
|
||||
|
||||
$resolved_url = tempnam(DOMPDF_TEMP_DIR, "ca_dompdf_img_");
|
||||
//debugpng
|
||||
if ($DEBUGPNG) echo $resolved_url . "\n";
|
||||
|
||||
if ($datauri) {
|
||||
if ($parsed_data_uri = parse_data_uri($url)) {
|
||||
$image = $parsed_data_uri['data'];
|
||||
list(, $ext) = explode('/', $parsed_data_uri['mime'], 2);
|
||||
}
|
||||
}
|
||||
else {
|
||||
$old_err = set_error_handler("record_warnings");
|
||||
$image = file_get_contents($full_url);
|
||||
restore_error_handler();
|
||||
}
|
||||
|
||||
if ( strlen($image) == 0 ) {
|
||||
//target image not found
|
||||
$resolved_url = DOMPDF_LIB_DIR . "/res/broken_image.png";
|
||||
$ext = "png";
|
||||
|
||||
//debugpng
|
||||
if ($DEBUGPNG) $full_url_dbg = $full_url.'(missing)';
|
||||
|
||||
} else {
|
||||
|
||||
file_put_contents($resolved_url, $image);
|
||||
|
||||
//e.g. fetch.php?media=url.jpg&cache=1
|
||||
//- Image file name might be one of the dynamic parts of the url, don't strip off!
|
||||
// if ( preg_match("/.*\.(\w+)/",$url,$match) ) $ext = $match[1];
|
||||
//- a remote url does not need to have a file extension at all
|
||||
//- local cached file does not have a matching file extension
|
||||
//Therefore get image type from the content
|
||||
|
||||
$imagedim = dompdf_getimagesize($resolved_url);
|
||||
|
||||
if( $imagedim[0] && $imagedim[1] &&
|
||||
in_array($imagedim[2], array(IMAGETYPE_GIF, IMAGETYPE_PNG, IMAGETYPE_JPEG, IMAGETYPE_BMP)) ) {
|
||||
//target image is valid
|
||||
|
||||
$imagetypes = array('','gif','jpeg','png','swf','psd','bmp');
|
||||
$ext = $imagetypes[$imagedim[2]];
|
||||
if ( rename($resolved_url,$resolved_url.'.'.$ext) ) {
|
||||
$resolved_url .= '.'.$ext;
|
||||
}
|
||||
|
||||
//Don't put replacement image into cache - otherwise it will be deleted on cache cleanup.
|
||||
//Only execute on successfull caching of remote image.
|
||||
self::$_cache[$full_url] = array($resolved_url,$ext);
|
||||
|
||||
} else {
|
||||
//target image is not valid.
|
||||
unlink($resolved_url);
|
||||
|
||||
$resolved_url = DOMPDF_LIB_DIR . "/res/broken_image.png";
|
||||
$ext = "png";
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
} else {
|
||||
|
||||
$resolved_url = build_url($proto, $host, $base_path, $url);
|
||||
if ($DEBUGPNG) print 'build_url('.$proto.','.$host.','.$base_path.','.$url.')('.$resolved_url.')';
|
||||
|
||||
if ( !preg_match("/.*\.(\w+)/",$url,$match) ) {
|
||||
//debugpng
|
||||
if ($DEBUGPNG) print '[resolve_url exception '.$url.']';
|
||||
throw new DOMPDF_Exception("Unknown image type: $url.");
|
||||
}
|
||||
|
||||
$ext = $match[1];
|
||||
|
||||
//debugpng
|
||||
if ($DEBUGPNG) $full_url_dbg = '(local)';
|
||||
|
||||
}
|
||||
|
||||
if ( !is_readable($resolved_url) || !filesize($resolved_url) ) {
|
||||
|
||||
//debugpng
|
||||
if ($DEBUGPNG) $full_url_dbg .= '(nocache'.$resolved_url.')';
|
||||
|
||||
$_dompdf_warnings[] = "File " .$resolved_url . " is not readable or is an empty file.\n";
|
||||
$resolved_url = DOMPDF_LIB_DIR . "/res/broken_image.png";
|
||||
$ext = "png";
|
||||
}
|
||||
|
||||
//debugpng
|
||||
if ($DEBUGPNG) print '[resolve_url '.$url.'|'.$full_url_dbg.'|'.$resolved_url.'|'.$ext.']';
|
||||
|
||||
return array($resolved_url, $ext);
|
||||
}
|
||||
|
||||
/**
|
||||
* Unlink all cached images (i.e. temporary images either downloaded
|
||||
* or converted)
|
||||
*/
|
||||
static function clear() {
|
||||
if ( count(self::$_cache) ) {
|
||||
while ($entry = array_shift(self::$_cache)) {
|
||||
list($file, $ext) = $entry;
|
||||
//debugpng
|
||||
if (DEBUGPNG) print '[clear unlink '.$file.']';
|
||||
if (!DEBUGKEEPTEMP)
|
||||
//XXX: Should we have some kind of fallback or warning if unlink() fails?
|
||||
unlink($file);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
116
pdf/include/image_frame_decorator.cls.php
Executable file
116
pdf/include/image_frame_decorator.cls.php
Executable file
@@ -0,0 +1,116 @@
|
||||
<?php
|
||||
/**
|
||||
* DOMPDF - PHP5 HTML to PDF renderer
|
||||
*
|
||||
* File: $RCSfile: image_frame_decorator.cls.php,v $
|
||||
* Created on: 2004-08-08
|
||||
*
|
||||
* Copyright (c) 2004 - Benj Carson <benjcarson@digitaljunkies.ca>
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with this library in the file LICENSE.LGPL; if not, write to the
|
||||
* Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
* 02111-1307 USA
|
||||
*
|
||||
* Alternatively, you may distribute this software under the terms of the
|
||||
* PHP License, version 3.0 or later. A copy of this license should have
|
||||
* been distributed with this file in the file LICENSE.PHP . If this is not
|
||||
* the case, you can obtain a copy at http://www.php.net/license/3_0.txt.
|
||||
*
|
||||
* The latest version of DOMPDF might be available at:
|
||||
* http://www.dompdf.com/
|
||||
*
|
||||
* @link http://www.dompdf.com/
|
||||
* @copyright 2004 Benj Carson
|
||||
* @author Benj Carson <benjcarson@digitaljunkies.ca>
|
||||
* @contributor Helmut Tischer <htischer@weihenstephan.org>
|
||||
* @package dompdf
|
||||
*
|
||||
* Changes
|
||||
* @contributor Helmut Tischer <htischer@weihenstephan.org>
|
||||
* @version 0.5.1.htischer.20090507
|
||||
* - add optional debug output
|
||||
*/
|
||||
|
||||
/* $Id: image_frame_decorator.cls.php 283 2010-07-19 17:57:40Z fabien.menager $ */
|
||||
|
||||
/**
|
||||
* Decorates frames for image layout and rendering
|
||||
*
|
||||
* @access private
|
||||
* @package dompdf
|
||||
*/
|
||||
class Image_Frame_Decorator extends Frame_Decorator {
|
||||
|
||||
/**
|
||||
* The path to the image file (note that remote images are
|
||||
* downloaded locally to DOMPDF_TEMP_DIR).
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $_image_url;
|
||||
|
||||
/**
|
||||
* The image's file extension (i.e. png, jpeg, gif)
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $_image_ext;
|
||||
|
||||
/**
|
||||
* Class constructor
|
||||
*
|
||||
* @param Frame $frame the frame to decorate
|
||||
* @param DOMPDF $dompdf the document's dompdf object (required to resolve relative & remote urls)
|
||||
*/
|
||||
function __construct(Frame $frame, DOMPDF $dompdf) {
|
||||
global $_dompdf_warnings;
|
||||
|
||||
parent::__construct($frame, $dompdf);
|
||||
$url = $frame->get_node()->getAttribute("src");
|
||||
|
||||
//debugpng
|
||||
if (DEBUGPNG) print '[__construct '.$url.']';
|
||||
|
||||
list($this->_image_url, $this->_image_ext) = Image_Cache::resolve_url($url,
|
||||
$dompdf->get_protocol(),
|
||||
$dompdf->get_host(),
|
||||
$dompdf->get_base_path());
|
||||
|
||||
if ( strrpos( $this->_image_url, DOMPDF_LIB_DIR . "/res/broken_image.png", 0) !== false &&
|
||||
$alt = $frame->get_node()->getAttribute("alt") ) {
|
||||
$style = $frame->get_style();
|
||||
$style->width = (4/3)*Font_Metrics::get_text_width($alt, $style->font_family, $style->font_size, $style->word_spacing);
|
||||
$style->height = Font_Metrics::get_font_height($style->font_family, $style->font_size);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the image's url
|
||||
*
|
||||
* @return string The url of this image
|
||||
*/
|
||||
function get_image_url() {
|
||||
return $this->_image_url;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the image's file extension
|
||||
*
|
||||
* @return string The image's file extension
|
||||
*/
|
||||
function get_image_ext() {
|
||||
return $this->_image_ext;
|
||||
}
|
||||
|
||||
}
|
||||
162
pdf/include/image_frame_reflower.cls.php
Executable file
162
pdf/include/image_frame_reflower.cls.php
Executable file
@@ -0,0 +1,162 @@
|
||||
<?php
|
||||
/**
|
||||
* DOMPDF - PHP5 HTML to PDF renderer
|
||||
*
|
||||
* File: $RCSfile: image_frame_reflower.cls.php,v $
|
||||
* Created on: 2004-08-08
|
||||
*
|
||||
* Copyright (c) 2004 - Benj Carson <benjcarson@digitaljunkies.ca>
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with this library in the file LICENSE.LGPL; if not, write to the
|
||||
* Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
* 02111-1307 USA
|
||||
*
|
||||
* Alternatively, you may distribute this software under the terms of the
|
||||
* PHP License, version 3.0 or later. A copy of this license should have
|
||||
* been distributed with this file in the file LICENSE.PHP . If this is not
|
||||
* the case, you can obtain a copy at http://www.php.net/license/3_0.txt.
|
||||
*
|
||||
* The latest version of DOMPDF might be available at:
|
||||
* http://www.dompdf.com/
|
||||
*
|
||||
* @link http://www.dompdf.com/
|
||||
* @copyright 2004 Benj Carson
|
||||
* @author Benj Carson <benjcarson@digitaljunkies.ca>
|
||||
* @contributor Helmut Tischer <htischer@weihenstephan.org>
|
||||
* @package dompdf
|
||||
*
|
||||
* Changes
|
||||
* @contributor Helmut Tischer <htischer@weihenstephan.org>
|
||||
* @version 0.5.1.htischer.20090507
|
||||
* - Fix image size as percent of wrapping box
|
||||
* - Fix arithmetic rounding of image size
|
||||
* - Time consuming additional image file scan only when really needed
|
||||
*/
|
||||
|
||||
/* $Id: image_frame_reflower.cls.php 357 2011-01-30 20:56:46Z fabien.menager $ */
|
||||
|
||||
/**
|
||||
* Image reflower class
|
||||
*
|
||||
* @access private
|
||||
* @package dompdf
|
||||
*/
|
||||
class Image_Frame_Reflower extends Frame_Reflower {
|
||||
|
||||
function __construct(Image_Frame_Decorator $frame) {
|
||||
parent::__construct($frame);
|
||||
}
|
||||
|
||||
function reflow(Frame_Decorator $block = null) {
|
||||
$this->_frame->position();
|
||||
|
||||
//FLOAT
|
||||
//$frame = $this->_frame;
|
||||
//$page = $frame->get_root();
|
||||
//if (DOMPDF_ENABLE_CSS_FLOAT && $frame->get_style()->float !== "none" ) {
|
||||
// $page->add_floating_frame($this);
|
||||
//}
|
||||
// Set the frame's width
|
||||
$this->get_min_max_width();
|
||||
|
||||
if ( $block ) {
|
||||
$block->add_frame_to_line($this->_frame);
|
||||
}
|
||||
}
|
||||
|
||||
function get_min_max_width() {
|
||||
if (DEBUGPNG) {
|
||||
// Determine the image's size. Time consuming. Only when really needed?
|
||||
list($img_width, $img_height) = dompdf_getimagesize($this->_frame->get_image_url());
|
||||
print "get_min_max_width() ".
|
||||
$this->_frame->get_style()->width.' '.
|
||||
$this->_frame->get_style()->height.';'.
|
||||
$this->_frame->get_parent()->get_style()->width." ".
|
||||
$this->_frame->get_parent()->get_style()->height.";".
|
||||
$this->_frame->get_parent()->get_parent()->get_style()->width.' '.
|
||||
$this->_frame->get_parent()->get_parent()->get_style()->height.';'.
|
||||
$img_width. ' '.
|
||||
$img_height.'|' ;
|
||||
}
|
||||
|
||||
$style = $this->_frame->get_style();
|
||||
|
||||
//own style auto or invalid value: use natural size in px
|
||||
//own style value: ignore suffix text including unit, use given number as px
|
||||
//own style %: walk up parent chain until found available space in pt; fill available space
|
||||
//
|
||||
//special ignored unit: e.g. 10ex: e treated as exponent; x ignored; 10e completely invalid ->like auto
|
||||
|
||||
$width = ($style->width > 0 ? $style->width : 0);
|
||||
if ( is_percent($width) ) {
|
||||
$t = 0.0;
|
||||
for ($f = $this->_frame->get_parent(); $f; $f = $f->get_parent()) {
|
||||
$t = (float)($f->get_style()->width); //always in pt
|
||||
if ((float)$t != 0) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
$width = ((float)rtrim($width,"%") * $t)/100; //maybe 0
|
||||
} elseif ( !mb_strpos($width, 'pt') ) {
|
||||
// Don't set image original size if "%" branch was 0 or size not given.
|
||||
// Otherwise aspect changed on %/auto combination for width/height
|
||||
// Resample according to px per inch
|
||||
// See also List_Bullet_Image_Frame_Decorator::__construct
|
||||
$width = (float)($width * 72) / DOMPDF_DPI;
|
||||
}
|
||||
|
||||
$height = ($style->height > 0 ? $style->height : 0);
|
||||
if ( is_percent($height) ) {
|
||||
$t = 0.0;
|
||||
for ($f = $this->_frame->get_parent(); $f; $f = $f->get_parent()) {
|
||||
$t = (float)($f->get_style()->height); //always in pt
|
||||
if ((float)$t != 0) {
|
||||
break;
|
||||
}
|
||||
}
|
||||
$height = ((float)rtrim($height,"%") * $t)/100; //maybe 0
|
||||
} elseif ( !mb_strpos($height, 'pt') ) {
|
||||
// Don't set image original size if "%" branch was 0 or size not given.
|
||||
// Otherwise aspect changed on %/auto combination for width/height
|
||||
// Resample according to px per inch
|
||||
// See also List_Bullet_Image_Frame_Decorator::__construct
|
||||
$height = (float)($height * 72) / DOMPDF_DPI;
|
||||
}
|
||||
|
||||
if ($width == 0 || $height == 0) {
|
||||
// Determine the image's size. Time consuming. Only when really needed!
|
||||
list($img_width, $img_height) = dompdf_getimagesize($this->_frame->get_image_url());
|
||||
|
||||
// don't treat 0 as error. Can be downscaled or can be catched elsewhere if image not readable.
|
||||
// Resample according to px per inch
|
||||
// See also List_Bullet_Image_Frame_Decorator::__construct
|
||||
if ($width == 0 && $height == 0) {
|
||||
$width = (float)($img_width * 72) / DOMPDF_DPI;
|
||||
$height = (float)($img_height * 72) / DOMPDF_DPI;
|
||||
} elseif ($height == 0 && $width != 0) {
|
||||
$height = ($width / $img_width) * $img_height; //keep aspect ratio
|
||||
} elseif ($width == 0 && $height != 0) {
|
||||
$width = ($height / $img_height) * $img_width; //keep aspect ratio
|
||||
}
|
||||
}
|
||||
|
||||
if (DEBUGPNG) print $width.' '.$height.';';
|
||||
|
||||
$style->width = $width . "pt";
|
||||
$style->height = $height . "pt";
|
||||
|
||||
return array( $width, $width, "min" => $width, "max" => $width);
|
||||
|
||||
}
|
||||
}
|
||||
95
pdf/include/image_renderer.cls.php
Executable file
95
pdf/include/image_renderer.cls.php
Executable file
@@ -0,0 +1,95 @@
|
||||
<?php
|
||||
/**
|
||||
* DOMPDF - PHP5 HTML to PDF renderer
|
||||
*
|
||||
* File: $RCSfile: image_renderer.cls.php,v $
|
||||
* Created on: 2004-08-04
|
||||
*
|
||||
* Copyright (c) 2004 - Benj Carson <benjcarson@digitaljunkies.ca>
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with this library in the file LICENSE.LGPL; if not, write to the
|
||||
* Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
* 02111-1307 USA
|
||||
*
|
||||
* Alternatively, you may distribute this software under the terms of the
|
||||
* PHP License, version 3.0 or later. A copy of this license should have
|
||||
* been distributed with this file in the file LICENSE.PHP . If this is not
|
||||
* the case, you can obtain a copy at http://www.php.net/license/3_0.txt.
|
||||
*
|
||||
* The latest version of DOMPDF might be available at:
|
||||
* http://www.dompdf.com/
|
||||
*
|
||||
* @link http://www.dompdf.com/
|
||||
* @copyright 2004 Benj Carson
|
||||
* @author Benj Carson <benjcarson@digitaljunkies.ca>
|
||||
* @package dompdf
|
||||
|
||||
*/
|
||||
|
||||
/* $Id: image_renderer.cls.php 325 2010-11-07 18:05:59Z fabien.menager $ */
|
||||
|
||||
/**
|
||||
* Image renderer
|
||||
*
|
||||
* @access private
|
||||
* @package dompdf
|
||||
*/
|
||||
class Image_Renderer extends Block_Renderer {
|
||||
|
||||
function render(Frame $frame) {
|
||||
// Render background & borders
|
||||
$style = $frame->get_style();
|
||||
$cb = $frame->get_containing_block();
|
||||
list($x, $y, $w, $h) = $frame->get_border_box();
|
||||
|
||||
$this->_set_opacity( $frame->get_opacity( $style->opacity ) );
|
||||
|
||||
// Handle the last child
|
||||
if ( ($bg = $style->background_color) !== "transparent" )
|
||||
$this->_canvas->filled_rectangle( $x + $widths[3], $y + $widths[0], $w, $h, $bg);
|
||||
|
||||
if ( ($url = $style->background_image) && $url !== "none" )
|
||||
$this->_background_image($url, $x + $widths[3], $y + $widths[0], $w, $h, $style);
|
||||
|
||||
$this->_render_border($frame);
|
||||
$this->_render_outline($frame);
|
||||
|
||||
list($x, $y) = $frame->get_padding_box();
|
||||
$x += $style->length_in_pt($style->padding_left, $cb["w"]);
|
||||
$y += $style->length_in_pt($style->padding_top, $cb["h"]);
|
||||
|
||||
$w = $style->length_in_pt($style->width, $cb["w"]);
|
||||
$h = $style->length_in_pt($style->height, $cb["h"]);
|
||||
|
||||
if ( strrpos( $frame->get_image_url(), DOMPDF_LIB_DIR . "/res/broken_image.png", 0) !== false &&
|
||||
$alt = $frame->get_node()->getAttribute("alt") ) {
|
||||
$font = $style->font_family;
|
||||
$size = $style->font_size;
|
||||
$spacing = $style->word_spacing;
|
||||
$this->_canvas->text($x, $y, $alt,
|
||||
$font, $size,
|
||||
$style->color, $spacing);
|
||||
}
|
||||
else {
|
||||
$this->_canvas->image( $frame->get_image_url(), $frame->get_image_ext(), $x, $y, $w, $h);
|
||||
}
|
||||
|
||||
if (DEBUG_LAYOUT && DEBUG_LAYOUT_BLOCKS) {
|
||||
$this->_debug_layout($frame->get_border_box(), "blue");
|
||||
if (DEBUG_LAYOUT_PADDINGBOX) {
|
||||
$this->_debug_layout($frame->get_padding_box(), "blue", array(0.5, 0.5));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
112
pdf/include/inline_frame_decorator.cls.php
Executable file
112
pdf/include/inline_frame_decorator.cls.php
Executable file
@@ -0,0 +1,112 @@
|
||||
<?php
|
||||
/**
|
||||
* DOMPDF - PHP5 HTML to PDF renderer
|
||||
*
|
||||
* File: $RCSfile: inline_frame_decorator.cls.php,v $
|
||||
* Created on: 2004-06-02
|
||||
*
|
||||
* Copyright (c) 2004 - Benj Carson <benjcarson@digitaljunkies.ca>
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with this library in the file LICENSE.LGPL; if not, write to the
|
||||
* Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
* 02111-1307 USA
|
||||
*
|
||||
* Alternatively, you may distribute this software under the terms of the
|
||||
* PHP License, version 3.0 or later. A copy of this license should have
|
||||
* been distributed with this file in the file LICENSE.PHP . If this is not
|
||||
* the case, you can obtain a copy at http://www.php.net/license/3_0.txt.
|
||||
*
|
||||
* The latest version of DOMPDF might be available at:
|
||||
* http://www.dompdf.com/
|
||||
*
|
||||
* @link http://www.dompdf.com/
|
||||
* @copyright 2004 Benj Carson
|
||||
* @author Benj Carson <benjcarson@digitaljunkies.ca>
|
||||
* @contributor Helmut Tischer <htischer@weihenstephan.org>
|
||||
* @package dompdf
|
||||
|
||||
*
|
||||
* Changes
|
||||
* @contributor Helmut Tischer <htischer@weihenstephan.org>
|
||||
* @version 20090610
|
||||
* - don't repeat non repeatable background images after a line break
|
||||
*/
|
||||
|
||||
/* $Id: inline_frame_decorator.cls.php 252 2010-04-19 08:10:45Z flaviencrochard $ */
|
||||
|
||||
/**
|
||||
* Decorates frames for inline layout
|
||||
*
|
||||
* @access private
|
||||
* @package dompdf
|
||||
*/
|
||||
class Inline_Frame_Decorator extends Frame_Decorator {
|
||||
|
||||
function __construct(Frame $frame, DOMPDF $dompdf) { parent::__construct($frame, $dompdf); }
|
||||
|
||||
function split($frame = null, $force_pagebreak = false) {
|
||||
|
||||
if ( is_null($frame) ) {
|
||||
$this->get_parent()->split($this, $force_pagebreak);
|
||||
return;
|
||||
}
|
||||
|
||||
if ( $frame->get_parent() !== $this )
|
||||
throw new DOMPDF_Exception("Unable to split: frame is not a child of this one.");
|
||||
|
||||
$split = $this->copy( $this->_frame->get_node()->cloneNode() );
|
||||
$this->get_parent()->insert_child_after($split, $this);
|
||||
|
||||
// Unset the current node's right style properties
|
||||
$style = $this->_frame->get_style();
|
||||
$style->margin_right = "0";
|
||||
$style->padding_right = "0";
|
||||
$style->border_right_width = "0";
|
||||
|
||||
// Unset the split node's left style properties since we don't want them
|
||||
// to propagate
|
||||
$style = $split->get_style();
|
||||
$style->margin_left = "0";
|
||||
$style->padding_left = "0";
|
||||
$style->border_left_width = "0";
|
||||
|
||||
//On continuation of inline element on next line,
|
||||
//don't repeat non-vertically repeatble background images
|
||||
//See e.g. in testcase image_variants, long desriptions
|
||||
if ( ($url = $style->background_image) && $url !== "none"
|
||||
&& ($repeat = $style->background_repeat) && $repeat !== "repeat" && $repeat !== "repeat-y"
|
||||
) {
|
||||
$style->background_image = "none";
|
||||
}
|
||||
|
||||
// Add $frame and all following siblings to the new split node
|
||||
$iter = $frame;
|
||||
while ($iter) {
|
||||
$frame = $iter;
|
||||
$iter = $iter->get_next_sibling();
|
||||
$frame->reset();
|
||||
$split->append_child($frame);
|
||||
}
|
||||
|
||||
$page_breaks = array("always", "left", "right");
|
||||
$frame_style = $frame->get_style();
|
||||
if( $force_pagebreak ||
|
||||
in_array($frame_style->page_break_before, $page_breaks) ||
|
||||
in_array($frame_style->page_break_after, $page_breaks) ) {
|
||||
|
||||
$this->get_parent()->split($split, true);
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
99
pdf/include/inline_frame_reflower.cls.php
Executable file
99
pdf/include/inline_frame_reflower.cls.php
Executable file
@@ -0,0 +1,99 @@
|
||||
<?php
|
||||
/**
|
||||
* DOMPDF - PHP5 HTML to PDF renderer
|
||||
*
|
||||
* File: $RCSfile: inline_frame_reflower.cls.php,v $
|
||||
* Created on: 2004-06-17
|
||||
*
|
||||
* Copyright (c) 2004 - Benj Carson <benjcarson@digitaljunkies.ca>
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with this library in the file LICENSE.LGPL; if not, write to the
|
||||
* Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
* 02111-1307 USA
|
||||
*
|
||||
* Alternatively, you may distribute this software under the terms of the
|
||||
* PHP License, version 3.0 or later. A copy of this license should have
|
||||
* been distributed with this file in the file LICENSE.PHP . If this is not
|
||||
* the case, you can obtain a copy at http://www.php.net/license/3_0.txt.
|
||||
*
|
||||
* The latest version of DOMPDF might be available at:
|
||||
* http://www.dompdf.com/
|
||||
*
|
||||
* @link http://www.dompdf.com/
|
||||
* @copyright 2004 Benj Carson
|
||||
* @author Benj Carson <benjcarson@digitaljunkies.ca>
|
||||
* @package dompdf
|
||||
|
||||
*/
|
||||
|
||||
/* $Id: inline_frame_reflower.cls.php 357 2011-01-30 20:56:46Z fabien.menager $ */
|
||||
|
||||
/**
|
||||
* Reflows inline frames
|
||||
*
|
||||
* @access private
|
||||
* @package dompdf
|
||||
*/
|
||||
class Inline_Frame_Reflower extends Frame_Reflower {
|
||||
|
||||
function __construct(Frame $frame) { parent::__construct($frame); }
|
||||
|
||||
//........................................................................
|
||||
|
||||
function reflow(Frame_Decorator $block = null) {
|
||||
$frame = $this->_frame;
|
||||
|
||||
// Check if a page break is forced
|
||||
$page = $frame->get_root();
|
||||
$page->check_forced_page_break($frame);
|
||||
|
||||
if ( $page->is_full() )
|
||||
return;
|
||||
|
||||
$style = $frame->get_style();
|
||||
|
||||
// Generated content
|
||||
$this->_set_content();
|
||||
|
||||
$frame->position();
|
||||
|
||||
$cb = $frame->get_containing_block();
|
||||
|
||||
// Add our margin, padding & border to the first and last children
|
||||
if ( ($f = $frame->get_first_child()) && $f instanceof Text_Frame_Decorator ) {
|
||||
$f_style = $f->get_style();
|
||||
$f_style->margin_left = $style->margin_left;
|
||||
$f_style->padding_left = $style->padding_left;
|
||||
$f_style->border_left = $style->border_left;
|
||||
}
|
||||
|
||||
if ( ($l = $frame->get_last_child()) && $l instanceof Text_Frame_Decorator ) {
|
||||
$l_style = $l->get_style();
|
||||
$l_style->margin_right = $style->margin_right;
|
||||
$l_style->padding_right = $style->padding_right;
|
||||
$l_style->border_right = $style->border_right;
|
||||
}
|
||||
|
||||
if ( $block ) {
|
||||
$block->add_frame_to_line($this->_frame);
|
||||
}
|
||||
|
||||
// Set the containing blocks and reflow each child. The containing
|
||||
// block is not changed by line boxes.
|
||||
foreach ( $frame->get_children() as $child ) {
|
||||
$child->set_containing_block($cb);
|
||||
$child->reflow($block);
|
||||
}
|
||||
}
|
||||
}
|
||||
102
pdf/include/inline_positioner.cls.php
Executable file
102
pdf/include/inline_positioner.cls.php
Executable file
@@ -0,0 +1,102 @@
|
||||
<?php
|
||||
/**
|
||||
* DOMPDF - PHP5 HTML to PDF renderer
|
||||
*
|
||||
* File: $RCSfile: inline_positioner.cls.php,v $
|
||||
* Created on: 2004-06-08
|
||||
*
|
||||
* Copyright (c) 2004 - Benj Carson <benjcarson@digitaljunkies.ca>
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with this library in the file LICENSE.LGPL; if not, write to the
|
||||
* Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
* 02111-1307 USA
|
||||
*
|
||||
* Alternatively, you may distribute this software under the terms of the
|
||||
* PHP License, version 3.0 or later. A copy of this license should have
|
||||
* been distributed with this file in the file LICENSE.PHP . If this is not
|
||||
* the case, you can obtain a copy at http://www.php.net/license/3_0.txt.
|
||||
*
|
||||
* The latest version of DOMPDF might be available at:
|
||||
* http://www.dompdf.com/
|
||||
*
|
||||
* @link http://www.dompdf.com/
|
||||
* @copyright 2004 Benj Carson
|
||||
* @author Benj Carson <benjcarson@digitaljunkies.ca>
|
||||
* @package dompdf
|
||||
|
||||
*/
|
||||
|
||||
/* $Id: inline_positioner.cls.php 357 2011-01-30 20:56:46Z fabien.menager $ */
|
||||
/**
|
||||
* Positions inline frames
|
||||
*
|
||||
* @access private
|
||||
* @package dompdf
|
||||
*/
|
||||
class Inline_Positioner extends Positioner {
|
||||
|
||||
function __construct(Frame_Decorator $frame) { parent::__construct($frame); }
|
||||
|
||||
//........................................................................
|
||||
|
||||
function position() {
|
||||
// Find our nearest block level parent and access its lines property.
|
||||
$p = $this->_frame->find_block_parent();
|
||||
|
||||
// Debugging code:
|
||||
|
||||
// pre_r("\nPositioning:");
|
||||
// pre_r("Me: " . $this->_frame->get_node()->nodeName . " (" . spl_object_hash($this->_frame->get_node()) . ")");
|
||||
// pre_r("Parent: " . $p->get_node()->nodeName . " (" . spl_object_hash($p->get_node()) . ")");
|
||||
|
||||
// End debugging
|
||||
|
||||
if ( !$p )
|
||||
throw new DOMPDF_Exception("No block-level parent found. Not good.");
|
||||
|
||||
$f = $this->_frame;
|
||||
|
||||
$cb = $f->get_containing_block();
|
||||
$style = $f->get_style();
|
||||
$line = $p->get_current_line();
|
||||
|
||||
// Skip the page break if in a fixed position element
|
||||
$is_fixed = false;
|
||||
while($f = $f->get_parent()) {
|
||||
if($f->get_style()->position === "fixed") {
|
||||
$is_fixed = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
$f = $this->_frame;
|
||||
|
||||
if ( !$is_fixed && $f->get_parent() &&
|
||||
$f->get_parent() instanceof Inline_Frame_Decorator &&
|
||||
$f->get_node()->nodeName === "#text" ) {
|
||||
|
||||
$min_max = $f->get_reflower()->get_min_max_width();
|
||||
$initialcb = $f->get_root()->get_containing_block();
|
||||
$height = $style->length_in_pt($style->height, $initialcb["h"]);
|
||||
|
||||
// If the frame doesn't fit in the current line, a line break occurs
|
||||
if ( $min_max["min"] > ($cb["w"]-$line["left"]-$line["w"]-$line["right"]) ) {
|
||||
$p->add_line();
|
||||
}
|
||||
}
|
||||
|
||||
$this->_frame->set_position($cb["x"] + $line["w"], $line["y"]);
|
||||
|
||||
}
|
||||
}
|
||||
207
pdf/include/inline_renderer.cls.php
Executable file
207
pdf/include/inline_renderer.cls.php
Executable file
@@ -0,0 +1,207 @@
|
||||
<?php
|
||||
/**
|
||||
* DOMPDF - PHP5 HTML to PDF renderer
|
||||
*
|
||||
* File: $RCSfile: inline_renderer.cls.php,v $
|
||||
* Created on: 2004-06-30
|
||||
*
|
||||
* Copyright (c) 2004 - Benj Carson <benjcarson@digitaljunkies.ca>
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with this library in the file LICENSE.LGPL; if not, write to the
|
||||
* Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
* 02111-1307 USA
|
||||
*
|
||||
* Alternatively, you may distribute this software under the terms of the
|
||||
* PHP License, version 3.0 or later. A copy of this license should have
|
||||
* been distributed with this file in the file LICENSE.PHP . If this is not
|
||||
* the case, you can obtain a copy at http://www.php.net/license/3_0.txt.
|
||||
*
|
||||
* The latest version of DOMPDF might be available at:
|
||||
* http://www.dompdf.com/
|
||||
*
|
||||
* @link http://www.dompdf.com/
|
||||
* @copyright 2004 Benj Carson
|
||||
* @author Benj Carson <benjcarson@digitaljunkies.ca>
|
||||
* @package dompdf
|
||||
|
||||
*/
|
||||
|
||||
/* $Id: inline_renderer.cls.php 332 2010-11-27 14:06:34Z fabien.menager $ */
|
||||
|
||||
/**
|
||||
* Renders inline frames
|
||||
*
|
||||
* @access private
|
||||
* @package dompdf
|
||||
*/
|
||||
class Inline_Renderer extends Abstract_Renderer {
|
||||
|
||||
//........................................................................
|
||||
|
||||
function render(Frame $frame) {
|
||||
$style = $frame->get_style();
|
||||
|
||||
if ( !$frame->get_first_child() )
|
||||
return; // No children, no service
|
||||
|
||||
// Draw the left border if applicable
|
||||
$bp = $style->get_border_properties();
|
||||
$widths = array($style->length_in_pt($bp["top"]["width"]),
|
||||
$style->length_in_pt($bp["right"]["width"]),
|
||||
$style->length_in_pt($bp["bottom"]["width"]),
|
||||
$style->length_in_pt($bp["left"]["width"]));
|
||||
|
||||
// Draw the background & border behind each child. To do this we need
|
||||
// to figure out just how much space each child takes:
|
||||
list($x, $y) = $frame->get_first_child()->get_position();
|
||||
$w = null;
|
||||
$h = 0;
|
||||
// $x += $widths[3];
|
||||
// $y += $widths[0];
|
||||
|
||||
$this->_set_opacity( $frame->get_opacity( $style->opacity ) );
|
||||
|
||||
$first_row = true;
|
||||
|
||||
foreach ($frame->get_children() as $child) {
|
||||
list($child_x, $child_y, $child_w, $child_h) = $child->get_padding_box();
|
||||
|
||||
if ( !is_null($w) && $child_x < $x + $w ) {
|
||||
//This branch seems to be supposed to being called on the first part
|
||||
//of an inline html element, and the part after the if clause for the
|
||||
//parts after a line break.
|
||||
//But because $w initially mostly is 0, and gets updated only on the next
|
||||
//round, this seem to be never executed and the common close always.
|
||||
|
||||
// The next child is on another line. Draw the background &
|
||||
// borders on this line.
|
||||
|
||||
// Background:
|
||||
if ( ($bg = $style->background_color) !== "transparent" )
|
||||
$this->_canvas->filled_rectangle( $x, $y, $w, $h, $bg);
|
||||
|
||||
if ( ($url = $style->background_image) && $url !== "none" ) {
|
||||
$this->_background_image($url, $x, $y, $w, $h, $style);
|
||||
}
|
||||
|
||||
// If this is the first row, draw the left border
|
||||
if ( $first_row ) {
|
||||
|
||||
if ( $bp["left"]["style"] !== "none" && $bp["left"]["color"] !== "transparent" && $bp["left"]["width"] > 0 ) {
|
||||
$method = "_border_" . $bp["left"]["style"];
|
||||
$this->$method($x, $y, $h + $widths[0] + $widths[2], $bp["left"]["color"], $widths, "left");
|
||||
}
|
||||
$first_row = false;
|
||||
}
|
||||
|
||||
// Draw the top & bottom borders
|
||||
if ( $bp["top"]["style"] !== "none" && $bp["top"]["color"] !== "transparent" && $bp["top"]["width"] > 0 ) {
|
||||
$method = "_border_" . $bp["top"]["style"];
|
||||
$this->$method($x, $y, $w + $widths[1] + $widths[3], $bp["top"]["color"], $widths, "top");
|
||||
}
|
||||
|
||||
if ( $bp["bottom"]["style"] !== "none" && $bp["bottom"]["color"] !== "transparent" && $bp["bottom"]["width"] > 0 ) {
|
||||
$method = "_border_" . $bp["bottom"]["style"];
|
||||
$this->$method($x, $y + $h + $widths[0] + $widths[2], $w + $widths[1] + $widths[3], $bp["bottom"]["color"], $widths, "bottom");
|
||||
}
|
||||
|
||||
// Handle anchors & links
|
||||
if ( $frame->get_node()->nodeName === "a" ) {
|
||||
if ( $href = $frame->get_node()->getAttribute("href") )
|
||||
$this->_canvas->add_link($href, $x, $y, $w, $h);
|
||||
}
|
||||
|
||||
$x = $child_x;
|
||||
$y = $child_y;
|
||||
$w = $child_w;
|
||||
$h = $child_h;
|
||||
continue;
|
||||
}
|
||||
|
||||
if ( is_null($w) )
|
||||
$w = $child_w;
|
||||
else
|
||||
$w += $child_w;
|
||||
|
||||
$h = max($h, $child_h);
|
||||
}
|
||||
|
||||
|
||||
// Handle the last child
|
||||
if ( ($bg = $style->background_color) !== "transparent" )
|
||||
$this->_canvas->filled_rectangle( $x + $widths[3], $y + $widths[0], $w, $h, $bg);
|
||||
|
||||
//On continuation lines (after line break) of inline elements, the style got copied.
|
||||
//But a non repeatable background image should not be repeated on the next line.
|
||||
//But removing the background image above has never an effect, and removing it below
|
||||
//removes it always, even on the initial line.
|
||||
//Need to handle it elsewhere, e.g. on certain ...clone()... usages.
|
||||
// Repeat not given: default is Style::__construct
|
||||
// ... && (!($repeat = $style->background_repeat) || $repeat === "repeat" ...
|
||||
//different position? $this->_background_image($url, $x, $y, $w, $h, $style);
|
||||
if ( ($url = $style->background_image) && $url !== "none" )
|
||||
$this->_background_image($url, $x + $widths[3], $y + $widths[0], $w, $h, $style);
|
||||
|
||||
// Add the border widths
|
||||
$w += $widths[1] + $widths[3];
|
||||
$h += $widths[0] + $widths[2];
|
||||
|
||||
// make sure the border and background start inside the left margin
|
||||
$left_margin = $style->length_in_pt($style->margin_left);
|
||||
$x += $left_margin;
|
||||
|
||||
// If this is the first row, draw the left border too
|
||||
if ( $first_row && $bp["left"]["style"] !== "none" && $bp["left"]["color"] !== "transparent" && $widths[3] > 0 ) {
|
||||
$method = "_border_" . $bp["left"]["style"];
|
||||
$this->$method($x, $y, $h, $bp["left"]["color"], $widths, "left");
|
||||
}
|
||||
|
||||
// Draw the top & bottom borders
|
||||
if ( $bp["top"]["style"] !== "none" && $bp["top"]["color"] !== "transparent" && $widths[0] > 0 ) {
|
||||
$method = "_border_" . $bp["top"]["style"];
|
||||
$this->$method($x, $y, $w, $bp["top"]["color"], $widths, "top");
|
||||
}
|
||||
|
||||
if ( $bp["bottom"]["style"] !== "none" && $bp["bottom"]["color"] !== "transparent" && $widths[2] > 0 ) {
|
||||
$method = "_border_" . $bp["bottom"]["style"];
|
||||
$this->$method($x, $y + $h, $w, $bp["bottom"]["color"], $widths, "bottom");
|
||||
}
|
||||
|
||||
// pre_var_dump(get_class($frame->get_next_sibling()));
|
||||
// $last_row = get_class($frame->get_next_sibling()) !== 'Inline_Frame_Decorator';
|
||||
// Draw the right border if this is the last row
|
||||
if ( $bp["right"]["style"] !== "none" && $bp["right"]["color"] !== "transparent" && $widths[1] > 0 ) {
|
||||
$method = "_border_" . $bp["right"]["style"];
|
||||
$this->$method($x + $w, $y, $h, $bp["right"]["color"], $widths, "right");
|
||||
}
|
||||
|
||||
$node = $frame->get_node();
|
||||
|
||||
// Handle anchors & links
|
||||
if ( $node->nodeName === "a" ) {
|
||||
if ( $name = $node->getAttribute("name") )
|
||||
$this->_canvas->add_named_dest($name);
|
||||
|
||||
if ( $href = $node->getAttribute("href") )
|
||||
$this->_canvas->add_link($href, $x, $y, $w, $h);
|
||||
}
|
||||
|
||||
if (DEBUG_LAYOUT && DEBUG_LAYOUT_INLINE) {
|
||||
$this->_debug_layout($child->get_border_box(), "blue");
|
||||
if (DEBUG_LAYOUT_PADDINGBOX) {
|
||||
$this->_debug_layout($child->get_padding_box(), "blue", array(0.5, 0.5));
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
68
pdf/include/javascript_embedder.cls.php
Executable file
68
pdf/include/javascript_embedder.cls.php
Executable file
@@ -0,0 +1,68 @@
|
||||
<?php
|
||||
/**
|
||||
* DOMPDF - PHP5 HTML to PDF renderer
|
||||
*
|
||||
* File: $RCSfile: php_evaluator.cls.php,v $
|
||||
* Created on: 2004-07-12
|
||||
*
|
||||
* Copyright (c) 2004 - Benj Carson <benjcarson@digitaljunkies.ca>
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with this library in the file LICENSE.LGPL; if not, write to the
|
||||
* Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
* 02111-1307 USA
|
||||
*
|
||||
* Alternatively, you may distribute this software under the terms of the
|
||||
* PHP License, version 3.0 or later. A copy of this license should have
|
||||
* been distributed with this file in the file LICENSE.PHP . If this is not
|
||||
* the case, you can obtain a copy at http://www.php.net/license/3_0.txt.
|
||||
*
|
||||
* The latest version of DOMPDF might be available at:
|
||||
* http://www.dompdf.com/
|
||||
*
|
||||
* @link http://www.dompdf.com/
|
||||
* @copyright 2004 Benj Carson
|
||||
* @author Benj Carson <benjcarson@digitaljunkies.ca>
|
||||
* @package dompdf
|
||||
*/
|
||||
|
||||
/* $Id: javascript_embedder.cls.php 291 2010-08-02 20:55:23Z fabien.menager $ */
|
||||
|
||||
/**
|
||||
* Embeds Javascript into the PDF document
|
||||
*
|
||||
* @access private
|
||||
* @package dompdf
|
||||
*/
|
||||
class Javascript_Embedder {
|
||||
|
||||
/**
|
||||
* @var DOMPDF
|
||||
*/
|
||||
protected $_dompdf;
|
||||
|
||||
function __construct(DOMPDF $dompdf) {
|
||||
$this->_dompdf = $dompdf;
|
||||
}
|
||||
|
||||
function insert($code) {
|
||||
$this->_dompdf->get_canvas()->javascript($code);
|
||||
}
|
||||
|
||||
function render($frame) {
|
||||
if ( !DOMPDF_ENABLE_JAVASCRIPT )
|
||||
return;
|
||||
|
||||
$this->insert($frame->get_node()->nodeValue);
|
||||
}
|
||||
}
|
||||
96
pdf/include/list_bullet_frame_decorator.cls.php
Executable file
96
pdf/include/list_bullet_frame_decorator.cls.php
Executable file
@@ -0,0 +1,96 @@
|
||||
<?php
|
||||
/**
|
||||
* DOMPDF - PHP5 HTML to PDF renderer
|
||||
*
|
||||
* File: $RCSfile: list_bullet_frame_decorator.cls.php,v $
|
||||
* Created on: 2004-06-23
|
||||
*
|
||||
* Copyright (c) 2004 - Benj Carson <benjcarson@digitaljunkies.ca>
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with this library in the file LICENSE.LGPL; if not, write to the
|
||||
* Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
* 02111-1307 USA
|
||||
*
|
||||
* Alternatively, you may distribute this software under the terms of the
|
||||
* PHP License, version 3.0 or later. A copy of this license should have
|
||||
* been distributed with this file in the file LICENSE.PHP . If this is not
|
||||
* the case, you can obtain a copy at http://www.php.net/license/3_0.txt.
|
||||
*
|
||||
* The latest version of DOMPDF might be available at:
|
||||
* http://www.dompdf.com/
|
||||
*
|
||||
* @link http://www.dompdf.com/
|
||||
* @copyright 2004 Benj Carson
|
||||
* @author Benj Carson <benjcarson@digitaljunkies.ca>
|
||||
* @contributor Helmut Tischer <htischer@weihenstephan.org>
|
||||
* @package dompdf
|
||||
|
||||
*
|
||||
* Changes
|
||||
* @contributor Helmut Tischer <htischer@weihenstephan.org>
|
||||
* @version 20090622
|
||||
* - bullet size proportional to font size, center position
|
||||
*/
|
||||
|
||||
/* $Id: list_bullet_frame_decorator.cls.php 325 2010-11-07 18:05:59Z fabien.menager $ */
|
||||
|
||||
/**
|
||||
* Decorates frames for list bullet rendering
|
||||
*
|
||||
* @access private
|
||||
* @package dompdf
|
||||
*/
|
||||
class List_Bullet_Frame_Decorator extends Frame_Decorator {
|
||||
|
||||
const BULLET_PADDING = 1; // Distance from bullet to text in pt
|
||||
// As fraction of font size (including descent). See also DECO_THICKNESS.
|
||||
const BULLET_THICKNESS = 0.04; // Thickness of bullet outline. Screen: 0.08, print: better less, e.g. 0.04
|
||||
const BULLET_DESCENT = 0.3; //descent of font below baseline. Todo: Guessed for now.
|
||||
const BULLET_SIZE = 0.35; // bullet diameter. For now 0.5 of font_size without descent.
|
||||
|
||||
static $BULLET_TYPES = array("disc", "circle", "square");
|
||||
|
||||
//........................................................................
|
||||
|
||||
function __construct(Frame $frame, DOMPDF $dompdf) {
|
||||
parent::__construct($frame, $dompdf);
|
||||
}
|
||||
|
||||
function get_margin_width() {
|
||||
$style = $this->_frame->get_style();
|
||||
// Small hack to prevent extra indenting of list text on list_style_position === "inside"
|
||||
// and on suppressed bullet
|
||||
if ( $style->list_style_position === "outside" ||
|
||||
$style->list_style_type === "none" )
|
||||
return 0;
|
||||
return $style->get_font_size()*self::BULLET_SIZE + 2 * self::BULLET_PADDING;
|
||||
}
|
||||
|
||||
//hits only on "inset" lists items, to increase height of box
|
||||
function get_margin_height() {
|
||||
$style = $this->_frame->get_style();
|
||||
if ( $style->list_style_type === 'none' ) return 0;
|
||||
return $style->get_font_size() * self::BULLET_SIZE + 2 * self::BULLET_PADDING;
|
||||
}
|
||||
|
||||
function get_width() {
|
||||
return $this->get_margin_height();
|
||||
}
|
||||
|
||||
function get_height() {
|
||||
return $this->get_margin_height();
|
||||
}
|
||||
|
||||
//........................................................................
|
||||
}
|
||||
66
pdf/include/list_bullet_frame_reflower.cls.php
Executable file
66
pdf/include/list_bullet_frame_reflower.cls.php
Executable file
@@ -0,0 +1,66 @@
|
||||
<?php
|
||||
/**
|
||||
* DOMPDF - PHP5 HTML to PDF renderer
|
||||
*
|
||||
* File: $RCSfile: list_bullet_frame_reflower.cls.php,v $
|
||||
* Created on: 2004-06-23
|
||||
*
|
||||
* Copyright (c) 2004 - Benj Carson <benjcarson@digitaljunkies.ca>
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with this library in the file LICENSE.LGPL; if not, write to the
|
||||
* Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
* 02111-1307 USA
|
||||
*
|
||||
* Alternatively, you may distribute this software under the terms of the
|
||||
* PHP License, version 3.0 or later. A copy of this license should have
|
||||
* been distributed with this file in the file LICENSE.PHP . If this is not
|
||||
* the case, you can obtain a copy at http://www.php.net/license/3_0.txt.
|
||||
*
|
||||
* The latest version of DOMPDF might be available at:
|
||||
* http://www.dompdf.com/
|
||||
*
|
||||
* @link http://www.dompdf.com/
|
||||
* @copyright 2004 Benj Carson
|
||||
* @author Benj Carson <benjcarson@digitaljunkies.ca>
|
||||
* @package dompdf
|
||||
|
||||
*/
|
||||
|
||||
/* $Id: list_bullet_frame_reflower.cls.php 357 2011-01-30 20:56:46Z fabien.menager $ */
|
||||
|
||||
/**
|
||||
* Reflows list bullets
|
||||
*
|
||||
* @access private
|
||||
* @package dompdf
|
||||
*/
|
||||
class List_Bullet_Frame_Reflower extends Frame_Reflower {
|
||||
|
||||
function __construct(Frame_Decorator $frame) { parent::__construct($frame); }
|
||||
|
||||
//........................................................................
|
||||
|
||||
function reflow(Frame_Decorator $block = null) {
|
||||
$style = $this->_frame->get_style();
|
||||
|
||||
$style->width = $this->_frame->get_width();
|
||||
$this->_frame->position();
|
||||
|
||||
if ( $style->list_style_position === "inside" ) {
|
||||
$p = $this->_frame->find_block_parent();
|
||||
$p->add_frame_to_line($this->_frame);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
188
pdf/include/list_bullet_image_frame_decorator.cls.php
Executable file
188
pdf/include/list_bullet_image_frame_decorator.cls.php
Executable file
@@ -0,0 +1,188 @@
|
||||
<?php
|
||||
/**
|
||||
* DOMPDF - PHP5 HTML to PDF renderer
|
||||
*
|
||||
* File: $RCSfile: list_bullet_image_frame_decorator.cls.php,v $
|
||||
* Created on: 2005-06-28
|
||||
*
|
||||
* Copyright (c) 2004 - Benj Carson <benjcarson@digitaljunkies.ca>
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with this library in the file LICENSE.LGPL; if not, write to the
|
||||
* Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
* 02111-1307 USA
|
||||
*
|
||||
* Alternatively, you may distribute this software under the terms of the
|
||||
* PHP License, version 3.0 or later. A copy of this license should have
|
||||
* been distributed with this file in the file LICENSE.PHP . If this is not
|
||||
* the case, you can obtain a copy at http://www.php.net/license/3_0.txt.
|
||||
*
|
||||
* The latest version of DOMPDF might be available at:
|
||||
* http://www.dompdf.com/
|
||||
*
|
||||
* @link http://www.dompdf.com/
|
||||
* @copyright 2004 Benj Carson
|
||||
* @author Benj Carson <benjcarson@digitaljunkies.ca>
|
||||
* @contributor Helmut Tischer <htischer@weihenstephan.org>
|
||||
* @package dompdf
|
||||
*
|
||||
* Changes
|
||||
* @contributor Helmut Tischer <htischer@weihenstephan.org>
|
||||
* @version 0.5.1.htischer.20090507
|
||||
* - added comment
|
||||
*/
|
||||
|
||||
/* $Id: list_bullet_image_frame_decorator.cls.php 354 2011-01-24 21:59:54Z fabien.menager $ */
|
||||
|
||||
/**
|
||||
* Decorates frames for list bullets with custom images
|
||||
*
|
||||
* @access private
|
||||
* @package dompdf
|
||||
*/
|
||||
class List_Bullet_Image_Frame_Decorator extends Frame_Decorator {
|
||||
|
||||
/**
|
||||
* The underlying image frame
|
||||
*
|
||||
* @var Image_Frame_Decorator
|
||||
*/
|
||||
protected $_img;
|
||||
|
||||
/**
|
||||
* The image's width in pixels
|
||||
*
|
||||
* @var int
|
||||
*/
|
||||
protected $_width;
|
||||
|
||||
/**
|
||||
* The image's height in pixels
|
||||
*
|
||||
* @var int
|
||||
*/
|
||||
protected $_height;
|
||||
|
||||
/**
|
||||
* Class constructor
|
||||
*
|
||||
* @param Frame $frame the bullet frame to decorate
|
||||
* @param DOMPDF $dompdf the document's dompdf object
|
||||
*/
|
||||
function __construct(Frame $frame, DOMPDF $dompdf) {
|
||||
$style = $frame->get_style();
|
||||
$url = $style->list_style_image;
|
||||
$frame->get_node()->setAttribute("src", $url);
|
||||
$this->_img = new Image_Frame_Decorator($frame, $dompdf);
|
||||
parent::__construct($this->_img, $dompdf);
|
||||
list($width, $height) = dompdf_getimagesize($this->_img->get_image_url());
|
||||
|
||||
// Resample the bullet image to be consistent with 'auto' sized images
|
||||
// See also Image_Frame_Reflower::get_min_max_width
|
||||
// Tested php ver: value measured in px, suffix "px" not in value: rtrim unnecessary.
|
||||
$this->_width = (((float)rtrim($width, "px")) * 72) / DOMPDF_DPI;
|
||||
$this->_height = (((float)rtrim($height, "px")) * 72) / DOMPDF_DPI;
|
||||
|
||||
//If an image is taller as the containing block/box, the box should be extended.
|
||||
//Neighbour elements are overwriting the overlapping image areas.
|
||||
//Todo: Where can the box size be extended?
|
||||
//Code below has no effect.
|
||||
//See block_frame_reflower _calculate_restricted_height
|
||||
//See generated_frame_reflower, Dompdf:render() "list-item", "-dompdf-list-bullet"S.
|
||||
//Leave for now
|
||||
//if ($style->min_height < $this->_height ) {
|
||||
// $style->min_height = $this->_height;
|
||||
//}
|
||||
//$style->height = "auto";
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the bullet's width
|
||||
*
|
||||
* @return int
|
||||
*/
|
||||
function get_width() {
|
||||
//ignore image width, use same width as on predefined bullet List_Bullet_Frame_Decorator
|
||||
//for proper alignment of bullet image and text. Allow image to not fitting on left border.
|
||||
//This controls the distance between bullet image and text
|
||||
//return $this->_width;
|
||||
return $this->_frame->get_style()->get_font_size()*List_Bullet_Frame_Decorator::BULLET_SIZE +
|
||||
2 * List_Bullet_Frame_Decorator::BULLET_PADDING;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the bullet's height
|
||||
*
|
||||
* @return int
|
||||
*/
|
||||
function get_height() {
|
||||
//based on image height
|
||||
return $this->_height;
|
||||
}
|
||||
|
||||
/**
|
||||
* Override get_margin_width
|
||||
*
|
||||
* @return int
|
||||
*/
|
||||
function get_margin_width() {
|
||||
//ignore image width, use same width as on predefined bullet List_Bullet_Frame_Decorator
|
||||
//for proper alignment of bullet image and text. Allow image to not fitting on left border.
|
||||
//This controls the extra indentation of text to make room for the bullet image.
|
||||
//Here use actual image size, not predefined bullet size
|
||||
//return $this->_frame->get_style()->get_font_size()*List_Bullet_Frame_Decorator::BULLET_SIZE +
|
||||
// 2 * List_Bullet_Frame_Decorator::BULLET_PADDING;
|
||||
|
||||
// Small hack to prevent indenting of list text
|
||||
// Image Might not exist, then position like on list_bullet_frame_decorator fallback to none.
|
||||
if ( $this->_frame->get_style()->list_style_position === "outside" ||
|
||||
$this->_width == 0)
|
||||
return 0;
|
||||
//This aligns the "inside" image position with the text.
|
||||
//The text starts to the right of the image.
|
||||
//Between the image and the text there is an added margin of image width.
|
||||
//Where this comes from is unknown.
|
||||
//The corresponding List_Bullet_Frame_Decorator sets a smaller margin. bullet size?
|
||||
return $this->_width + 2 * List_Bullet_Frame_Decorator::BULLET_PADDING;
|
||||
}
|
||||
|
||||
/**
|
||||
* Override get_margin_height()
|
||||
*
|
||||
* @return int
|
||||
*/
|
||||
function get_margin_height() {
|
||||
//Hits only on "inset" lists items, to increase height of box
|
||||
//based on image height
|
||||
return $this->_height + 2 * List_Bullet_Frame_Decorator::BULLET_PADDING;
|
||||
}
|
||||
|
||||
/**
|
||||
* Return image url
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
function get_image_url() {
|
||||
return $this->_img->get_image_url();
|
||||
}
|
||||
|
||||
/**
|
||||
* Return the image extension
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
function get_image_ext() {
|
||||
return $this->_img->get_image_ext();
|
||||
}
|
||||
|
||||
}
|
||||
111
pdf/include/list_bullet_positioner.cls.php
Executable file
111
pdf/include/list_bullet_positioner.cls.php
Executable file
@@ -0,0 +1,111 @@
|
||||
<?php
|
||||
/**
|
||||
* DOMPDF - PHP5 HTML to PDF renderer
|
||||
*
|
||||
* File: $RCSfile: list_bullet_positioner.cls.php,v $
|
||||
* Created on: 2004-06-23
|
||||
*
|
||||
* Copyright (c) 2004 - Benj Carson <benjcarson@digitaljunkies.ca>
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with this library in the file LICENSE.LGPL; if not, write to the
|
||||
* Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
* 02111-1307 USA
|
||||
*
|
||||
* Alternatively, you may distribute this software under the terms of the
|
||||
* PHP License, version 3.0 or later. A copy of this license should have
|
||||
* been distributed with this file in the file LICENSE.PHP . If this is not
|
||||
* the case, you can obtain a copy at http://www.php.net/license/3_0.txt.
|
||||
*
|
||||
* The latest version of DOMPDF might be available at:
|
||||
* http://www.dompdf.com/
|
||||
*
|
||||
* @link http://www.dompdf.com/
|
||||
* @copyright 2004 Benj Carson
|
||||
* @author Benj Carson <benjcarson@digitaljunkies.ca>
|
||||
* @contributor Helmut Tischer <htischer@weihenstephan.org>
|
||||
* @package dompdf
|
||||
|
||||
*
|
||||
* Changes
|
||||
* @contributor Helmut Tischer <htischer@weihenstephan.org>
|
||||
* @version 20090622
|
||||
* - try to adjust top position of bullet to top corner of subsequent font
|
||||
*/
|
||||
|
||||
/* $Id: list_bullet_positioner.cls.php 216 2010-03-11 22:49:18Z ryan.masten $ */
|
||||
|
||||
/**
|
||||
* Positions list bullets
|
||||
*
|
||||
* @access private
|
||||
* @package dompdf
|
||||
*/
|
||||
class List_Bullet_Positioner extends Positioner {
|
||||
|
||||
function __construct(Frame_Decorator $frame) { parent::__construct($frame); }
|
||||
|
||||
//........................................................................
|
||||
|
||||
function position() {
|
||||
|
||||
// Bullets & friends are positioned an absolute distance to the left of
|
||||
// the content edge of their parent element
|
||||
$cb = $this->_frame->get_containing_block();
|
||||
$style = $this->_frame->get_style();
|
||||
|
||||
// Note: this differs from most frames in that we must position
|
||||
// ourselves after determining our width
|
||||
$x = $cb["x"] - $this->_frame->get_width();
|
||||
|
||||
$p = $this->_frame->find_block_parent();
|
||||
|
||||
$y = $p->get_current_line("y");
|
||||
|
||||
// This is a bit of a hack...
|
||||
$n = $this->_frame->get_next_sibling();
|
||||
if ( $n ) {
|
||||
$style = $n->get_style();
|
||||
$y += $style->length_in_pt( array($style->margin_top, $style->padding_top),
|
||||
$n->get_containing_block("w") );
|
||||
}
|
||||
|
||||
// Now the position is the left top of the block which should be marked with the bullet.
|
||||
// We tried to find out the y of the start of the first text character within the block.
|
||||
// But the top margin/padding does not fit, neither from this nor from the next sibling
|
||||
// The "bit of a hack" above does not work also.
|
||||
|
||||
// Instead let's position the bullet vertically centered to the block which should be marked.
|
||||
// But for get_next_sibling() the get_containing_block is all zero, and for find_block_parent()
|
||||
// the get_containing_block is paper width and the entire list as height.
|
||||
|
||||
// if ($p) {
|
||||
// //$cb = $n->get_containing_block();
|
||||
// $cb = $p->get_containing_block();
|
||||
// $y += $cb["h"]/2;
|
||||
// print 'cb:'.$cb["x"].':'.$cb["y"].':'.$cb["w"].':'.$cb["h"].':';
|
||||
// }
|
||||
|
||||
// Todo:
|
||||
// For now give up on the above. Use Guesswork with font y-pos in the middle of the line spacing
|
||||
|
||||
$style = $p->get_style();
|
||||
$font_size = $style->get_font_size();
|
||||
$line_height = $style->length_in_pt($style->line_height, $font_size);
|
||||
$y += ($line_height - $font_size) / 2;
|
||||
|
||||
//Position is x-end y-top of character position of the bullet.
|
||||
$this->_frame->set_position($x, $y);
|
||||
|
||||
}
|
||||
}
|
||||
200
pdf/include/list_bullet_renderer.cls.php
Executable file
200
pdf/include/list_bullet_renderer.cls.php
Executable file
@@ -0,0 +1,200 @@
|
||||
<?php
|
||||
/**
|
||||
* DOMPDF - PHP5 HTML to PDF renderer
|
||||
*
|
||||
* File: $RCSfile: list_bullet_renderer.cls.php,v $
|
||||
* Created on: 2004-06-23
|
||||
*
|
||||
* Copyright (c) 2004 - Benj Carson <benjcarson@digitaljunkies.ca>
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with this library in the file LICENSE.LGPL; if not, write to the
|
||||
* Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
* 02111-1307 USA
|
||||
*
|
||||
* Alternatively, you may distribute this software under the terms of the
|
||||
* PHP License, version 3.0 or later. A copy of this license should have
|
||||
* been distributed with this file in the file LICENSE.PHP . If this is not
|
||||
* the case, you can obtain a copy at http://www.php.net/license/3_0.txt.
|
||||
*
|
||||
* The latest version of DOMPDF might be available at:
|
||||
* http://www.dompdf.com/
|
||||
*
|
||||
* @link http://www.dompdf.com/
|
||||
* @copyright 2004 Benj Carson
|
||||
* @author Benj Carson <benjcarson@digitaljunkies.ca>
|
||||
* @contributor Helmut Tischer <htischer@weihenstephan.org>
|
||||
* @package dompdf
|
||||
|
||||
*
|
||||
* Changes
|
||||
* @contributor Helmut Tischer <htischer@weihenstephan.org>
|
||||
* @version 20090622
|
||||
* - bullet size proportional to font size, center position
|
||||
*/
|
||||
|
||||
/* $Id: list_bullet_renderer.cls.php 354 2011-01-24 21:59:54Z fabien.menager $ */
|
||||
|
||||
/**
|
||||
* Renders list bullets
|
||||
*
|
||||
* @access private
|
||||
* @package dompdf
|
||||
*/
|
||||
class List_Bullet_Renderer extends Abstract_Renderer {
|
||||
|
||||
//........................................................................
|
||||
private function make_counter($n, $type, $pad = null){
|
||||
$n = intval($n);
|
||||
$text = "";
|
||||
$uppercase = false;
|
||||
|
||||
switch ($type) {
|
||||
case "decimal-leading-zero":
|
||||
case "decimal":
|
||||
case "1":
|
||||
if ($pad)
|
||||
$text = str_pad($n, $pad, "0", STR_PAD_LEFT);
|
||||
else
|
||||
$text = $n;
|
||||
break;
|
||||
|
||||
case "upper-alpha":
|
||||
case "upper-latin":
|
||||
case "A":
|
||||
$uppercase = true;
|
||||
case "lower-alpha":
|
||||
case "lower-latin":
|
||||
case "a":
|
||||
$text = chr( ($n % 26) + ord('a') - 1);
|
||||
break;
|
||||
|
||||
case "upper-roman":
|
||||
case "I":
|
||||
$uppercase = true;
|
||||
case "lower-roman":
|
||||
case "i":
|
||||
$text = dec2roman($n);
|
||||
break;
|
||||
|
||||
case "lower-greek":
|
||||
$text = unichr($n + 944);
|
||||
break;
|
||||
}
|
||||
|
||||
if ($uppercase)
|
||||
$text = strtoupper($text);
|
||||
|
||||
return $text.".";
|
||||
}
|
||||
|
||||
function render(Frame $frame) {
|
||||
|
||||
$style = $frame->get_style();
|
||||
$font_size = $style->get_font_size();
|
||||
$line_height = $style->length_in_pt($style->line_height, $frame->get_containing_block("w"));
|
||||
|
||||
$this->_set_opacity( $frame->get_opacity( $style->opacity ) );
|
||||
|
||||
// Handle list-style-image
|
||||
// If list style image is requested but missing, fall back to predefined types
|
||||
if ( $style->list_style_image !== "none" &&
|
||||
strcmp($img = $frame->get_image_url(), DOMPDF_LIB_DIR . "/res/broken_image.png") != 0) {
|
||||
|
||||
list($x,$y) = $frame->get_position();
|
||||
|
||||
//For expected size and aspect, instead of box size, use image natural size scaled to DPI.
|
||||
// Resample the bullet image to be consistent with 'auto' sized images
|
||||
// See also Image_Frame_Reflower::get_min_max_width
|
||||
// Tested php ver: value measured in px, suffix "px" not in value: rtrim unnecessary.
|
||||
//$w = $frame->get_width();
|
||||
//$h = $frame->get_height();
|
||||
list($width, $height) = dompdf_getimagesize($img);
|
||||
$w = (((float)rtrim($width, "px")) * 72) / DOMPDF_DPI;
|
||||
$h = (((float)rtrim($height, "px")) * 72) / DOMPDF_DPI;
|
||||
|
||||
$x -= $w;
|
||||
$y -= ($line_height - $font_size)/2; //Reverse hinting of list_bullet_positioner
|
||||
|
||||
$this->_canvas->image( $img, $frame->get_image_ext(), $x, $y, $w, $h);
|
||||
|
||||
} else {
|
||||
|
||||
$bullet_style = $style->list_style_type;
|
||||
|
||||
$fill = false;
|
||||
|
||||
switch ($bullet_style) {
|
||||
|
||||
default:
|
||||
case "disc":
|
||||
$fill = true;
|
||||
|
||||
case "circle":
|
||||
list($x,$y) = $frame->get_position();
|
||||
$r = ($font_size*(List_Bullet_Frame_Decorator::BULLET_SIZE /*-List_Bullet_Frame_Decorator::BULLET_THICKNESS*/ ))/2;
|
||||
$x -= $font_size*(List_Bullet_Frame_Decorator::BULLET_SIZE/2);
|
||||
$y += ($font_size*(1-List_Bullet_Frame_Decorator::BULLET_DESCENT))/2;
|
||||
$o = $font_size*List_Bullet_Frame_Decorator::BULLET_THICKNESS;
|
||||
$this->_canvas->circle($x, $y, $r, $style->color, $o, null, $fill);
|
||||
break;
|
||||
|
||||
case "square":
|
||||
list($x, $y) = $frame->get_position();
|
||||
$w = $font_size*List_Bullet_Frame_Decorator::BULLET_SIZE;
|
||||
$x -= $w;
|
||||
$y += ($font_size*(1-List_Bullet_Frame_Decorator::BULLET_DESCENT-List_Bullet_Frame_Decorator::BULLET_SIZE))/2;
|
||||
$this->_canvas->filled_rectangle($x, $y, $w, $w, $style->color);
|
||||
break;
|
||||
|
||||
case "decimal-leading-zero":
|
||||
case "decimal":
|
||||
case "lower-alpha":
|
||||
case "lower-latin":
|
||||
case "lower-roman":
|
||||
case "lower-greek":
|
||||
case "upper-alpha":
|
||||
case "upper-latin":
|
||||
case "upper-roman":
|
||||
case "1": // HTML 4.0 compatibility
|
||||
case "a":
|
||||
case "i":
|
||||
case "A":
|
||||
case "I":
|
||||
list($x,$y) = $frame->get_position();
|
||||
|
||||
$pad = null;
|
||||
if ( $bullet_style === "decimal-leading-zero" ) {
|
||||
$pad = strlen($frame->get_parent()->get_parent()->get_node()->getAttribute("dompdf-children-count"));
|
||||
}
|
||||
|
||||
$index = $frame->get_node()->getAttribute("dompdf-counter");
|
||||
$text = $this->make_counter($index, $bullet_style, $pad);
|
||||
$font_family = $style->font_family;
|
||||
$spacing = 0; //$frame->get_text_spacing() + $style->word_spacing;
|
||||
|
||||
if ( trim($text) == "" )
|
||||
return;
|
||||
|
||||
$x -= Font_Metrics::get_text_width($text, $font_family, $font_size, $spacing);
|
||||
|
||||
$this->_canvas->text($x, $y, $text,
|
||||
$font_family, $font_size,
|
||||
$style->color, $spacing);
|
||||
|
||||
case "none":
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
59
pdf/include/null_frame_decorator.cls.php
Executable file
59
pdf/include/null_frame_decorator.cls.php
Executable file
@@ -0,0 +1,59 @@
|
||||
<?php
|
||||
/**
|
||||
* DOMPDF - PHP5 HTML to PDF renderer
|
||||
*
|
||||
* File: $RCSfile: null_frame_decorator.cls.php,v $
|
||||
* Created on: 2004-07-12
|
||||
*
|
||||
* Copyright (c) 2004 - Benj Carson <benjcarson@digitaljunkies.ca>
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with this library in the file LICENSE.LGPL; if not, write to the
|
||||
* Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
* 02111-1307 USA
|
||||
*
|
||||
* Alternatively, you may distribute this software under the terms of the
|
||||
* PHP License, version 3.0 or later. A copy of this license should have
|
||||
* been distributed with this file in the file LICENSE.PHP . If this is not
|
||||
* the case, you can obtain a copy at http://www.php.net/license/3_0.txt.
|
||||
*
|
||||
* The latest version of DOMPDF might be available at:
|
||||
* http://www.dompdf.com/
|
||||
*
|
||||
* @link http://www.dompdf.com/
|
||||
* @copyright 2004 Benj Carson
|
||||
* @author Benj Carson <benjcarson@digitaljunkies.ca>
|
||||
* @package dompdf
|
||||
|
||||
*/
|
||||
|
||||
/* $Id: null_frame_decorator.cls.php 216 2010-03-11 22:49:18Z ryan.masten $ */
|
||||
|
||||
/**
|
||||
* Dummy decorator
|
||||
*
|
||||
* @access private
|
||||
* @package dompdf
|
||||
*/
|
||||
class Null_Frame_Decorator extends Frame_Decorator {
|
||||
|
||||
function __construct(Frame $frame, DOMPDF $dompdf) {
|
||||
parent::__construct($frame, $dompdf);
|
||||
$style = $this->_frame->get_style();
|
||||
$style->width = 0;
|
||||
$style->height = 0;
|
||||
$style->margin = 0;
|
||||
$style->padding = 0;
|
||||
}
|
||||
|
||||
}
|
||||
54
pdf/include/null_frame_reflower.cls.php
Executable file
54
pdf/include/null_frame_reflower.cls.php
Executable file
@@ -0,0 +1,54 @@
|
||||
<?php
|
||||
/**
|
||||
* DOMPDF - PHP5 HTML to PDF renderer
|
||||
*
|
||||
* File: $RCSfile: null_frame_reflower.cls.php,v $
|
||||
* Created on: 2004-07-12
|
||||
*
|
||||
* Copyright (c) 2004 - Benj Carson <benjcarson@digitaljunkies.ca>
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with this library in the file LICENSE.LGPL; if not, write to the
|
||||
* Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
* 02111-1307 USA
|
||||
*
|
||||
* Alternatively, you may distribute this software under the terms of the
|
||||
* PHP License, version 3.0 or later. A copy of this license should have
|
||||
* been distributed with this file in the file LICENSE.PHP . If this is not
|
||||
* the case, you can obtain a copy at http://www.php.net/license/3_0.txt.
|
||||
*
|
||||
* The latest version of DOMPDF might be available at:
|
||||
* http://www.dompdf.com/
|
||||
*
|
||||
* @link http://www.dompdf.com/
|
||||
* @copyright 2004 Benj Carson
|
||||
* @author Benj Carson <benjcarson@digitaljunkies.ca>
|
||||
* @package dompdf
|
||||
|
||||
*/
|
||||
|
||||
/* $Id: null_frame_reflower.cls.php 357 2011-01-30 20:56:46Z fabien.menager $ */
|
||||
|
||||
/**
|
||||
* Dummy reflower
|
||||
*
|
||||
* @access private
|
||||
* @package dompdf
|
||||
*/
|
||||
class Null_Frame_Reflower extends Frame_Reflower {
|
||||
|
||||
function __construct(Frame $frame) { parent::__construct($frame); }
|
||||
|
||||
function reflow(Frame_Decorator $block = null) { return; }
|
||||
|
||||
}
|
||||
56
pdf/include/null_positioner.cls.php
Executable file
56
pdf/include/null_positioner.cls.php
Executable file
@@ -0,0 +1,56 @@
|
||||
<?php
|
||||
/**
|
||||
* DOMPDF - PHP5 HTML to PDF renderer
|
||||
*
|
||||
* File: $RCSfile: null_positioner.cls.php,v $
|
||||
* Created on: 2004-07-12
|
||||
*
|
||||
* Copyright (c) 2004 - Benj Carson <benjcarson@digitaljunkies.ca>
|
||||
*
|
||||
* This library is free software; you can redistribute it and/or
|
||||
* modify it under the terms of the GNU Lesser General Public
|
||||
* License as published by the Free Software Foundation; either
|
||||
* version 2.1 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This library is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
* Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License
|
||||
* along with this library in the file LICENSE.LGPL; if not, write to the
|
||||
* Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
|
||||
* 02111-1307 USA
|
||||
*
|
||||
* Alternatively, you may distribute this software under the terms of the
|
||||
* PHP License, version 3.0 or later. A copy of this license should have
|
||||
* been distributed with this file in the file LICENSE.PHP . If this is not
|
||||
* the case, you can obtain a copy at http://www.php.net/license/3_0.txt.
|
||||
*
|
||||
* The latest version of DOMPDF might be available at:
|
||||
* http://www.dompdf.com/
|
||||
*
|
||||
* @link http://www.dompdf.com/
|
||||
* @copyright 2004 Benj Carson
|
||||
* @author Benj Carson <benjcarson@digitaljunkies.ca>
|
||||
* @package dompdf
|
||||
|
||||
*/
|
||||
|
||||
/* $Id: null_positioner.cls.php 216 2010-03-11 22:49:18Z ryan.masten $ */
|
||||
|
||||
/**
|
||||
* Dummy positioner
|
||||
*
|
||||
* @access private
|
||||
* @package dompdf
|
||||
*/
|
||||
class Null_Positioner extends Positioner {
|
||||
|
||||
function __construct(Frame_Decorator $frame) {
|
||||
parent::__construct($frame);
|
||||
}
|
||||
|
||||
function position() { return; }
|
||||
|
||||
}
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user