annotation.dart
5.3 KB
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
/*
* Copyright (C) 2017, David PHAM-VAN <dev.nfet.net@gmail.com>
*
* This library is free software; you can redistribute it and/or
* modify it under the terms of the GNU Lesser General
* License as published by the Free Software Foundation; either
* version 2.1 of the License, or (at your option) any later version.
*
* This library is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* Lesser General License for more details.
*
* You should have received a copy of the GNU Lesser General
* License along with this library; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*/
part of pdf;
class PDFAnnot extends PDFObject {
/// Solid border. The border is drawn as a solid line.
static const SOLID = 0;
/// The border is drawn with a dashed line.
static const DASHED = 1;
/// The border is drawn in a beveled style (faux three-dimensional) such
/// that it looks as if it is pushed out of the page (opposite of INSET)
static const BEVELED = 2;
/// The border is drawn in an inset style (faux three-dimensional) such
/// that it looks as if it is inset into the page (opposite of BEVELED)
static const INSET = 3;
/// The border is drawn as a line on the bottom of the annotation rectangle
static const UNDERLINED = 4;
/// The subtype of the outline, ie text, note, etc
final String subtype;
/// The size of the annotation
final double l, b, r, t;
/// The text of a text annotation
final String s;
/// flag used to indicate that the destination should fit the screen
static const FULL_PAGE = -9999.0;
/// Link to the Destination page
PDFObject dest;
/// If fl!=FULL_PAGE then this is the region of the destination page shown.
/// Otherwise they are ignored.
final double fl, fb, fr, ft;
/// the border for this annotation
PDFBorder border;
PDFAnnot(PDFPage pdfPage,
{String type, this.s, this.l, this.b, this.r, this.t, this.subtype, this.dest, this.fl, this.fb, this.fr, this.ft})
: super(pdfPage.pdfDocument, type) {
pdfPage.annotations.add(this);
}
/// This is used to create an annotation.
/// @param s Subtype for this annotation
/// @param l Left coordinate
/// @param b Bottom coordinate
/// @param r Right coordinate
/// @param t Top coordinate
factory PDFAnnot.annotation(PDFPage pdfPage, String s, double l, double b, double r, double t) =>
new PDFAnnot(pdfPage, type: "/Annot", s: s, l: l, b: b, r: r, t: t);
/// Creates a text annotation
/// @param l Left coordinate
/// @param b Bottom coordinate
/// @param r Right coordinate
/// @param t Top coordinate
/// @param s Text for this annotation
factory PDFAnnot.text(PDFPage pdfPage, double l, double b, double r, double t, String s) =>
new PDFAnnot(pdfPage, type: "/Text", l: l, b: b, r: r, t: t, s: s);
/// Creates a link annotation
/// @param l Left coordinate
/// @param b Bottom coordinate
/// @param r Right coordinate
/// @param t Top coordinate
/// @param dest Destination for this link. The page will fit the display.
/// @param fl Left coordinate
/// @param fb Bottom coordinate
/// @param fr Right coordinate
/// @param ft Top coordinate
/// <br><br>Rectangle describing what part of the page to be displayed
/// (must be in User Coordinates)
factory PDFAnnot.link(PDFPage pdfPage, double l, double b, double r, double t, PDFObject dest,
[double fl = FULL_PAGE, double fb = FULL_PAGE, double fr = FULL_PAGE, double ft = FULL_PAGE]) =>
new PDFAnnot(pdfPage, type: "/Link", l: l, b: b, r: r, t: t, dest: dest, fl: fl, fb: fb, fr: fr, ft: ft);
/// Sets the border for the annotation. By default, no border is defined.
///
/// <p>If the style is DASHED, then this method uses PDF's default dash
/// scheme {3}
///
/// <p>Important: the annotation must have been added to the document before
/// this is used. If the annotation was created using the methods in
/// PDFPage, then the annotation is already in the document.
///
/// @param style Border style SOLID, DASHED, BEVELED, INSET or UNDERLINED.
/// @param width Width of the border
/// @param dash Array of lengths, used for drawing the dashes. If this
/// is null, then the default of {3} is used.
void setBorder(double width, {int style = 0, List<double> dash}) {
border = new PDFBorder(pdfDocument, width, style: style, dash: dash);
}
/// Output the annotation
///
/// @param os OutputStream to send the object to
@override
void prepare() {
super.prepare();
params["/Subtype"] = PDFStream.string(subtype);
params["/Rect"] = PDFStream.string("[$l $b $r $t]");
// handle the border
if (border == null) {
params["/Border"] = PDFStream.string("[0 0 0]");
} else {
params["/BS"] = border.ref();
}
// Now the annotation subtypes
if (subtype == "/Text") {
params["/Contents"] = PDFStream.string(s);
} else if (subtype == "/Link") {
var dests = new List<PDFStream>();
dests.add(dest.ref());
if (fl == FULL_PAGE)
dests.add(PDFStream.string("/Fit"));
else {
dests.add(PDFStream.string("/FitR $fl $fb $fr $ft"));
}
params["/Dest"] = PDFStream.array(dests);
}
}
}