3560 lines
155 KiB
Plaintext
Executable File
3560 lines
155 KiB
Plaintext
Executable File
CREATE OR REPLACE PACKAGE BODY pdfgen_pkg
|
|
AS
|
|
/*******************************************************************************
|
|
* Logiciel : PL_FPDF *
|
|
* Version : 0.9.4 *
|
|
* Date : 13/06/2006 *
|
|
* Auteur : Pierre-Gilles Levallois *
|
|
* Licence : GPL *
|
|
* *
|
|
********************************************************************************
|
|
* Cette librairie PL/SQL est un portage de la version 1.53 de FPDF, célèbre *
|
|
* classe PHP développée par Olivier PLATHEY (http://www.fpdf.org/) *
|
|
********************************************************************************
|
|
This program is free software; you can redistribute it and/or modify
|
|
it under the terms of the GNU General Public License as published by
|
|
the Free Software Foundation; either version 2 of the License, or
|
|
(at your option) any later version.
|
|
|
|
This program 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 General Public License for more details.
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
along with this program; if not, write to the Free Software
|
|
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
|
********************************************************************************/
|
|
|
|
/*******************************************************************************
|
|
TODO :
|
|
- Known bugs :
|
|
|
|
CHANGELOG :
|
|
0.9.4 -> 0.9.5 :
|
|
- Merged several bug fixes and enhancements from various contributors.
|
|
0.9.3 -> 0.9.4 :
|
|
- Fixed printing links on pages, both URL and internal links now work.
|
|
- Added the ability to put more than one link on a page.
|
|
- Rob Duke (Columbia Forest Products).
|
|
0.9.2 -> 0.9.3 :
|
|
- Added Sample on setHeaderProc and setFooterProc procedures.
|
|
- Added parameter implementation to thes procedures.
|
|
- Modify Header and footer procedure behaviour to get parameter values
|
|
- declared subtype 'word' ans type 'tv4000a' in the specs.
|
|
|
|
0.9.1 -> 0.9.2 :
|
|
- Added procedure helloword Example.
|
|
- Added procedure testImg Example.
|
|
|
|
*******************************************************************************/
|
|
|
|
-- Privates types
|
|
subtype flag is boolean;
|
|
subtype car is varchar2(1);
|
|
subtype phrase is varchar2(255);
|
|
subtype txt is varchar2(2000);
|
|
subtype bigtext is varchar2(32767);
|
|
subtype margin is number;
|
|
|
|
-- type tv1 is table of varchar2(1) index by binary_integer;
|
|
type tbool is table of boolean index by binary_integer;
|
|
type tn is table of number index by binary_integer;
|
|
type tv4000 is table of varchar2(4000) index by binary_integer;
|
|
type tv32k is table of varchar2(32767) index by binary_integer;
|
|
|
|
type tclob is table of clob index by binary_integer;
|
|
|
|
type charSet is table of pls_integer index by car;
|
|
|
|
type recFont is record ( i word,
|
|
n pls_integer,
|
|
type word,
|
|
name word,
|
|
dsc tv4000,
|
|
up word,
|
|
ut word,
|
|
cw charSet,
|
|
enc word,
|
|
file word,
|
|
diff word,
|
|
length1 word,
|
|
length2 word);
|
|
|
|
type fontsArray is table of recFont index by phrase;
|
|
|
|
type recImage is record ( n number, -- indice d'insertion dans le document
|
|
i number, -- ?
|
|
w number, -- width
|
|
h number, -- height
|
|
cs txt, -- colorspace
|
|
bpc txt, -- Bit per color
|
|
f txt, -- File Format
|
|
parms txt, -- pdf parameter for this image
|
|
pal txt, -- colors palette informations
|
|
trns tn, -- transparency
|
|
data blob -- Data
|
|
);
|
|
|
|
type imagesArray is table of recImage index by txt;
|
|
|
|
type recFormat is record ( largeur number,
|
|
hauteur number);
|
|
|
|
type rec2chp is record ( zero txt,
|
|
un txt);
|
|
|
|
type rec5 is record ( page number,
|
|
zero txt,
|
|
un txt,
|
|
deux txt,
|
|
trois txt,
|
|
quatre txt);
|
|
|
|
type LinksArray is table of rec5;
|
|
|
|
type Array2dim is table of rec2chp;
|
|
|
|
type ArrayCharWidths is table of charSet index by word;
|
|
|
|
-- Private properties
|
|
page number; -- current page number
|
|
n number; -- current object number
|
|
offsets tv4000; -- array of object offsets
|
|
--pdfDoc tv32k; -- buffer holding in-memory final PDF document.
|
|
pdfDoc tclob;
|
|
imgBlob blob; -- allows creation of persistent blobs for images
|
|
--pages tv32k; -- array containing pages
|
|
pages tclob;
|
|
state word; -- current document state
|
|
b_compress flag := false; -- compression flag
|
|
DefOrientation car; -- default orientation
|
|
CurOrientation car; -- current orientation
|
|
OrientationChanges tbool; -- array indicating orientation changes
|
|
k number; -- scale factor (number of points in user unit)
|
|
fwPt number;
|
|
fhPt number; -- dimensions of page format in points
|
|
fw number;
|
|
fh number; -- dimensions of page format in user unit
|
|
wPt number;
|
|
hPt number; -- current dimensions of page in points
|
|
w number;
|
|
h number; -- current dimensions of page in user unit
|
|
lMargin margin; -- left margin
|
|
tMargin margin; -- top margin
|
|
rMargin margin; -- right margin
|
|
bMargin margin; -- page break margin
|
|
cMargin margin; -- cell margin
|
|
x number;
|
|
y number; -- current position in user unit for cell positioning
|
|
lasth number; -- height of last cell printed
|
|
LineWidth number; -- line width in user unit
|
|
CoreFonts tv4000a; -- array of standard font names
|
|
fonts fontsArray;
|
|
-- array of used fonts
|
|
FontFiles fontsArray; -- array of font files
|
|
diffs tv4000; -- array of encoding differences
|
|
images imagesArray; -- array of used images
|
|
PageLinks LinksArray:=LinksArray(); -- array of links in pages
|
|
links Array2dim:= Array2dim(); -- array of internal links
|
|
FontFamily word; -- current font family
|
|
FontStyle word; -- current font style
|
|
underline flag; -- underlining flag
|
|
CurrentFont recFont; -- current font info
|
|
FontSizePt number; -- current font size in points
|
|
FontSize number; -- current font size in user unit
|
|
DrawColor phrase; -- commands for drawing color
|
|
FillColor phrase; -- commands for filling color
|
|
TextColor phrase; -- commands for txt color
|
|
ColorFlag flag; -- indicates whether fill and txt colors are different
|
|
ws word; -- word spacing
|
|
AutoPageBreak flag; -- automatic page breaking
|
|
PageBreakTrigger number; -- threshold used to trigger page breaks
|
|
InFooter flag; -- flag set when processing footer
|
|
ZoomMode word; -- zoom display mode
|
|
LayoutMode word; -- layout display mode
|
|
title txt; -- title
|
|
subject txt; -- subject
|
|
author txt; -- author
|
|
keywords txt; -- keywords
|
|
creator txt; -- creator
|
|
AliasNbPages word; -- alias for total number of pages
|
|
PDFVersion word; -- PDF version number
|
|
|
|
jsIncluded boolean := false;
|
|
jsNbr number;
|
|
jsStr varchar2(4000);
|
|
|
|
-- Proprietés ajoutées lors du portage en PLSQL.
|
|
fpdf_charwidths ArrayCharWidths; -- Characters table.
|
|
MyHeader_Proc txt; -- Personal Header procedure.
|
|
MyHeader_ProcParam tv4000a; -- Table of parameters of the personal header Proc.
|
|
MyFooter_Proc txt; -- Personal Footer procedure.
|
|
MyFooter_ProcParam tv4000a; -- Table of parameters of the personal footer Proc.
|
|
formatArray recFormat; -- Dimension of the format (variable : format).
|
|
gb_mode_debug boolean := false;
|
|
Linespacing number;
|
|
|
|
|
|
-- variables dont je ne maitrise pas bien l'emploi.
|
|
-- A vérifier au court de la validation du portage.
|
|
originalsize word;
|
|
size1 word;
|
|
size2 word;
|
|
/*******************************************************************************
|
|
* *
|
|
* Protected methods : Internal function and procedures *
|
|
* *
|
|
*******************************************************************************/
|
|
----------------------------------------------------------------------------------
|
|
-- proc. and func. spécifiques ajoutées au portage.
|
|
----------------------------------------------------------------------------------
|
|
procedure print (pstr varchar2) is
|
|
begin
|
|
-- Choose the output mode...
|
|
htp.p(pstr);
|
|
-- My outpout method
|
|
-- affiche.p(pstr);
|
|
end print;
|
|
|
|
|
|
----------------------------------------------------------------------------------
|
|
-- Testing if method for additionnal fonts exists in this package
|
|
-- lv_existing_methods MUST reference all the "p_put..." procedure of the package.
|
|
----------------------------------------------------------------------------------
|
|
function methode_exists(pMethodName varchar2) return boolean is
|
|
lv_existing_methods varchar2(2000)
|
|
:= 'p_putstream,p_putxobjectdict,p_putresourcedict,p_putfonts,p_putimages,p_putresources,'||
|
|
'p_putinfo,p_putcatalog,p_putheader,p_puttrailer,p_putpages';
|
|
begin
|
|
if (instr(lv_existing_methods, lower(pMethodName) ) > 0 ) then
|
|
return true;
|
|
end if;
|
|
return false;
|
|
exception
|
|
when others then
|
|
return false;
|
|
end methode_exists;
|
|
|
|
----------------------------------------------------------------------------------
|
|
-- Calculate the length of the final document contained in the plsql table pdfDoc.
|
|
----------------------------------------------------------------------------------
|
|
function getPDFDocLength return pls_integer is
|
|
lg pls_integer := 0;
|
|
begin
|
|
for i in pdfDoc.first..pdfDoc.last loop
|
|
lg := lg + nvl(length(pdfDoc(i)), 0);
|
|
end loop;
|
|
return lg;
|
|
exception
|
|
when others then
|
|
error('getPDFDocLength : '||sqlerrm);
|
|
return -1;
|
|
end getPDFDocLength;
|
|
|
|
----------------------------------------------------------------------------------
|
|
-- Setting metric for courier Font
|
|
----------------------------------------------------------------------------------
|
|
function getFontCourier return charSet is
|
|
mySet charSet;
|
|
begin
|
|
--
|
|
-- Courier font.
|
|
--
|
|
for i in 0..255
|
|
loop
|
|
mySet(chr(i)):=600;
|
|
end loop;
|
|
return mySet;
|
|
end getFontCourier;
|
|
|
|
----------------------------------------------------------------------------------
|
|
-- Setting metric for helvetica
|
|
----------------------------------------------------------------------------------
|
|
function getFontHelvetica return charSet is
|
|
mySet charSet;
|
|
begin
|
|
-- helvetica font.
|
|
mySet(chr(0)) := 278; mySet(chr(1)) := 278; mySet(chr(2)) := 278; mySet(chr(3)) := 278; mySet(chr(4)) := 278; mySet(chr(5)) := 278; mySet(chr(6)) := 278; mySet(chr(7)) := 278; mySet(chr(8)) := 278; mySet(chr(9)) := 278; mySet(chr(10)) := 278; mySet(chr(11)) := 278; mySet(chr(12)) := 278; mySet(chr(13)) := 278; mySet(chr(14)) := 278; mySet(chr(15)) := 278; mySet(chr(16)) := 278; mySet(chr(17)) := 278; mySet(chr(18)) := 278; mySet(chr(19)) := 278; mySet(chr(20)) := 278; mySet(chr(21)) := 278;
|
|
mySet(chr(22)) := 278; mySet(chr(23)) := 278; mySet(chr(24)) := 278; mySet(chr(25)) := 278; mySet(chr(26)) := 278; mySet(chr(27)) := 278; mySet(chr(28)) := 278; mySet(chr(29)) := 278; mySet(chr(30)) := 278; mySet(chr(31)) := 278;
|
|
mySet(' ') := 278; mySet('!') := 278; mySet('"') := 355; mySet('#') := 556; mySet('$') := 556; mySet('%') := 889; mySet('&') := 667; mySet('''') := 191; mySet('(') := 333; mySet(')') := 333; mySet('*') := 389; mySet('+') := 584;
|
|
mySet(',') := 278; mySet('-') := 333; mySet('.') := 278; mySet('/') := 278; mySet('0') := 556; mySet('1') := 556; mySet('2') := 556; mySet('3') := 556; mySet('4') := 556; mySet('5') := 556; mySet('6') := 556; mySet('7') := 556; mySet('8') := 556; mySet('9') := 556; mySet(':') := 278; mySet(';') := 278; mySet('<') := 584; mySet('=') := 584; mySet('>') := 584; mySet('?') := 556; mySet('@') := 1015; mySet('A') := 667;
|
|
mySet('B') := 667; mySet('C') := 722; mySet('D') := 722; mySet('E') := 667; mySet('F') := 611; mySet('G') := 778; mySet('H') := 722; mySet('I') := 278; mySet('J') := 500; mySet('K') := 667; mySet('L') := 556; mySet('M') := 833; mySet('N') := 722; mySet('O') := 778; mySet('P') := 667; mySet('Q') := 778; mySet('R') := 722; mySet('S') := 667; mySet('T') := 611; mySet('U') := 722; mySet('V') := 667; mySet('W') := 944;
|
|
mySet('X') := 667; mySet('Y') := 667; mySet('Z') := 611; mySet('[') := 278; mySet('\') := 278; mySet(']') := 278; mySet('^') := 469; mySet('_') := 556; mySet('`') := 333; mySet('a') := 556; mySet('b') := 556; mySet('c') := 500; mySet('d') := 556; mySet('e') := 556; mySet('f') := 278; mySet('g') := 556; mySet('h') := 556; mySet('i') := 222; mySet('j') := 222; mySet('k') := 500; mySet('l') := 222; mySet('m') := 833;
|
|
mySet('n') := 556; mySet('o') := 556; mySet('p') := 556; mySet('q') := 556; mySet('r') := 333; mySet('s') := 500; mySet('t') := 278; mySet('u') := 556; mySet('v') := 500; mySet('w') := 722; mySet('x') := 500; mySet('y') := 500; mySet('z') := 500; mySet('{') := 334; mySet('|') := 260; mySet('}') := 334; mySet('~') := 584; mySet(chr(127)) := 350; mySet(chr(128)) := 556; mySet(chr(129)) := 350; mySet(chr(130)) := 222; mySet(chr(131)) := 556;
|
|
mySet(chr(132)) := 333; mySet(chr(133)) := 1000; mySet(chr(134)) := 556; mySet(chr(135)) := 556; mySet(chr(136)) := 333; mySet(chr(137)) := 1000; mySet(chr(138)) := 667; mySet(chr(139)) := 333; mySet(chr(140)) := 1000; mySet(chr(141)) := 350; mySet(chr(142)) := 611; mySet(chr(143)) := 350; mySet(chr(144)) := 350; mySet(chr(145)) := 222; mySet(chr(146)) := 222; mySet(chr(147)) := 333; mySet(chr(148)) := 333; mySet(chr(149)) := 350; mySet(chr(150)) := 556; mySet(chr(151)) := 1000; mySet(chr(152)) := 333; mySet(chr(153)) := 1000;
|
|
mySet(chr(154)) := 500; mySet(chr(155)) := 333; mySet(chr(156)) := 944; mySet(chr(157)) := 350; mySet(chr(158)) := 500; mySet(chr(159)) := 667; mySet(chr(160)) := 278; mySet(chr(161)) := 333; mySet(chr(162)) := 556; mySet(chr(163)) := 556; mySet(chr(164)) := 556; mySet(chr(165)) := 556; mySet(chr(166)) := 260; mySet(chr(167)) := 556; mySet(chr(168)) := 333; mySet(chr(169)) := 737; mySet(chr(170)) := 370; mySet(chr(171)) := 556; mySet(chr(172)) := 584; mySet(chr(173)) := 333; mySet(chr(174)) := 737; mySet(chr(175)) := 333;
|
|
mySet(chr(176)) := 400; mySet(chr(177)) := 584; mySet(chr(178)) := 333; mySet(chr(179)) := 333; mySet(chr(180)) := 333; mySet(chr(181)) := 556; mySet(chr(182)) := 537; mySet(chr(183)) := 278; mySet(chr(184)) := 333; mySet(chr(185)) := 333; mySet(chr(186)) := 365; mySet(chr(187)) := 556; mySet(chr(188)) := 834; mySet(chr(189)) := 834; mySet(chr(190)) := 834; mySet(chr(191)) := 611; mySet(chr(192)) := 667; mySet(chr(193)) := 667; mySet(chr(194)) := 667; mySet(chr(195)) := 667; mySet(chr(196)) := 667; mySet(chr(197)) := 667;
|
|
mySet(chr(198)) := 1000; mySet(chr(199)) := 722; mySet(chr(200)) := 667; mySet(chr(201)) := 667; mySet(chr(202)) := 667; mySet(chr(203)) := 667; mySet(chr(204)) := 278; mySet(chr(205)) := 278; mySet(chr(206)) := 278; mySet(chr(207)) := 278; mySet(chr(208)) := 722; mySet(chr(209)) := 722; mySet(chr(210)) := 778; mySet(chr(211)) := 778; mySet(chr(212)) := 778; mySet(chr(213)) := 778; mySet(chr(214)) := 778; mySet(chr(215)) := 584; mySet(chr(216)) := 778; mySet(chr(217)) := 722; mySet(chr(218)) := 722; mySet(chr(219)) := 722;
|
|
mySet(chr(220)) := 722; mySet(chr(221)) := 667; mySet(chr(222)) := 667; mySet(chr(223)) := 611; mySet(chr(224)) := 556; mySet(chr(225)) := 556; mySet(chr(226)) := 556; mySet(chr(227)) := 556; mySet(chr(228)) := 556; mySet(chr(229)) := 556; mySet(chr(230)) := 889; mySet(chr(231)) := 500; mySet(chr(232)) := 556; mySet(chr(233)) := 556; mySet(chr(234)) := 556; mySet(chr(235)) := 556; mySet(chr(236)) := 278; mySet(chr(237)) := 278; mySet(chr(238)) := 278; mySet(chr(239)) := 278; mySet(chr(240)) := 556; mySet(chr(241)) := 556;
|
|
mySet(chr(242)) := 556; mySet(chr(243)) := 556; mySet(chr(244)) := 556; mySet(chr(245)) := 556; mySet(chr(246)) := 556; mySet(chr(247)) := 584; mySet(chr(248)) := 611; mySet(chr(249)) := 556; mySet(chr(250)) := 556; mySet(chr(251)) := 556; mySet(chr(252)) := 556; mySet(chr(253)) := 500; mySet(chr(254)) := 556; mySet(chr(255)) := 500;
|
|
return mySet;
|
|
end getFontHelvetica;
|
|
|
|
----------------------------------------------------------------------------------
|
|
-- Setting metric for helvetica ITALIC
|
|
----------------------------------------------------------------------------------
|
|
function getFontHelveticai return charSet is
|
|
mySet charSet;
|
|
begin
|
|
-- helvetica Italic font.
|
|
mySet(chr(0)) := 278; mySet(chr(1)) := 278; mySet(chr(2)) := 278; mySet(chr(3)) := 278; mySet(chr(4)) := 278; mySet(chr(5)) := 278; mySet(chr(6)) := 278; mySet(chr(7)) := 278; mySet(chr(8)) := 278; mySet(chr(9)) := 278; mySet(chr(10)) := 278; mySet(chr(11)) := 278; mySet(chr(12)) := 278; mySet(chr(13)) := 278; mySet(chr(14)) := 278; mySet(chr(15)) := 278; mySet(chr(16)) := 278; mySet(chr(17)) := 278; mySet(chr(18)) := 278; mySet(chr(19)) := 278; mySet(chr(20)) := 278; mySet(chr(21)) := 278;
|
|
mySet(chr(22)) := 278; mySet(chr(23)) := 278; mySet(chr(24)) := 278; mySet(chr(25)) := 278; mySet(chr(26)) := 278; mySet(chr(27)) := 278; mySet(chr(28)) := 278; mySet(chr(29)) := 278; mySet(chr(30)) := 278; mySet(chr(31)) := 278; mySet(' ') := 278; mySet('!') := 278; mySet('"') := 355; mySet('#') := 556; mySet('$') := 556; mySet('%') := 889; mySet('&') := 667; mySet('''') := 191; mySet('(') := 333; mySet(')') := 333; mySet('*') := 389; mySet('+') := 584;
|
|
mySet(',') := 278; mySet('-') := 333; mySet('.') := 278; mySet('/') := 278; mySet('0') := 556; mySet('1') := 556; mySet('2') := 556; mySet('3') := 556; mySet('4') := 556; mySet('5') := 556; mySet('6') := 556; mySet('7') := 556; mySet('8') := 556; mySet('9') := 556; mySet(':') := 278; mySet(';') := 278; mySet('<') := 584; mySet('=') := 584; mySet('>') := 584; mySet('?') := 556; mySet('@') := 1015; mySet('A') := 667;
|
|
mySet('B') := 667; mySet('C') := 722; mySet('D') := 722; mySet('E') := 667; mySet('F') := 611; mySet('G') := 778; mySet('H') := 722; mySet('I') := 278; mySet('J') := 500; mySet('K') := 667; mySet('L') := 556; mySet('M') := 833; mySet('N') := 722; mySet('O') := 778; mySet('P') := 667; mySet('Q') := 778; mySet('R') := 722; mySet('S') := 667; mySet('T') := 611; mySet('U') := 722; mySet('V') := 667; mySet('W') := 944;
|
|
mySet('X') := 667; mySet('Y') := 667; mySet('Z') := 611; mySet('[') := 278; mySet('\') := 278; mySet(']') := 278; mySet('^') := 469; mySet('_') := 556; mySet('`') := 333; mySet('a') := 556; mySet('b') := 556; mySet('c') := 500; mySet('d') := 556; mySet('e') := 556; mySet('f') := 278; mySet('g') := 556; mySet('h') := 556; mySet('i') := 222; mySet('j') := 222; mySet('k') := 500; mySet('l') := 222; mySet('m') := 833;
|
|
mySet('n') := 556; mySet('o') := 556; mySet('p') := 556; mySet('q') := 556; mySet('r') := 333; mySet('s') := 500; mySet('t') := 278; mySet('u') := 556; mySet('v') := 500; mySet('w') := 722; mySet('x') := 500; mySet('y') := 500; mySet('z') := 500; mySet('{') := 334; mySet('|') := 260; mySet('}') := 334; mySet('~') := 584; mySet(chr(127)) := 350; mySet(chr(128)) := 556; mySet(chr(129)) := 350; mySet(chr(130)) := 222; mySet(chr(131)) := 556;
|
|
mySet(chr(132)) := 333; mySet(chr(133)) := 1000; mySet(chr(134)) := 556; mySet(chr(135)) := 556; mySet(chr(136)) := 333; mySet(chr(137)) := 1000; mySet(chr(138)) := 667; mySet(chr(139)) := 333; mySet(chr(140)) := 1000; mySet(chr(141)) := 350; mySet(chr(142)) := 611; mySet(chr(143)) := 350; mySet(chr(144)) := 350; mySet(chr(145)) := 222; mySet(chr(146)) := 222; mySet(chr(147)) := 333; mySet(chr(148)) := 333; mySet(chr(149)) := 350; mySet(chr(150)) := 556; mySet(chr(151)) := 1000; mySet(chr(152)) := 333; mySet(chr(153)) := 1000;
|
|
mySet(chr(154)) := 500; mySet(chr(155)) := 333; mySet(chr(156)) := 944; mySet(chr(157)) := 350; mySet(chr(158)) := 500; mySet(chr(159)) := 667; mySet(chr(160)) := 278; mySet(chr(161)) := 333; mySet(chr(162)) := 556; mySet(chr(163)) := 556; mySet(chr(164)) := 556; mySet(chr(165)) := 556; mySet(chr(166)) := 260; mySet(chr(167)) := 556; mySet(chr(168)) := 333; mySet(chr(169)) := 737; mySet(chr(170)) := 370; mySet(chr(171)) := 556; mySet(chr(172)) := 584; mySet(chr(173)) := 333; mySet(chr(174)) := 737; mySet(chr(175)) := 333;
|
|
mySet(chr(176)) := 400; mySet(chr(177)) := 584; mySet(chr(178)) := 333; mySet(chr(179)) := 333; mySet(chr(180)) := 333; mySet(chr(181)) := 556; mySet(chr(182)) := 537; mySet(chr(183)) := 278; mySet(chr(184)) := 333; mySet(chr(185)) := 333; mySet(chr(186)) := 365; mySet(chr(187)) := 556; mySet(chr(188)) := 834; mySet(chr(189)) := 834; mySet(chr(190)) := 834; mySet(chr(191)) := 611; mySet(chr(192)) := 667; mySet(chr(193)) := 667; mySet(chr(194)) := 667; mySet(chr(195)) := 667; mySet(chr(196)) := 667; mySet(chr(197)) := 667;
|
|
mySet(chr(198)) := 1000; mySet(chr(199)) := 722; mySet(chr(200)) := 667; mySet(chr(201)) := 667; mySet(chr(202)) := 667; mySet(chr(203)) := 667; mySet(chr(204)) := 278; mySet(chr(205)) := 278; mySet(chr(206)) := 278; mySet(chr(207)) := 278; mySet(chr(208)) := 722; mySet(chr(209)) := 722; mySet(chr(210)) := 778; mySet(chr(211)) := 778; mySet(chr(212)) := 778; mySet(chr(213)) := 778; mySet(chr(214)) := 778; mySet(chr(215)) := 584; mySet(chr(216)) := 778; mySet(chr(217)) := 722; mySet(chr(218)) := 722; mySet(chr(219)) := 722;
|
|
mySet(chr(220)) := 722; mySet(chr(221)) := 667; mySet(chr(222)) := 667; mySet(chr(223)) := 611; mySet(chr(224)) := 556; mySet(chr(225)) := 556; mySet(chr(226)) := 556; mySet(chr(227)) := 556; mySet(chr(228)) := 556; mySet(chr(229)) := 556; mySet(chr(230)) := 889; mySet(chr(231)) := 500; mySet(chr(232)) := 556; mySet(chr(233)) := 556; mySet(chr(234)) := 556; mySet(chr(235)) := 556; mySet(chr(236)) := 278; mySet(chr(237)) := 278; mySet(chr(238)) := 278; mySet(chr(239)) := 278; mySet(chr(240)) := 556; mySet(chr(241)) := 556;
|
|
mySet(chr(242)) := 556; mySet(chr(243)) := 556; mySet(chr(244)) := 556; mySet(chr(245)) := 556; mySet(chr(246)) := 556; mySet(chr(247)) := 584; mySet(chr(248)) := 611; mySet(chr(249)) := 556; mySet(chr(250)) := 556; mySet(chr(251)) := 556; mySet(chr(252)) := 556; mySet(chr(253)) := 500; mySet(chr(254)) := 556; mySet(chr(255)) := 500;
|
|
return mySet;
|
|
end getFontHelveticai;
|
|
|
|
----------------------------------------------------------------------------------
|
|
-- Setting metric for helvetica BOLD
|
|
----------------------------------------------------------------------------------
|
|
function getFontHelveticab return charSet is
|
|
mySet charSet;
|
|
begin
|
|
-- helvetica bold font.
|
|
mySet(chr(0)) := 278; mySet(chr(1)) := 278; mySet(chr(2)) := 278; mySet(chr(3)) := 278; mySet(chr(4)) := 278; mySet(chr(5)) := 278; mySet(chr(6)) := 278; mySet(chr(7)) := 278; mySet(chr(8)) := 278; mySet(chr(9)) := 278; mySet(chr(10)) := 278; mySet(chr(11)) := 278; mySet(chr(12)) := 278; mySet(chr(13)) := 278; mySet(chr(14)) := 278; mySet(chr(15)) := 278; mySet(chr(16)) := 278; mySet(chr(17)) := 278; mySet(chr(18)) := 278; mySet(chr(19)) := 278; mySet(chr(20)) := 278; mySet(chr(21)) := 278;
|
|
mySet(chr(22)) := 278; mySet(chr(23)) := 278; mySet(chr(24)) := 278; mySet(chr(25)) := 278; mySet(chr(26)) := 278; mySet(chr(27)) := 278; mySet(chr(28)) := 278; mySet(chr(29)) := 278; mySet(chr(30)) := 278; mySet(chr(31)) := 278; mySet(' ') := 278; mySet('!') := 333; mySet('"') := 474; mySet('#') := 556; mySet('$') := 556; mySet('%') := 889; mySet('&') := 722; mySet('''') := 238; mySet('(') := 333; mySet(')') := 333; mySet('*') := 389; mySet('+') := 584;
|
|
mySet(',') := 278; mySet('-') := 333; mySet('.') := 278; mySet('/') := 278; mySet('0') := 556; mySet('1') := 556; mySet('2') := 556; mySet('3') := 556; mySet('4') := 556; mySet('5') := 556; mySet('6') := 556; mySet('7') := 556; mySet('8') := 556; mySet('9') := 556; mySet(':') := 333; mySet(';') := 333; mySet('<') := 584; mySet('=') := 584; mySet('>') := 584; mySet('?') := 611; mySet('@') := 975; mySet('A') := 722;
|
|
mySet('B') := 722; mySet('C') := 722; mySet('D') := 722; mySet('E') := 667; mySet('F') := 611; mySet('G') := 778; mySet('H') := 722; mySet('I') := 278; mySet('J') := 556; mySet('K') := 722; mySet('L') := 611; mySet('M') := 833; mySet('N') := 722; mySet('O') := 778; mySet('P') := 667; mySet('Q') := 778; mySet('R') := 722; mySet('S') := 667; mySet('T') := 611; mySet('U') := 722; mySet('V') := 667; mySet('W') := 944;
|
|
mySet('X') := 667; mySet('Y') := 667; mySet('Z') := 611; mySet('[') := 333; mySet('\') := 278; mySet(']') := 333; mySet('^') := 584; mySet('_') := 556; mySet('`') := 333; mySet('a') := 556; mySet('b') := 611; mySet('c') := 556; mySet('d') := 611; mySet('e') := 556; mySet('f') := 333; mySet('g') := 611; mySet('h') := 611; mySet('i') := 278; mySet('j') := 278; mySet('k') := 556; mySet('l') := 278; mySet('m') := 889;
|
|
mySet('n') := 611; mySet('o') := 611; mySet('p') := 611; mySet('q') := 611; mySet('r') := 389; mySet('s') := 556; mySet('t') := 333; mySet('u') := 611; mySet('v') := 556; mySet('w') := 778; mySet('x') := 556; mySet('y') := 556; mySet('z') := 500; mySet('{') := 389; mySet('|') := 280; mySet('}') := 389; mySet('~') := 584; mySet(chr(127)) := 350; mySet(chr(128)) := 556; mySet(chr(129)) := 350; mySet(chr(130)) := 278; mySet(chr(131)) := 556;
|
|
mySet(chr(132)) := 500; mySet(chr(133)) := 1000; mySet(chr(134)) := 556; mySet(chr(135)) := 556; mySet(chr(136)) := 333; mySet(chr(137)) := 1000; mySet(chr(138)) := 667; mySet(chr(139)) := 333; mySet(chr(140)) := 1000; mySet(chr(141)) := 350; mySet(chr(142)) := 611; mySet(chr(143)) := 350; mySet(chr(144)) := 350; mySet(chr(145)) := 278; mySet(chr(146)) := 278; mySet(chr(147)) := 500; mySet(chr(148)) := 500; mySet(chr(149)) := 350; mySet(chr(150)) := 556; mySet(chr(151)) := 1000; mySet(chr(152)) := 333; mySet(chr(153)) := 1000;
|
|
mySet(chr(154)) := 556; mySet(chr(155)) := 333; mySet(chr(156)) := 944; mySet(chr(157)) := 350; mySet(chr(158)) := 500; mySet(chr(159)) := 667; mySet(chr(160)) := 278; mySet(chr(161)) := 333; mySet(chr(162)) := 556; mySet(chr(163)) := 556; mySet(chr(164)) := 556; mySet(chr(165)) := 556; mySet(chr(166)) := 280; mySet(chr(167)) := 556; mySet(chr(168)) := 333; mySet(chr(169)) := 737; mySet(chr(170)) := 370; mySet(chr(171)) := 556; mySet(chr(172)) := 584; mySet(chr(173)) := 333; mySet(chr(174)) := 737; mySet(chr(175)) := 333;
|
|
mySet(chr(176)) := 400; mySet(chr(177)) := 584; mySet(chr(178)) := 333; mySet(chr(179)) := 333; mySet(chr(180)) := 333; mySet(chr(181)) := 611; mySet(chr(182)) := 556; mySet(chr(183)) := 278; mySet(chr(184)) := 333; mySet(chr(185)) := 333; mySet(chr(186)) := 365; mySet(chr(187)) := 556; mySet(chr(188)) := 834; mySet(chr(189)) := 834; mySet(chr(190)) := 834; mySet(chr(191)) := 611; mySet(chr(192)) := 722; mySet(chr(193)) := 722; mySet(chr(194)) := 722; mySet(chr(195)) := 722; mySet(chr(196)) := 722; mySet(chr(197)) := 722;
|
|
mySet(chr(198)) := 1000; mySet(chr(199)) := 722; mySet(chr(200)) := 667; mySet(chr(201)) := 667; mySet(chr(202)) := 667; mySet(chr(203)) := 667; mySet(chr(204)) := 278; mySet(chr(205)) := 278; mySet(chr(206)) := 278; mySet(chr(207)) := 278; mySet(chr(208)) := 722; mySet(chr(209)) := 722; mySet(chr(210)) := 778; mySet(chr(211)) := 778; mySet(chr(212)) := 778; mySet(chr(213)) := 778; mySet(chr(214)) := 778; mySet(chr(215)) := 584; mySet(chr(216)) := 778; mySet(chr(217)) := 722; mySet(chr(218)) := 722; mySet(chr(219)) := 722;
|
|
mySet(chr(220)) := 722; mySet(chr(221)) := 667; mySet(chr(222)) := 667; mySet(chr(223)) := 611; mySet(chr(224)) := 556; mySet(chr(225)) := 556; mySet(chr(226)) := 556; mySet(chr(227)) := 556; mySet(chr(228)) := 556; mySet(chr(229)) := 556; mySet(chr(230)) := 889; mySet(chr(231)) := 556; mySet(chr(232)) := 556; mySet(chr(233)) := 556; mySet(chr(234)) := 556; mySet(chr(235)) := 556; mySet(chr(236)) := 278; mySet(chr(237)) := 278; mySet(chr(238)) := 278; mySet(chr(239)) := 278; mySet(chr(240)) := 611; mySet(chr(241)) := 611;
|
|
mySet(chr(242)) := 611; mySet(chr(243)) := 611; mySet(chr(244)) := 611; mySet(chr(245)) := 611; mySet(chr(246)) := 611; mySet(chr(247)) := 584; mySet(chr(248)) := 611; mySet(chr(249)) := 611; mySet(chr(250)) := 611; mySet(chr(251)) := 611; mySet(chr(252)) := 611; mySet(chr(253)) := 556; mySet(chr(254)) := 611; mySet(chr(255)) := 556;
|
|
return mySet;
|
|
end getFontHelveticab;
|
|
|
|
----------------------------------------------------------------------------------
|
|
-- Setting metric for helvetica BOLD ITALIC
|
|
----------------------------------------------------------------------------------
|
|
function getFontHelveticabi return charSet is
|
|
mySet charSet;
|
|
begin
|
|
-- helvetica bold italic font.
|
|
mySet(chr(0)) := 278; mySet(chr(1)) := 278; mySet(chr(2)) := 278; mySet(chr(3)) := 278; mySet(chr(4)) := 278; mySet(chr(5)) := 278; mySet(chr(6)) := 278; mySet(chr(7)) := 278; mySet(chr(8)) := 278; mySet(chr(9)) := 278; mySet(chr(10)) := 278; mySet(chr(11)) := 278; mySet(chr(12)) := 278; mySet(chr(13)) := 278; mySet(chr(14)) := 278; mySet(chr(15)) := 278; mySet(chr(16)) := 278; mySet(chr(17)) := 278; mySet(chr(18)) := 278; mySet(chr(19)) := 278; mySet(chr(20)) := 278; mySet(chr(21)) := 278;
|
|
mySet(chr(22)) := 278; mySet(chr(23)) := 278; mySet(chr(24)) := 278; mySet(chr(25)) := 278; mySet(chr(26)) := 278; mySet(chr(27)) := 278; mySet(chr(28)) := 278; mySet(chr(29)) := 278; mySet(chr(30)) := 278; mySet(chr(31)) := 278; mySet(' ') := 278; mySet('!') := 333; mySet('"') := 474; mySet('#') := 556; mySet('$') := 556; mySet('%') := 889; mySet('&') := 722; mySet('''') := 238; mySet('(') := 333; mySet(')') := 333; mySet('*') := 389; mySet('+') := 584;
|
|
mySet(',') := 278; mySet('-') := 333; mySet('.') := 278; mySet('/') := 278; mySet('0') := 556; mySet('1') := 556; mySet('2') := 556; mySet('3') := 556; mySet('4') := 556; mySet('5') := 556; mySet('6') := 556; mySet('7') := 556; mySet('8') := 556; mySet('9') := 556; mySet(':') := 333; mySet(';') := 333; mySet('<') := 584; mySet('=') := 584; mySet('>') := 584; mySet('?') := 611; mySet('@') := 975; mySet('A') := 722;
|
|
mySet('B') := 722; mySet('C') := 722; mySet('D') := 722; mySet('E') := 667; mySet('F') := 611; mySet('G') := 778; mySet('H') := 722; mySet('I') := 278; mySet('J') := 556; mySet('K') := 722; mySet('L') := 611; mySet('M') := 833; mySet('N') := 722; mySet('O') := 778; mySet('P') := 667; mySet('Q') := 778; mySet('R') := 722; mySet('S') := 667; mySet('T') := 611; mySet('U') := 722; mySet('V') := 667; mySet('W') := 944;
|
|
mySet('X') := 667; mySet('Y') := 667; mySet('Z') := 611; mySet('[') := 333; mySet('\') := 278; mySet(']') := 333; mySet('^') := 584; mySet('_') := 556; mySet('`') := 333; mySet('a') := 556; mySet('b') := 611; mySet('c') := 556; mySet('d') := 611; mySet('e') := 556; mySet('f') := 333; mySet('g') := 611; mySet('h') := 611; mySet('i') := 278; mySet('j') := 278; mySet('k') := 556; mySet('l') := 278; mySet('m') := 889;
|
|
mySet('n') := 611; mySet('o') := 611; mySet('p') := 611; mySet('q') := 611; mySet('r') := 389; mySet('s') := 556; mySet('t') := 333; mySet('u') := 611; mySet('v') := 556; mySet('w') := 778; mySet('x') := 556; mySet('y') := 556; mySet('z') := 500; mySet('{') := 389; mySet('|') := 280; mySet('}') := 389; mySet('~') := 584; mySet(chr(127)) := 350; mySet(chr(128)) := 556; mySet(chr(129)) := 350; mySet(chr(130)) := 278; mySet(chr(131)) := 556;
|
|
mySet(chr(132)) := 500; mySet(chr(133)) := 1000; mySet(chr(134)) := 556; mySet(chr(135)) := 556; mySet(chr(136)) := 333; mySet(chr(137)) := 1000; mySet(chr(138)) := 667; mySet(chr(139)) := 333; mySet(chr(140)) := 1000; mySet(chr(141)) := 350; mySet(chr(142)) := 611; mySet(chr(143)) := 350; mySet(chr(144)) := 350; mySet(chr(145)) := 278; mySet(chr(146)) := 278; mySet(chr(147)) := 500; mySet(chr(148)) := 500; mySet(chr(149)) := 350; mySet(chr(150)) := 556; mySet(chr(151)) := 1000; mySet(chr(152)) := 333; mySet(chr(153)) := 1000;
|
|
mySet(chr(154)) := 556; mySet(chr(155)) := 333; mySet(chr(156)) := 944; mySet(chr(157)) := 350; mySet(chr(158)) := 500; mySet(chr(159)) := 667; mySet(chr(160)) := 278; mySet(chr(161)) := 333; mySet(chr(162)) := 556; mySet(chr(163)) := 556; mySet(chr(164)) := 556; mySet(chr(165)) := 556; mySet(chr(166)) := 280; mySet(chr(167)) := 556; mySet(chr(168)) := 333; mySet(chr(169)) := 737; mySet(chr(170)) := 370; mySet(chr(171)) := 556; mySet(chr(172)) := 584; mySet(chr(173)) := 333; mySet(chr(174)) := 737; mySet(chr(175)) := 333;
|
|
mySet(chr(176)) := 400; mySet(chr(177)) := 584; mySet(chr(178)) := 333; mySet(chr(179)) := 333; mySet(chr(180)) := 333; mySet(chr(181)) := 611; mySet(chr(182)) := 556; mySet(chr(183)) := 278; mySet(chr(184)) := 333; mySet(chr(185)) := 333; mySet(chr(186)) := 365; mySet(chr(187)) := 556; mySet(chr(188)) := 834; mySet(chr(189)) := 834; mySet(chr(190)) := 834; mySet(chr(191)) := 611; mySet(chr(192)) := 722; mySet(chr(193)) := 722; mySet(chr(194)) := 722; mySet(chr(195)) := 722; mySet(chr(196)) := 722; mySet(chr(197)) := 722;
|
|
mySet(chr(198)) := 1000; mySet(chr(199)) := 722; mySet(chr(200)) := 667; mySet(chr(201)) := 667; mySet(chr(202)) := 667; mySet(chr(203)) := 667; mySet(chr(204)) := 278; mySet(chr(205)) := 278; mySet(chr(206)) := 278; mySet(chr(207)) := 278; mySet(chr(208)) := 722; mySet(chr(209)) := 722; mySet(chr(210)) := 778; mySet(chr(211)) := 778; mySet(chr(212)) := 778; mySet(chr(213)) := 778; mySet(chr(214)) := 778; mySet(chr(215)) := 584; mySet(chr(216)) := 778; mySet(chr(217)) := 722; mySet(chr(218)) := 722; mySet(chr(219)) := 722;
|
|
mySet(chr(220)) := 722; mySet(chr(221)) := 667; mySet(chr(222)) := 667; mySet(chr(223)) := 611; mySet(chr(224)) := 556; mySet(chr(225)) := 556; mySet(chr(226)) := 556; mySet(chr(227)) := 556; mySet(chr(228)) := 556; mySet(chr(229)) := 556; mySet(chr(230)) := 889; mySet(chr(231)) := 556; mySet(chr(232)) := 556; mySet(chr(233)) := 556; mySet(chr(234)) := 556; mySet(chr(235)) := 556; mySet(chr(236)) := 278; mySet(chr(237)) := 278; mySet(chr(238)) := 278; mySet(chr(239)) := 278; mySet(chr(240)) := 611; mySet(chr(241)) := 611;
|
|
mySet(chr(242)) := 611; mySet(chr(243)) := 611; mySet(chr(244)) := 611; mySet(chr(245)) := 611; mySet(chr(246)) := 611; mySet(chr(247)) := 584; mySet(chr(248)) := 611; mySet(chr(249)) := 611; mySet(chr(250)) := 611; mySet(chr(251)) := 611; mySet(chr(252)) := 611; mySet(chr(253)) := 556; mySet(chr(254)) := 611; mySet(chr(255)) := 556;
|
|
return mySet;
|
|
end getFontHelveticabi;
|
|
|
|
----------------------------------------------------------------------------------
|
|
-- Setting metric for times
|
|
----------------------------------------------------------------------------------
|
|
function getFontTimes return charSet is
|
|
mySet charSet;
|
|
begin
|
|
-- Times font.
|
|
mySet(chr(0)) := 250; mySet(chr(1)) := 250; mySet(chr(2)) := 250; mySet(chr(3)) := 250; mySet(chr(4)) := 250; mySet(chr(5)) := 250; mySet(chr(6)) := 250; mySet(chr(7)) := 250; mySet(chr(8)) := 250; mySet(chr(9)) := 250; mySet(chr(10)) := 250; mySet(chr(11)) := 250; mySet(chr(12)) := 250; mySet(chr(13)) := 250; mySet(chr(14)) := 250; mySet(chr(15)) := 250; mySet(chr(16)) := 250; mySet(chr(17)) := 250; mySet(chr(18)) := 250; mySet(chr(19)) := 250; mySet(chr(20)) := 250; mySet(chr(21)) := 250;
|
|
mySet(chr(22)) := 250; mySet(chr(23)) := 250; mySet(chr(24)) := 250; mySet(chr(25)) := 250; mySet(chr(26)) := 250; mySet(chr(27)) := 250; mySet(chr(28)) := 250; mySet(chr(29)) := 250; mySet(chr(30)) := 250; mySet(chr(31)) := 250; mySet(' ') := 250; mySet('!') := 333; mySet('"') := 408; mySet('#') := 500; mySet('$') := 500; mySet('%') := 833; mySet('&') := 778; mySet('''') := 180; mySet('(') := 333; mySet(')') := 333; mySet('*') := 500; mySet('+') := 564;
|
|
mySet(',') := 250; mySet('-') := 333; mySet('.') := 250; mySet('/') := 278; mySet('0') := 500; mySet('1') := 500; mySet('2') := 500; mySet('3') := 500; mySet('4') := 500; mySet('5') := 500; mySet('6') := 500; mySet('7') := 500; mySet('8') := 500; mySet('9') := 500; mySet(':') := 278; mySet(';') := 278; mySet('<') := 564; mySet('=') := 564; mySet('>') := 564; mySet('?') := 444; mySet('@') := 921; mySet('A') := 722;
|
|
mySet('B') := 667; mySet('C') := 667; mySet('D') := 722; mySet('E') := 611; mySet('F') := 556; mySet('G') := 722; mySet('H') := 722; mySet('I') := 333; mySet('J') := 389; mySet('K') := 722; mySet('L') := 611; mySet('M') := 889; mySet('N') := 722; mySet('O') := 722; mySet('P') := 556; mySet('Q') := 722; mySet('R') := 667; mySet('S') := 556; mySet('T') := 611; mySet('U') := 722; mySet('V') := 722; mySet('W') := 944;
|
|
mySet('X') := 722; mySet('Y') := 722; mySet('Z') := 611; mySet('[') := 333; mySet('\') := 278; mySet(']') := 333; mySet('^') := 469; mySet('_') := 500; mySet('`') := 333; mySet('a') := 444; mySet('b') := 500; mySet('c') := 444; mySet('d') := 500; mySet('e') := 444; mySet('f') := 333; mySet('g') := 500; mySet('h') := 500; mySet('i') := 278; mySet('j') := 278; mySet('k') := 500; mySet('l') := 278; mySet('m') := 778;
|
|
mySet('n') := 500; mySet('o') := 500; mySet('p') := 500; mySet('q') := 500; mySet('r') := 333; mySet('s') := 389; mySet('t') := 278; mySet('u') := 500; mySet('v') := 500; mySet('w') := 722; mySet('x') := 500; mySet('y') := 500; mySet('z') := 444; mySet('{') := 480; mySet('|') := 200; mySet('}') := 480; mySet('~') := 541; mySet(chr(127)) := 350; mySet(chr(128)) := 500; mySet(chr(129)) := 350; mySet(chr(130)) := 333; mySet(chr(131)) := 500;
|
|
mySet(chr(132)) := 444; mySet(chr(133)) := 1000; mySet(chr(134)) := 500; mySet(chr(135)) := 500; mySet(chr(136)) := 333; mySet(chr(137)) := 1000; mySet(chr(138)) := 556; mySet(chr(139)) := 333; mySet(chr(140)) := 889; mySet(chr(141)) := 350; mySet(chr(142)) := 611; mySet(chr(143)) := 350; mySet(chr(144)) := 350; mySet(chr(145)) := 333; mySet(chr(146)) := 333; mySet(chr(147)) := 444; mySet(chr(148)) := 444; mySet(chr(149)) := 350; mySet(chr(150)) := 500; mySet(chr(151)) := 1000; mySet(chr(152)) := 333; mySet(chr(153)) := 980;
|
|
mySet(chr(154)) := 389; mySet(chr(155)) := 333; mySet(chr(156)) := 722; mySet(chr(157)) := 350; mySet(chr(158)) := 444; mySet(chr(159)) := 722; mySet(chr(160)) := 250; mySet(chr(161)) := 333; mySet(chr(162)) := 500; mySet(chr(163)) := 500; mySet(chr(164)) := 500; mySet(chr(165)) := 500; mySet(chr(166)) := 200; mySet(chr(167)) := 500; mySet(chr(168)) := 333; mySet(chr(169)) := 760; mySet(chr(170)) := 276; mySet(chr(171)) := 500; mySet(chr(172)) := 564; mySet(chr(173)) := 333; mySet(chr(174)) := 760; mySet(chr(175)) := 333;
|
|
mySet(chr(176)) := 400; mySet(chr(177)) := 564; mySet(chr(178)) := 300; mySet(chr(179)) := 300; mySet(chr(180)) := 333; mySet(chr(181)) := 500; mySet(chr(182)) := 453; mySet(chr(183)) := 250; mySet(chr(184)) := 333; mySet(chr(185)) := 300; mySet(chr(186)) := 310; mySet(chr(187)) := 500; mySet(chr(188)) := 750; mySet(chr(189)) := 750; mySet(chr(190)) := 750; mySet(chr(191)) := 444; mySet(chr(192)) := 722; mySet(chr(193)) := 722; mySet(chr(194)) := 722; mySet(chr(195)) := 722; mySet(chr(196)) := 722; mySet(chr(197)) := 722;
|
|
mySet(chr(198)) := 889; mySet(chr(199)) := 667; mySet(chr(200)) := 611; mySet(chr(201)) := 611; mySet(chr(202)) := 611; mySet(chr(203)) := 611; mySet(chr(204)) := 333; mySet(chr(205)) := 333; mySet(chr(206)) := 333; mySet(chr(207)) := 333; mySet(chr(208)) := 722; mySet(chr(209)) := 722; mySet(chr(210)) := 722; mySet(chr(211)) := 722; mySet(chr(212)) := 722; mySet(chr(213)) := 722; mySet(chr(214)) := 722; mySet(chr(215)) := 564; mySet(chr(216)) := 722; mySet(chr(217)) := 722; mySet(chr(218)) := 722; mySet(chr(219)) := 722;
|
|
mySet(chr(220)) := 722; mySet(chr(221)) := 722; mySet(chr(222)) := 556; mySet(chr(223)) := 500; mySet(chr(224)) := 444; mySet(chr(225)) := 444; mySet(chr(226)) := 444; mySet(chr(227)) := 444; mySet(chr(228)) := 444; mySet(chr(229)) := 444; mySet(chr(230)) := 667; mySet(chr(231)) := 444; mySet(chr(232)) := 444; mySet(chr(233)) := 444; mySet(chr(234)) := 444; mySet(chr(235)) := 444; mySet(chr(236)) := 278; mySet(chr(237)) := 278; mySet(chr(238)) := 278; mySet(chr(239)) := 278; mySet(chr(240)) := 500; mySet(chr(241)) := 500;
|
|
mySet(chr(242)) := 500; mySet(chr(243)) := 500; mySet(chr(244)) := 500; mySet(chr(245)) := 500; mySet(chr(246)) := 500; mySet(chr(247)) := 564; mySet(chr(248)) := 500; mySet(chr(249)) := 500; mySet(chr(250)) := 500; mySet(chr(251)) := 500; mySet(chr(252)) := 500; mySet(chr(253)) := 500; mySet(chr(254)) := 500; mySet(chr(255)) := 500;
|
|
return mySet;
|
|
end getFontTimes;
|
|
|
|
----------------------------------------------------------------------------------
|
|
-- Setting metric for times ITALIC
|
|
----------------------------------------------------------------------------------
|
|
function getFontTimesi return charSet is
|
|
mySet charSet;
|
|
begin
|
|
-- Times italic font.
|
|
mySet(chr(0)) := 250; mySet(chr(1)) := 250; mySet(chr(2)) := 250; mySet(chr(3)) := 250; mySet(chr(4)) := 250; mySet(chr(5)) := 250; mySet(chr(6)) := 250; mySet(chr(7)) := 250; mySet(chr(8)) := 250; mySet(chr(9)) := 250; mySet(chr(10)) := 250; mySet(chr(11)) := 250; mySet(chr(12)) := 250; mySet(chr(13)) := 250; mySet(chr(14)) := 250; mySet(chr(15)) := 250; mySet(chr(16)) := 250; mySet(chr(17)) := 250; mySet(chr(18)) := 250; mySet(chr(19)) := 250; mySet(chr(20)) := 250; mySet(chr(21)) := 250;
|
|
mySet(chr(22)) := 250; mySet(chr(23)) := 250; mySet(chr(24)) := 250; mySet(chr(25)) := 250; mySet(chr(26)) := 250; mySet(chr(27)) := 250; mySet(chr(28)) := 250; mySet(chr(29)) := 250; mySet(chr(30)) := 250; mySet(chr(31)) := 250; mySet(' ') := 250; mySet('!') := 333; mySet('"') := 420; mySet('#') := 500; mySet('$') := 500; mySet('%') := 833; mySet('&') := 778; mySet('''') := 214; mySet('(') := 333; mySet(')') := 333; mySet('*') := 500; mySet('+') := 675;
|
|
mySet(',') := 250; mySet('-') := 333; mySet('.') := 250; mySet('/') := 278; mySet('0') := 500; mySet('1') := 500; mySet('2') := 500; mySet('3') := 500; mySet('4') := 500; mySet('5') := 500; mySet('6') := 500; mySet('7') := 500; mySet('8') := 500; mySet('9') := 500; mySet(':') := 333; mySet(';') := 333; mySet('<') := 675; mySet('=') := 675; mySet('>') := 675; mySet('?') := 500; mySet('@') := 920; mySet('A') := 611;
|
|
mySet('B') := 611; mySet('C') := 667; mySet('D') := 722; mySet('E') := 611; mySet('F') := 611; mySet('G') := 722; mySet('H') := 722; mySet('I') := 333; mySet('J') := 444; mySet('K') := 667; mySet('L') := 556; mySet('M') := 833; mySet('N') := 667; mySet('O') := 722; mySet('P') := 611; mySet('Q') := 722; mySet('R') := 611; mySet('S') := 500; mySet('T') := 556; mySet('U') := 722; mySet('V') := 611; mySet('W') := 833;
|
|
mySet('X') := 611; mySet('Y') := 556; mySet('Z') := 556; mySet('[') := 389; mySet('\') := 278; mySet(']') := 389; mySet('^') := 422; mySet('_') := 500; mySet('`') := 333; mySet('a') := 500; mySet('b') := 500; mySet('c') := 444; mySet('d') := 500; mySet('e') := 444; mySet('f') := 278; mySet('g') := 500; mySet('h') := 500; mySet('i') := 278; mySet('j') := 278; mySet('k') := 444; mySet('l') := 278; mySet('m') := 722;
|
|
mySet('n') := 500; mySet('o') := 500; mySet('p') := 500; mySet('q') := 500; mySet('r') := 389; mySet('s') := 389; mySet('t') := 278; mySet('u') := 500; mySet('v') := 444; mySet('w') := 667; mySet('x') := 444; mySet('y') := 444; mySet('z') := 389; mySet('{') := 400; mySet('|') := 275; mySet('}') := 400; mySet('~') := 541; mySet(chr(127)) := 350; mySet(chr(128)) := 500; mySet(chr(129)) := 350; mySet(chr(130)) := 333; mySet(chr(131)) := 500;
|
|
mySet(chr(132)) := 556; mySet(chr(133)) := 889; mySet(chr(134)) := 500; mySet(chr(135)) := 500; mySet(chr(136)) := 333; mySet(chr(137)) := 1000; mySet(chr(138)) := 500; mySet(chr(139)) := 333; mySet(chr(140)) := 944; mySet(chr(141)) := 350; mySet(chr(142)) := 556; mySet(chr(143)) := 350; mySet(chr(144)) := 350; mySet(chr(145)) := 333; mySet(chr(146)) := 333; mySet(chr(147)) := 556; mySet(chr(148)) := 556; mySet(chr(149)) := 350; mySet(chr(150)) := 500; mySet(chr(151)) := 889; mySet(chr(152)) := 333; mySet(chr(153)) := 980;
|
|
mySet(chr(154)) := 389; mySet(chr(155)) := 333; mySet(chr(156)) := 667; mySet(chr(157)) := 350; mySet(chr(158)) := 389; mySet(chr(159)) := 556; mySet(chr(160)) := 250; mySet(chr(161)) := 389; mySet(chr(162)) := 500; mySet(chr(163)) := 500; mySet(chr(164)) := 500; mySet(chr(165)) := 500; mySet(chr(166)) := 275; mySet(chr(167)) := 500; mySet(chr(168)) := 333; mySet(chr(169)) := 760; mySet(chr(170)) := 276; mySet(chr(171)) := 500; mySet(chr(172)) := 675; mySet(chr(173)) := 333; mySet(chr(174)) := 760; mySet(chr(175)) := 333;
|
|
mySet(chr(176)) := 400; mySet(chr(177)) := 675; mySet(chr(178)) := 300; mySet(chr(179)) := 300; mySet(chr(180)) := 333; mySet(chr(181)) := 500; mySet(chr(182)) := 523; mySet(chr(183)) := 250; mySet(chr(184)) := 333; mySet(chr(185)) := 300; mySet(chr(186)) := 310; mySet(chr(187)) := 500; mySet(chr(188)) := 750; mySet(chr(189)) := 750; mySet(chr(190)) := 750; mySet(chr(191)) := 500; mySet(chr(192)) := 611; mySet(chr(193)) := 611; mySet(chr(194)) := 611; mySet(chr(195)) := 611; mySet(chr(196)) := 611; mySet(chr(197)) := 611;
|
|
mySet(chr(198)) := 889; mySet(chr(199)) := 667; mySet(chr(200)) := 611; mySet(chr(201)) := 611; mySet(chr(202)) := 611; mySet(chr(203)) := 611; mySet(chr(204)) := 333; mySet(chr(205)) := 333; mySet(chr(206)) := 333; mySet(chr(207)) := 333; mySet(chr(208)) := 722; mySet(chr(209)) := 667; mySet(chr(210)) := 722; mySet(chr(211)) := 722; mySet(chr(212)) := 722; mySet(chr(213)) := 722; mySet(chr(214)) := 722; mySet(chr(215)) := 675; mySet(chr(216)) := 722; mySet(chr(217)) := 722; mySet(chr(218)) := 722; mySet(chr(219)) := 722;
|
|
mySet(chr(220)) := 722; mySet(chr(221)) := 556; mySet(chr(222)) := 611; mySet(chr(223)) := 500; mySet(chr(224)) := 500; mySet(chr(225)) := 500; mySet(chr(226)) := 500; mySet(chr(227)) := 500; mySet(chr(228)) := 500; mySet(chr(229)) := 500; mySet(chr(230)) := 667; mySet(chr(231)) := 444; mySet(chr(232)) := 444; mySet(chr(233)) := 444; mySet(chr(234)) := 444; mySet(chr(235)) := 444; mySet(chr(236)) := 278; mySet(chr(237)) := 278; mySet(chr(238)) := 278; mySet(chr(239)) := 278; mySet(chr(240)) := 500; mySet(chr(241)) := 500;
|
|
mySet(chr(242)) := 500; mySet(chr(243)) := 500; mySet(chr(244)) := 500; mySet(chr(245)) := 500; mySet(chr(246)) := 500; mySet(chr(247)) := 675; mySet(chr(248)) := 500; mySet(chr(249)) := 500; mySet(chr(250)) := 500; mySet(chr(251)) := 500; mySet(chr(252)) := 500; mySet(chr(253)) := 444; mySet(chr(254)) := 500; mySet(chr(255)) := 444;
|
|
return mySet;
|
|
end getFontTimesi;
|
|
|
|
----------------------------------------------------------------------------------
|
|
-- Setting metric for times BOLD
|
|
----------------------------------------------------------------------------------
|
|
function getFontTimesb return charSet is
|
|
mySet charSet;
|
|
begin
|
|
-- Times bold font.
|
|
mySet(chr(0)) := 250; mySet(chr(1)) := 250; mySet(chr(2)) := 250; mySet(chr(3)) := 250; mySet(chr(4)) := 250; mySet(chr(5)) := 250; mySet(chr(6)) := 250; mySet(chr(7)) := 250; mySet(chr(8)) := 250; mySet(chr(9)) := 250; mySet(chr(10)) := 250; mySet(chr(11)) := 250; mySet(chr(12)) := 250; mySet(chr(13)) := 250; mySet(chr(14)) := 250; mySet(chr(15)) := 250; mySet(chr(16)) := 250; mySet(chr(17)) := 250; mySet(chr(18)) := 250; mySet(chr(19)) := 250; mySet(chr(20)) := 250; mySet(chr(21)) := 250;
|
|
mySet(chr(22)) := 250; mySet(chr(23)) := 250; mySet(chr(24)) := 250; mySet(chr(25)) := 250; mySet(chr(26)) := 250; mySet(chr(27)) := 250; mySet(chr(28)) := 250; mySet(chr(29)) := 250; mySet(chr(30)) := 250; mySet(chr(31)) := 250; mySet(' ') := 250; mySet('!') := 333; mySet('"') := 555; mySet('#') := 500; mySet('$') := 500; mySet('%') := 1000; mySet('&') := 833; mySet('''') := 278; mySet('(') := 333; mySet(')') := 333; mySet('*') := 500; mySet('+') := 570;
|
|
mySet(',') := 250; mySet('-') := 333; mySet('.') := 250; mySet('/') := 278; mySet('0') := 500; mySet('1') := 500; mySet('2') := 500; mySet('3') := 500; mySet('4') := 500; mySet('5') := 500; mySet('6') := 500; mySet('7') := 500; mySet('8') := 500; mySet('9') := 500; mySet(':') := 333; mySet(';') := 333; mySet('<') := 570; mySet('=') := 570; mySet('>') := 570; mySet('?') := 500; mySet('@') := 930; mySet('A') := 722;
|
|
mySet('B') := 667; mySet('C') := 722; mySet('D') := 722; mySet('E') := 667; mySet('F') := 611; mySet('G') := 778; mySet('H') := 778; mySet('I') := 389; mySet('J') := 500; mySet('K') := 778; mySet('L') := 667; mySet('M') := 944; mySet('N') := 722; mySet('O') := 778; mySet('P') := 611; mySet('Q') := 778; mySet('R') := 722; mySet('S') := 556; mySet('T') := 667; mySet('U') := 722; mySet('V') := 722; mySet('W') := 1000;
|
|
mySet('X') := 722; mySet('Y') := 722; mySet('Z') := 667; mySet('[') := 333; mySet('\') := 278; mySet(']') := 333; mySet('^') := 581; mySet('_') := 500; mySet('`') := 333; mySet('a') := 500; mySet('b') := 556; mySet('c') := 444; mySet('d') := 556; mySet('e') := 444; mySet('f') := 333; mySet('g') := 500; mySet('h') := 556; mySet('i') := 278; mySet('j') := 333; mySet('k') := 556; mySet('l') := 278; mySet('m') := 833;
|
|
mySet('n') := 556; mySet('o') := 500; mySet('p') := 556; mySet('q') := 556; mySet('r') := 444; mySet('s') := 389; mySet('t') := 333; mySet('u') := 556; mySet('v') := 500; mySet('w') := 722; mySet('x') := 500; mySet('y') := 500; mySet('z') := 444; mySet('{') := 394; mySet('|') := 220; mySet('}') := 394; mySet('~') := 520; mySet(chr(127)) := 350; mySet(chr(128)) := 500; mySet(chr(129)) := 350; mySet(chr(130)) := 333; mySet(chr(131)) := 500;
|
|
mySet(chr(132)) := 500; mySet(chr(133)) := 1000; mySet(chr(134)) := 500; mySet(chr(135)) := 500; mySet(chr(136)) := 333; mySet(chr(137)) := 1000; mySet(chr(138)) := 556; mySet(chr(139)) := 333; mySet(chr(140)) := 1000; mySet(chr(141)) := 350; mySet(chr(142)) := 667; mySet(chr(143)) := 350; mySet(chr(144)) := 350; mySet(chr(145)) := 333; mySet(chr(146)) := 333; mySet(chr(147)) := 500; mySet(chr(148)) := 500; mySet(chr(149)) := 350; mySet(chr(150)) := 500; mySet(chr(151)) := 1000; mySet(chr(152)) := 333; mySet(chr(153)) := 1000;
|
|
mySet(chr(154)) := 389; mySet(chr(155)) := 333; mySet(chr(156)) := 722; mySet(chr(157)) := 350; mySet(chr(158)) := 444; mySet(chr(159)) := 722; mySet(chr(160)) := 250; mySet(chr(161)) := 333; mySet(chr(162)) := 500; mySet(chr(163)) := 500; mySet(chr(164)) := 500; mySet(chr(165)) := 500; mySet(chr(166)) := 220; mySet(chr(167)) := 500; mySet(chr(168)) := 333; mySet(chr(169)) := 747; mySet(chr(170)) := 300; mySet(chr(171)) := 500; mySet(chr(172)) := 570; mySet(chr(173)) := 333; mySet(chr(174)) := 747; mySet(chr(175)) := 333;
|
|
mySet(chr(176)) := 400; mySet(chr(177)) := 570; mySet(chr(178)) := 300; mySet(chr(179)) := 300; mySet(chr(180)) := 333; mySet(chr(181)) := 556; mySet(chr(182)) := 540; mySet(chr(183)) := 250; mySet(chr(184)) := 333; mySet(chr(185)) := 300; mySet(chr(186)) := 330; mySet(chr(187)) := 500; mySet(chr(188)) := 750; mySet(chr(189)) := 750; mySet(chr(190)) := 750; mySet(chr(191)) := 500; mySet(chr(192)) := 722; mySet(chr(193)) := 722; mySet(chr(194)) := 722; mySet(chr(195)) := 722; mySet(chr(196)) := 722; mySet(chr(197)) := 722;
|
|
mySet(chr(198)) := 1000; mySet(chr(199)) := 722; mySet(chr(200)) := 667; mySet(chr(201)) := 667; mySet(chr(202)) := 667; mySet(chr(203)) := 667; mySet(chr(204)) := 389; mySet(chr(205)) := 389; mySet(chr(206)) := 389; mySet(chr(207)) := 389; mySet(chr(208)) := 722; mySet(chr(209)) := 722; mySet(chr(210)) := 778; mySet(chr(211)) := 778; mySet(chr(212)) := 778; mySet(chr(213)) := 778; mySet(chr(214)) := 778; mySet(chr(215)) := 570; mySet(chr(216)) := 778; mySet(chr(217)) := 722; mySet(chr(218)) := 722; mySet(chr(219)) := 722;
|
|
mySet(chr(220)) := 722; mySet(chr(221)) := 722; mySet(chr(222)) := 611; mySet(chr(223)) := 556; mySet(chr(224)) := 500; mySet(chr(225)) := 500; mySet(chr(226)) := 500; mySet(chr(227)) := 500; mySet(chr(228)) := 500; mySet(chr(229)) := 500; mySet(chr(230)) := 722; mySet(chr(231)) := 444; mySet(chr(232)) := 444; mySet(chr(233)) := 444; mySet(chr(234)) := 444; mySet(chr(235)) := 444; mySet(chr(236)) := 278; mySet(chr(237)) := 278; mySet(chr(238)) := 278; mySet(chr(239)) := 278; mySet(chr(240)) := 500; mySet(chr(241)) := 556;
|
|
mySet(chr(242)) := 500; mySet(chr(243)) := 500; mySet(chr(244)) := 500; mySet(chr(245)) := 500; mySet(chr(246)) := 500; mySet(chr(247)) := 570; mySet(chr(248)) := 500; mySet(chr(249)) := 556; mySet(chr(250)) := 556; mySet(chr(251)) := 556; mySet(chr(252)) := 556; mySet(chr(253)) := 500; mySet(chr(254)) := 556; mySet(chr(255)) := 500;
|
|
return mySet;
|
|
end getFontTimesb;
|
|
|
|
----------------------------------------------------------------------------------
|
|
-- Setting metric for times BOLD ITALIC
|
|
----------------------------------------------------------------------------------
|
|
function getFontTimesbi return charSet is
|
|
mySet charSet;
|
|
begin
|
|
-- Times bold italic font.
|
|
mySet(chr(0)) := 250; mySet(chr(1)) := 250; mySet(chr(2)) := 250; mySet(chr(3)) := 250; mySet(chr(4)) := 250; mySet(chr(5)) := 250; mySet(chr(6)) := 250; mySet(chr(7)) := 250; mySet(chr(8)) := 250; mySet(chr(9)) := 250; mySet(chr(10)) := 250; mySet(chr(11)) := 250; mySet(chr(12)) := 250; mySet(chr(13)) := 250; mySet(chr(14)) := 250; mySet(chr(15)) := 250; mySet(chr(16)) := 250; mySet(chr(17)) := 250; mySet(chr(18)) := 250; mySet(chr(19)) := 250; mySet(chr(20)) := 250; mySet(chr(21)) := 250;
|
|
mySet(chr(22)) := 250; mySet(chr(23)) := 250; mySet(chr(24)) := 250; mySet(chr(25)) := 250; mySet(chr(26)) := 250; mySet(chr(27)) := 250; mySet(chr(28)) := 250; mySet(chr(29)) := 250; mySet(chr(30)) := 250; mySet(chr(31)) := 250; mySet(' ') := 250; mySet('!') := 389; mySet('"') := 555; mySet('#') := 500; mySet('$') := 500; mySet('%') := 833; mySet('&') := 778; mySet('''') := 278; mySet('(') := 333; mySet(')') := 333; mySet('*') := 500; mySet('+') := 570;
|
|
mySet(',') := 250; mySet('-') := 333; mySet('.') := 250; mySet('/') := 278; mySet('0') := 500; mySet('1') := 500; mySet('2') := 500; mySet('3') := 500; mySet('4') := 500; mySet('5') := 500; mySet('6') := 500; mySet('7') := 500; mySet('8') := 500; mySet('9') := 500; mySet(':') := 333; mySet(';') := 333; mySet('<') := 570; mySet('=') := 570; mySet('>') := 570; mySet('?') := 500; mySet('@') := 832; mySet('A') := 667;
|
|
mySet('B') := 667; mySet('C') := 667; mySet('D') := 722; mySet('E') := 667; mySet('F') := 667; mySet('G') := 722; mySet('H') := 778; mySet('I') := 389; mySet('J') := 500; mySet('K') := 667; mySet('L') := 611; mySet('M') := 889; mySet('N') := 722; mySet('O') := 722; mySet('P') := 611; mySet('Q') := 722; mySet('R') := 667; mySet('S') := 556; mySet('T') := 611; mySet('U') := 722; mySet('V') := 667; mySet('W') := 889;
|
|
mySet('X') := 667; mySet('Y') := 611; mySet('Z') := 611; mySet('[') := 333; mySet('\') := 278; mySet(']') := 333; mySet('^') := 570; mySet('_') := 500; mySet('`') := 333; mySet('a') := 500; mySet('b') := 500; mySet('c') := 444; mySet('d') := 500; mySet('e') := 444; mySet('f') := 333; mySet('g') := 500; mySet('h') := 556; mySet('i') := 278; mySet('j') := 278; mySet('k') := 500; mySet('l') := 278; mySet('m') := 778;
|
|
mySet('n') := 556; mySet('o') := 500; mySet('p') := 500; mySet('q') := 500; mySet('r') := 389; mySet('s') := 389; mySet('t') := 278; mySet('u') := 556; mySet('v') := 444; mySet('w') := 667; mySet('x') := 500; mySet('y') := 444; mySet('z') := 389; mySet('{') := 348; mySet('|') := 220; mySet('}') := 348; mySet('~') := 570; mySet(chr(127)) := 350; mySet(chr(128)) := 500; mySet(chr(129)) := 350; mySet(chr(130)) := 333; mySet(chr(131)) := 500;
|
|
mySet(chr(132)) := 500; mySet(chr(133)) := 1000; mySet(chr(134)) := 500; mySet(chr(135)) := 500; mySet(chr(136)) := 333; mySet(chr(137)) := 1000; mySet(chr(138)) := 556; mySet(chr(139)) := 333; mySet(chr(140)) := 944; mySet(chr(141)) := 350; mySet(chr(142)) := 611; mySet(chr(143)) := 350; mySet(chr(144)) := 350; mySet(chr(145)) := 333; mySet(chr(146)) := 333; mySet(chr(147)) := 500; mySet(chr(148)) := 500; mySet(chr(149)) := 350; mySet(chr(150)) := 500; mySet(chr(151)) := 1000; mySet(chr(152)) := 333; mySet(chr(153)) := 1000;
|
|
mySet(chr(154)) := 389; mySet(chr(155)) := 333; mySet(chr(156)) := 722; mySet(chr(157)) := 350; mySet(chr(158)) := 389; mySet(chr(159)) := 611; mySet(chr(160)) := 250; mySet(chr(161)) := 389; mySet(chr(162)) := 500; mySet(chr(163)) := 500; mySet(chr(164)) := 500; mySet(chr(165)) := 500; mySet(chr(166)) := 220; mySet(chr(167)) := 500; mySet(chr(168)) := 333; mySet(chr(169)) := 747; mySet(chr(170)) := 266; mySet(chr(171)) := 500; mySet(chr(172)) := 606; mySet(chr(173)) := 333; mySet(chr(174)) := 747; mySet(chr(175)) := 333;
|
|
mySet(chr(176)) := 400; mySet(chr(177)) := 570; mySet(chr(178)) := 300; mySet(chr(179)) := 300; mySet(chr(180)) := 333; mySet(chr(181)) := 576; mySet(chr(182)) := 500; mySet(chr(183)) := 250; mySet(chr(184)) := 333; mySet(chr(185)) := 300; mySet(chr(186)) := 300; mySet(chr(187)) := 500; mySet(chr(188)) := 750; mySet(chr(189)) := 750; mySet(chr(190)) := 750; mySet(chr(191)) := 500; mySet(chr(192)) := 667; mySet(chr(193)) := 667; mySet(chr(194)) := 667; mySet(chr(195)) := 667; mySet(chr(196)) := 667; mySet(chr(197)) := 667;
|
|
mySet(chr(198)) := 944; mySet(chr(199)) := 667; mySet(chr(200)) := 667; mySet(chr(201)) := 667; mySet(chr(202)) := 667; mySet(chr(203)) := 667; mySet(chr(204)) := 389; mySet(chr(205)) := 389; mySet(chr(206)) := 389; mySet(chr(207)) := 389; mySet(chr(208)) := 722; mySet(chr(209)) := 722; mySet(chr(210)) := 722; mySet(chr(211)) := 722; mySet(chr(212)) := 722; mySet(chr(213)) := 722; mySet(chr(214)) := 722; mySet(chr(215)) := 570; mySet(chr(216)) := 722; mySet(chr(217)) := 722; mySet(chr(218)) := 722; mySet(chr(219)) := 722;
|
|
mySet(chr(220)) := 722; mySet(chr(221)) := 611; mySet(chr(222)) := 611; mySet(chr(223)) := 500; mySet(chr(224)) := 500; mySet(chr(225)) := 500; mySet(chr(226)) := 500; mySet(chr(227)) := 500; mySet(chr(228)) := 500; mySet(chr(229)) := 500; mySet(chr(230)) := 722; mySet(chr(231)) := 444; mySet(chr(232)) := 444; mySet(chr(233)) := 444; mySet(chr(234)) := 444; mySet(chr(235)) := 444; mySet(chr(236)) := 278; mySet(chr(237)) := 278; mySet(chr(238)) := 278; mySet(chr(239)) := 278; mySet(chr(240)) := 500; mySet(chr(241)) := 556;
|
|
mySet(chr(242)) := 500; mySet(chr(243)) := 500; mySet(chr(244)) := 500; mySet(chr(245)) := 500; mySet(chr(246)) := 500; mySet(chr(247)) := 570; mySet(chr(248)) := 500; mySet(chr(249)) := 556; mySet(chr(250)) := 556; mySet(chr(251)) := 556; mySet(chr(252)) := 556; mySet(chr(253)) := 444; mySet(chr(254)) := 500; mySet(chr(255)) := 444;
|
|
return mySet;
|
|
end getFontTimesbi;
|
|
|
|
----------------------------------------------------------------------------------
|
|
-- Setting metric for Symbol
|
|
----------------------------------------------------------------------------------
|
|
function getFontSymbol return charSet is
|
|
mySet charSet;
|
|
begin
|
|
-- Symbol font.
|
|
mySet(chr(0)) := 250; mySet(chr(1)) := 250; mySet(chr(2)) := 250; mySet(chr(3)) := 250; mySet(chr(4)) := 250; mySet(chr(5)) := 250; mySet(chr(6)) := 250; mySet(chr(7)) := 250; mySet(chr(8)) := 250; mySet(chr(9)) := 250; mySet(chr(10)) := 250; mySet(chr(11)) := 250; mySet(chr(12)) := 250; mySet(chr(13)) := 250; mySet(chr(14)) := 250; mySet(chr(15)) := 250; mySet(chr(16)) := 250; mySet(chr(17)) := 250; mySet(chr(18)) := 250; mySet(chr(19)) := 250; mySet(chr(20)) := 250; mySet(chr(21)) := 250;
|
|
mySet(chr(22)) := 250; mySet(chr(23)) := 250; mySet(chr(24)) := 250; mySet(chr(25)) := 250; mySet(chr(26)) := 250; mySet(chr(27)) := 250; mySet(chr(28)) := 250; mySet(chr(29)) := 250; mySet(chr(30)) := 250; mySet(chr(31)) := 250; mySet(' ') := 250; mySet('!') := 333; mySet('"') := 713; mySet('#') := 500; mySet('$') := 549; mySet('%') := 833; mySet('&') := 778; mySet('''') := 439; mySet('(') := 333; mySet(')') := 333; mySet('*') := 500; mySet('+') := 549;
|
|
mySet(',') := 250; mySet('-') := 549; mySet('.') := 250; mySet('/') := 278; mySet('0') := 500; mySet('1') := 500; mySet('2') := 500; mySet('3') := 500; mySet('4') := 500; mySet('5') := 500; mySet('6') := 500; mySet('7') := 500; mySet('8') := 500; mySet('9') := 500; mySet(':') := 278; mySet(';') := 278; mySet('<') := 549; mySet('=') := 549; mySet('>') := 549; mySet('?') := 444; mySet('@') := 549; mySet('A') := 722;
|
|
mySet('B') := 667; mySet('C') := 722; mySet('D') := 612; mySet('E') := 611; mySet('F') := 763; mySet('G') := 603; mySet('H') := 722; mySet('I') := 333; mySet('J') := 631; mySet('K') := 722; mySet('L') := 686; mySet('M') := 889; mySet('N') := 722; mySet('O') := 722; mySet('P') := 768; mySet('Q') := 741; mySet('R') := 556; mySet('S') := 592; mySet('T') := 611; mySet('U') := 690; mySet('V') := 439; mySet('W') := 768;
|
|
mySet('X') := 645; mySet('Y') := 795; mySet('Z') := 611; mySet('[') := 333; mySet('\') := 863; mySet(']') := 333; mySet('^') := 658; mySet('_') := 500; mySet('`') := 500; mySet('a') := 631; mySet('b') := 549; mySet('c') := 549; mySet('d') := 494; mySet('e') := 439; mySet('f') := 521; mySet('g') := 411; mySet('h') := 603; mySet('i') := 329; mySet('j') := 603; mySet('k') := 549; mySet('l') := 549; mySet('m') := 576;
|
|
mySet('n') := 521; mySet('o') := 549; mySet('p') := 549; mySet('q') := 521; mySet('r') := 549; mySet('s') := 603; mySet('t') := 439; mySet('u') := 576; mySet('v') := 713; mySet('w') := 686; mySet('x') := 493; mySet('y') := 686; mySet('z') := 494; mySet('{') := 480; mySet('|') := 200; mySet('}') := 480; mySet('~') := 549; mySet(chr(127)) := 0; mySet(chr(128)) := 0; mySet(chr(129)) := 0; mySet(chr(130)) := 0; mySet(chr(131)) := 0;
|
|
mySet(chr(132)) := 0; mySet(chr(133)) := 0; mySet(chr(134)) := 0; mySet(chr(135)) := 0; mySet(chr(136)) := 0; mySet(chr(137)) := 0; mySet(chr(138)) := 0; mySet(chr(139)) := 0; mySet(chr(140)) := 0; mySet(chr(141)) := 0; mySet(chr(142)) := 0; mySet(chr(143)) := 0; mySet(chr(144)) := 0; mySet(chr(145)) := 0; mySet(chr(146)) := 0; mySet(chr(147)) := 0; mySet(chr(148)) := 0; mySet(chr(149)) := 0; mySet(chr(150)) := 0; mySet(chr(151)) := 0; mySet(chr(152)) := 0; mySet(chr(153)) := 0;
|
|
mySet(chr(154)) := 0; mySet(chr(155)) := 0; mySet(chr(156)) := 0; mySet(chr(157)) := 0; mySet(chr(158)) := 0; mySet(chr(159)) := 0; mySet(chr(160)) := 750; mySet(chr(161)) := 620; mySet(chr(162)) := 247; mySet(chr(163)) := 549; mySet(chr(164)) := 167; mySet(chr(165)) := 713; mySet(chr(166)) := 500; mySet(chr(167)) := 753; mySet(chr(168)) := 753; mySet(chr(169)) := 753; mySet(chr(170)) := 753; mySet(chr(171)) := 1042; mySet(chr(172)) := 987; mySet(chr(173)) := 603; mySet(chr(174)) := 987; mySet(chr(175)) := 603;
|
|
mySet(chr(176)) := 400; mySet(chr(177)) := 549; mySet(chr(178)) := 411; mySet(chr(179)) := 549; mySet(chr(180)) := 549; mySet(chr(181)) := 713; mySet(chr(182)) := 494; mySet(chr(183)) := 460; mySet(chr(184)) := 549; mySet(chr(185)) := 549; mySet(chr(186)) := 549; mySet(chr(187)) := 549; mySet(chr(188)) := 1000; mySet(chr(189)) := 603; mySet(chr(190)) := 1000; mySet(chr(191)) := 658; mySet(chr(192)) := 823; mySet(chr(193)) := 686; mySet(chr(194)) := 795; mySet(chr(195)) := 987; mySet(chr(196)) := 768; mySet(chr(197)) := 768;
|
|
mySet(chr(198)) := 823; mySet(chr(199)) := 768; mySet(chr(200)) := 768; mySet(chr(201)) := 713; mySet(chr(202)) := 713; mySet(chr(203)) := 713; mySet(chr(204)) := 713; mySet(chr(205)) := 713; mySet(chr(206)) := 713; mySet(chr(207)) := 713; mySet(chr(208)) := 768; mySet(chr(209)) := 713; mySet(chr(210)) := 790; mySet(chr(211)) := 790; mySet(chr(212)) := 890; mySet(chr(213)) := 823; mySet(chr(214)) := 549; mySet(chr(215)) := 250; mySet(chr(216)) := 713; mySet(chr(217)) := 603; mySet(chr(218)) := 603; mySet(chr(219)) := 1042;
|
|
mySet(chr(220)) := 987; mySet(chr(221)) := 603; mySet(chr(222)) := 987; mySet(chr(223)) := 603; mySet(chr(224)) := 494; mySet(chr(225)) := 329; mySet(chr(226)) := 790; mySet(chr(227)) := 790; mySet(chr(228)) := 786; mySet(chr(229)) := 713; mySet(chr(230)) := 384; mySet(chr(231)) := 384; mySet(chr(232)) := 384; mySet(chr(233)) := 384; mySet(chr(234)) := 384; mySet(chr(235)) := 384; mySet(chr(236)) := 494; mySet(chr(237)) := 494; mySet(chr(238)) := 494; mySet(chr(239)) := 494; mySet(chr(240)) := 0; mySet(chr(241)) := 329;
|
|
mySet(chr(242)) := 274; mySet(chr(243)) := 686; mySet(chr(244)) := 686; mySet(chr(245)) := 686; mySet(chr(246)) := 384; mySet(chr(247)) := 384; mySet(chr(248)) := 384; mySet(chr(249)) := 384; mySet(chr(250)) := 384; mySet(chr(251)) := 384; mySet(chr(252)) := 494; mySet(chr(253)) := 494; mySet(chr(254)) := 494; mySet(chr(255)) := 0;
|
|
return mySet;
|
|
end getFontSymbol;
|
|
|
|
----------------------------------------------------------------------------------
|
|
-- Setting metric for zapfdingbats
|
|
----------------------------------------------------------------------------------
|
|
function getFontZapfdingbats return charSet is
|
|
mySet charSet;
|
|
begin
|
|
-- zapfdingbats font.
|
|
mySet(chr(0)) := 0; mySet(chr(1)) := 0; mySet(chr(2)) := 0; mySet(chr(3)) := 0; mySet(chr(4)) := 0; mySet(chr(5)) := 0; mySet(chr(6)) := 0; mySet(chr(7)) := 0; mySet(chr(8)) := 0; mySet(chr(9)) := 0; mySet(chr(10)) := 0; mySet(chr(11)) := 0; mySet(chr(12)) := 0; mySet(chr(13)) := 0; mySet(chr(14)) := 0; mySet(chr(15)) := 0; mySet(chr(16)) := 0; mySet(chr(17)) := 0; mySet(chr(18)) := 0; mySet(chr(19)) := 0; mySet(chr(20)) := 0; mySet(chr(21)) := 0;
|
|
mySet(chr(22)) := 0; mySet(chr(23)) := 0; mySet(chr(24)) := 0; mySet(chr(25)) := 0; mySet(chr(26)) := 0; mySet(chr(27)) := 0; mySet(chr(28)) := 0; mySet(chr(29)) := 0; mySet(chr(30)) := 0; mySet(chr(31)) := 0; mySet(' ') := 278; mySet('!') := 974; mySet('"') := 961; mySet('#') := 974; mySet('$') := 980; mySet('%') := 719; mySet('&') := 789; mySet('''') := 790; mySet('(') := 791; mySet(')') := 690; mySet('*') := 960; mySet('+') := 939;
|
|
mySet(',') := 549; mySet('-') := 855; mySet('.') := 911; mySet('/') := 933; mySet('0') := 911; mySet('1') := 945; mySet('2') := 974; mySet('3') := 755; mySet('4') := 846; mySet('5') := 762; mySet('6') := 761; mySet('7') := 571; mySet('8') := 677; mySet('9') := 763; mySet(':') := 760; mySet(';') := 759; mySet('<') := 754; mySet('=') := 494; mySet('>') := 552; mySet('?') := 537; mySet('@') := 577; mySet('A') := 692;
|
|
mySet('B') := 786; mySet('C') := 788; mySet('D') := 788; mySet('E') := 790; mySet('F') := 793; mySet('G') := 794; mySet('H') := 816; mySet('I') := 823; mySet('J') := 789; mySet('K') := 841; mySet('L') := 823; mySet('M') := 833; mySet('N') := 816; mySet('O') := 831; mySet('P') := 923; mySet('Q') := 744; mySet('R') := 723; mySet('S') := 749; mySet('T') := 790; mySet('U') := 792; mySet('V') := 695; mySet('W') := 776;
|
|
mySet('X') := 768; mySet('Y') := 792; mySet('Z') := 759; mySet('[') := 707; mySet('\') := 708; mySet(']') := 682; mySet('^') := 701; mySet('_') := 826; mySet('`') := 815; mySet('a') := 789; mySet('b') := 789; mySet('c') := 707; mySet('d') := 687; mySet('e') := 696; mySet('f') := 689; mySet('g') := 786; mySet('h') := 787; mySet('i') := 713; mySet('j') := 791; mySet('k') := 785; mySet('l') := 791; mySet('m') := 873;
|
|
mySet('n') := 761; mySet('o') := 762; mySet('p') := 762; mySet('q') := 759; mySet('r') := 759; mySet('s') := 892; mySet('t') := 892; mySet('u') := 788; mySet('v') := 784; mySet('w') := 438; mySet('x') := 138; mySet('y') := 277; mySet('z') := 415; mySet('{') := 392; mySet('|') := 392; mySet('}') := 668; mySet('~') := 668; mySet(chr(127)) := 0; mySet(chr(128)) := 390; mySet(chr(129)) := 390; mySet(chr(130)) := 317; mySet(chr(131)) := 317;
|
|
mySet(chr(132)) := 276; mySet(chr(133)) := 276; mySet(chr(134)) := 509; mySet(chr(135)) := 509; mySet(chr(136)) := 410; mySet(chr(137)) := 410; mySet(chr(138)) := 234; mySet(chr(139)) := 234; mySet(chr(140)) := 334; mySet(chr(141)) := 334; mySet(chr(142)) := 0; mySet(chr(143)) := 0; mySet(chr(144)) := 0; mySet(chr(145)) := 0; mySet(chr(146)) := 0; mySet(chr(147)) := 0; mySet(chr(148)) := 0; mySet(chr(149)) := 0; mySet(chr(150)) := 0; mySet(chr(151)) := 0; mySet(chr(152)) := 0; mySet(chr(153)) := 0;
|
|
mySet(chr(154)) := 0; mySet(chr(155)) := 0; mySet(chr(156)) := 0; mySet(chr(157)) := 0; mySet(chr(158)) := 0; mySet(chr(159)) := 0; mySet(chr(160)) := 0; mySet(chr(161)) := 732; mySet(chr(162)) := 544; mySet(chr(163)) := 544; mySet(chr(164)) := 910; mySet(chr(165)) := 667; mySet(chr(166)) := 760; mySet(chr(167)) := 760; mySet(chr(168)) := 776; mySet(chr(169)) := 595; mySet(chr(170)) := 694; mySet(chr(171)) := 626; mySet(chr(172)) := 788; mySet(chr(173)) := 788; mySet(chr(174)) := 788; mySet(chr(175)) := 788;
|
|
mySet(chr(176)) := 788; mySet(chr(177)) := 788; mySet(chr(178)) := 788; mySet(chr(179)) := 788; mySet(chr(180)) := 788; mySet(chr(181)) := 788; mySet(chr(182)) := 788; mySet(chr(183)) := 788; mySet(chr(184)) := 788; mySet(chr(185)) := 788; mySet(chr(186)) := 788; mySet(chr(187)) := 788; mySet(chr(188)) := 788; mySet(chr(189)) := 788; mySet(chr(190)) := 788; mySet(chr(191)) := 788; mySet(chr(192)) := 788; mySet(chr(193)) := 788; mySet(chr(194)) := 788; mySet(chr(195)) := 788; mySet(chr(196)) := 788; mySet(chr(197)) := 788;
|
|
mySet(chr(198)) := 788; mySet(chr(199)) := 788; mySet(chr(200)) := 788; mySet(chr(201)) := 788; mySet(chr(202)) := 788; mySet(chr(203)) := 788; mySet(chr(204)) := 788; mySet(chr(205)) := 788; mySet(chr(206)) := 788; mySet(chr(207)) := 788; mySet(chr(208)) := 788; mySet(chr(209)) := 788; mySet(chr(210)) := 788; mySet(chr(211)) := 788; mySet(chr(212)) := 894; mySet(chr(213)) := 838; mySet(chr(214)) := 1016; mySet(chr(215)) := 458; mySet(chr(216)) := 748; mySet(chr(217)) := 924; mySet(chr(218)) := 748; mySet(chr(219)) := 918;
|
|
mySet(chr(220)) := 927; mySet(chr(221)) := 928; mySet(chr(222)) := 928; mySet(chr(223)) := 834; mySet(chr(224)) := 873; mySet(chr(225)) := 828; mySet(chr(226)) := 924; mySet(chr(227)) := 924; mySet(chr(228)) := 917; mySet(chr(229)) := 930; mySet(chr(230)) := 931; mySet(chr(231)) := 463; mySet(chr(232)) := 883; mySet(chr(233)) := 836; mySet(chr(234)) := 836; mySet(chr(235)) := 867; mySet(chr(236)) := 867; mySet(chr(237)) := 696; mySet(chr(238)) := 696; mySet(chr(239)) := 874; mySet(chr(240)) := 0; mySet(chr(241)) := 874;
|
|
mySet(chr(242)) := 760; mySet(chr(243)) := 946; mySet(chr(244)) := 771; mySet(chr(245)) := 865; mySet(chr(246)) := 771; mySet(chr(247)) := 888; mySet(chr(248)) := 967; mySet(chr(249)) := 888; mySet(chr(250)) := 831; mySet(chr(251)) := 873; mySet(chr(252)) := 927; mySet(chr(253)) := 970; mySet(chr(254)) := 918; mySet(chr(255)) := 0;
|
|
return mySet;
|
|
end getFontZapfdingbats;
|
|
|
|
----------------------------------------------------------------------------------
|
|
-- Inclusion des métriques d'une font.
|
|
----------------------------------------------------------------------------------
|
|
procedure p_includeFont (pfontname varchar2) is
|
|
mySet charSet;
|
|
begin
|
|
if (pfontname is not null) then
|
|
case pfontname
|
|
when 'courier' then -- courier
|
|
mySet := getFontCourier;
|
|
fpdf_charwidths(pfontname||'B') := mySet;
|
|
fpdf_charwidths(pfontname||'I') := mySet;
|
|
fpdf_charwidths(pfontname||'BI') := mySet;
|
|
when 'helvetica' then -- helvetica font.
|
|
mySet := getFontHelvetica;
|
|
--
|
|
when 'helveticaI' then -- helvetica italic font.
|
|
mySet := getFontHelveticai;
|
|
--
|
|
when 'helveticaB' then -- helvetica bold font.
|
|
mySet := getFontHelveticab;
|
|
--
|
|
when 'helveticaBI' then -- helvetica bold italic font.
|
|
mySet := getFontHelveticabi;
|
|
--
|
|
when 'times' then -- times font.
|
|
mySet := getFontTimes;
|
|
--
|
|
when 'timesI' then -- times italic font.
|
|
mySet := getFontTimesi;
|
|
--
|
|
when 'timesB' then -- times bold font.
|
|
mySet := getFontTimesb;
|
|
--
|
|
when 'timesBI' then -- times bold italic font.
|
|
mySet := getFontTimesbi;
|
|
--
|
|
when 'symbol' then -- symbol font.
|
|
mySet := getFontSymbol;
|
|
--
|
|
when 'zapfdingbats' then -- zapfdingbats font.
|
|
mySet := getFontZapfdingbats;
|
|
--
|
|
else null;
|
|
end case;
|
|
fpdf_charwidths(pfontname) := mySet;
|
|
end if;
|
|
end p_includeFont;
|
|
|
|
|
|
----------------------------------------------------------------------------------
|
|
-- p_getFontMetrics : récupérer les metric d'une font.
|
|
----------------------------------------------------------------------------------
|
|
function p_getFontMetrics(pFontName varchar2) return charSet is
|
|
mySet charSet;
|
|
begin
|
|
if (pfontname is not null) then
|
|
case pfontname
|
|
when 'courier' then -- courier
|
|
mySet := getFontCourier;
|
|
when 'helvetica' then -- helvetica font.
|
|
mySet := getFontHelvetica;
|
|
--
|
|
when 'helveticaI' then -- helvetica italic font.
|
|
mySet := getFontHelveticai;
|
|
--
|
|
when 'helveticaB' then -- helvetica bold font.
|
|
mySet := getFontHelveticab;
|
|
--
|
|
when 'helveticaBI' then -- helvetica bold italic font.
|
|
mySet := getFontHelveticabi;
|
|
--
|
|
when 'times' then -- times font.
|
|
mySet := getFontTimes;
|
|
--
|
|
when 'timesI' then -- times italic font.
|
|
mySet := getFontTimesi;
|
|
--
|
|
when 'timesI' then -- times bold font.
|
|
mySet := getFontTimesb;
|
|
--
|
|
when 'timesBI' then -- times bold italic font.
|
|
mySet := getFontTimesbi;
|
|
--
|
|
when 'symbol' then -- symbol font.
|
|
mySet := getFontSymbol;
|
|
--
|
|
when 'zapfdingbats' then -- zapfdingbats font.
|
|
mySet := getFontZapfdingbats;
|
|
--
|
|
else null;
|
|
end case;
|
|
end if;
|
|
return mySet;
|
|
end p_getFontMetrics;
|
|
|
|
----------------------------------------------------------------------------------
|
|
-- Parcours le tableau des images et renvoie true si l'image cherché existe
|
|
-- dans le tableau.
|
|
----------------------------------------------------------------------------------
|
|
function imageExists(pFile varchar2) return boolean is
|
|
begin
|
|
if (images.exists(lower(pFile))) then
|
|
return true;
|
|
end if;
|
|
return false;
|
|
exception
|
|
when others then
|
|
error('imageExists : '||sqlerrm);
|
|
return false;
|
|
end imageExists;
|
|
|
|
----------------------------------------------------------------------------------
|
|
-- Parcours le tableau des charwidths et renvoie true si il existe pour la font
|
|
-- donnée.
|
|
----------------------------------------------------------------------------------
|
|
function fpdf_charwidthsExists(pFontName varchar2) return boolean is
|
|
chTab charSet;
|
|
begin
|
|
if (fpdf_charwidths.exists(pFontName)) then
|
|
chTab := fpdf_charwidths(pFontName);
|
|
if (nvl(chTab.count, 0) > 0) then
|
|
return true;
|
|
end if;
|
|
end if;
|
|
return false;
|
|
exception
|
|
when others then
|
|
return false;
|
|
end fpdf_charwidthsExists;
|
|
|
|
----------------------------------------------------------------------------------
|
|
-- Parcours le tableau des fonts et renvoie true si il existe pour la font
|
|
-- donnée.
|
|
----------------------------------------------------------------------------------
|
|
function fontsExists(pFontName varchar2) return boolean is
|
|
ft word;
|
|
begin
|
|
if (fonts.exists(pFontName)) then
|
|
ft := fonts(pFontName).name||fonts(pFontName).type;
|
|
if (nvl(ft, 0) != 0) then
|
|
return true;
|
|
end if;
|
|
end if;
|
|
return false;
|
|
exception
|
|
when others then
|
|
return false;
|
|
end fontsExists;
|
|
|
|
--------------------------------------------------------------------------------
|
|
-- get an image in a blob from an http url.
|
|
-- The image is converted on the fly to PNG format.
|
|
--------------------------------------------------------------------------------
|
|
function getImageFromUrl(p_Url varchar2) return ordsys.ordImage is
|
|
myImg ordsys.ordImage;
|
|
lv_url varchar2(2000) := p_Url;
|
|
urityp URIType;
|
|
begin
|
|
-- normalize url.
|
|
if (instr(lv_url, 'http') = 0 ) then
|
|
lv_url := 'http://'||owa_util.get_cgi_env('SERVER_NAME')||'/'||lv_url;
|
|
end if;
|
|
|
|
urityp := URIFactory.getURI(lv_url);
|
|
|
|
myImg := ORDSYS.ORDImage.init();
|
|
myImg.source.localdata := urityp.getBlob();
|
|
myImg.setMimeType(urityp.getContentType());
|
|
|
|
begin
|
|
myImg.setProperties();
|
|
Exception
|
|
when others then
|
|
null; -- Ignore exceptions, mimetype is enough.
|
|
end;
|
|
|
|
-- Transform image to PNG if it is a GIF, a JPG or a BMP
|
|
if (myImg.getFileFormat() != 'PNGF' ) then
|
|
myImg.process('fileFormat=PNGF,contentFormat=8bitlutrgb');
|
|
myImg.setProperties();
|
|
end if;
|
|
|
|
return myImg;
|
|
exception
|
|
when others then
|
|
Error('pl_fpdf.getImageFromUrl :'||sqlerrm||', image :'||p_Url);
|
|
return myImg;
|
|
return myImg;
|
|
end getImageFromUrl;
|
|
|
|
--------------------------------------------------------------------------------
|
|
-- get an image in a blob from an oracle table.
|
|
--------------------------------------------------------------------------------
|
|
function getImageFromDatabase(pFile varchar2) return ordsys.ordImage is
|
|
myImg ordsys.ordImage := ordsys.ordImage.init();
|
|
begin
|
|
return myImg;
|
|
end getImageFromDatabase;
|
|
|
|
--------------------------------------------------------------------------------
|
|
-- Enables debug infos
|
|
--------------------------------------------------------------------------------
|
|
procedure DebugEnabled is
|
|
begin
|
|
gb_mode_debug := true;
|
|
end DebugEnabled;
|
|
|
|
--------------------------------------------------------------------------------
|
|
-- disables debug infos
|
|
--------------------------------------------------------------------------------
|
|
procedure DebugDisabled is
|
|
begin
|
|
gb_mode_debug := false;
|
|
end DebugDisabled;
|
|
|
|
--------------------------------------------------------------------------------
|
|
-- Returns the k property
|
|
--------------------------------------------------------------------------------
|
|
function GetScaleFactor return number is
|
|
begin
|
|
-- Get scale factor
|
|
return k;
|
|
end GetScaleFactor;
|
|
|
|
--------------------------------------------------------------------------------
|
|
-- Returns the Linespacing property
|
|
--------------------------------------------------------------------------------
|
|
function GetLineSpacing return number is
|
|
begin
|
|
-- Get LineSpacing property
|
|
return LineSpacing;
|
|
end GetLineSpacing;
|
|
|
|
--------------------------------------------------------------------------------
|
|
-- sets the Linespacing property
|
|
--------------------------------------------------------------------------------
|
|
Procedure SetLineSpacing (pls number) is
|
|
begin
|
|
-- Set LineSpacing property
|
|
LineSpacing := pls;
|
|
end SetLineSpacing;
|
|
|
|
----------------------------------------------------------------------------------
|
|
-- Compatibilité PHP -> PLSQL : proc. and func. spécifiques au portages
|
|
-- ajoutée pour des facilités de traduction
|
|
----------------------------------------------------------------------------------
|
|
function ord(pStr varchar2) return number is
|
|
begin
|
|
return ascii(substr(pStr, 1, 1));
|
|
end ord;
|
|
|
|
function empty (p_myvar varchar2) return boolean is
|
|
begin
|
|
if (p_myvar is null) then
|
|
return true;
|
|
end if;
|
|
return false;
|
|
end empty;
|
|
|
|
function empty (p_mynum number) return boolean is
|
|
begin
|
|
return empty (p_myvar => to_char(p_mynum));
|
|
end empty;
|
|
|
|
function str_replace ( psearch varchar2, preplace varchar2, psubject varchar2) return varchar2 is
|
|
begin
|
|
return replace(psubject, psearch, preplace);
|
|
end str_replace;
|
|
|
|
function strlen (pstr varchar2) return number is
|
|
begin
|
|
return length(pstr);
|
|
end strlen;
|
|
|
|
function strlen (pstr clob) return number is
|
|
begin
|
|
return length(pstr);
|
|
end strlen;
|
|
|
|
function tonumber(v_str in varchar2) return number is
|
|
v_num number;
|
|
v_str2 varchar2(255);
|
|
begin
|
|
begin
|
|
v_num := to_number(v_str);
|
|
exception
|
|
when others then
|
|
v_num := null;
|
|
end;
|
|
if v_num is null then
|
|
-- maybe wrong NLS, try again
|
|
v_str2 := replace(v_str,',.','.,');
|
|
begin
|
|
v_num := to_number(v_str2);
|
|
exception
|
|
when others then
|
|
v_num := null;
|
|
end;
|
|
end if;
|
|
return v_num;
|
|
end;
|
|
|
|
function tochar(pnum number, pprecision number default 2) return varchar2 is
|
|
mynum word := replace(to_char(pnum),',','.');
|
|
ceilnum word;
|
|
decnum word;
|
|
begin
|
|
if (instr(mynum,'.') = 0) then
|
|
mynum := mynum || '.0';
|
|
end if;
|
|
ceilnum := nvl(substr(mynum,1,instr(mynum,'.')-1), '0');
|
|
decnum := nvl(substr(mynum,instr(mynum,'.')+1), '0');
|
|
decnum := substr(decnum,1, pprecision);
|
|
if (pprecision = 0 ) then
|
|
mynum := ceilnum;
|
|
else
|
|
mynum := ceilnum || '.' ||decnum;
|
|
end if;
|
|
return mynum;
|
|
end tochar;
|
|
|
|
function date_YmdHis (p_date date default sysdate) return varchar2 is
|
|
begin
|
|
return to_char(p_date,'YYYYMMDDHH24MISS');
|
|
end date_YmdHis;
|
|
|
|
function is_string (pstr varchar2) return boolean is
|
|
temp varchar2(2000);
|
|
begin
|
|
temp := to_number(pstr);
|
|
-- Si on passe là c'est que la variable contient un nombre sinon => exception.
|
|
return false;
|
|
exception
|
|
when others then
|
|
return true;
|
|
end is_string;
|
|
|
|
function function_exists (pname varchar2) return boolean is
|
|
begin
|
|
-- Pas de fct fdt de compression zlib sous oracle.
|
|
return false;
|
|
end function_exists;
|
|
|
|
function strtoupper (pstr in out varchar2) return varchar2 is
|
|
begin
|
|
return upper(pstr);
|
|
end strtoupper;
|
|
|
|
function strtolower (pstr in out varchar2) return varchar2 is
|
|
begin
|
|
return lower(pstr);
|
|
end strtolower;
|
|
|
|
function substr_count (ptxt varchar2, pstr varchar2) return number is
|
|
nbr number := 0;
|
|
begin
|
|
for i in 1..length(ptxt)
|
|
loop
|
|
if (substr(ptxt,i,1) = pstr) then
|
|
nbr := nbr + 1;
|
|
end if;
|
|
end loop;
|
|
return nbr;
|
|
end substr_count;
|
|
|
|
----------------------------------------------------------------------------------------
|
|
-- Traduction des méthodes PHP.
|
|
----------------------------------------------------------------------------------------
|
|
procedure p_dochecks is
|
|
begin
|
|
-- Check for decimal separator
|
|
-- MBR 15.03.2011: commented out to use the established NLS settings for session -- PDF generation seems to work without this anyway...
|
|
-- execute immediate 'alter session set NLS_NUMERIC_CHARACTERS = '',.''';
|
|
null;
|
|
end p_dochecks;
|
|
|
|
----------------------------------------------------------------------------------------
|
|
function p_getfontpath return varchar2 is
|
|
begin
|
|
-- Procedure inutile avec le PLSQL : toutes les fonts sont chargées en mémoire.
|
|
return null;
|
|
end p_getfontpath;
|
|
|
|
----------------------------------------------------------------------------------------
|
|
procedure p_out(pstr varchar2 default null, pCRLF boolean default true) is
|
|
lv_CRLF varchar2(2) := null;
|
|
begin
|
|
if (pCRLF) then
|
|
lv_CRLF := chr(10);
|
|
end if;
|
|
-- Add a line to the document
|
|
if(state = 2) then
|
|
pages(page):= pages(page) || pstr || lv_CRLF;
|
|
else
|
|
pdfDoc(pdfDoc.last + 1) := pstr || lv_CRLF;
|
|
end if;
|
|
exception
|
|
when others then
|
|
error('p_out : '||sqlerrm);
|
|
end p_out;
|
|
|
|
|
|
procedure p_out(pstr clob default null, pCRLF boolean default true)
|
|
is
|
|
lv_CRLF varchar2(2) := null;
|
|
begin
|
|
if (pCRLF) then
|
|
lv_CRLF := chr(10);
|
|
end if;
|
|
-- Add a line to the document
|
|
if(state = 2) then
|
|
pages(page):= pages(page) || pstr || lv_CRLF;
|
|
else
|
|
pdfDoc(pdfDoc.last + 1) := pstr || lv_CRLF;
|
|
end if;
|
|
exception
|
|
when others then
|
|
error('p_out (clob) : '||sqlerrm);
|
|
end p_out;
|
|
|
|
----------------------------------------------------------------------------------------
|
|
procedure p_newobj is
|
|
begin
|
|
-- Begin a new object
|
|
n := n + 1;
|
|
offsets(n) := getPDFDocLength();
|
|
p_out(n || ' 0 obj');
|
|
exception
|
|
when others then
|
|
error('p_newobj : '||sqlerrm);
|
|
end p_newobj;
|
|
|
|
----------------------------------------------------------------------------------------
|
|
function p_escape(pstr varchar2) return varchar2 is
|
|
begin
|
|
-- Add \ before \, ( and )
|
|
return str_replace(')','\)',str_replace('(','\(',str_replace('\\','\\\\',pstr)));
|
|
--return str_replace('\\','\\\\',pstr);
|
|
end p_escape;
|
|
|
|
----------------------------------------------------------------------------------------
|
|
function p_textstring(pstr varchar2) return varchar2 is
|
|
begin
|
|
-- Format a text string
|
|
return '(' || p_escape(pstr) || ')';
|
|
end p_textstring;
|
|
|
|
----------------------------------------------------------------------------------------
|
|
procedure p_putstream(pstr varchar2) is
|
|
begin
|
|
p_out('stream');
|
|
p_out(pstr);
|
|
p_out('endstream');
|
|
exception
|
|
when others then
|
|
error('p_putstream : '||sqlerrm);
|
|
end p_putstream;
|
|
|
|
----------------------------------------------------------------------------------------
|
|
procedure p_putstream(pstr clob) is
|
|
begin
|
|
p_out('stream');
|
|
p_out(pstr);
|
|
p_out('endstream');
|
|
exception
|
|
when others then
|
|
error('p_putstream (clob): '||sqlerrm);
|
|
end p_putstream;
|
|
|
|
|
|
procedure p_putstream(pData in out NOCOPY blob) is
|
|
offset integer := 1;
|
|
lv_content_length number := dbms_lob.getlength(pdata);
|
|
buf_size integer := 2000;
|
|
buf raw(2000);
|
|
begin
|
|
p_out('stream');
|
|
-- read the blob and put it in small pieces in a varchar
|
|
while offset < lv_content_length loop
|
|
dbms_lob.read(pData,buf_size,offset,buf);
|
|
p_out(utl_raw.cast_to_varchar2(buf), false);
|
|
offset := offset + buf_size;
|
|
end loop;
|
|
-- put a CRLF at te end of the blob
|
|
p_out(chr(10), false);
|
|
p_out('endstream');
|
|
exception
|
|
when others then
|
|
error('p_putstream : '||sqlerrm);
|
|
end p_putstream;
|
|
|
|
----------------------------------------------------------------------------------------
|
|
procedure p_putxobjectdict is
|
|
v txt;
|
|
begin
|
|
v := images.first;
|
|
while (v is not null) loop
|
|
p_out('/I' || images(v).i || ' ' || images(v).n || ' 0 R');
|
|
v := images.next(v);
|
|
end loop;
|
|
exception
|
|
when others then
|
|
error('p_putxobjectdict : '||sqlerrm);
|
|
end p_putxobjectdict;
|
|
|
|
----------------------------------------------------------------------------------------
|
|
procedure p_putresourcedict is
|
|
v varchar2(200);
|
|
begin
|
|
p_out('/ProcSet [/PDF /Text /ImageB /ImageC /ImageI]');
|
|
p_out('/Font <<');
|
|
v := fonts.first;
|
|
while (v is not null)
|
|
loop
|
|
p_out('/F' || fonts(v).i || ' ' || fonts(v).n ||' 0 R');
|
|
v := fonts.next(v);
|
|
end loop;
|
|
p_out('>>');
|
|
p_out('/XObject <<');
|
|
p_putxobjectdict();
|
|
p_out('>>');
|
|
exception
|
|
when others then
|
|
error('p_putresourcedict : '||sqlerrm);
|
|
end p_putresourcedict;
|
|
|
|
----------------------------------------------------------------------------------------
|
|
procedure p_putfonts is
|
|
nf number := n;
|
|
i pls_integer;
|
|
k varchar2(200);
|
|
v varchar2(200);
|
|
myFont varchar2(2000);
|
|
mySet charSet;
|
|
myHeader boolean;
|
|
myType word;
|
|
myName word;
|
|
myFile word;
|
|
s varchar2(2000);
|
|
cw charSet;
|
|
theType word;
|
|
methode word;
|
|
-- plsqlmethode word;
|
|
begin
|
|
null;
|
|
i := diffs.first;
|
|
while (i is not null)
|
|
loop
|
|
-- Encodings
|
|
p_newobj();
|
|
p_out('<</Type /Encoding /BaseEncoding /WinAnsiEncoding /Differences ['|| diffs(i) ||']>>');
|
|
p_out('endobj');
|
|
i:= diffs.next(i);
|
|
end loop;
|
|
|
|
-- foreach($this->FontFiles as $file=>$info)
|
|
v := FontFiles.first;
|
|
while (v is not null)
|
|
loop
|
|
null;
|
|
-- Font file embedding
|
|
p_newobj();
|
|
FontFiles(v).n:= n;
|
|
myFont := null;
|
|
|
|
|
|
mySet := p_getFontMetrics(FontFiles(v).file);
|
|
for i in mySet.first..mySet.last loop
|
|
myFont := myFont || mySet(i);
|
|
end loop;
|
|
|
|
if (mySet.count = 0) then
|
|
Error('Font file not found');
|
|
end if;
|
|
|
|
if(FontFiles(v).length2 is not null) then
|
|
|
|
myHeader := false;
|
|
if ( ord(myFont) = 128) then
|
|
myHeader := true;
|
|
end if;
|
|
|
|
if(myHeader) then
|
|
-- Strip first binary header
|
|
myFont := substr(myFont,6);
|
|
end if;
|
|
|
|
if(myHeader and ord(substr(myFont,(FontFiles(v).length1), 1)) = 128) then
|
|
-- Strip second binary header
|
|
myFont := substr(myFont, 1, FontFiles(v).length1) || substr(myFont, FontFiles(v).length1 + 6);
|
|
end if;
|
|
end if;
|
|
p_out('<</Length ' || strlen(myFont));
|
|
|
|
p_out('/Length1 ' || FontFiles(v).length1);
|
|
if(FontFiles(v).length2 is not null) then
|
|
p_out('/Length2 '|| FontFiles(v).length2 ||' /Length3 0');
|
|
end if;
|
|
p_out('>>');
|
|
p_putstream(myFont);
|
|
p_out('endobj');
|
|
|
|
v := FontFiles.next(v);
|
|
end loop;
|
|
|
|
|
|
k := fonts.first;
|
|
while (k is not null) loop
|
|
|
|
|
|
--foreach(fonts as $k=>myFont)
|
|
--{
|
|
-- Font objects
|
|
fonts(k).n := n+1;
|
|
myType := fonts(k).type;
|
|
myName := fonts(k).name;
|
|
if(myType = 'core') then
|
|
-- Standard font
|
|
p_newobj();
|
|
p_out('<</Type /Font');
|
|
p_out('/BaseFont /' || myName);
|
|
p_out('/Subtype /Type1');
|
|
if(lower(myName) != 'symbol' and lower(myName) != 'zapfdingbats') then
|
|
p_out('/Encoding /WinAnsiEncoding');
|
|
end if;
|
|
p_out('>>');
|
|
p_out('endobj');
|
|
elsif(lower(myType) = 'type1' or lower(myType) = 'truetype') then
|
|
-- Additional Type1 or TrueType font
|
|
p_newobj();
|
|
p_out('<</Type /Font');
|
|
p_out('/BaseFont /' || myName);
|
|
p_out('/Subtype /' || myType);
|
|
p_out('/FirstChar 32 /LastChar 255');
|
|
p_out('/Widths ' || (n+1) || ' 0 R');
|
|
p_out('/FontDescriptor ' || (n+2) || ' 0 R');
|
|
if(fonts(k).enc is not null) then
|
|
if(fonts(k).diff is not null) then
|
|
p_out('/Encoding ' || (nf + fonts(k).diff) || ' 0 R');
|
|
else
|
|
p_out('/Encoding /WinAnsiEncoding');
|
|
end if;
|
|
end if;
|
|
p_out('>>');
|
|
p_out('endobj');
|
|
-- Widths
|
|
p_newobj();
|
|
|
|
cw := fonts(k).cw;
|
|
s := '[';
|
|
for i in 32..255 loop
|
|
s := s || cw(chr(i)) || ' ';
|
|
end loop;
|
|
p_out(s || ']');
|
|
p_out('endobj');
|
|
-- Descriptor
|
|
p_newobj();
|
|
s := '<</Type /FontDescriptor /FontName /' || myName;
|
|
|
|
for l in fonts(k).dsc.first..fonts(k).dsc.last loop
|
|
s := s || ' /' || l || ' ' || fonts(k).dsc(l);
|
|
end loop;
|
|
|
|
myFile := fonts(k).file;
|
|
if (myFile is not null) then
|
|
if (lower(myType) = 'type1') then
|
|
theType := '';
|
|
else
|
|
theType := '2';
|
|
end if;
|
|
s := s || ' /FontFile' || theType || ' ' || FontFiles(myFile).n || ' 0 R';
|
|
end if;
|
|
p_out(s || '>>');
|
|
p_out('endobj');
|
|
else
|
|
-- Allow for additional types
|
|
methode := 'p_put' || strtolower(myType);
|
|
|
|
if(not methode_exists(methode)) then
|
|
Error('Unsupported font type: ' || myType);
|
|
-- else
|
|
-- plsqlmethode := 'begin pl_fpdf.'|| methode ||'(''' || fonts(k) || '''); end';
|
|
-- execute immediate plsqlmethode;
|
|
end if;
|
|
end if;
|
|
|
|
k := fonts.next(k);
|
|
end loop;
|
|
exception
|
|
when others then
|
|
error('p_putfonts : '||sqlerrm);
|
|
end p_putfonts;
|
|
|
|
----------------------------------------------------------------------------------------
|
|
procedure p_putimages is
|
|
filter word;
|
|
info recImage;
|
|
v txt;
|
|
trns txt;
|
|
pal txt;
|
|
begin
|
|
if (b_compress) then
|
|
filter := '/Filter /FlateDecode ';
|
|
else
|
|
filter := '';
|
|
end if;
|
|
--while(list($file,$info)=each($this->images))
|
|
v := images.first;
|
|
while (v is not null) loop
|
|
p_newobj();
|
|
images(v).n := n;
|
|
info := images(v);
|
|
p_out('<</Type /XObject');
|
|
p_out('/Subtype /Image');
|
|
p_out('/Width ' || info.w);
|
|
p_out('/Height ' || info.h);
|
|
if(info.cs = 'Indexed') then
|
|
p_out('/ColorSpace [/Indexed /DeviceRGB ' || to_char(strlen(info.pal) / 3 - 1) || ' ' || to_char(n+1) || ' 0 R]');
|
|
else
|
|
p_out('/ColorSpace /' || info.cs);
|
|
if(info.cs = 'DeviceCMYK') then
|
|
p_out('/Decode (1 0 1 0 1 0 1 0)');
|
|
end if;
|
|
end if;
|
|
|
|
p_out('/BitsPerComponent ' || info.bpc);
|
|
if(info.f is not null) then
|
|
p_out('/Filter /' || info.f);
|
|
end if;
|
|
if(info.parms is not null) then
|
|
p_out(info.parms);
|
|
end if;
|
|
|
|
if(info.trns.first is not null ) then
|
|
trns := '';
|
|
for i in info.trns.first..info.trns.count loop
|
|
trns := trns || info.trns(i) || ' ' || info.trns(i) || ' ';
|
|
end loop;
|
|
p_out('/Mask (' || trns || ')');
|
|
end if;
|
|
|
|
p_out('/Length ' || dbms_lob.getlength(info.data) || '>>');
|
|
p_putstream(info.data);
|
|
images(v).data := null;
|
|
p_out('endobj');
|
|
|
|
--Palette
|
|
if(info.cs = 'Indexed') then
|
|
p_newobj();
|
|
if (b_compress) then
|
|
-- gzcompress($info('pal'))
|
|
null;
|
|
else
|
|
pal := info.pal;
|
|
end if;
|
|
p_out('<<' || filter || '/Length ' || strlen(pal) || '>>');
|
|
p_putstream(pal);
|
|
p_out('endobj');
|
|
end if;
|
|
v := images.next(v);
|
|
end loop;
|
|
exception
|
|
when others then
|
|
error('p_putimages : '||sqlerrm);
|
|
end p_putimages;
|
|
|
|
|
|
procedure jsSet(theJs varchar2) is
|
|
begin
|
|
|
|
jsIncluded := true;
|
|
jsStr := theJs;
|
|
|
|
end;
|
|
|
|
|
|
procedure jsAutoPrint(silent boolean default false, closeWindow boolean default false) is
|
|
printArgs varchar2(130);
|
|
begin
|
|
|
|
-- note about silent printing: adobe just changed how silent printing works,
|
|
-- there is a way to do it...i will code it soon
|
|
|
|
if silent then printArgs := '{bUI: true, bSilent: true}'; end if;
|
|
|
|
--
|
|
-- to close window, create closeit.html put in root dir:
|
|
-- closeit.html: <html><head><script>window.close();</script></head></html>
|
|
--
|
|
|
|
if closeWindow then
|
|
jsSet('this.print('||printArgs||'); this.getURL("/closeit.html", false);');
|
|
else
|
|
jsSet('this.print('||printArgs||');');
|
|
end if;
|
|
|
|
|
|
end;
|
|
|
|
|
|
procedure jsAddTodoc is
|
|
begin
|
|
|
|
p_newobj();
|
|
jsNbr := n;
|
|
p_out('<<');
|
|
p_out('/Names [(EmbeddedJS) '|| to_char(n+1) ||' 0 R]');
|
|
p_out('>>');
|
|
p_out('endobj');
|
|
|
|
p_newobj();
|
|
p_out('<<');
|
|
p_out('/S /JavaScript');
|
|
p_out('/JS '||p_textstring(jsStr));
|
|
p_out('>>');
|
|
p_out('endobj');
|
|
|
|
end;
|
|
|
|
----------------------------------------------------------------------------------------
|
|
procedure p_putresources is
|
|
begin
|
|
p_putfonts();
|
|
p_putimages();
|
|
|
|
if jsIncluded then jsAddTodoc; end if;
|
|
|
|
-- Resource dictionary
|
|
offsets(2):= getPDFDocLength();
|
|
p_out('2 0 obj');
|
|
p_out('<<');
|
|
p_putresourcedict();
|
|
p_out('>>');
|
|
p_out('endobj');
|
|
|
|
|
|
exception
|
|
when others then
|
|
error('p_putresources : '||sqlerrm);
|
|
end p_putresources;
|
|
|
|
----------------------------------------------------------------------------------------
|
|
procedure p_putinfo is
|
|
begin
|
|
p_out('/Producer ' || p_textstring('PL_FPDF ' || PL_FPDF_VERSION || ' portage pour Laclasse.com par P.G. Levallois de la version '|| FPDF_VERSION ||' de PHP/FPDF d''Olivier Plathey.'));
|
|
if(not empty(title)) then
|
|
p_out('/Title ' || p_textstring(title));
|
|
end if;
|
|
if(not empty(subject)) then
|
|
p_out('/Subject ' || p_textstring(subject));
|
|
end if;
|
|
if(not empty(author)) then
|
|
p_out('/Author ' || p_textstring(author));
|
|
end if;
|
|
if(not empty(keywords)) then
|
|
p_out('/Keywords ' || p_textstring(keywords));
|
|
end if;
|
|
if(not empty(creator)) then
|
|
p_out('/Creator ' || p_textstring(creator));
|
|
end if;
|
|
p_out('/CreationDate ' || p_textstring('D:' || date_YmdHis()));
|
|
exception
|
|
when others then
|
|
error('p_putinfo : '||sqlerrm);
|
|
end p_putinfo;
|
|
|
|
----------------------------------------------------------------------------------------
|
|
procedure p_putcatalog is
|
|
begin
|
|
p_out('/Type /Catalog');
|
|
p_out('/Pages 1 0 R');
|
|
|
|
if(ZoomMode='fullpage') then
|
|
p_out('/OpenAction [3 0 R /Fit]');
|
|
elsif(ZoomMode='fullwidth') then
|
|
p_out('/OpenAction [3 0 R /FitH null]');
|
|
elsif(ZoomMode='real') then
|
|
p_out('/OpenAction [3 0 R /XYZ null null 1]');
|
|
elsif(not is_string(ZoomMode)) then
|
|
p_out('/OpenAction [3 0 R /XYZ null null ' || (ZoomMode/100) || ']');
|
|
end if;
|
|
if(LayoutMode='single') then
|
|
p_out('/PageLayout /SinglePage');
|
|
elsif(LayoutMode='continuous') then
|
|
p_out('/PageLayout /OneColumn');
|
|
elsif(LayoutMode='two') then
|
|
p_out('/PageLayout /TwoColumnLeft');
|
|
end if;
|
|
|
|
if jsIncluded then p_out('/Names <</JavaScript '||jsNbr||' 0 R>>'); end if;
|
|
|
|
|
|
|
|
exception
|
|
when others then
|
|
error('p_putcatalog : '||sqlerrm);
|
|
end p_putcatalog;
|
|
|
|
|
|
----------------------------------------------------------------------------------------
|
|
procedure p_putheader is
|
|
begin
|
|
p_out('%PDF-' || PDFVersion);
|
|
end p_putheader;
|
|
|
|
|
|
----------------------------------------------------------------------------------------
|
|
procedure p_puttrailer is
|
|
begin
|
|
p_out('/Size ' || (n+1));
|
|
p_out('/Root ' || n || ' 0 R');
|
|
p_out('/Info ' || (n-1) || ' 0 R');
|
|
end p_puttrailer;
|
|
|
|
----------------------------------------------------------------------------------------
|
|
procedure p_endpage is
|
|
begin
|
|
-- End of page contents
|
|
state:=1;
|
|
end p_endpage;
|
|
|
|
----------------------------------------------------------------------------------------
|
|
procedure p_putpages is
|
|
nb number := page;
|
|
filter varchar2(200);
|
|
annots bigtext;
|
|
rect txt;
|
|
l number;
|
|
h number;
|
|
kids txt;
|
|
v_0 varchar2(255);
|
|
v_1 varchar2(255);
|
|
v_2 varchar2(255);
|
|
v_3 varchar2(255);
|
|
v_4 varchar2(255);
|
|
v_0n number;
|
|
v_1n number;
|
|
v_2n number;
|
|
v_3n number;
|
|
begin
|
|
-- Replace number of pages
|
|
if not empty(AliasNbPages) then
|
|
for i in 1..nb loop
|
|
pages(i) := str_replace(AliasNbPages,nb,pages(i));
|
|
end loop;
|
|
end if;
|
|
|
|
if DefOrientation = 'P' then
|
|
wPt:=fwPt;
|
|
hPt:=fhPt;
|
|
else
|
|
wPt:=fhPt;
|
|
hPt:=fwPt;
|
|
end if;
|
|
|
|
if (b_compress) then
|
|
filter := '/Filter /FlateDecode ';
|
|
else
|
|
filter := '';
|
|
end if;
|
|
|
|
for i in 1..nb loop
|
|
-- Page
|
|
p_newobj();
|
|
p_out('<</Type /Page');
|
|
p_out('/Parent 1 0 R');
|
|
if(OrientationChanges.exists(i)) then
|
|
p_out('/MediaBox [0 0 '||tochar(hPt)||' '||tochar(wPt)||']');
|
|
end if;
|
|
p_out('/Resources 2 0 R');
|
|
|
|
annots := '/Annots [';
|
|
if PageLinks.count > 0 then
|
|
for j in 1..PageLinks.last loop
|
|
if(nvl(PageLinks(j).page,0)=i) then
|
|
v_0 := PageLinks(j).zero;
|
|
v_0n := tonumber(v_0);
|
|
v_1 := PageLinks(j).un;
|
|
v_1n := tonumber(v_1);
|
|
v_2 := PageLinks(j).deux;
|
|
v_2n := tonumber(v_2);
|
|
v_3 := PageLinks(j).trois;
|
|
v_3n := tonumber(v_3);
|
|
v_4 := PageLinks(j).quatre;
|
|
rect := tochar(v_0) || ' ' || tochar(v_1) || ' ' || tochar(v_0n + v_2n)
|
|
|| ' ' || tochar(v_1n - v_3n);
|
|
annots := annots || '<</Type /Annot /Subtype /Link /Rect [' || rect ||
|
|
'] /Border [0 0 0] ';
|
|
if is_string(PageLinks(j).quatre) then
|
|
annots := annots ||'/A <</S /URI /URI '||p_textstring(PageLinks(j).quatre)
|
|
|| '>>>>';
|
|
else
|
|
if (OrientationChanges(PageLinks(j).zero) is not null) then
|
|
h := wPt;
|
|
else
|
|
h := hPt;
|
|
end if;
|
|
annots := annots || '/Dest ['||to_char(3+2*(links(PageLinks(j).quatre).zero-1))||' 0 R /XYZ 0 '||
|
|
to_char(links(PageLinks(j).quatre).un)||' null]>>';
|
|
end if;
|
|
end if;
|
|
end loop;
|
|
|
|
--end loop of PageLinks;
|
|
p_out(annots || ']');
|
|
end if;
|
|
p_out('/Contents ' || to_char(n+1) || ' 0 R>>');
|
|
p_out('endobj');
|
|
-- Page content
|
|
-- Pas de compression : oracle ne sait pas faire.
|
|
p_newobj();
|
|
p_out('<<' || filter || '/Length ' || strlen(pages(i)) || '>>');
|
|
p_putstream(pages(i));
|
|
p_out('endobj');
|
|
end loop;
|
|
|
|
-- Pages root
|
|
offsets(1):=getPDFDocLength();
|
|
p_out('1 0 obj');
|
|
p_out('<</Type /Pages');
|
|
kids := '/Kids [';
|
|
-- Bug dicoverd by Alexandre : arodichevski@newmed.net
|
|
--for i in 0..nb loop
|
|
for i in 0..nb-1 loop
|
|
kids := kids || to_char(3+2*i) || ' 0 R ';
|
|
end loop;
|
|
p_out( kids || ']');
|
|
p_out('/Count '|| nb);
|
|
p_out('/MediaBox [0 0 '||tochar(wPt)||' '||tochar(hPt)||']');
|
|
p_out('>>');
|
|
p_out('endobj');
|
|
|
|
exception
|
|
when others then
|
|
error('p_putpages : '||sqlerrm);
|
|
|
|
end p_putpages;
|
|
|
|
----------------------------------------------------------------------------------------
|
|
procedure p_enddoc is
|
|
o number;
|
|
begin
|
|
p_putheader();
|
|
p_putpages();
|
|
p_putresources();
|
|
-- Info
|
|
p_newobj();
|
|
p_out('<<');
|
|
p_putinfo();
|
|
p_out('>>');
|
|
p_out('endobj');
|
|
-- Catalog
|
|
p_newobj();
|
|
p_out('<<');
|
|
p_putcatalog();
|
|
p_out('>>');
|
|
p_out('endobj');
|
|
-- Cross-ref
|
|
o := getPDFDocLength();
|
|
p_out('xref');
|
|
p_out('0 ' || (n+1));
|
|
p_out('0000000000 65535 f ');
|
|
for i in 1..n
|
|
loop
|
|
p_out(substr('0000000000', 1, 10 - length(offsets(i)) ) ||offsets(i) || ' 00000 n ');
|
|
end loop;
|
|
-- Trailer
|
|
p_out('trailer');
|
|
p_out('<<');
|
|
p_puttrailer();
|
|
p_out('>>');
|
|
p_out('startxref');
|
|
p_out(o);
|
|
p_out('%%EOF');
|
|
state := 3;
|
|
exception
|
|
when others then
|
|
error('p_enddoc : '||sqlerrm);
|
|
end p_enddoc;
|
|
|
|
----------------------------------------------------------------------------------------
|
|
procedure p_beginpage(orientation varchar2) is
|
|
Myorientation word := orientation;
|
|
begin
|
|
page := page + 1;
|
|
pages(page):='';
|
|
state:=2;
|
|
x:=lMargin;
|
|
y:=tMargin;
|
|
FontFamily:='';
|
|
-- Page orientation
|
|
if(empty(Myorientation)) then
|
|
Myorientation:=DefOrientation;
|
|
else
|
|
Myorientation := substr(Myorientation, 1, 1);
|
|
Myorientation:=strtoupper(Myorientation);
|
|
if(Myorientation!=DefOrientation) then
|
|
OrientationChanges(page):=true;
|
|
end if;
|
|
end if;
|
|
if(Myorientation!=CurOrientation) then
|
|
-- Change orientation
|
|
if(orientation='P') then
|
|
wPt:=fwPt;
|
|
hPt:=fhPt;
|
|
w:=fw;
|
|
h:=fh;
|
|
else
|
|
wPt:=fhPt;
|
|
hPt:=fwPt;
|
|
w:=fh;
|
|
h:=fw;
|
|
end if;
|
|
pageBreakTrigger:=h-bMargin;
|
|
CurOrientation:=Myorientation;
|
|
end if;
|
|
exception
|
|
when others then
|
|
error('p_beginpage : '||sqlerrm);
|
|
end p_beginpage;
|
|
|
|
----------------------------------------------------------------------------------------
|
|
function p_dounderline(px number,py number,ptxt varchar2) return varchar2 is
|
|
up word := CurrentFont.up;
|
|
ut word := CurrentFont.ut;
|
|
w number := 0;
|
|
begin
|
|
w:=GetStringWidth(ptxt) + ws * substr_count(ptxt,' ');
|
|
return tochar(px*k,2)||' '||tochar((h-(py-up/1000*fontsize))*k,2)||' '||tochar(w*k,2)||' '||tochar(-ut/1000*fontsizePt,2)||' re f';
|
|
exception
|
|
when others then
|
|
error('p_dounderline : '||sqlerrm);
|
|
end p_dounderline;
|
|
|
|
|
|
--------------------------------------------------------------------------------
|
|
-- Function to convert a binary unsigned integer
|
|
-- into a PLSQL number
|
|
--------------------------------------------------------------------------------
|
|
function p_freadint( p_data in varchar2 ) return number
|
|
is
|
|
l_number number default 0;
|
|
l_bytes number default length(p_data);
|
|
big_endian constant boolean default true;
|
|
begin
|
|
if (big_endian)
|
|
then
|
|
for i in 1 .. l_bytes loop
|
|
l_number := l_number +
|
|
ascii(substr(p_data,i,1)) *
|
|
power(2,8*(i-1));
|
|
end loop;
|
|
else
|
|
for i in 1 .. l_bytes loop
|
|
l_number := l_number +
|
|
ascii(substr(p_data,l_bytes-i+1,1)) *
|
|
power(2,8*(i-1));
|
|
end loop;
|
|
end if;
|
|
|
|
return l_number;
|
|
end p_freadint;
|
|
|
|
|
|
/*
|
|
--------------------------------------------------------------------------------
|
|
-- Parse an image
|
|
--------------------------------------------------------------------------------
|
|
function p_parseImage(pFile varchar2) return recImage is
|
|
myImg ordsys.ordImage := ordsys.ordImage.init();
|
|
myImgInfo recImage;
|
|
myCtFormat word;
|
|
-- colspace word;
|
|
myblob blob;
|
|
png_signature constant varchar2(8) := chr(137) || 'PNG' || chr(13) || chr(10) || chr(26) || chr(10);
|
|
amount number;
|
|
f number default 1;
|
|
buf varchar2(8192);
|
|
bufRaw raw(32000);
|
|
amount_rd number;
|
|
amount_wr number;
|
|
offset_rd number;
|
|
offset_wr number;
|
|
ct word;
|
|
colors pls_integer;
|
|
n number;
|
|
myType word;
|
|
-- NullTabN tn;
|
|
imgDataStartsHere number;
|
|
imgDataStopsHere number;
|
|
nb_chuncks number;
|
|
---------------------------------------------------------------------------------------------
|
|
function freadb(pBlob in out nocopy blob, pHandle in out number, pLength in out number) return raw is
|
|
l_data_raw raw(8192);
|
|
l_hdr_size number default 2000;
|
|
begin
|
|
dbms_lob.read(pBlob, pLength, pHandle, l_data_raw);
|
|
pHandle := pHandle + pLength;
|
|
return l_data_raw;
|
|
end freadb;
|
|
|
|
function fread(pBlob in out nocopy blob, pHandle in out number, pLength in out number) return varchar2 is
|
|
begin
|
|
return utl_raw.cast_to_varchar2(freadb(pBlob, pHandle, pLength));
|
|
end fread;
|
|
|
|
---------------------------------------------------------------------------------------------
|
|
|
|
begin
|
|
myImgInfo.data := empty_blob();
|
|
myImg := getImageFromUrl(pFile);
|
|
myCtFormat := myImg.getContentFormat();
|
|
myblob := myImg.getContent();
|
|
myImgInfo.i := 1;
|
|
-- reading the blob
|
|
amount := 8;
|
|
--Check signature
|
|
if(fread(myblob, f, amount) != png_signature ) then
|
|
Error('Not a PNG file: ' || pFile);
|
|
end if;
|
|
|
|
-- Read header chunk
|
|
amount := 4;
|
|
buf := fread(myblob, f, amount);
|
|
|
|
buf := fread(myblob, f, amount);
|
|
if(buf != 'IHDR') then
|
|
Error('Incorrect PNG file: ' || pFile);
|
|
end if;
|
|
|
|
myImgInfo.w := myImg.getWidth();
|
|
myImgInfo.h := myImg.getHeight();
|
|
|
|
-- ^^^ I have already get width and height, so go forward (read 4 Bytes twice)
|
|
buf := fread(myblob, f, amount);
|
|
buf := fread(myblob, f, amount);
|
|
|
|
amount := 1;
|
|
|
|
myImgInfo.bpc := ord(fread(myblob, f, amount));
|
|
if( myImgInfo.bpc > 8) then
|
|
Error('16-bit depth not supported: ' || pFile);
|
|
end if;
|
|
|
|
ct := ord(fread(myblob, f, amount));
|
|
if( ct = 0 ) then
|
|
myImgInfo.cs := 'DeviceGray';
|
|
elsif( ct = 2 ) then
|
|
myImgInfo.cs := 'DeviceRGB';
|
|
elsif( ct = 3 ) then
|
|
myImgInfo.cs := 'Indexed';
|
|
else
|
|
Error('Alpha channel not supported: ' || pFile);
|
|
end if;
|
|
if( ord(fread(myblob, f, amount)) != 0 ) then
|
|
Error('Unknown compression method: ' || pFile);
|
|
end if;
|
|
if( ord(fread(myblob, f, amount)) != 0 ) then
|
|
Error('Unknown filter method: ' || pFile);
|
|
end if;
|
|
if( ord(fread(myblob, f, amount)) != 0 ) then
|
|
Error('Interlacing not supported: ' || pFile);
|
|
end if;
|
|
|
|
amount := 4;
|
|
buf := fread(myblob, f, amount);
|
|
|
|
if (ct = 2 ) then
|
|
colors := 3;
|
|
else
|
|
colors := 1;
|
|
end if;
|
|
|
|
myImgInfo.parms := '/DecodeParms <</Predictor 15 /Colors ' || to_char(colors) || ' /BitsPerComponent ' || myImgInfo.bpc || ' /Columns ' || myImgInfo.w || '>>';
|
|
-- scan chunks looking for palette, transparency and image data
|
|
loop
|
|
amount := 4;
|
|
n := utl_raw.cast_to_binary_integer(freadb(myblob, f, amount));
|
|
myType := fread(myblob, f, amount);
|
|
if(myType = 'PLTE') then
|
|
-- Read palette
|
|
amount := n;
|
|
myImgInfo.pal := fread(myblob, f, amount);
|
|
amount := 4;
|
|
buf := fread(myblob, f, amount);
|
|
elsif(myType = 'tRNS') then
|
|
-- Read transparency info
|
|
amount := n;
|
|
buf := fread(myblob, f, amount);
|
|
if(ct = 0) then
|
|
myImgInfo.trns(1) := ord(substr(buf,1,1));
|
|
elsif( ct = 2) then
|
|
myImgInfo.trns(1) := ord(substr(buf,1,1));
|
|
myImgInfo.trns(2) := ord(substr(buf,3,1));
|
|
myImgInfo.trns(3) := ord(substr(buf,5,1));
|
|
else
|
|
if(instr(buf,chr(0)) > 0) then
|
|
myImgInfo.trns(1) := instr(buf,chr(0));
|
|
end if;
|
|
end if;
|
|
amount := 4;
|
|
buf := fread(myblob, f, amount);
|
|
elsif(myType = 'IDAT') then
|
|
-- Read image data block after the loop, just mark the begin of data
|
|
imgDataStartsHere := f;
|
|
exit;
|
|
elsif(myType = 'IEND') then
|
|
|
|
exit;
|
|
else
|
|
amount := n + 4;
|
|
buf := fread(myblob, f, amount);
|
|
end if;
|
|
exit when n is null or n = 0;
|
|
end loop;
|
|
|
|
imgDataStopsHere := dbms_lob.instr(myblob, utl_raw.cast_to_raw('IEND'),1,1);
|
|
-- copy image in the structure.
|
|
amount_rd := 8192;
|
|
amount_wr := 8192;
|
|
offset_rd := 1;
|
|
offset_wr := 1;
|
|
nb_chuncks := ceil(((imgDataStopsHere - imgDataStartsHere)) / amount_rd);
|
|
dbms_lob.createtemporary(myImgInfo.data, true);
|
|
for i in 1..nb_chuncks loop
|
|
offset_rd := imgDataStartsHere + ((i - 1) * amount_rd);
|
|
|
|
dbms_lob.read(myblob, amount_rd, offset_rd, bufRaw);
|
|
offset_wr := ((i - 1) * amount_wr) + 1;
|
|
amount_wr := amount_rd;
|
|
dbms_lob.write(myImgInfo.data, amount_wr, offset_wr, bufRaw);
|
|
end loop;
|
|
if( myImgInfo.cs = 'Indexed' and myImgInfo.pal is null) then
|
|
Error('Missing palette in '|| pFile);
|
|
end if;
|
|
myImgInfo.f := 'FlateDecode';
|
|
return myImgInfo;
|
|
exception
|
|
when others then
|
|
Error('p_parseImage : '||SQLERRM);
|
|
return myImgInfo;
|
|
end p_parseImage;
|
|
|
|
*/
|
|
|
|
--------------------------------------------------------------------------------
|
|
-- Parse an image
|
|
--------------------------------------------------------------------------------
|
|
function p_parseImage(pFile varchar2) return recImage is
|
|
myImg ordsys.ordImage := ordsys.ordImage.init();
|
|
myImgInfo recImage;
|
|
myCtFormat word;
|
|
colspace word;
|
|
myblob blob;
|
|
chunk_content blob;
|
|
png_signature constant varchar2(8) := chr(137) || 'PNG' || chr(13) || chr(10) || chr(26) || chr(10);
|
|
signature_len integer := 8;
|
|
chunklength_len integer := 4;
|
|
chunktype_len integer := 4;
|
|
chunkdata_len integer;
|
|
widthheight_len integer := 8;
|
|
hdrflag_len integer := 1;
|
|
crc_len integer := 4;
|
|
chunk_num integer := 0;
|
|
--amount number;
|
|
f number default 1;
|
|
f_chunk number default 1;
|
|
buf varchar2(8192);
|
|
ct word;
|
|
colors pls_integer;
|
|
n number;
|
|
myType word;
|
|
NullTabN tn;
|
|
imgDataStartsHere number;
|
|
imgDataStopsHere number;
|
|
nb_chuncks number;
|
|
---------------------------------------------------------------------------------------------
|
|
function freadb(pBlob in out nocopy blob, pHandle in out number, pLength in out number) return raw is
|
|
l_data_raw raw(8192);
|
|
l_hdr_size number default 2000;
|
|
begin
|
|
dbms_lob.read(pBlob, pLength, pHandle, l_data_raw);
|
|
pHandle := pHandle + pLength;
|
|
return l_data_raw;
|
|
end freadb;
|
|
|
|
function fread(pBlob in out nocopy blob, pHandle in out number, pLength in out number) return varchar2 is
|
|
begin
|
|
return utl_raw.cast_to_varchar2(freadb(pBlob, pHandle, pLength));
|
|
end fread;
|
|
|
|
procedure fread_blob(pBlob in out nocopy blob, pHandle in out number,
|
|
pLength in out number, pDestBlob in out nocopy blob ) is
|
|
begin
|
|
dbms_lob.trim( pDestBlob, 0);
|
|
dbms_lob.copy( pDestBlob, pBlob, pLength, 1, pHandle );
|
|
pHandle := pHandle + pLength;
|
|
end fread_blob;
|
|
|
|
---------------------------------------------------------------------------------------------
|
|
|
|
begin
|
|
dbms_lob.createtemporary(chunk_content, true );
|
|
dbms_lob.open(chunk_content,dbms_lob.LOB_READWRITE);
|
|
--we use the package level imgBlob variable so the temp blob will persist throughout pdf creation.
|
|
dbms_lob.createtemporary(imgBlob, true );
|
|
myImgInfo.data := imgBlob;
|
|
dbms_lob.open(myImgInfo.data,dbms_lob.LOB_READWRITE);
|
|
myImg := getImageFromUrl(pFile);
|
|
myCtFormat := myImg.getContentFormat();
|
|
myblob := myImg.getContent();
|
|
myImgInfo.i := 1;
|
|
-- reading the blob
|
|
|
|
--Check signature
|
|
if(fread(myblob, f, signature_len) != png_signature ) then
|
|
Error('Not a PNG file: ' || pFile);
|
|
end if;
|
|
|
|
myImgInfo.w := myImg.getWidth();
|
|
myImgInfo.h := myImg.getHeight();
|
|
|
|
-- scan chunks looking for palette, transparency and image data
|
|
loop
|
|
|
|
chunkdata_len := utl_raw.cast_to_binary_integer(freadb(myblob, f, chunklength_len));
|
|
myType := fread(myblob, f, chunktype_len);
|
|
--read chunk contents into separate blob
|
|
if( chunkdata_len > 0 ) then
|
|
fread_blob(myblob,f,chunkdata_len,chunk_content);
|
|
f_chunk := 1;
|
|
end if;
|
|
chunk_num := chunk_num + 1;
|
|
--discard the crc
|
|
buf := fread(myblob, f, crc_len);
|
|
if( chunk_num = 1 and myType != 'IHDR' ) then
|
|
Error('Incorrect PNG file: ' || pFile);
|
|
elsif(myType = 'IHDR') then
|
|
-- ^^^ I have already get width and height, so go forward (read 4 Bytes twice)
|
|
buf := fread(chunk_content, f_chunk, widthheight_len);
|
|
|
|
myImgInfo.bpc := ord(fread(chunk_content, f_chunk, hdrflag_len));
|
|
if( myImgInfo.bpc > 8) then
|
|
Error('16-bit depth not supported: ' || pFile);
|
|
end if;
|
|
|
|
ct := ord(fread(chunk_content, f_chunk, hdrflag_len));
|
|
if( ct = 0 ) then
|
|
myImgInfo.cs := 'DeviceGray';
|
|
elsif( ct = 2 ) then
|
|
myImgInfo.cs := 'DeviceRGB';
|
|
elsif( ct = 3 ) then
|
|
myImgInfo.cs := 'Indexed';
|
|
else
|
|
Error('Alpha channel not supported: ' || pFile);
|
|
end if;
|
|
if( ord(fread(chunk_content, f_chunk, hdrflag_len)) != 0 ) then
|
|
Error('Unknown compression method: ' || pFile);
|
|
end if;
|
|
if( ord(fread(chunk_content, f_chunk, hdrflag_len)) != 0 ) then
|
|
Error('Unknown filter method: ' || pFile);
|
|
end if;
|
|
if( ord(fread(chunk_content, f_chunk, hdrflag_len)) != 0 ) then
|
|
Error('Interlacing not supported: ' || pFile);
|
|
end if;
|
|
if (ct = 2 ) then
|
|
colors := 3;
|
|
else
|
|
colors := 1;
|
|
end if;
|
|
|
|
myImgInfo.parms := '/DecodeParms <</Predictor 15 /Colors ' || to_char(colors) || ' /BitsPerComponent ' || myImgInfo.bpc || ' /Columns ' || myImgInfo.w || '>>';
|
|
|
|
elsif(myType = 'PLTE') then
|
|
-- Read palette
|
|
myImgInfo.pal := fread(chunk_content, f_chunk, chunkdata_len ) ;
|
|
elsif(myType = 'tRNS') then
|
|
-- Read transparency info
|
|
buf := fread(chunk_content, f_chunk, chunkdata_len ) ;
|
|
if(ct = 0) then
|
|
myImgInfo.trns(1) := ord(substr(buf,1,1));
|
|
elsif( ct = 2) then
|
|
myImgInfo.trns(1) := ord(substr(buf,1,1));
|
|
myImgInfo.trns(2) := ord(substr(buf,3,1));
|
|
myImgInfo.trns(3) := ord(substr(buf,5,1));
|
|
else
|
|
if(instr(buf,chr(0)) > 0) then
|
|
myImgInfo.trns(1) := instr(buf,chr(0));
|
|
end if;
|
|
end if;
|
|
elsif(myType = 'IDAT') then
|
|
-- Read image data block after the loop, just mark the begin of data
|
|
dbms_lob.append(myImgInfo.data,chunk_content);
|
|
elsif(myType = 'IEND') then
|
|
exit;
|
|
end if;
|
|
end loop;
|
|
|
|
if( myImgInfo.cs = 'Indexed' and myImgInfo.pal is null) then
|
|
Error('Missing palette in '|| pFile);
|
|
end if;
|
|
myImgInfo.f := 'FlateDecode';
|
|
dbms_lob.close(chunk_content);
|
|
dbms_lob.close(myImgInfo.data);
|
|
dbms_lob.freetemporary(chunk_content);
|
|
return myImgInfo;
|
|
exception
|
|
when others then
|
|
Error('p_parseImage : '||SQLERRM);
|
|
return myImgInfo;
|
|
end p_parseImage;
|
|
|
|
|
|
/*******************************************************************************
|
|
* *
|
|
* Public methods *
|
|
* *
|
|
********************************************************************************/
|
|
|
|
----------------------------------------------------------------------------------------
|
|
-- Methods added to FPDF primary class
|
|
----------------------------------------------------------------------------------------
|
|
----------------------------------------------------------------------------------------
|
|
-- SetDash Ecrire en pointillés
|
|
----------------------------------------------------------------------------------------
|
|
procedure SetDash(pblack number default 0, pwhite number default 0) is
|
|
s txt;
|
|
begin
|
|
if(pblack != 0 or pwhite != 0) then
|
|
s := '['||tochar(pblack*k, 3)||' '||tochar( pwhite*k, 3)||'] 0 d';
|
|
else
|
|
s := '[] 0 d';
|
|
end if;
|
|
p_out(s);
|
|
end SetDash;
|
|
|
|
----------------------------------------------------------------------------------------
|
|
-- Methods from FPDF primary class
|
|
----------------------------------------------------------------------------------------
|
|
----------------------------------------------------------------------------------------
|
|
procedure Error(pmsg varchar2) is
|
|
begin
|
|
if gb_mode_debug then
|
|
print('<pre>');
|
|
for i in pdfDoc.first..pdfDoc.last loop
|
|
if i is not null then
|
|
print(replace(replace(pdfDoc(i),'>','>'),'<','<'));
|
|
end if;
|
|
end loop;
|
|
print('</pre>');
|
|
end if;
|
|
-- Fatal error
|
|
raise_application_error(-20100,'<B>PL_FPDF error: </B>'|| pmsg);
|
|
end Error;
|
|
|
|
----------------------------------------------------------------------------------------
|
|
function GetCurrentFontSize return number is
|
|
begin
|
|
-- Get fontsizePt
|
|
return fontsizePt;
|
|
end GetCurrentFontSize;
|
|
|
|
----------------------------------------------------------------------------------------
|
|
function GetCurrentFontStyle return varchar2 is
|
|
begin
|
|
-- Get fontStyle
|
|
return fontStyle;
|
|
end GetCurrentFontStyle;
|
|
|
|
----------------------------------------------------------------------------------------
|
|
function GetCurrentFontFamily return varchar2 is
|
|
begin
|
|
-- Get fontStyle
|
|
return FontFamily;
|
|
end GetCurrentFontFamily;
|
|
|
|
|
|
----------------------------------------------------------------------------------------
|
|
procedure Ln(h number default null) is
|
|
begin
|
|
-- Line feed; default value is last cell height
|
|
x :=lMargin;
|
|
if(is_string(h)) then
|
|
y:= y + lasth;
|
|
else
|
|
y:= y + h;
|
|
end if;
|
|
end Ln;
|
|
|
|
----------------------------------------------------------------------------------------
|
|
function GetX return number is
|
|
begin
|
|
-- Get x position
|
|
return x;
|
|
end GetX;
|
|
|
|
----------------------------------------------------------------------------------------
|
|
procedure SetX(px number) is
|
|
begin
|
|
-- Set x position
|
|
if(px>=0) then
|
|
x:=px;
|
|
else
|
|
x:=w+px;
|
|
end if;
|
|
end SetX;
|
|
|
|
----------------------------------------------------------------------------------------
|
|
function GetY return number is
|
|
begin
|
|
-- Get y position
|
|
return y;
|
|
end GetY;
|
|
|
|
----------------------------------------------------------------------------------------
|
|
procedure SetY(py number) is
|
|
begin
|
|
-- Set y position and reset x
|
|
x:=lMargin;
|
|
if(py>=0) then
|
|
y:=py;
|
|
else
|
|
y:=h+py;
|
|
end if;
|
|
end SetY;
|
|
|
|
----------------------------------------------------------------------------------------
|
|
procedure SetXY(x number,y number) is
|
|
begin
|
|
-- Set x and y positions
|
|
SetY(y);
|
|
SetX(x);
|
|
end SetXY;
|
|
|
|
----------------------------------------------------------------------------------------
|
|
-- SetHeaderProc : setting header Callback
|
|
----------------------------------------------------------------------------------------
|
|
procedure SetHeaderProc(headerprocname in varchar2, paramTable tv4000a default noParam) is
|
|
begin
|
|
MyHeader_Proc := headerprocname;
|
|
MyHeader_ProcParam := paramTable;
|
|
end;
|
|
|
|
----------------------------------------------------------------------------------------
|
|
-- SetFooterProc : setting footer Callback
|
|
----------------------------------------------------------------------------------------
|
|
procedure SetFooterProc(footerprocname in varchar2, paramTable tv4000a default noParam) is
|
|
begin
|
|
MyFooter_Proc := footerprocname;
|
|
MyFooter_ProcParam := paramTable;
|
|
end;
|
|
|
|
----------------------------------------------------------------------------------------
|
|
procedure SetMargins(left number,top number ,right number default -1) is
|
|
myright margin := right;
|
|
begin
|
|
-- Set left, top and right margins
|
|
lMargin:=left;
|
|
tMargin:=top;
|
|
if(myright=-1) then
|
|
myright:=left;
|
|
end if;
|
|
rMargin:=myright;
|
|
end SetMargins;
|
|
|
|
----------------------------------------------------------------------------------------
|
|
procedure SetLeftMargin( pMargin number) is
|
|
begin
|
|
-- Set left margin
|
|
lMargin:=pMargin;
|
|
if(page > 0 and x < pMargin) then
|
|
x:= pMargin;
|
|
end if;
|
|
end SetLeftMargin;
|
|
|
|
----------------------------------------------------------------------------------------
|
|
procedure SetTopMargin(pMargin number) is
|
|
begin
|
|
-- Set top margin
|
|
tMargin := pMargin;
|
|
end SetTopMargin;
|
|
|
|
----------------------------------------------------------------------------------------
|
|
procedure SetRightMargin(pMargin number) is
|
|
begin
|
|
-- Set right margin
|
|
rMargin := pMargin;
|
|
end SetRightMargin;
|
|
|
|
----------------------------------------------------------------------------------------
|
|
procedure SetAutoPageBreak(pauto boolean, pMargin number default 0) is
|
|
begin
|
|
-- Set auto page break mode and triggering margin
|
|
AutoPageBreak := pauto;
|
|
bMargin := pMargin;
|
|
pageBreakTrigger:=h-pMargin;
|
|
end SetAutoPageBreak;
|
|
|
|
----------------------------------------------------------------------------------------
|
|
procedure SetDisplayMode(zoom varchar2,layout varchar2 default 'continuous') is
|
|
begin
|
|
-- Set display mode in viewer
|
|
if(zoom in ('fullpage', 'fullwidth', 'real', 'default') or not is_string(zoom)) then
|
|
ZoomMode:= zoom;
|
|
else
|
|
Error('Incorrect zoom display mode: ' || zoom);
|
|
end if;
|
|
if(layout in ('single', 'continuous', 'two', 'default')) then
|
|
LayoutMode := layout;
|
|
else
|
|
Error('Incorrect layout display mode: ' || layout);
|
|
end if;
|
|
end SetDisplayMode;
|
|
|
|
----------------------------------------------------------------------------------------
|
|
procedure SetCompression(p_compress boolean default false) is
|
|
begin
|
|
-- Set page compression
|
|
if(function_exists('gzcompress')) then
|
|
b_compress:=p_compress;
|
|
else
|
|
b_compress:=false;
|
|
end if;
|
|
end SetCompression;
|
|
|
|
----------------------------------------------------------------------------------------
|
|
procedure SetTitle(ptitle varchar2) is
|
|
begin
|
|
-- Title of document
|
|
title:=ptitle;
|
|
end SetTitle;
|
|
|
|
----------------------------------------------------------------------------------------
|
|
procedure SetSubject(psubject varchar2) is
|
|
begin
|
|
-- Subject of document
|
|
subject:= psubject;
|
|
end SetSubject;
|
|
|
|
----------------------------------------------------------------------------------------
|
|
procedure SetAuthor(pauthor varchar2) is
|
|
begin
|
|
-- Author of document
|
|
author:=pauthor;
|
|
end SetAuthor;
|
|
|
|
----------------------------------------------------------------------------------------
|
|
procedure SetKeywords(pkeywords varchar2) is
|
|
begin
|
|
-- Keywords of document
|
|
keywords:=pkeywords;
|
|
end SetKeywords;
|
|
|
|
----------------------------------------------------------------------------------------
|
|
procedure SetCreator(pcreator varchar2) is
|
|
begin
|
|
-- Creator of document
|
|
creator:=pcreator;
|
|
end SetCreator;
|
|
|
|
----------------------------------------------------------------------------------------
|
|
procedure SetAliasNbPages(palias varchar2 default '{nb}') is
|
|
begin
|
|
-- Define an alias for total number of pages
|
|
AliasNbPages:=palias;
|
|
end SetAliasNbPages;
|
|
|
|
|
|
----------------------------------------------------------------------------------------
|
|
-- buildPlsqlStatment : building the pl/lsq stmt for header or Footer hooked custom proc
|
|
-- Binding parameters and values.
|
|
----------------------------------------------------------------------------------------
|
|
function buildPlsqlStatment(callbackProc varchar2, tParam tv4000a default noParam) return varchar2 is
|
|
plsqStmt bigtext;
|
|
paramName word;
|
|
begin
|
|
if (tParam.first is not null) then
|
|
-- retrieving values of parameters to build plssql statment.
|
|
plsqStmt := 'Begin '||callbackProc||'(';
|
|
paramName := tParam.first;
|
|
while (paramName is not null) loop
|
|
if (paramName != tParam.first) then
|
|
plsqStmt := plsqStmt || ', ';
|
|
end if;
|
|
plsqStmt := plsqStmt || paramName ||'=>'''||
|
|
replace(tParam(paramName), '''', '''''')||'''';
|
|
paramName := tParam.next(paramName);
|
|
end loop;
|
|
plsqStmt := plsqStmt||'); end;';
|
|
else
|
|
plsqStmt := 'Begin '||callbackProc||'; end;';
|
|
end if;
|
|
return plsqStmt;
|
|
end buildPlsqlStatment;
|
|
|
|
----------------------------------------------------------------------------------------
|
|
-- Header : Procedure that hook the callback procedure for the repetitive header on each page;
|
|
----------------------------------------------------------------------------------------
|
|
procedure Header is
|
|
plsqStmt bigtext;
|
|
begin
|
|
-- MyHeader_Proc defined in Declaration
|
|
if (not empty(MyHeader_Proc)) then
|
|
-- building plsql stmt.
|
|
plsqStmt := buildPlsqlStatment(MyHeader_Proc, MyHeader_ProcParam);
|
|
-- Executing callback.
|
|
execute immediate plsqStmt;
|
|
end if;
|
|
exception
|
|
when others then
|
|
error('Header : '||sqlerrm||' statement : '||plsqStmt);
|
|
end Header;
|
|
|
|
----------------------------------------------------------------------------------------
|
|
-- Footer : Procedure that hook the callback procedure for the repetitive footer on each page;
|
|
----------------------------------------------------------------------------------------
|
|
procedure Footer is
|
|
plsqStmt bigtext;
|
|
begin
|
|
-- MyFooter_Proc defined in Declaration
|
|
if (not empty(MyFooter_Proc)) then
|
|
-- building plsql stmt.
|
|
plsqStmt := buildPlsqlStatment(MyFooter_Proc, MyFooter_ProcParam);
|
|
-- Executing callback.
|
|
execute immediate plsqStmt;
|
|
end if;
|
|
exception
|
|
when others then
|
|
error('Footer : '||sqlerrm||' statement : '||plsqStmt);
|
|
end Footer;
|
|
|
|
----------------------------------------------------------------------------------------
|
|
function PageNo return number is
|
|
begin
|
|
-- Get current page number
|
|
return page;
|
|
end PageNo;
|
|
|
|
----------------------------------------------------------------------------------------
|
|
procedure SetDrawColor(r number,g number default -1,b number default -1) is
|
|
begin
|
|
-- Set color for all stroking operations
|
|
if((r=0 and g=0 and b=0) or g=-1) then
|
|
DrawColor:=tochar(r/255,3)||' G';
|
|
else
|
|
DrawColor:=tochar(r/255,3) || ' ' || tochar(g/255,3) || ' ' || tochar(b/255,3) || ' RG';
|
|
end if;
|
|
if(page>0) then
|
|
p_out(DrawColor);
|
|
end if;
|
|
end SetDrawColor;
|
|
|
|
----------------------------------------------------------------------------------------
|
|
procedure SetFillColor (r number,g number default -1,b number default -1) is
|
|
begin
|
|
-- Set color for all filling operations
|
|
if((r=0 and g=0 and b=0) or g=-1) then
|
|
FillColor:=tochar(r/255,3) || ' g';
|
|
else
|
|
FillColor:=tochar(r/255,3) ||' '|| tochar(g/255,3) ||' '|| tochar(b/255,3) || ' rg';
|
|
end if;
|
|
if (FillColor!=TextColor) then
|
|
ColorFlag:=true;
|
|
else
|
|
ColorFlag:=false;
|
|
end if;
|
|
if(page>0) then
|
|
p_out(FillColor);
|
|
end if;
|
|
end SetFillColor;
|
|
|
|
----------------------------------------------------------------------------------------
|
|
procedure SetTextColor (r number,g number default -1,b number default -1) is
|
|
begin
|
|
-- Set color for text
|
|
if((r=0 and g=0 and b=0) or g=-1) then
|
|
TextColor:=tochar(r/255,3) || ' g';
|
|
else
|
|
TextColor:=tochar(r/255,3) ||' '|| tochar(g/255,3) ||' '|| tochar(b/255,3) || ' rg';
|
|
end if;
|
|
if (FillColor!=TextColor) then
|
|
ColorFlag:=true;
|
|
else
|
|
ColorFlag:=false;
|
|
end if;
|
|
end SetTextColor;
|
|
|
|
----------------------------------------------------------------------------------------
|
|
procedure SetLineWidth(width number) is
|
|
begin
|
|
-- Set line width
|
|
LineWidth:=width;
|
|
if(page>0) then
|
|
p_out(tochar(width*k,2) ||' w');
|
|
end if;
|
|
end SetLineWidth;
|
|
|
|
----------------------------------------------------------------------------------------
|
|
procedure Line(x1 number,y1 number,x2 number,y2 number) is
|
|
begin
|
|
-- Draw a line
|
|
p_out( tochar(x1*k,2) ||
|
|
' ' || tochar((h-y1)*k,2) ||
|
|
' m ' || tochar(x2*k,2) ||
|
|
' ' || tochar((h-y2)*k,2) || ' l S');
|
|
end Line;
|
|
|
|
----------------------------------------------------------------------------------------
|
|
procedure Rect(px number,py number,pw number,ph number,pstyle varchar2 default '') is
|
|
op word;
|
|
begin
|
|
-- Draw a rectangle
|
|
if(pstyle='F') then
|
|
op:='f';
|
|
elsif(pstyle='FD' or pstyle='DF') then
|
|
op:='B';
|
|
else
|
|
op:='S';
|
|
end if;
|
|
p_out(tochar(px*k,2) || ' ' || tochar((h-py)*k,2) || ' ' || tochar(pw*k,2) || ' ' || tochar(-ph*k,2) || ' re ' || op);
|
|
end Rect;
|
|
|
|
|
|
----------------------------------------------------------------------------------------
|
|
function AddLink return number is
|
|
nb_link number;
|
|
--:= links.count + 1;
|
|
begin
|
|
nb_link := nvl(links.last+1,1);
|
|
links.extend(1);
|
|
-- Create a new internal link
|
|
links(nb_link).zero := 0;
|
|
links(nb_link).un := 0;
|
|
return nb_link;
|
|
end AddLink;
|
|
|
|
----------------------------------------------------------------------------------------
|
|
procedure SetLink(plink number,py number default 0,ppage number default -1) is
|
|
mypy number := py;
|
|
myppage number := ppage;
|
|
begin
|
|
-- Set destination of internal link
|
|
if(mypy=-1) then
|
|
mypy:=y;
|
|
end if;
|
|
if(myppage=-1) then
|
|
myppage:=page;
|
|
end if;
|
|
links(plink).zero:=myppage;
|
|
links(plink).un:=mypy;
|
|
end SetLink;
|
|
|
|
----------------------------------------------------------------------------------------
|
|
procedure Link(px number,py number,pw number,ph number,plink varchar2) is
|
|
v_last_plink integer;
|
|
v_ntoextend integer;
|
|
v_rec rec5;
|
|
begin
|
|
-- Put a link on the page
|
|
|
|
v_last_plink := nvl(PageLinks.last,0);
|
|
v_ntoextend := v_last_plink+1;
|
|
PageLinks.extend(1);
|
|
-- set values
|
|
PageLinks(v_ntoextend).page:=page;
|
|
PageLinks(v_ntoextend).zero:=px*k;
|
|
PageLinks(v_ntoextend).un:=hPt-py*k;
|
|
PageLinks(v_ntoextend).deux:=pw*k;
|
|
PageLinks(v_ntoextend).trois:=ph*k;
|
|
PageLinks(v_ntoextend).quatre:=plink;
|
|
end Link;
|
|
|
|
|
|
----------------------------------------------------------------------------------------
|
|
procedure Text(px number,py number,ptxt varchar2) is
|
|
s varchar2(2000);
|
|
begin
|
|
-- Output a string
|
|
s:='BT '|| tochar(px*k,2) ||' '|| tochar((h-py)*k,2) ||' Td ('||p_escape(ptxt)||') Tj ET';
|
|
if(underline and ptxt is not null) then
|
|
s := s || ' ' || p_dounderline(px,py,ptxt);
|
|
end if;
|
|
if(ColorFlag) then
|
|
s := 'q '|| TextColor ||' ' || s || ' Q';
|
|
end if;
|
|
p_out(s);
|
|
end Text;
|
|
|
|
----------------------------------------------------------------------------------------
|
|
function AcceptPageBreak return boolean is
|
|
begin
|
|
-- Accept automatic page break or not
|
|
return AutoPageBreak;
|
|
end AcceptPageBreak;
|
|
|
|
|
|
----------------------------------------------------------------------------------------
|
|
procedure OpenPDF is
|
|
begin
|
|
-- Begin document
|
|
state:=1;
|
|
end OpenPDF;
|
|
|
|
----------------------------------------------------------------------------------------
|
|
procedure ClosePDF is
|
|
begin
|
|
-- Terminate document
|
|
if(state=3) then
|
|
return;
|
|
end if;
|
|
if(page=0) then
|
|
AddPage();
|
|
end if;
|
|
-- Page footer
|
|
InFooter:=true;
|
|
Footer();
|
|
InFooter:=false;
|
|
-- Close page
|
|
p_endpage();
|
|
-- Close document
|
|
p_enddoc();
|
|
end ClosePDF;
|
|
|
|
----------------------------------------------------------------------------------------
|
|
procedure AddPage(orientation varchar2 default '') is
|
|
myFamily txt;
|
|
myStyle txt;
|
|
mySize number := fontsizePt;
|
|
lw phrase := LineWidth;
|
|
dc phrase := DrawColor;
|
|
fc phrase := FillColor;
|
|
tc phrase := TextColor;
|
|
cf flag := ColorFlag;
|
|
|
|
begin
|
|
-- Start a new page
|
|
if(state=0) then
|
|
OpenPDF();
|
|
end if;
|
|
myFamily:= FontFamily;
|
|
if (underline) then
|
|
myStyle := FontStyle || 'U';
|
|
end if;
|
|
if(page>0) then
|
|
-- Page footer
|
|
InFooter:=true;
|
|
Footer();
|
|
InFooter:=false;
|
|
-- Close page
|
|
p_endpage();
|
|
end if;
|
|
-- Start new page
|
|
p_beginpage(orientation);
|
|
-- Set line cap style to square
|
|
p_out('2 J');
|
|
-- Set line width
|
|
LineWidth:=lw;
|
|
p_out(tochar(lw*k)||' w');
|
|
-- Set font
|
|
if(myFamily is not null) then
|
|
SetFont(myFamily,myStyle,mySize);
|
|
end if;
|
|
-- Set colors
|
|
DrawColor:=dc;
|
|
if(dc!='0 G') then
|
|
p_out(dc);
|
|
end if;
|
|
FillColor:=fc;
|
|
if(fc!='0 g') then
|
|
p_out(fc);
|
|
end if;
|
|
TextColor:= tc;
|
|
ColorFlag:= cf;
|
|
-- Page header
|
|
header();
|
|
-- Restore line width
|
|
if(LineWidth!=lw) then
|
|
LineWidth:=lw;
|
|
p_out(tochar(lw*k)||' w');
|
|
end if;
|
|
-- Restore font
|
|
|
|
if myFamily is null then
|
|
SetFont(myFamily,myStyle,mySize);
|
|
end if;
|
|
-- Restore colors
|
|
if(DrawColor!=dc) then
|
|
DrawColor:=dc;
|
|
p_out(dc);
|
|
end if;
|
|
if(FillColor!=fc) then
|
|
FillColor:=fc;
|
|
p_out(fc);
|
|
end if;
|
|
TextColor:=tc;
|
|
ColorFlag:=cf;
|
|
end AddPage;
|
|
|
|
----------------------------------------------------------------------------------------
|
|
procedure fpdf
|
|
(orientation varchar2 default 'P',
|
|
unit varchar2 default 'mm',
|
|
format varchar2 default 'A4') is
|
|
myorientation word := orientation;
|
|
myformat word := format;
|
|
mymargin margin;
|
|
begin
|
|
-- Some checks
|
|
p_dochecks();
|
|
-- Initialization of properties
|
|
page:=0;
|
|
n:=2;
|
|
-- Open the final structure for the PDF document.
|
|
pdfDoc(1) := null;
|
|
state:=0;
|
|
InFooter:=false;
|
|
lasth:=0;
|
|
--FontFamily:='';
|
|
FontFamily:='helvetica';
|
|
fontstyle:='';
|
|
fontsizePt:=12;
|
|
underline:=false;
|
|
DrawColor:='0 G';
|
|
FillColor:='0 g';
|
|
TextColor:='0 g';
|
|
ColorFlag:=false;
|
|
ws:=0;
|
|
|
|
-- Standard fonts
|
|
CoreFonts('courier') := 'Courier';
|
|
CoreFonts('courierB') := 'Courier-Bold';
|
|
CoreFonts('courierI') := 'Courier-Oblique';
|
|
CoreFonts('courierBI') := 'Courier-BoldOblique';
|
|
CoreFonts('helvetica') := 'Helvetica';
|
|
CoreFonts('helveticaB') := 'Helvetica-Bold';
|
|
CoreFonts('helveticaI') := 'Helvetica-Oblique';
|
|
CoreFonts('helveticaBI') := 'Helvetica-BoldOblique';
|
|
CoreFonts('times') := 'Times-Roman';
|
|
CoreFonts('timesB') := 'Times-Bold';
|
|
CoreFonts('timesI') := 'Times-Italic';
|
|
CoreFonts('timesBI') := 'Times-BoldItalic';
|
|
CoreFonts('symbol') := 'Symbol';
|
|
CoreFonts('zapfdingbats') := 'ZapfDingbats';
|
|
|
|
-- Scale factor
|
|
if(unit='pt') then
|
|
k:=1;
|
|
elsif(unit='mm') then
|
|
k:=72/25.4;
|
|
elsif(unit='cm') then
|
|
k:=72/2.54;
|
|
elsif(unit='in') then
|
|
k:=72;
|
|
else
|
|
Error('Incorrect unit: ' || unit);
|
|
end if;
|
|
|
|
-- Others added properties
|
|
Linespacing := fontsizePt / k; -- minimum line spacing in multicell
|
|
|
|
-- Page format
|
|
if(is_string(myformat)) then
|
|
myformat:=strtolower(myformat);
|
|
if(myformat='a3') then
|
|
formatArray.largeur := 841.89;
|
|
formatArray.hauteur := 1190.55;
|
|
elsif(myformat='a4') then
|
|
formatArray.largeur := 595.28;
|
|
formatArray.hauteur := 841.89;
|
|
elsif(myformat='a5') then
|
|
formatArray.largeur := 420.94;
|
|
formatArray.hauteur := 595.28;
|
|
elsif(myformat='letter') then
|
|
formatArray.largeur := 612;
|
|
formatArray.hauteur := 792;
|
|
elsif(myformat='legal') then
|
|
formatArray.largeur := 612;
|
|
formatArray.hauteur := 1008;
|
|
else
|
|
Error('Unknown page format: '|| myformat);
|
|
end if;
|
|
fwPt:=formatArray.largeur;
|
|
fhPt:=formatArray.hauteur;
|
|
else
|
|
fwPt:=formatArray.largeur*k;
|
|
fhPt:=formatArray.hauteur*k;
|
|
end if;
|
|
fw:=fwPt/k;
|
|
fh:=fhPt/k;
|
|
-- Page orientation
|
|
myorientation:=strtolower(myorientation);
|
|
if(myorientation='p' or myorientation='portrait') then
|
|
DefOrientation:='P';
|
|
wPt:=fwPt;
|
|
hPt:=fhPt;
|
|
elsif(myorientation='l' or myorientation='landscape') then
|
|
DefOrientation:='L';
|
|
wPt:=fhPt;
|
|
hPt:=fwPt;
|
|
else
|
|
Error('Incorrect orientation: ' || myorientation);
|
|
end if;
|
|
CurOrientation:=DefOrientation;
|
|
w:=wPt/k;
|
|
h:=hPt/k;
|
|
-- Page margins (1 cm)
|
|
mymargin:=28.35/k;
|
|
SetMargins(mymargin,mymargin);
|
|
-- Interior cell margin (1 mm)
|
|
cMargin:=mymargin/10;
|
|
-- Line width (0.2 mm)
|
|
LineWidth:=.567/k;
|
|
-- Automatic page break
|
|
SetAutoPageBreak(true,2*mymargin);
|
|
-- Full width display mode
|
|
SetDisplayMode('fullwidth');
|
|
-- Disable compression
|
|
SetCompression(false);
|
|
-- Set default PDF version number
|
|
PDFVersion:='1.3';
|
|
|
|
-- MBR 03.03.2010: re-initialize images collection
|
|
images.delete;
|
|
|
|
end fpdf;
|
|
|
|
----------------------------------------------------------------------------------------
|
|
procedure AddFont (family varchar2, style varchar2 default '',filename varchar2 default '') is
|
|
myfamily word := family;
|
|
mystyle word := style;
|
|
myfile word := filename;
|
|
fontkey word;
|
|
fontCount number;
|
|
i pls_integer;
|
|
d pls_integer;
|
|
nb pls_integer;
|
|
myDiff varchar2(2000);
|
|
myType varchar2(256); -- ????????? Cette variable est peut-être globale ????????????
|
|
-- tabNull tv4000;
|
|
begin
|
|
-- Add a TrueType or Type1 font
|
|
myfamily:=strtolower(myfamily);
|
|
if myfile is null then
|
|
myfile:=str_replace(' ','',myfamily) || strtolower(mystyle) || '.php';
|
|
end if;
|
|
if(myfamily='arial') then
|
|
myfamily:='helvetica';
|
|
end if;
|
|
mystyle:=strtoupper(mystyle);
|
|
if(mystyle='IB') then
|
|
mystyle:='BI';
|
|
end if;
|
|
|
|
fontkey:=myfamily || mystyle;
|
|
if(fonts.exists(fontkey)) then
|
|
Error('Font already added: ' || myfamily || ' ' || mystyle);
|
|
end if;
|
|
|
|
p_includeFont(fontkey);
|
|
|
|
|
|
fontCount:=nvl(fonts.count, 0) + 1;
|
|
|
|
fonts(fontkey).i := fontCount;
|
|
fonts(fontkey).type := 'core';
|
|
fonts(fontkey).name := coreFonts(fontkey);
|
|
fonts(fontkey).up := -100;
|
|
fonts(fontkey).ut := 50;
|
|
fonts(fontkey).cw := fpdf_charWidths(fontkey);
|
|
fonts(fontkey).file := myfile;
|
|
|
|
if(myDiff is not null) then
|
|
-- Search existing encodings
|
|
d:=0;
|
|
nb:=diffs.count;
|
|
for i in 1..nb
|
|
loop
|
|
if(diffs(i) = myDiff) then
|
|
d:=i;
|
|
exit;
|
|
end if;
|
|
end loop;
|
|
if(d=0) then
|
|
d:=nb+1;
|
|
diffs(d):=myDiff;
|
|
end if;
|
|
fonts(fontkey).diff:=d;
|
|
end if;
|
|
|
|
if(myfile is not null) then
|
|
if(myType = 'TrueType') then
|
|
FontFiles(myfile).length1 := originalsize;
|
|
else
|
|
FontFiles(myfile).length1 := size1;
|
|
FontFiles(myfile).length2 := size2;
|
|
end if;
|
|
end if;
|
|
end AddFont;
|
|
|
|
----------------------------------------------------------------------------------------
|
|
procedure SetFont(pfamily varchar2,pstyle varchar2 default '',psize number default 0) is
|
|
myfamily word := pfamily;
|
|
mystyle word := pstyle;
|
|
mysize number := psize;
|
|
FontCount number := 0;
|
|
myFontFile word;
|
|
fontkey word;
|
|
-- tabnull tv4000;
|
|
begin
|
|
-- Select a font; size given in points
|
|
myfamily:=strtolower(myfamily);
|
|
|
|
if myfamily is null then
|
|
myfamily:=FontFamily;
|
|
end if;
|
|
|
|
if(myfamily='arial') then
|
|
myfamily:='helvetica';
|
|
elsif(myfamily='symbol' or myfamily='zapfdingbats') then
|
|
mystyle:='';
|
|
end if;
|
|
mystyle:=strtoupper(mystyle);
|
|
|
|
if(instr(mystyle,'U') > 0) then
|
|
underline:=true;
|
|
mystyle:=str_replace('U','',mystyle);
|
|
else
|
|
underline:=false;
|
|
end if;
|
|
if(mystyle='IB') then
|
|
mystyle:='BI';
|
|
end if;
|
|
if(mysize=0) then
|
|
mysize:=fontsizePt;
|
|
end if;
|
|
|
|
-- Test if font is already selected
|
|
if(FontFamily=myfamily and fontstyle=mystyle and fontsizePt=mysize) then
|
|
return;
|
|
end if;
|
|
|
|
-- Test if used for the first time
|
|
fontkey:=nvl(myfamily || mystyle, '');
|
|
|
|
|
|
--if(not fontsExists(fontkey)) then
|
|
if(not fonts.exists(fontkey)) then
|
|
-- Check if one of the standard fonts
|
|
|
|
if(CoreFonts.exists(fontkey)) then
|
|
--if(not fpdf_charwidthsExists(fontkey)) then
|
|
if(not fpdf_charwidths.exists(fontkey)) then
|
|
-- Load metric file
|
|
|
|
myFontFile:=myfamily;
|
|
if(myfamily='times' or myfamily='helvetica') then
|
|
myFontFile:=myFontFile || strtolower(mystyle);
|
|
end if;
|
|
--
|
|
p_includeFont(fontkey);
|
|
--
|
|
if(not fpdf_charwidthsExists(fontkey)) then
|
|
Error('Could not include font metric file');
|
|
end if;
|
|
end if;
|
|
FontCount:=nvl(fonts.count,0) + 1;
|
|
fonts(fontkey).i := FontCount;
|
|
fonts(fontkey).type := 'core';
|
|
fonts(fontkey).name := CoreFonts(fontkey);
|
|
fonts(fontkey).up := -100;
|
|
fonts(fontkey).ut := 50;
|
|
fonts(fontkey).cw := fpdf_charwidths(fontkey);
|
|
else
|
|
Error('Undefined font: ' || myfamily || ' ' || mystyle);
|
|
end if;
|
|
end if;
|
|
-- Select it
|
|
FontFamily:=myfamily;
|
|
fontstyle:=mystyle;
|
|
fontsizePt:=mysize;
|
|
fontsize:=mysize/k;
|
|
-- if(fontsExists(fontkey)) then
|
|
CurrentFont:= fonts(fontkey);
|
|
-- end if;
|
|
if(page>0) then
|
|
p_out('BT /F'||CurrentFont.i||' '||tochar(fontsizePt,2)||' Tf ET');
|
|
end if;
|
|
end SetFont;
|
|
|
|
|
|
----------------------------------------------------------------------------------------
|
|
function GetStringWidth(pstr varchar2) return number is
|
|
charSetWidth CharSet;
|
|
w number;
|
|
lg number;
|
|
wdth number;
|
|
c car;
|
|
begin
|
|
-- Get width of a string in the current font
|
|
charSetWidth := CurrentFont.cw;
|
|
w:=0;
|
|
lg := strlen(pstr);
|
|
for i in 1..lg
|
|
loop
|
|
wdth := 0;
|
|
c := substr(pstr,i,1);
|
|
--if (charSetWidth.exists(c)) then
|
|
wdth := charSetWidth(c);
|
|
--end if;
|
|
w:= w + wdth;
|
|
end loop;
|
|
return w * fontsize/1000;
|
|
end GetStringWidth;
|
|
|
|
|
|
----------------------------------------------------------------------------------------
|
|
procedure SetFontSize(psize number) is
|
|
begin
|
|
-- Set font size in points
|
|
if(fontsizePt=psize) then
|
|
return;
|
|
end if;
|
|
fontsizePt:=psize;
|
|
fontsize:=psize/k;
|
|
if(page>0) then
|
|
p_out('BT /F'||CurrentFont.i||' '||tochar(fontsizePt,2)||' Tf ET');
|
|
end if;
|
|
end SetFontSize;
|
|
|
|
----------------------------------------------------------------------------------------
|
|
procedure Cell
|
|
(pw number,
|
|
ph number default 0,
|
|
ptxt varchar2 default '',
|
|
pborder varchar2 default '0',
|
|
pln number default 0,
|
|
palign varchar2 default '',
|
|
pfill number default 0,
|
|
plink varchar2 default '') is
|
|
myPW number := pw;
|
|
myK k%type := k;
|
|
myX x%type := x;
|
|
myY y%type := y;
|
|
myWS ws%type := ws;
|
|
myS bigtext; -- was: txt
|
|
myOP bigtext; -- was: txt
|
|
myDX number;
|
|
myTXT2 bigtext; -- was: txt
|
|
begin
|
|
null;
|
|
-- Output a cell
|
|
if( ( y + ph > pageBreakTrigger) and not InFooter and AcceptPageBreak()) then
|
|
-- Automatic page break
|
|
if(myWS > 0) then
|
|
ws:=0;
|
|
p_out('0 Tw');
|
|
end if;
|
|
AddPage(CurOrientation);
|
|
x:=myX;
|
|
if(myWS > 0) then
|
|
ws := myWS;
|
|
p_out(tochar(myWS * myK,3) ||' Tw');
|
|
end if;
|
|
end if;
|
|
|
|
if(myPW = 0) then
|
|
myPW := w - rMargin - x;
|
|
end if;
|
|
myS := '';
|
|
if(pfill = 1 or pborder = '1') then
|
|
if(pfill = 1) then
|
|
if (pborder = '1') then
|
|
myOP := 'B';
|
|
else
|
|
myOP := 'f';
|
|
end if;
|
|
else
|
|
myOP := 'S';
|
|
end if;
|
|
myS := tochar(x*myK,2)||' '||tochar((h-y)*myK,2)||' '||tochar(myPW*myK,2)||' '||tochar(-ph*myK,2)||' re '||myOP||' ';
|
|
end if;
|
|
|
|
if(is_string(pborder)) then
|
|
myX := x;
|
|
myY := y;
|
|
if(instr(pborder,'L') > 0) then
|
|
myS := myS || tochar(myX*myK,2) ||' '||tochar((h-myY)*myK,2)||' m '||tochar(myX*myK,2)||' '||tochar((h-(myY+ph))*myK,2)||' l S ';
|
|
end if;
|
|
if(instr(pborder,'T') > 0) then
|
|
myS := myS || tochar(myX*myK,2)||' '||tochar((h-myY)*myK,2)||' m '||tochar((myX+myPW)*myK,2)||' '||tochar((h-myY)*myK,2)||' l S ';
|
|
end if;
|
|
if(instr(pborder,'R') > 0) then
|
|
myS := myS || tochar((myX+myPW)*myK,2)||' '||tochar((h-myY)*myK,2)||' m '||tochar((myX+myPW)*myK,2)||' '||tochar((h-(myY+ph))*myK,2)||' l S ';
|
|
end if;
|
|
if(instr(pborder,'B') > 0) then
|
|
myS := myS || tochar(myX*myK,2)||' '||tochar((h-(myY+ph))*myK,2)||' m '||tochar((myX+myPW)*myK,2)||' '||tochar((h-(myY+ph))*myK,2)||' l S ';
|
|
end if;
|
|
end if;
|
|
if ptxt is not null then
|
|
if(palign='R') then
|
|
myDX := myPW - cMargin - GetStringWidth(ptxt);
|
|
elsif(palign='C') then
|
|
myDX := (myPW - GetStringWidth(ptxt))/2;
|
|
else
|
|
myDX := cMargin;
|
|
end if;
|
|
if(ColorFlag) then
|
|
myS := myS || 'q ' || TextColor || ' ';
|
|
end if;
|
|
-- myTXT2 := str_replace(')','\\)',str_replace('(','\\(',str_replace('\\','\\\\',ptxt)));
|
|
myTXT2 := str_replace('\\','\\\\',ptxt);
|
|
|
|
-- FDL 20.06.2011: Need to espace paranthesis in the text
|
|
myTXT2 := p_escape (myTXT2);
|
|
|
|
myS := myS || 'BT '||tochar((x+myDX)*myK,2)||' '||tochar((h-(y+.5*ph+.3*fontsize))*myK,2)||' Td ('||myTXT2||') Tj ET';
|
|
if(underline) then
|
|
myS := myS || ' ' || p_dounderline(x+myDX,y+.5*ph+.3*fontsize,ptxt);
|
|
end if;
|
|
if(ColorFlag) then
|
|
myS := myS || ' Q';
|
|
end if;
|
|
if(not empty(plink)) then
|
|
Link(x + myDX,y + .5*ph - .5*fontsize, GetStringWidth(ptxt), fontsize, plink);
|
|
end if;
|
|
end if;
|
|
if(not empty(myS)) then
|
|
p_out(myS);
|
|
end if;
|
|
|
|
lasth := ph;
|
|
if( pln>0 ) then
|
|
-- Go to next line
|
|
y := y + ph;
|
|
if(pln=1) then
|
|
x := lMargin;
|
|
end if;
|
|
else
|
|
x := x + myPW;
|
|
end if;
|
|
exception
|
|
when others then
|
|
error('Cell : '||sqlerrm);
|
|
end Cell;
|
|
|
|
----------------------------------------------------------------------------------------
|
|
-- MultiCell : Output text with automatic or explicit line breaks
|
|
-- param phMax : give the max height for the multicell. (0 if non applicable)
|
|
-- if ph is null : the minimum height is the value of the property LineSpacing
|
|
----------------------------------------------------------------------------------------
|
|
procedure MultiCell
|
|
( pw number,
|
|
ph number default 0,
|
|
ptxt varchar2,
|
|
pborder varchar2 default '0',
|
|
palign varchar2 default 'J',
|
|
pfill number default 0,
|
|
phMax number default 0) is
|
|
|
|
charSetWidth CharSet;
|
|
myPW number := pw;
|
|
myBorder word := pborder;
|
|
myS bigtext; -- was: txt
|
|
myNB number;
|
|
wmax number;
|
|
myB bigtext; -- was: txt
|
|
myB2 bigtext; -- was: txt
|
|
sep number := -1;
|
|
-- i number := 0;
|
|
-- j number := 0;
|
|
i number := 1;
|
|
j number := 1;
|
|
l number := 0;
|
|
ns number := 0;
|
|
nl number := 1;
|
|
carac word;
|
|
lb_skip boolean := false;
|
|
ls number;
|
|
cumulativeHeight number := 0;
|
|
myH number := pH;
|
|
begin
|
|
-- Output text with automatic or explicit line breaks
|
|
|
|
-- see if we need to set Height to the minimum linespace
|
|
if (myH = 0) then
|
|
myH := getLineSpacing;
|
|
end if;
|
|
|
|
charSetWidth := CurrentFont.cw;
|
|
if(myPW = 0) then
|
|
myPW:=w - rMargin - x;
|
|
end if;
|
|
wmax := (myPW - 2 * cMargin) * 1000 / fontsize;
|
|
myS := str_replace(CHR(13),'',ptxt);
|
|
myNB := strlen(myS);
|
|
if(myNB > 0 and substr(myS,-1) = CHR(10) ) then
|
|
myNB := myNB - 1;
|
|
end if;
|
|
myB := 0;
|
|
|
|
if (myBorder is not null) then
|
|
if(myBorder = '1') then
|
|
myBorder :='LTRB';
|
|
myB := 'LRT';
|
|
myB2 := 'LR';
|
|
else
|
|
myB2 := '';
|
|
if(instr(myBorder,'L') > 0) then
|
|
myB2 := myB2 || 'L';
|
|
end if;
|
|
if(instr(myBorder,'R') > 0) then
|
|
myB2 := myB2 || 'R';
|
|
end if;
|
|
if (instr(myBorder,'T') > 0) then
|
|
myB := myB2 || 'T';
|
|
else
|
|
myB := myB2;
|
|
end if;
|
|
end if;
|
|
end if;
|
|
|
|
while(i <= myNB)
|
|
loop
|
|
lb_skip := false;
|
|
-- Get next character
|
|
carac := substr(myS,i,1);
|
|
if(carac = CHR(10)) then
|
|
-- Explicit line break
|
|
if(ws > 0) then
|
|
ws := 0;
|
|
p_out('0 Tw');
|
|
end if;
|
|
Cell(myPW,myH,substr(myS,j,i-j),myB,2,palign,pfill);
|
|
cumulativeHeight := cumulativeHeight + myH;
|
|
i := i + 1;
|
|
sep := -1;
|
|
j := i;
|
|
l := 0;
|
|
ns := 0;
|
|
nl := nl + 1;
|
|
if(myBorder is not null and nl = 2) then
|
|
myB := myB2;
|
|
end if;
|
|
-- si on passe là on continue à la prochaine itération de la boucle
|
|
-- en PHP il y avait l'instruction "continue" .
|
|
lb_skip := true;
|
|
end if;
|
|
|
|
if (not lb_skip) then
|
|
if(carac =' ') then
|
|
sep := i;
|
|
ls := l;
|
|
ns := ns + 1;
|
|
end if;
|
|
l := l + charSetWidth (carac);
|
|
if( l > wmax) then
|
|
-- Automatic line break
|
|
if(sep=-1) then
|
|
if(i=j) then
|
|
i := i + 1;
|
|
end if;
|
|
if(ws > 0) then
|
|
ws := 0;
|
|
p_out('0 Tw');
|
|
end if;
|
|
Cell(myPW,myH,substr(myS,j,i-j),myB,2,palign,pfill);
|
|
else
|
|
if(palign = 'J') then
|
|
if (ns > 1) then
|
|
ws := (wmax - ls)/1000*fontsize/(ns-1);
|
|
else
|
|
ws := 0;
|
|
end if;
|
|
p_out(''|| tochar(ws*k,3) ||' Tw');
|
|
end if;
|
|
Cell(myPW,myH,substr(myS,j,sep-j),myB,2,palign,pfill);
|
|
i := sep + 1;
|
|
end if;
|
|
cumulativeHeight := cumulativeHeight + myH;
|
|
sep := -1;
|
|
j := i;
|
|
l := 0;
|
|
ns := 0;
|
|
nl := nl + 1;
|
|
if(myBorder is not null and nl = 2) then
|
|
myB := myB2;
|
|
end if;
|
|
else
|
|
i := i + 1;
|
|
end if;
|
|
end if;
|
|
end loop;
|
|
|
|
-- Last chunk
|
|
if(ws > 0) then
|
|
ws := 0;
|
|
p_out('0 Tw');
|
|
end if;
|
|
|
|
if(myBorder is not null and instr(myBorder,'B') > 0) then
|
|
if (phMax > 0) then
|
|
if (cumulativeHeight >= phMax) then
|
|
myB := myB || 'B';
|
|
end if;
|
|
else
|
|
myB := myB || 'B';
|
|
end if;
|
|
end if;
|
|
Cell(myPW,myH,substr(myS,j,i-j),myB,2,palign,pfill);
|
|
cumulativeHeight := cumulativeHeight + myH;
|
|
|
|
-- add an empty cell if phMax is not reached.
|
|
if (phMax > 0) then
|
|
if ( cumulativeHeight < phMax ) then
|
|
-- dealing with the bottom border.
|
|
if(myBorder is not null and instr(myBorder,'B') > 0) then
|
|
myB := myB || 'B';
|
|
end if;
|
|
Cell(myPW,phMax-cumulativeHeight,null,myB,2,palign,pfill);
|
|
end if;
|
|
end if;
|
|
|
|
x := lMargin;
|
|
|
|
exception
|
|
when others then
|
|
error('MultiCell : '||sqlerrm);
|
|
end MultiCell;
|
|
|
|
|
|
|
|
----------------------------------------------------------------------------------------
|
|
procedure image ( pFile varchar2,
|
|
pX number,
|
|
pY number,
|
|
pWidth number default 0,
|
|
pHeight number default 0,
|
|
pType varchar2 default null,
|
|
pLink varchar2 default null) is
|
|
|
|
myFile varchar2(2000) := pFile;
|
|
-- myType varchar2(256) := pType;
|
|
myW number := pWidth;
|
|
myH number := pHeight;
|
|
-- pos number;
|
|
info recImage;
|
|
begin
|
|
--Put an image on the page
|
|
if ( not imageExists(myFile) ) then
|
|
--First use of image, get info
|
|
info := p_parseImage(myFile);
|
|
info.i := nvl(images.count, 0) + 1;
|
|
images(lower(myFile)) := info;
|
|
else
|
|
info := images(lower(myFile));
|
|
end if;
|
|
--Automatic width and height calculation if needed
|
|
if(myW = 0 and myH = 0) then
|
|
--Put image at 72 dpi
|
|
myW := info.w / k;
|
|
myH := info.h / k;
|
|
end if;
|
|
if (myW = 0) then
|
|
myW := myH * info.w / info.h;
|
|
end if;
|
|
if (myH = 0) then
|
|
myH := myW * info.h / info.w;
|
|
end if;
|
|
p_out('q '||tochar(myW * k, 2)||' 0 0 '||tochar(myH * k, 2)||' '||tochar(pX * k, 2)||' '||tochar((h - ( pY + myH)) * k, 2)||' cm /I'||to_char(info.i)||' Do Q');
|
|
if(pLink is not null) then
|
|
Link(pX,pY,myW,myH,pLink);
|
|
end if;
|
|
exception
|
|
when others then
|
|
error('image : '||sqlerrm);
|
|
end image;
|
|
|
|
/* THIS PROCEDURE HANGS UP ........... */
|
|
----------------------------------------------------------------------------------------
|
|
procedure Write(pH varchar2,ptxt varchar2,plink varchar2 default null) is
|
|
charSetWidth CharSet;
|
|
myW number; -- remaining width from actual position in user units
|
|
myWmax number; -- remaining cellspace
|
|
s bigtext;
|
|
c word;
|
|
nb pls_integer;
|
|
sep pls_integer;
|
|
i pls_integer;
|
|
j pls_integer;
|
|
l pls_integer;
|
|
lsep pls_integer;
|
|
lastl pls_integer;
|
|
begin
|
|
-- Output text in flowing mode
|
|
charSetWidth := CurrentFont.cw;
|
|
myW := w - rMargin - x;
|
|
myWmax := (myW - 2 * cMargin) * 1000 / FontSize;
|
|
s := str_replace(chr(13),'',ptxt);
|
|
nb := strlen(s);
|
|
sep := -1; -- no blank space encountered, position of last blank
|
|
i := 1; -- running position
|
|
j := 1; -- last remembered position , start for next output
|
|
l := 0; -- string length since last written
|
|
lsep := 0; -- position of last blank
|
|
lastl := 0; -- length till that blank
|
|
-- Loop over all characters
|
|
while i <= nb loop
|
|
-- Get next character
|
|
c := substr(s, i, 1);
|
|
|
|
-- Explicit line break
|
|
if(c = chr(10)) then
|
|
Cell(myW, pH, substr(s,j,i-j), 0, 1, '', 0, plink);
|
|
-- positioned at beginning of new line
|
|
i := i + 1;
|
|
sep := -1;
|
|
j := i;
|
|
l := 0;
|
|
myW := w - rMargin - x;
|
|
myWmax := (myW - 2 * cMargin) * 1000 / FontSize; -- whole line
|
|
|
|
else
|
|
if c = ' ' then
|
|
sep := i;
|
|
lsep := 0;
|
|
lastl := l;
|
|
else
|
|
lsep := lsep + charSetWidth(c);
|
|
end if;
|
|
l := l + charSetWidth(c);
|
|
if l > myWmax then
|
|
-- Automatic line break
|
|
if sep = -1 then -- forced
|
|
Cell(myW, pH, substr(s,j,i-j+1), 0, 1, '', 0, plink);
|
|
i := i + 1;
|
|
j := i;
|
|
l := 0;
|
|
else -- wrap at last blank
|
|
Cell(myW, pH, substr(s,j,sep-j), 0, 1, '', 0, plink);
|
|
i := sep + 1;
|
|
j := i;
|
|
sep := -1;
|
|
l := lsep-(myWmax-lastl); -- rest remaining space from previous line
|
|
-- WHY ????
|
|
end if;
|
|
myW := w - rMargin - x;
|
|
myWmax := (myW - 2 * cMargin) * 1000 / FontSize;
|
|
else
|
|
i := i + 1;
|
|
end if;
|
|
end if;
|
|
end loop;
|
|
-- Last chunk
|
|
if( i != j ) then
|
|
Cell((l+2*cMargin) / 1000 * FontSize, pH, substr(s,j), 0, 0, '', 0, plink);
|
|
end if;
|
|
exception
|
|
when others then
|
|
error('write : '||sqlerrm);
|
|
end write;
|
|
|
|
|
|
procedure htp_print_clob (p_clob in clob)
|
|
as
|
|
l_buffer varchar2(32767);
|
|
c_max_size constant integer := 8000; -- 32767
|
|
l_start integer := 1;
|
|
l_cloblen integer;
|
|
begin
|
|
|
|
if p_clob is not null then
|
|
|
|
l_cloblen := dbms_lob.getlength (p_clob );
|
|
|
|
loop
|
|
l_buffer := dbms_lob.substr (p_clob, c_max_size, l_start);
|
|
htp.prn (l_buffer);
|
|
l_start := l_start + c_max_size;
|
|
exit when l_start > l_cloblen;
|
|
end loop ;
|
|
|
|
end if;
|
|
|
|
end htp_print_clob;
|
|
|
|
|
|
----------------------------------------------------------------------------------------
|
|
procedure Output(pname varchar2 default null,pdest varchar2 default null) is
|
|
myName word := pname;
|
|
myDest word := pdest;
|
|
v_doc blob; -- finally complete document
|
|
v_blob blob;
|
|
v_clob clob;
|
|
v_in pls_integer;
|
|
v_out pls_integer;
|
|
v_lang pls_integer;
|
|
v_warning pls_integer;
|
|
v_len pls_integer;
|
|
begin
|
|
dbms_lob.createtemporary(v_blob, false, dbms_lob.session);
|
|
dbms_lob.createtemporary(v_doc, false, dbms_lob.session);
|
|
-- Output PDF to some destination
|
|
-- Finish document if necessary
|
|
if state < 3 then
|
|
ClosePDF();
|
|
end if;
|
|
myDest := strtoupper(myDest);
|
|
if(myDest is null) then
|
|
if(myName is null) then
|
|
myName := 'doc.pdf';
|
|
myDest := 'I';
|
|
else
|
|
myDest := 'D';
|
|
end if;
|
|
end if;
|
|
|
|
if (myDest = 'I') then
|
|
-- Send as pdf to a browser
|
|
OWA_UTIL.MIME_HEADER('application/pdf',false);
|
|
htp.print('Content-Length: ' || getPDFDocLength());
|
|
htp.print('Content-disposition: inline; filename="' || myName || '"');
|
|
owa_util.http_header_close;
|
|
|
|
-- restitution du contenu...
|
|
v_len := 1;
|
|
for i in pdfDoc.first..pdfDoc.last loop
|
|
v_clob := pdfDoc(i);
|
|
if v_clob is not null then
|
|
v_in := 1;
|
|
v_out := 1;
|
|
v_lang := 0;
|
|
v_warning := 0;
|
|
v_len := dbms_lob.getlength(v_clob);
|
|
|
|
-- empty the blob (otherwise it will keep growing because the converttoblob parameter is in/out)
|
|
dbms_lob.trim(v_blob,0);
|
|
|
|
dbms_lob.convertToBlob(v_blob, v_clob, v_len, v_in, v_out, dbms_lob.default_csid, v_lang, v_warning);
|
|
--dbms_lob.convertToBlob(v_blob, v_clob, v_len, v_in, v_out, nls_charset_id('AL32UTF8'), v_lang, v_warning);
|
|
dbms_lob.append(v_doc, dbms_lob.substr(v_blob, v_len));
|
|
end if;
|
|
end loop;
|
|
wpg_docload.download_file(v_doc);
|
|
|
|
elsif (myDest = 'D') then
|
|
|
|
-- Download file
|
|
if(not empty(owa_util.get_cgi_env('HTTP_USER_AGENT')) and instr(owa_util.get_cgi_env('HTTP_USER_AGENT'),'MSIE') > 0) then
|
|
OWA_UTIL.MIME_HEADER('application/force-download',false);
|
|
else
|
|
OWA_UTIL.MIME_HEADER('application/octet-stream',false);
|
|
end if;
|
|
htp.print('Content-Length: ' || getPDFDocLength());
|
|
htp.print('Content-disposition: attachment; filename="' || myName || '"');
|
|
owa_util.http_header_close;
|
|
|
|
-- restitution du contenu...
|
|
for i in pdfDoc.first..pdfDoc.last loop
|
|
--htp.prn(pdfDoc(i));
|
|
htp_print_clob (pdfDoc(i));
|
|
end loop;
|
|
|
|
elsif (myDest = 'S') then
|
|
--OWA_UTIL.MIME_HEADER('application/pdf');
|
|
OWA_UTIL.MIME_HEADER('text/html');
|
|
-- Return as a string
|
|
for i in pdfDoc.first..pdfDoc.last loop
|
|
htp.prn(replace(replace(replace(pdfDoc(i),'<', '<'),'>','>'),chr(10),'<br/>'));
|
|
end loop;
|
|
else
|
|
error('Incorrect output destination: ' || myDest);
|
|
end if;
|
|
|
|
exception
|
|
when others then
|
|
error('Output : '||sqlerrm);
|
|
end Output;
|
|
|
|
|
|
function get_output return blob
|
|
as
|
|
l_returnvalue blob;
|
|
|
|
l_blob blob;
|
|
l_clob clob;
|
|
l_in pls_integer;
|
|
l_out pls_integer;
|
|
l_lang pls_integer;
|
|
l_warning pls_integer;
|
|
|
|
c_max_size constant pls_integer := 8000; -- 32767
|
|
l_start pls_integer := 1;
|
|
l_cloblen pls_integer;
|
|
|
|
begin
|
|
|
|
/*
|
|
|
|
Purpose: Return PDF file as BLOB
|
|
|
|
Remarks:
|
|
|
|
Who Date Description
|
|
------ ---------- -------------------------------------
|
|
MBR 08.01.2010 Created
|
|
|
|
*/
|
|
|
|
dbms_lob.createtemporary(l_blob, true, dbms_lob.session);
|
|
dbms_lob.createtemporary(l_returnvalue, true, dbms_lob.session);
|
|
|
|
-- Finish document if necessary
|
|
|
|
if state < 3 then
|
|
ClosePDF();
|
|
end if;
|
|
|
|
for i in pdfDoc.first .. pdfDoc.last loop
|
|
|
|
--debug_pkg.printf('i = %1', i);
|
|
|
|
l_clob := pdfDoc(i);
|
|
|
|
if l_clob is not null then
|
|
|
|
l_cloblen := dbms_lob.getlength (l_clob);
|
|
l_in := 1;
|
|
l_out := 1;
|
|
l_lang := 0;
|
|
l_warning := 0;
|
|
|
|
--debug_pkg.printf('clob length = %1', l_cloblen);
|
|
|
|
-- empty the blob (otherwise it will keep growing because the converttoblob parameter is in/out)
|
|
dbms_lob.trim(l_blob,0);
|
|
|
|
dbms_lob.converttoblob(l_blob, l_clob, l_cloblen, l_in, l_out, dbms_lob.default_csid, l_lang, l_warning);
|
|
|
|
--debug_pkg.printf('blob length = %1', dbms_lob.getlength(v_blob));
|
|
|
|
l_start := 1;
|
|
|
|
loop
|
|
--debug_pkg.printf('... appending from position %1', l_start);
|
|
dbms_lob.append(l_returnvalue, dbms_lob.substr (l_blob, c_max_size, l_start));
|
|
l_start := l_start + c_max_size;
|
|
exit when l_start > l_cloblen;
|
|
end loop ;
|
|
|
|
end if;
|
|
|
|
end loop;
|
|
|
|
return l_returnvalue;
|
|
|
|
end get_output;
|
|
|
|
|
|
procedure test(pdest varchar2 default 'D')
|
|
is
|
|
begin
|
|
null;
|
|
end test;
|
|
|
|
|
|
END pdfgen_pkg;
|
|
/
|