git-svn-id: https://pdfsharp.svn.codeplex.com/svn@39620 56d0cb2f-6006-4f69-a5a2-94740...
[pdfsharp:pdfsharp.git] / PDFsharp / code / PdfSharp / PdfSharp.Pdf.Advanced / PdfCatalog.cs
1 #region PDFsharp - A .NET library for processing PDF\r
2 //\r
3 // Authors:\r
4 //   Stefan Lange (mailto:Stefan.Lange@pdfsharp.com)\r
5 //\r
6 // Copyright (c) 2005-2009 empira Software GmbH, Cologne (Germany)\r
7 //\r
8 // http://www.pdfsharp.com\r
9 // http://sourceforge.net/projects/pdfsharp\r
10 //\r
11 // Permission is hereby granted, free of charge, to any person obtaining a\r
12 // copy of this software and associated documentation files (the "Software"),\r
13 // to deal in the Software without restriction, including without limitation\r
14 // the rights to use, copy, modify, merge, publish, distribute, sublicense,\r
15 // and/or sell copies of the Software, and to permit persons to whom the\r
16 // Software is furnished to do so, subject to the following conditions:\r
17 //\r
18 // The above copyright notice and this permission notice shall be included\r
19 // in all copies or substantial portions of the Software.\r
20 //\r
21 // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\r
22 // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\r
23 // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL\r
24 // THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\r
25 // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\r
26 // FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER \r
27 // DEALINGS IN THE SOFTWARE.\r
28 #endregion\r
29 \r
30 using System;\r
31 using System.Collections;\r
32 using System.Text;\r
33 using System.IO;\r
34 using PdfSharp.Internal;\r
35 using PdfSharp.Pdf.IO;\r
36 using PdfSharp.Pdf.AcroForms;\r
37 \r
38 namespace PdfSharp.Pdf.Advanced\r
39 {\r
40   /// <summary>\r
41   /// Represents the catalog dictionary.\r
42   /// </summary>\r
43   public sealed class PdfCatalog : PdfDictionary\r
44   {\r
45     /// <summary>\r
46     /// Initializes a new instance of the <see cref="PdfCatalog"/> class.\r
47     /// </summary>\r
48     public PdfCatalog(PdfDocument document)\r
49       : base(document)\r
50     {\r
51       Elements.SetName(Keys.Type, "/Catalog");\r
52 \r
53       this.version = "1.4";  // HACK in PdfCatalog\r
54     }\r
55 \r
56     PdfCatalog(PdfDictionary dictionary)\r
57       : base(dictionary)\r
58     { }\r
59 \r
60     /// <summary>\r
61     /// Get or sets the version of the PDF specification to which the document conforms.\r
62     /// </summary>\r
63     public string Version\r
64     {\r
65       get { return this.version; }\r
66       set\r
67       {\r
68         switch (value)\r
69         {\r
70           case "1.0":\r
71           case "1.1":\r
72           case "1.2":\r
73             throw new InvalidOperationException("Unsupported PDF version.");\r
74 \r
75           case "1.3":\r
76           case "1.4":\r
77             this.version = value;\r
78             break;\r
79 \r
80           case "1.5":\r
81           case "1.6":\r
82             throw new InvalidOperationException("Unsupported PDF version.");\r
83 \r
84           default:\r
85             throw new ArgumentException("Invalid version.");\r
86         }\r
87       }\r
88     }\r
89     string version = "1.3";\r
90 \r
91     /// <summary>\r
92     /// Gets the pages collection of this document.\r
93     /// </summary>\r
94     public PdfPages Pages\r
95     {\r
96       get\r
97       {\r
98         if (this.pages == null)\r
99         {\r
100           this.pages = (PdfPages)Elements.GetValue(Keys.Pages, VCF.CreateIndirect);\r
101           if (this.Owner.IsImported)\r
102             this.pages.FlattenPageTree();\r
103         }\r
104         return this.pages;\r
105       }\r
106     }\r
107     PdfPages pages;\r
108 \r
109     /// <summary>\r
110     /// Implementation of PdfDocument.PageLayout.\r
111     /// </summary>\r
112     internal PdfPageLayout PageLayout\r
113     {\r
114       get { return (PdfPageLayout)Elements.GetEnumFromName(Keys.PageLayout, PdfPageLayout.SinglePage); }\r
115       set { Elements.SetEnumAsName(Keys.PageLayout, value); }\r
116     }\r
117 \r
118     /// <summary>\r
119     /// Implementation of PdfDocument.PageMode.\r
120     /// </summary>\r
121     internal PdfPageMode PageMode\r
122     {\r
123       get { return (PdfPageMode)Elements.GetEnumFromName(Keys.PageMode, PdfPageMode.UseNone); }\r
124       set { Elements.SetEnumAsName(Keys.PageMode, value); }\r
125     }\r
126 \r
127     /// <summary>\r
128     /// Implementation of PdfDocument.ViewerPreferences.\r
129     /// </summary>\r
130     internal PdfViewerPreferences ViewerPreferences\r
131     {\r
132       get\r
133       {\r
134         if (this.viewerPreferences == null)\r
135           this.viewerPreferences = (PdfViewerPreferences)Elements.GetValue(Keys.ViewerPreferences, VCF.CreateIndirect);\r
136         return this.viewerPreferences;\r
137       }\r
138     }\r
139     PdfViewerPreferences viewerPreferences;\r
140 \r
141     /// <summary>\r
142     /// Implementation of PdfDocument.Outlines.\r
143     /// </summary>\r
144     internal PdfOutline.PdfOutlineCollection Outlines\r
145     {\r
146       get\r
147       {\r
148         if (this.outline == null)\r
149           this.outline = (PdfOutline)Elements.GetValue(Keys.Outlines, VCF.CreateIndirect);\r
150         return this.outline.Outlines;\r
151       }\r
152     }\r
153     PdfOutline outline;\r
154 \r
155     /// <summary>\r
156     /// Gets the AcroForm dictionary of this document.\r
157     /// </summary>\r
158     public PdfAcroForm AcroForm\r
159     {\r
160       get\r
161       {\r
162         if (this.acroForm == null)\r
163           this.acroForm = (PdfAcroForm)Elements.GetValue(Keys.AcroForm);\r
164         return this.acroForm;\r
165       }\r
166     }\r
167     PdfAcroForm acroForm;\r
168 \r
169     /// <summary>\r
170     /// Implementation of PdfDocument.PageMode.\r
171     /// </summary>\r
172     public string Language\r
173     {\r
174       get { return Elements.GetString(Keys.Lang); }\r
175       set \r
176       {\r
177         if (value == null)\r
178           Elements.Remove(Keys.Lang);\r
179         else\r
180           Elements.SetString(Keys.Lang, value);\r
181       }\r
182     }\r
183 \r
184     /// <summary>\r
185     /// Dispatches PrepareForSave to the objects that need it.\r
186     /// </summary>\r
187     internal override void PrepareForSave()\r
188     {\r
189       if (this.pages != null)\r
190         this.pages.PrepareForSave();\r
191 \r
192       if (this.outline != null && this.outline.Outlines.Count > 0)\r
193       {\r
194         if (Elements[Keys.PageMode] == null)\r
195           PageMode = PdfPageMode.UseOutlines;\r
196         this.outline.PrepareForSave();\r
197       }\r
198     }\r
199 \r
200     internal override void WriteObject(PdfWriter writer)\r
201     {\r
202       if (this.outline != null && this.outline.Outlines.Count > 0)\r
203       {\r
204         if (Elements[Keys.PageMode] == null)\r
205           PageMode = PdfPageMode.UseOutlines;\r
206       }\r
207       base.WriteObject(writer);\r
208     }\r
209 \r
210     /// <summary>\r
211     /// Predefined keys of this dictionary.\r
212     /// </summary>\r
213     internal sealed class Keys : KeysBase\r
214     {\r
215       /// <summary>\r
216       /// (Required) The type of PDF object that this dictionary describes; \r
217       /// must be Catalog for the catalog dictionary.\r
218       /// </summary>\r
219       [KeyInfo(KeyType.Name | KeyType.Required, FixedValue = "Catalog")]\r
220       public const string Type = "/Type";\r
221 \r
222       /// <summary>\r
223       /// (Optional; PDF 1.4) The version of the PDF specification to which the document\r
224       /// conforms (for example, 1.4) if later than the version specified in the file\92s header.\r
225       /// If the header specifies a later version, or if this entry is absent, the document \r
226       /// conforms to the version specified in the header. This entry enables a PDF producer \r
227       /// application to update the version using an incremental update.\r
228       /// </summary>\r
229       [KeyInfo("1.4", KeyType.Name | KeyType.Optional)]\r
230       public const string Version = "/Version";\r
231 \r
232       /// <summary>\r
233       /// (Required; must be an indirect reference) The page tree node that is the root of \r
234       /// the document\92s page tree.\r
235       /// </summary>\r
236       [KeyInfo(KeyType.Dictionary | KeyType.Required | KeyType.MustBeIndirect, typeof(PdfPages))]\r
237       public const string Pages = "/Pages";\r
238 \r
239       /// <summary>\r
240       /// (Optional; PDF 1.3) A number tree defining the page labeling for the document. \r
241       /// The keys in this tree are page indices; the corresponding values are page label dictionaries.\r
242       /// Each page index denotes the first page in a labeling range to which the specified page \r
243       /// label dictionary applies. The tree must include a value for pageindex 0.\r
244       /// </summary>\r
245       [KeyInfo("1.3", KeyType.NumberTree | KeyType.Optional)]\r
246       public const string PageLabels = "/PageLabels";\r
247 \r
248       /// <summary>\r
249       /// (Optional; PDF 1.2) The document\92s name dictionary.\r
250       /// </summary>\r
251       [KeyInfo("1.2", KeyType.Dictionary | KeyType.Optional)]\r
252       public const string Names = "/Names";\r
253 \r
254       /// <summary>\r
255       /// (Optional; PDF 1.1; must be an indirect reference) A dictionary of names and \r
256       /// corresponding destinations.\r
257       /// </summary>\r
258       [KeyInfo("1.1", KeyType.Dictionary | KeyType.Optional)]\r
259       public const string Dests = "/Dests";\r
260 \r
261       /// <summary>\r
262       /// (Optional; PDF 1.2) A viewer preferences dictionary specifying the way the document \r
263       /// is to be displayed on the screen. If this entry is absent, applications should use\r
264       /// their own current user preference settings.\r
265       /// </summary>\r
266       [KeyInfo("1.2", KeyType.Dictionary | KeyType.Optional, typeof(PdfViewerPreferences))]\r
267       public const string ViewerPreferences = "/ViewerPreferences";\r
268 \r
269       /// <summary>\r
270       /// (Optional) A name object specifying the page layout to be used when the document is \r
271       /// opened:\r
272       /// SinglePage - Display one page at a time.\r
273       /// OneColumn - Display the pages in one column.\r
274       /// TwoColumnLeft - Display the pages in two columns, with oddnumbered pages on the left.\r
275       /// TwoColumnRight - Display the pages in two columns, with oddnumbered pages on the right.\r
276       /// TwoPageLeft - (PDF 1.5) Display the pages two at a time, with odd-numbered pages on the left\r
277       /// TwoPageRight - (PDF 1.5) Display the pages two at a time, with odd-numbered pages on the right.\r
278       /// </summary>\r
279       [KeyInfo(KeyType.Name | KeyType.Optional)]\r
280       public const string PageLayout = "/PageLayout";\r
281 \r
282       /// <summary>\r
283       /// (Optional) A name object specifying how the document should be displayed when opened:\r
284       /// UseNone - Neither document outline nor thumbnail images visible.\r
285       /// UseOutlines - Document outline visible.\r
286       /// UseThumbs - Thumbnail images visible.\r
287       /// FullScreen - Full-screen mode, with no menu bar, windowcontrols, or any other window visible.\r
288       /// UseOC - (PDF 1.5) Optional content group panel visible.\r
289       /// UseAttachments (PDF 1.6) Attachments panel visible.\r
290       /// Default value: UseNone.\r
291       /// </summary>\r
292       [KeyInfo(KeyType.Name | KeyType.Optional)]\r
293       public const string PageMode = "/PageMode";\r
294 \r
295       /// <summary>\r
296       /// (Optional; must be an indirect reference) The outline dictionary that is the root \r
297       /// of the document\92s outline hierarchy.\r
298       /// </summary>\r
299       [KeyInfo(KeyType.Dictionary | KeyType.Optional, typeof(PdfOutline))]\r
300       public const string Outlines = "/Outlines";\r
301 \r
302       /// <summary>\r
303       /// (Optional; PDF 1.1; must be an indirect reference) An array of thread dictionaries \r
304       /// representing the document\92s article threads.\r
305       /// </summary>\r
306       [KeyInfo("1.1", KeyType.Array | KeyType.Optional)]\r
307       public const string Threads = "/Threads";\r
308 \r
309       /// <summary>\r
310       /// (Optional; PDF 1.1) A value specifying a destination to be displayed or an action to be \r
311       /// performed when the document is opened. The value is either an array defining a destination \r
312       /// or an action dictionary representing an action. If this entry is absent, the document\r
313       /// should be opened to the top of the first page at the default magnification factor.\r
314       /// </summary>\r
315       [KeyInfo("1.1", KeyType.ArrayOrDictionary | KeyType.Optional)]\r
316       public const string OpenAction = "/OpenAction";\r
317 \r
318       /// <summary>\r
319       /// (Optional; PDF 1.4) An additional-actions dictionary defining the actions to be taken \r
320       /// in response to various trigger events affecting the document as a whole.\r
321       /// </summary>\r
322       [KeyInfo("1.4", KeyType.Dictionary | KeyType.Optional)]\r
323       public const string AA = "/AA";\r
324 \r
325       /// <summary>\r
326       /// (Optional; PDF 1.1) A URI dictionary containing document-level information for URI \r
327       /// (uniform resource identifier) actions.\r
328       /// </summary>\r
329       [KeyInfo("1.1", KeyType.Dictionary | KeyType.Optional)]\r
330       public const string URI = "/URI";\r
331 \r
332       /// <summary>\r
333       /// (Optional; PDF 1.2) The document\92s interactive form (AcroForm) dictionary.\r
334       /// </summary>\r
335       [KeyInfo("1.2", KeyType.Dictionary | KeyType.Optional, typeof(PdfAcroForm))]\r
336       public const string AcroForm = "/AcroForm";\r
337 \r
338       /// <summary>\r
339       /// (Optional; PDF 1.4; must be an indirect reference) A metadata stream \r
340       /// containing metadata  for the document.\r
341       /// </summary>\r
342       [KeyInfo("1.4", KeyType.Dictionary | KeyType.Optional | KeyType.MustBeIndirect)]\r
343       public const string Metadata = "/Metadata";\r
344 \r
345       /// <summary>\r
346       /// (Optional; PDF 1.3) The document\92s structure tree root dictionary.\r
347       /// </summary>\r
348       [KeyInfo("1.3", KeyType.Dictionary | KeyType.Optional)]\r
349       public const string StructTreeRoot = "/StructTreeRoot";\r
350 \r
351       /// <summary>\r
352       /// (Optional; PDF 1.4) A mark information dictionary containing information\r
353       /// about the document\92s usage of Tagged PDF conventions.\r
354       /// </summary>\r
355       [KeyInfo("1.4", KeyType.Dictionary | KeyType.Optional)]\r
356       public const string MarkInfo = "/MarkInfo";\r
357 \r
358       /// <summary>\r
359       /// (Optional; PDF 1.4) A language identifier specifying the natural language for all \r
360       /// text in the document except where overridden by language specifications for structure \r
361       /// elements or marked content. If this entry is absent, the language is considered unknown.\r
362       /// </summary>\r
363       [KeyInfo("1.4", KeyType.String | KeyType.Optional)]\r
364       public const string Lang = "/Lang";\r
365 \r
366       /// <summary>\r
367       /// (Optional; PDF 1.3) A Web Capture information dictionary containing state information\r
368       /// used by the Acrobat Web Capture (AcroSpider) plugin extension.\r
369       /// </summary>\r
370       [KeyInfo("1.3", KeyType.Dictionary | KeyType.Optional)]\r
371       public const string SpiderInfo = "/SpiderInfo";\r
372 \r
373       /// <summary>\r
374       /// (Optional; PDF 1.4) An array of output intent dictionaries describing the color \r
375       /// characteristics of output devices on which the document might be rendered.\r
376       /// </summary>\r
377       [KeyInfo("1.4", KeyType.Array | KeyType.Optional)]\r
378       public const string OutputIntents = "/OutputIntents";\r
379 \r
380       /// <summary>\r
381       /// (Optional; PDF 1.4) A page-piece dictionary associated with the document.\r
382       /// </summary>\r
383       [KeyInfo("1.4", KeyType.Dictionary | KeyType.Optional)]\r
384       public const string PieceInfo = "/PieceInfo";\r
385 \r
386       /// <summary>\r
387       /// (Optional; PDF 1.5; required if a document contains optional content) The document\92\r
388       /// optional content properties dictionary.\r
389       /// </summary>\r
390       [KeyInfo("1.5", KeyType.Dictionary | KeyType.Optional)]\r
391       public const string OCProperties = "/OCProperties";\r
392 \r
393       /// <summary>\r
394       /// (Optional; PDF 1.5) A permissions dictionary that specifies user access permissions \r
395       /// for the document.\r
396       /// </summary>\r
397       [KeyInfo("1.5", KeyType.Dictionary | KeyType.Optional)]\r
398       public const string Perms = "/Perms";\r
399 \r
400       /// <summary>\r
401       /// (Optional; PDF 1.5) A dictionary containing attestations regarding the content of a \r
402       /// PDF document, as it relates to the legality of digital signatures.\r
403       /// </summary>\r
404       [KeyInfo("1.5", KeyType.Dictionary | KeyType.Optional)]\r
405       public const string Legal = "/Legal";\r
406 \r
407       /// <summary>\r
408       /// Gets the KeysMeta for these keys.\r
409       /// </summary>\r
410       public static DictionaryMeta Meta\r
411       {\r
412         get\r
413         {\r
414           if (Keys.meta == null)\r
415             Keys.meta = CreateMeta(typeof(Keys));\r
416           return Keys.meta;\r
417         }\r
418       }\r
419       static DictionaryMeta meta;\r
420     }\r
421 \r
422     /// <summary>\r
423     /// Gets the KeysMeta of this dictionary type.\r
424     /// </summary>\r
425     internal override DictionaryMeta Meta\r
426     {\r
427       get { return Keys.Meta; }\r
428     }\r
429   }\r
430 }\r