1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
|
/*
* $Id$
* Copyright (C) 2001 The Apache Software Foundation. All rights reserved.
* For details on use and redistribution please refer to the
* LICENSE file included with these sources.
*/
package org.apache.fop.pdf;
/**
* class representing a font descriptor.
*
* Font descriptors are specified on page 222 and onwards of the PDF 1.3 spec.
*/
public class PDFFontDescriptor extends PDFObject {
// Required fields
protected int ascent;
protected int capHeight;
protected int descent;
protected int flags;
protected PDFRectangle fontBBox;
protected String basefont; // PDF-spec: FontName
protected int italicAngle;
protected int stemV;
// Optional fields
protected int stemH = 0;
protected int xHeight = 0;
protected int leading = 0;
protected int avgWidth = 0;
protected int maxWidth = 0;
protected int missingWidth = 0;
protected PDFStream fontfile;
// protected String charSet = null;
protected byte subtype;
/**
* create the /FontDescriptor object
*
* @param number the object's number
* @param ascent the maximum height above the baseline
* @param descent the maximum depth below the baseline
* @param capHeight height of the capital letters
* @param flags various characteristics of the font
* @param fontBBox the bounding box for the described font
* @param basefont the base font name
* @param italicAngle the angle of the vertical dominant strokes
* @param stemV the width of the dominant vertical stems of glyphs
*/
public PDFFontDescriptor(int number, String basefont, int ascent,
int descent, int capHeight, int flags,
PDFRectangle fontBBox, int italicAngle,
int stemV) {
/* generic creation of PDF object */
super(number);
/* set fields using paramaters */
this.basefont = basefont;
this.ascent = ascent;
this.descent = descent;
this.capHeight = capHeight;
this.flags = flags;
this.fontBBox = fontBBox;
this.italicAngle = italicAngle;
this.stemV = stemV;
}
/**
* set the optional metrics
*/
public void setMetrics(int avgWidth, int maxWidth, int missingWidth,
int leading, int stemH, int xHeight) {
this.avgWidth = avgWidth;
this.maxWidth = maxWidth;
this.missingWidth = missingWidth;
this.leading = leading;
this.stemH = stemH;
this.xHeight = xHeight;
}
/**
* set the optional font file stream
*
* @param subtype the font type defined in the font stream
* @param fontfile the stream containing an embedded font
*/
public void setFontFile(byte subtype, PDFStream fontfile) {
this.subtype = subtype;
this.fontfile = fontfile;
}
// public void setCharSet(){}//for subset fonts
/**
* produce the PDF representation for the object
*
* @return the PDF
*/
public byte[] toPDF() {
StringBuffer p = new StringBuffer(this.number + " " + this.generation
+ " obj\n<< /Type /FontDescriptor"
+ "\n/FontName /" + this.basefont);
p.append("\n/FontBBox ");
p.append(fontBBox.toPDFString());
p.append("\n/Flags ");
p.append(flags);
p.append("\n/CapHeight ");
p.append(capHeight);
p.append("\n/Ascent ");
p.append(ascent);
p.append("\n/Descent ");
p.append(descent);
p.append("\n/ItalicAngle ");
p.append(italicAngle);
p.append("\n/StemV ");
p.append(stemV);
// optional fields
if (stemH != 0) {
p.append("\n/StemH ");
p.append(stemH);
}
if (xHeight != 0) {
p.append("\n/XHeight ");
p.append(xHeight);
}
if (avgWidth != 0) {
p.append("\n/AvgWidth ");
p.append(avgWidth);
}
if (maxWidth != 0) {
p.append("\n/MaxWidth ");
p.append(maxWidth);
}
if (missingWidth != 0) {
p.append("\n/MissingWidth ");
p.append(missingWidth);
}
if (leading != 0) {
p.append("\n/Leading ");
p.append(leading);
}
if (fontfile != null) {
switch (subtype) {
case PDFFont.TYPE1:
p.append("\n/FontFile ");
break;
case PDFFont.TRUETYPE:
p.append("\n/FontFile2 ");
break;
case PDFFont.TYPE0:
p.append("\n/FontFile2 ");
break;
default:
p.append("\n/FontFile2 ");
}
p.append(fontfile.referencePDF());
}
// charSet for subset fonts // not yet implemented
// CID optional field
fillInPDF(p);
p.append("\n >>\nendobj\n");
return p.toString().getBytes();
}
/**
* fill in the specifics for the font's descriptor.
*
* the given buffer already contains the fields common to all descriptors.
*
* @param begin the buffer to be completed with the specific fields
*/
protected void fillInPDF(StringBuffer begin) {}
}
|