c# pdf parser free : Batch pdf metadata editor application SDK utility azure winforms asp.net visual studio xcolor4-part790

xcolor v2.11 (2007/01/21)
41
5 Technical Supplement
5.1 Color models supported by drivers
Since some of the drivers only pretendto support the hsb model, we included some
code to bypass this behaviour. The models actually added by xcolor are shown in
the log file. Table 5 lists mainly the drivers that are part of current MiKT
E
X[11]
distributions and their color model support. Probably, other distributions behave
similarly.
Table 5: Drivers and color models
Driver
Version
rgb
cmy
cmyk
hsb
gray
RGB
HTML
HSB
Gray
dvipdf
1999/02/16 v3.0i
d
n
d
n
d
i
n
n
n
dvips
1999/02/16 v3.0i
d
n
d
d
d
i
n
n
n
dvipsone 1999/02/16 v3.0i
d
n
d
d
d
i
n
n
n
pctex32
1999/02/16 v3.0i
d
n
d
d
d
i
n
n
n
pctexps
1999/02/16 v3.0i
d
n
d
d
d
i
n
n
n
pdftex
2006/03/02 v0.03p
d
n
d
n
d
i
n
n
n
dvipdfm
1998/11/24 vx.x
1
d
n
d
a
d
i
n
n
n
dvipdfm
1999/9/6 vx.x
2
d
n
d
a
d
i
n
n
n
dvipdfmx ?
d
n
d
f
d
i
n
n
n
textures
1997/5/28 v0.3
d
n
d
a
i
n
n
n
n
vtex
1999/01/14 v6.3
d
n
d
n
i
i
n
n
n
xetex
2004/05/09 v0.7
i
n
i
i
i
i
d
n
n
tcidvi
1999/02/16 v3.0i
i
n
i
n
i
d
n
n
n
truetex
1999/02/16 v3.0i
i
n
i
n
i
d
n
n
n
dviwin
1999/02/16 v3.0i
n
n
n
n
n
n
n
n
n
emtex
1999/02/16 v3.0i
n
n
n
n
n
n
n
n
n
pctexhp
1999/02/16 v3.0i
n
n
n
n
n
n
n
n
n
pctexwin
1999/02/16 v3.0i
n
n
n
n
n
n
n
n
n
dviwindo = dvipsone; oztex = dvips; xdvi = dvips + monochrome
1
part of graphics package
2
additionally distributed with MiKT
E
X
Driver’s color model support: d=direct, i=indirect, a=alleged, n=none, f=faulty
5.2 How xcolor handles driver-specific color models
Although there is a variety of drivers that implement different approaches to color
visualisation, they all have some features in common, as defined by the origi-
nal color package. One of these features is that any color model ‘foo’ requires a
\color@foo{cmd}{spec} command in order to translate the ‘foo’-dependent
color spec into some driver-specific code that is stored in cmd. Therefore,
xcolor in general detects driver-support for the ‘foo’ model via the existence of
\color@foo.
By this mechanism, xcolor can also change the behaviour of certain models with-
out touching the driver file itself. A good example is the \substitutecolormodel
command which is used during the package initialisation process to provide sup-
port for models that are not covered by the actual driver (like hsb for pdftex) or
Batch pdf metadata editor - add, remove, update PDF metadata in C#.net, ASP.NET, MVC, Ajax, WinForms, WPF
Allow C# Developers to Read, Add, Edit, Update and Delete PDF Metadata
metadata in pdf documents; extract pdf metadata
Batch pdf metadata editor - VB.NET PDF metadata library: add, remove, update PDF metadata in vb.net, ASP.NET, MVC, Ajax, WinForms, WPF
Enable VB.NET Users to Read, Write, Edit, Delete and Update PDF Document Metadata
pdf metadata extract; change pdf metadata
xcolor v2.11 (2007/01/21)
42
that have incorrect implementations (like hsb for dvipdfm).
5.3 Behind the scenes: internal color representation
Every definition of a color in order to access it by its name requires an internal
representation of the color, i.e. a macro that contains some bits of information
required by the driver to display the color properly.
color’s \definecolor{foo}{...}{...} generates a command \\color@foo
14
which contains the color definition in a driver-dependent way; therefore it is pos-
sible but non-trivial to access the color model and parameters afterwards (see the
colorinfo package [12] for a solution).
color’s \DefineNamedColor{named}{foo}{...}{...}generates\col@foo
15
which
again contains some driver-dependent information. In this case, an additional
\\color@foo will only be defined if the package option usecolors is active.
xcolor’s \definecolor{foo}{...}{...} generates
16
acommand \\color@foo as
well, which combines the features of the former commands and contains both
the driver-dependent and driver-independent information, thus making it possible
to access the relevant parameters in a standardised way. Although it has now
adifferent syntax, \\color@foo expands to the same expression as the original
command. On the other hand, \col@foo commands are no longer needed and
therefore not generated in the ‘named’ case: xcolor works with a single color data
structure (as described).
Table 6 on the next page shows some examples for the two most prominent drivers.
See also figure 3on page 32 which displays the definitions with respect to the driver
that was used to process this document.
5.4 A remark on accuracy
Since the macros presented here require some computation, special efforts were
made to ensure a maximum of accuracy for conversion and mixing formulas — all
within T
E
X’s limited numerical capabilities.
17
We decided to develop and include
a small set of commands to improve the quality of division and multiplication
results, instead of loading one of the packages that provide multi-digit arithmetic
and a lot more, like realcalc or fp. The marginal contribution of the latter packages
seems not to justify their usage for our purposes. Thus, we stay within a sort of
fixed-point arithmetic framework, providing at most 5 decimal digits via T
E
X’s
dimension registers.
14
The double backslash is intentional.
15Thesinglebackslashis intentional.
16
Thiswas introducedin version 1.10; priorto that, a command \\xcolor@foo witha different
syntax was generated.
17For example, applyingthe e ‘transformation’ ’ \dimen0=0.intpt t \the\dimen0 to all l 5-digit
numbers int of the range 00000...99999, exactly 34464 of these 100000 numbers don’t survive
unchanged. We are not talking about gobbled final zeros here ...
C# PDF Convert to Tiff SDK: Convert PDF to tiff images in C#.net
Studio .NET project. Powerful .NET control to batch convert PDF documents to tiff format in Visual C# .NET program. Free library are
google search pdf metadata; remove metadata from pdf acrobat
C# PDF Convert to Word SDK: Convert PDF to Word library in C#.net
Powerful components for batch converting PDF documents in C#.NET program. Convert PDF to multiple MS Word formats such as .doc and .docx.
batch update pdf metadata; view pdf metadata
xcolor v2.11 (2007/01/21)
43
Table 6: Driver-dependent internal color representation
dvips driver
\\color@Plum=macro:
(\definecolor{Plum}{rgb}{.5,0,1})
color
->rgb .5 0 1.
\\color@Plum=macro:
(\definecolor{Plum}{rgb}{.5,0,1})
xcolor
->\xcolor@ {}{rgb 0.5 0 1}{rgb}{0.5,0,1}.
\col@Plum=macro:
(\DefineNamedColor{Plum}{rgb}{.5,0,1})
color
->\@nil .
\\color@Plum=macro:
(with option usenames)
-> Plum.
\\color@Plum=macro:
(\definecolor[named]{Plum}{rgb}{.5,0,1})
xcolor
->\xcolor@ {named}{ Plum}{rgb}{0.5,0,1}.
pdftex driver
\\color@Plum=macro:
(\definecolor{Plum}{rgb}{.5,0,1})
color
->.5 0 1 rg .5 0 1 RG.
\\color@Plum=macro:
(\definecolor{Plum}{rgb}{.5,0,1})
xcolor
->\xcolor@ {}{0.5 0 1 rg 0.5 0 1 RG}{rgb}{0.5,0,1}.
\col@Plum=macro:
(\DefineNamedColor{Plum}{rgb}{.5,0,1})
color
->.5 0 1 rg .5 0 1 RG.
\\color@Plum=macro:
(with option usenames)
->.5 0 1 rg .5 0 1 RG.
\\color@Plum=macro:
(\definecolor[named]{Plum}{rgb}{.5,0,1})
xcolor
->\xcolor@ {}{0.5 0 1 rg 0.5 0 1 RG}{rgb}{0.5,0,1}.
C# PDF File Merge Library: Merge, append PDF files in C#.net, ASP.
NET components for batch combining PDF documents in C#.NET class. Powerful library dlls for mering PDF in both C#.NET WinForms and ASP.NET WebForms.
add metadata to pdf file; get pdf metadata
C# PDF Print Library: Print PDF documents in C#.net, ASP.NET
NET search text in PDF, C#.NET edit PDF bookmark, C#.NET edit PDF metadata, C#.NET Quicken PDF printer library allows C# users to batch print PDF file in
analyze pdf metadata; bulk edit pdf metadata
xcolor v2.11 (2007/01/21)
44
6 The Formulas
6.1 Color mixing
In general, we use linear interpolation for color mixing:
mix(C,C
,p) = p· C +(1− p) · C
(9)
Note that there is a special situation in the hsb case: if saturation = 0 then
the color equals a gray color of level brightness, independently of the hue value.
Therefore, to achieve smooth transitions of an arbitrary color to a specific gray
(like white or black), we actually use the formulas
tint
hsb
(C,p) = p· C + (1 −p) ·
hue,0,1
(10)
shade
hsb
(C,p) = p· C + (1 −p) ·
hue,0,0
(11)
tone
hsb
(C,p) = p· C + (1 −p) ·
hue,0,
1
2
(12)
where C = (hue,saturation,brightness).
From equation (9) and the way how color expressions are being interpreted, as
described in section 2.3 on page 12, it is an easy proof by induction to verify that
acolor expression
C
0
!P
1
!C
1
!P
2
!...!P
n
!C
n
(13)
with n ∈ {0,1,2,...}, colors C
0
,C
1
,...,C
n
,and percentages P
1
,...,P
n
∈[0,100]
will result in a parameter vector
C=
n
ν=0
n
µ=ν+1
p
µ
(1 −p
ν
)· C
ν
=p
n
···p
1
·C
0
+p
n
···p
2
(1 −p
1
)·C
1
+p
n
···p
3
(1 −p
2
)·C
2
+...
+p
n
(1 −p
n−1
)· C
n−1
+(1 −p
n
)· C
n
(14)
where p
0
:= 0 and p
ν
:= P
ν
/100 for ν = 1,...,n. We note also a split formula:
C
0
!P
1
!C
1
!...!P
n+k
!C
n+k
=p
n+k
···p
n+1
·C
0
!P
1
!C
1
!...!P
n
!C
n
−p
n+k
···p
n+1
·C
n
+C
n
!P
n+1
!C
n+1
!...!P
n+k
!C
n+k
(15)
6.2 Conversion between integer and real models
We fix a positive integer n and define the sets I
n
:= {0,1,...,n} and R := [0,1].
The complement of ν ∈ I
n
is n − ν, the complement of x ∈ R is 1 −x.
C# Create PDF from Tiff Library to convert tif images to PDF in C#
NET component for batch converting tiff images to PDF documents in C# class. Create PDF from Tiff in both .NET WinForms and ASP.NET application.
pdf metadata editor online; adding metadata to pdf files
C# Create PDF from PowerPoint Library to convert pptx, ppt to PDF
PowerPoint. Professional .NET PDF converter control for batch conversion. Export PowerPoint hyperlink to PDF in .NET console application.
pdf xmp metadata editor; add metadata to pdf programmatically
xcolor v2.11 (2007/01/21)
45
Table 7: Color constants
model/constant
white
black
gray
rgb
(1,1,1)
(0,0,0)
(
1
2
,
1
2
,
1
2
)
cmy
(0,0,0)
(1,1,1)
(
1
2
,
1
2
,
1
2
)
cmyk
(0,0,0,0) (0,0,0,1)
(0,0,0,
1
2
)
hsb
(h,0,1)
(h,0,0)
(h,0,
1
2
)
Hsb
(h
,0,1)
(h
,0,0)
(h
,0,
1
2
)
tHsb
(h
,0,1)
(h
,0,0)
(h
,0,
1
2
)
gray
1
0
1
2
RGB
(L,L,L)
(0,0,0)
(⌊
L+1
2
⌋,⌊
L+1
2
⌋,⌊
L+1
2
⌋)
HTML
FFFFFF
000000
808080
HSB
(H,0,M)
(H,0,0)
(H,0,⌊
M+1
2
⌋)
Gray
N
0
N+1
2
Table 8: Color conversion pairs
from/to
rgb
cmy
cmyk
hsb
Hsb
tHsb
gray
RGB
HTML
HSB
Gray
rgb
id
(cmy)
(hsb)
(hsb)
(hsb)
(gray)
cmy
id
(rgb)
(rgb)
(rgb)
(rgb)
(rgb)
(rgb)
(gray)
cmyk
(cmy)
id
(cmy) (cmy) (cmy)
(cmy) (cmy) (cmy) (gray)
hsb
(rgb)
(rgb)
id
(Hsb)
(rgb)
(rgb)
(rgb)
(rgb)
Hsb
(hsb)
(hsb)
(hsb)
id
(hsb)
(hsb)
(hsb)
(hsb)
(hsb)
tHsb
(Hsb)
(Hsb)
(Hsb)
(Hsb)
id
(Hsb)
(Hsb)
(Hsb)
(Hsb)
(Hsb)
gray
id
RGB
(rgb)
(rgb)
(rgb)
(rgb)
(rgb)
(rgb)
id
(rgb)
(rgb)
(rgb)
HTML
(rgb)
(rgb)
(rgb)
(rgb)
(rgb)
(rgb)
(rgb)
id
(rgb)
(rgb)
HSB
(hsb)
(hsb)
(hsb)
(hsb)
(hsb)
(hsb)
(hsb)
(hsb)
id
(hsb)
Gray
(gray) (gray) (gray) (gray) (gray) (gray)
(gray) (gray) (gray)
id
wave
(hsb)
(hsb)
(hsb)
(hsb)
(hsb)
(hsb)
(hsb)
(hsb)
(hsb)
(hsb)
id = identity function; ∗ = specific conversion function;
(model) = conversion via specified model
C# Create PDF from Excel Library to convert xlsx, xls to PDF in C#
Professional .NET PDF converter control for batch conversion. Merge all Excel sheets to one PDF file. Export PDF from Excel with cell border or no border.
clean pdf metadata; edit pdf metadata online
C# Create PDF from Word Library to convert docx, doc to PDF in C#.
and ASP.NET. Convert both DOC and DOCX formats to PDF files. Professional .NET control for batch conversion in C#.NET class. Easy to
remove metadata from pdf file; remove metadata from pdf
xcolor v2.11 (2007/01/21)
46
6.2.1 Real to integer conversion
The straightforward mapping for this case is
Γ
n
:R → I
n
, x → round(n ·x,0) =
1
2
+n · x
(16)
where round(r,d) rounds the real number r to d ≥ 0 decimal digits. This mapping
nearly always preserves complements, as shown in the next lemma.
Lemma 1 (Preservation of complements). For x ∈ R,
Γ
n
(x) +Γ
n
(1− x) = n ⇐⇒ x /∈ R
n
:=
1
n
ν−
1
2
ν= 1,2,...,n
.
(17)
Proof. Let ν := Γ
n
(x), then from −
1
2
≤η := n ·x −ν <
1
2
we conclude
Γ
n
(1 −x) = round(n(1− x),0) = round(n −ν −η,0) =
n−ν
if η = −
1
2
n−ν +1 if η = −
1
2
Now, η = −
1
2
⇐⇒ x =
1
n
ν−
1
2
⇐⇒ x ∈ I
n
.
Remark: the set R
n
is obviously identical to the set of points where Γ
n
is not
continuous.
6.2.2 Integer to real conversion
The straightforward way in this case is the function
n
:I
n
→R, ν →
ν
n
.
(18)
Thisis, however, only one out of a variety of solutions: every function ∆
n
:I
n
→R
that obeys the condition
ν∈ I
n
⇒Γ
n
n
(ν)
(19)
which is equivalent to
ν∈ I
n
⇒ν +
1
2
>n · ∆
n
(ν) ≥ ν −
1
2
(20)
does at least guarantee that all integers ν may be reconstructed from ∆
n
(ν) via
multiplication by n and rounding to the nearest integer. Preservation of comple-
ments means now
ν∈ I
n
⇒∆
n
(ν) +∆
n
(n − ν) = 1
(21)
which is obviously the case for ∆
n
= ∆
n
. If we consider, more generally, a
transformation
n
(ν) =
ν+α
n+ β
(22)
with β = −n, then the magic inequality (20) is equivalent to
1
2
>
αn −βν
n+ β
≥−
1
2
(23)
xcolor v2.11 (2007/01/21)
47
which is obeyed by the function
n
:I
n
→R, ν →
ν
n+1
if ν ≤
n+1
2
ν+1
n+1
if ν >
n+1
2
(24)
that has the nice feature ∆
n
n+1
2
=
1
2
for odd n.
Lemma 2 (Preservation of complements). For odd n and each ν ∈ I
n
,
n
(ν) +∆
n
(n −ν) = 1 ⇐⇒ ν /∈ I
n
:=
n−1
2
,
n+1
2
.
(25)
Proof. The assertion is a consequence of the following arguments:
• ν <
n−1
2
⇐⇒ n −ν >
n+1
2
and
n−1
2
+
n+1
2
=n;
• ν <
n−1
2
⇒ ∆
n
(ν) +∆
n
(n − ν) =
ν
n+1
+
n−ν+1
n+1
=1;
• ν =
n−1
2
⇒ ∆
n
(ν) +∆
n
(n − ν) =
n−1
2(n+1)
+
1
2
=
n
n+1
= 1.
For the time being, we choose ∆
n
:= ∆
n
as default transformation function.
Another variant — whichisprobably tooslow for large-scale on-the-fly calculations
— may be used for constructing sets of predefined colors. The basic idea is to
minimize the number of decimal digits in the representation while keeping some
invariance with respect to the original resolution:
′′
n
:I
n
→R, ν → round
ν
n
,d
n
(
ν
n
)
(26)
where
d
n
:[0,1] → IN, x → min
d∈ IN
Γ
n
round(∆
n
n
(x)),d)
n
(x)
(27)
In the most common case n = 255 it turns out that we end up with at
most 3 decimal digits; preservation of complements is only violated for ν ∈
{25,26,76,77,127,128,178,179,229,230} where the corresponding set of decimal
numbers is {0.098,0.1,0.298,0.3,0.498,0.5,0.698,0.7,0.898,0.9}.
6.3 Color conversion and complements
We collect here the specific conversion formulasbetween the supported color mod-
els. Table 8 on page 45 gives an overwiew of how each conversion pair is handled.
In general, PostScript (as described in [1]) is used as a basis for most of the cal-
culations, since it supports the color models rgb, cmyk, hsb, and gray natively.
Furthermore, Alvy Ray Smith’s paper [15]is cited in [1] asreference for hsb-related
formulas.
First, we define a constant whichisbeing usedthroughout the conversionformulas:
E:= (1,1,1)
(28)
6.3.1 The rgb model
Conversion rgb to cmy Source: [1], p. 475.
(cyan,magenta,yellow) := E −(red,green,blue)
(29)
xcolor v2.11 (2007/01/21)
48
Conversion rgb to hsb (1) We set
x:= max{red,green,blue}
(30)
y:= med{red,green,blue}
(31)
z:= min{red,green,blue}
(32)
(33)
where ‘med’ denotes the median of the values. Then,
brightness := x
(34)
Case x = z:
saturation := 0
(35)
hue := 0
(36)
Case x = z:
saturation :=
x−z
x
(37)
f:=
x−y
x−z
(38)
hue :=
1
6
·
1−f if x = red ≥ green ≥ blue = z
1+f if x = green ≥ red ≥ blue = z
3−f if x = green ≥ blue ≥ red = z
3+f if x = blue ≥ green ≥ red = z
5−f if x = blue ≥ red ≥ green = z
5+f if x = red ≥ blue > green = z
(39)
This is based on [15], RGB to HSV Algorithm (Hexcone Model), which reads
(slightly reformulated):
r:=
x−red
x− z
,
g:=
x−green
x−z
,
b:=
x−blue
x−z
(40)
hue :=
1
6
·
5+b if red = x and green = z
1−g if red = x and green > z
1+r if green = x and blue = z
3−b if green = x and blue > z
3+g if blue = x and red = z
5−r if blue = x and red > z
(41)
Note that the singular case x = z is not covered completely in Smith’s original
algorithm; we stick here to PostScript’s behaviour in real life.
Because we need to sort three numbers in order to calculate x,y,z, several com-
parisons are involved in the algorithm. We present now a second method which is
more suited for T
E
X.
xcolor v2.11 (2007/01/21)
49
Conversion rgb to hsb (2) Let β be a function that takesa Boolean expression
as argument and returns 1 if the expression is true, 0 otherwise; set
i:= 4 ·β(red ≥ green) +2 ·β(green ≥ blue) + β(blue ≥ red),
(42)
and
(hue,saturation,brightness) :=
Φ(blue,green,red,3,1)
if i = 1
Φ(green,red,blue,1,1)
if i = 2
Φ(green,blue,red,3,−1) if i = 3
Φ(red,blue,green,5,1)
if i = 4
Φ(blue,red,green,5,−1) if i = 5
Φ(red,green,blue,1,−1) if i = 6
(0,0,blue)
if i = 7
(43)
where
Φ(x,y,z,u,v) :=
u· (x− z) +v ·(x−y)
6(x−z)
,
x−z
x
,x
(44)
The singular case x = z, which is equivalent to red = green = blue, is covered here
by i = 7.
It is not difficult to see that this algorithm is a reformulation of the previous
method. The following table explains how the transition from equation (39) to
equation (43) works:
6·hue
Condition
red ≥ green
green ≥ blue
blue ≥ red
i
1− f
red ≥ green ≥ blue
1
1
6/7
1+ f
green ≥ red ≥ blue
1
2/3/6/7
3− f
green ≥ blue ≥ red
1
1
3/7
3+ f
blue ≥ green ≥ red
1
1/3/5/7
5− f
blue ≥ red ≥ green
1
1
5/7
5+ f
red ≥ blue ≥ green
1
4/5/6/7
Here, ∗ denotes possible 0 or 1 values. Bold i values mark the main cases where
all ∗ values of a row are zero. The slight difference to equation (39) in the last
inequality is intentional and does no harm.
Conversion rgb to gray Source: [1], p. 474.
gray := 0.3 ·red +0.59· green+0.11 · blue
(45)
Conversion rgb to RGB As described in section 6.2.1 on page 46.
(Red,Green,Blue) :=
Γ
L
(red),Γ
L
(green),Γ
L
(blue)
(46)
Conversion rgb to HTML As described in section 6.2.1 on page 46. Convert
to 6-digit hexadecimal afterwards. Certainly, multiplication and summation can
be replaced by simple text concatenation of 2-digit hexadecimals.
RRGGBB :=
65536 · Γ
L
(red) +256 ·Γ
L
(green) +Γ
L
(blue)
hex
(47)
xcolor v2.11 (2007/01/21)
50
Complement of rgb color We simply take the complementary vector:
(red
,green
,blue
):= E −(red,green,blue)
(48)
6.3.2 The cmy model
Conversion cmy to rgb This is simply a reversion of the rgb → cmy case, cf.
section 6.3.1 on page 47.
(red,green,blue) := E −(cyan,magenta,yellow)
(49)
Conversion cmy to cmyk This is probably the hardest of our conversion tasks:
many sources emphasize that there does not exist any universal conversion algo-
rithm for this case because of device-dependence. The following algorithm is an
extended version of the one given in [1], p. 476.
k:= min{cyan,magenta,yellow}
(50)
cyan := min{1,max{0,cyan −UCR
c
(k)}}
(51)
magenta := min{1,max{0,magenta− UCR
m
(k)}}
(52)
yellow := min{1,max{0,yellow− UCR
y
(k)}}
(53)
black := BG(k)
(54)
Here, four additional functions are required:
UCR
c
,UCR
m
,UCR
y
:[0,1] → [−1,1]
undercolor-removal
BG : [0,1] → [0,1]
black-generation
These functions are device-dependent, see the remarks in [1]. Although there are
some indications that they should be chosen as nonlinear functions, as long as we
have no further knowledge about the target device we define them linearly:
UCR
c
(k) := β
c
·k
(55)
UCR
m
(k) := β
m
·k
(56)
UCR
y
(k) := β
y
·k
(57)
BG(k) := β
k
·k
(58)
where the parameters are given by \def\adjustUCRBG{β
c
,β
m
,β
y
,β
k
} at
\adjustUCRBG
any point in a document, defaulting to {1,1,1,1}.
Conversion cmy to gray This is derived from the conversion chain cmy →
rgb → gray.
gray := 1− (0.3 ·cyan+0.59 · magenta +0.11 · yellow)
(59)
Complement of cmy color We simply take the complementary vector:
(cyan
,magenta
,yellow
):= E −(cyan,magenta,yellow)
(60)
Documents you may be interested
Documents you may be interested