1use crate::object::Null;
4use crate::object::macros::object;
5use crate::object::r#ref::{MaybeRef, ObjRef};
6use crate::object::{Name, ObjectIdentifier};
7use crate::object::{Object, ObjectLike};
8use crate::reader::{Readable, Reader, ReaderContext, Skippable};
9use crate::xref::XRef;
10use std::collections::HashMap;
11use std::fmt::{Debug, Formatter};
12use std::ops::Deref;
13use std::sync::Arc;
14
15#[derive(Clone)]
18pub struct Dict<'a>(Arc<Repr<'a>>);
19
20impl Default for Dict<'_> {
21 fn default() -> Self {
22 Self::empty()
23 }
24}
25
26impl PartialEq for Dict<'_> {
29 fn eq(&self, other: &Self) -> bool {
30 self.0.data == other.0.data
31 }
32}
33
34impl<'a> Dict<'a> {
35 pub fn empty() -> Dict<'a> {
37 let repr = Repr {
38 data: &[],
39 offsets: Default::default(),
40 ctx: ReaderContext::new(XRef::dummy(), false),
41 };
42
43 Self(Arc::new(repr))
44 }
45
46 pub fn data(&self) -> &'a [u8] {
48 self.0.data
49 }
50
51 pub fn len(&self) -> usize {
53 self.0.offsets.len()
54 }
55
56 pub fn is_empty(&self) -> bool {
58 self.0.offsets.is_empty()
59 }
60
61 pub fn contains_key(&self, key: impl Deref<Target = [u8]>) -> bool {
63 self.0
64 .offsets
65 .contains_key(&Name::from_unescaped(key.deref()))
66 }
67
68 #[allow(
71 private_bounds,
72 reason = "users shouldn't be able to implement `ObjectLike` for custom objects."
73 )]
74 pub fn get<'b, T>(&self, key: impl Deref<Target = [u8]>) -> Option<T>
75 where
76 T: ObjectLike<'a>,
77 {
78 self.get_raw::<T>(key.as_ref())?.resolve(self.0.ctx)
79 }
80
81 pub fn get_ref(&self, key: impl Deref<Target = [u8]>) -> Option<ObjRef> {
83 let offset = *self.0.offsets.get(&Name::from_unescaped(key.as_ref()))?;
84
85 Reader::new(&self.0.data[offset..]).read_with_context::<ObjRef>(self.0.ctx)
86 }
87
88 pub fn keys(&self) -> impl Iterator<Item = Name<'a>> {
90 self.0.offsets.keys().cloned()
91 }
92
93 pub fn entries(&self) -> impl Iterator<Item = (Name<'a>, MaybeRef<Object<'a>>)> {
95 let mut sorted_keys = self.keys().collect::<Vec<_>>();
96 sorted_keys.sort_by(|n1, n2| n1.as_ref().cmp(n2.as_ref()));
97 sorted_keys.into_iter().map(|k| {
98 let obj = self.get_raw(k.deref()).unwrap();
99 (k, obj)
100 })
101 }
102
103 pub fn obj_id(&self) -> Option<ObjectIdentifier> {
105 self.0.ctx.obj_number
106 }
107
108 #[allow(private_bounds)]
110 pub fn get_raw<T>(&self, key: impl Deref<Target = [u8]>) -> Option<MaybeRef<T>>
111 where
112 T: Readable<'a>,
113 {
114 let offset = *self.0.offsets.get(&Name::from_unescaped(key.as_ref()))?;
115
116 Reader::new(&self.0.data[offset..]).read_with_context::<MaybeRef<T>>(self.0.ctx)
117 }
118}
119
120impl Debug for Dict<'_> {
121 fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
122 let mut r = Reader::new(self.0.data);
123 let mut debug_struct = f.debug_struct("Dict");
124
125 for (key, val) in &self.0.offsets {
126 r.jump(*val);
127 debug_struct.field(
128 &format!("{:?}", key.as_str()),
129 &r.read_with_context::<MaybeRef<Object>>(ReaderContext::dummy())
130 .unwrap(),
131 );
132 }
133 Ok(())
134 }
135}
136
137impl Skippable for Dict<'_> {
138 fn skip(r: &mut Reader<'_>, is_content_stream: bool) -> Option<()> {
139 r.forward_tag(b"<<")?;
140
141 loop {
142 r.skip_white_spaces_and_comments();
143
144 if let Some(()) = r.forward_tag(b">>") {
145 break Some(());
146 } else {
147 r.skip::<Name>(is_content_stream)?;
148 r.skip_white_spaces_and_comments();
149
150 if is_content_stream {
151 r.skip::<Object>(is_content_stream)?;
152 } else {
153 r.skip::<MaybeRef<Object>>(is_content_stream)?;
154 }
155 }
156 }
157 }
158}
159
160impl<'a> Readable<'a> for Dict<'a> {
161 fn read(r: &mut Reader<'a>, ctx: ReaderContext<'a>) -> Option<Self> {
162 read_inner(r, ctx, Some(b"<<"), b">>")
163 }
164}
165
166fn read_inner<'a>(
167 r: &mut Reader<'a>,
168 ctx: ReaderContext<'a>,
169 start_tag: Option<&[u8]>,
170 end_tag: &[u8],
171) -> Option<Dict<'a>> {
172 let mut offsets = HashMap::new();
173
174 let data = {
175 let dict_data = r.tail()?;
176 let start_offset = r.offset();
177
178 if let Some(start_tag) = start_tag {
180 r.forward_tag(start_tag)?;
181 }
182
183 loop {
184 r.skip_white_spaces_and_comments();
185
186 if let Some(()) = r.peek_tag(end_tag) {
188 r.forward_tag(end_tag)?;
189 let end_offset = r.offset() - start_offset;
190
191 break &dict_data[..end_offset];
192 } else {
193 let name = r.read_without_context::<Name>()?;
194 r.skip_white_spaces_and_comments();
195
196 let is_null = {
198 let mut nr = Reader::new(r.tail()?);
199
200 if ctx.in_content_stream {
201 nr.read_with_context::<Null>(ctx)
202 } else {
203 nr.read_with_context::<MaybeRef<Null>>(ctx)
204 .and_then(|n| n.resolve(ctx))
205 }
206 .is_some()
207 };
208
209 if !is_null {
210 let offset = r.offset() - start_offset;
211 offsets.insert(name, offset);
212 }
213
214 if ctx.in_content_stream {
215 r.skip::<Object>(ctx.in_content_stream)?;
216 } else {
217 r.skip::<MaybeRef<Object>>(ctx.in_content_stream)?;
218 }
219 }
220 }
221 };
222
223 Some(Dict(Arc::new(Repr { data, offsets, ctx })))
224}
225
226object!(Dict<'a>, Dict);
227
228struct Repr<'a> {
229 data: &'a [u8],
230 offsets: HashMap<Name<'a>, usize>,
231 ctx: ReaderContext<'a>,
232}
233
234pub(crate) struct InlineImageDict<'a>(Dict<'a>);
235
236impl<'a> InlineImageDict<'a> {
237 pub(crate) fn get_dict(&self) -> &Dict<'a> {
238 &self.0
239 }
240}
241
242impl<'a> Readable<'a> for InlineImageDict<'a> {
243 fn read(r: &mut Reader<'a>, ctx: ReaderContext<'a>) -> Option<Self> {
244 Some(Self(read_inner(r, ctx, None, b"ID")?))
245 }
246}
247
248#[allow(missing_docs)]
250pub mod keys {
251 macro_rules! key {
252 ($i:ident, $e:expr) => {
253 pub const $i: &'static [u8] = $e;
254 };
255 }
256
257 key!(A, b"A");
259 key!(AA, b"AA");
260 key!(ABSOLUTE_COLORIMETRIC, b"AbsoluteColorimetric");
261 key!(AC, b"AC");
262 key!(ACRO_FORM, b"AcroForm");
263 key!(ACTUAL_TEXT, b"ActualText");
264 key!(ADBE, b"ADBE");
265 key!(ADBE_PKCS7_DETACHED, b"adbe.pkcs7.detached");
266 key!(ADBE_PKCS7_SHA1, b"adbe.pkcs7.sha1");
267 key!(ADBE_X509_RSA_SHA1, b"adbe.x509.rsa_sha1");
268 key!(ADOBE_PPKLITE, b"Adobe.PPKLite");
269 key!(AESV2, b"AESV2");
270 key!(AESV3, b"AESV3");
271 key!(AF, b"AF");
272 key!(AF_RELATIONSHIP, b"AFRelationship");
273 key!(AFTER, b"After");
274 key!(AI_META_DATA, b"AIMetaData");
275 key!(AIS, b"AIS");
276 key!(ALL_OFF, b"AllOff");
277 key!(ALL_ON, b"AllOn");
278 key!(ALT, b"Alt");
279 key!(ALPHA, b"Alpha");
280 key!(ALTERNATE, b"Alternate");
281 key!(ANNOT, b"Annot");
282 key!(ANNOTS, b"Annots");
283 key!(ANTI_ALIAS, b"AntiAlias");
284 key!(ANY_OFF, b"AnyOff");
285 key!(ANY_ON, b"AnyOn");
286 key!(AP, b"AP");
287 key!(AP_REF, b"APRef");
288 key!(APP, b"App");
289 key!(ART_BOX, b"ArtBox");
290 key!(ARTIFACT, b"Artifact");
291 key!(AS, b"AS");
292 key!(ASCENT, b"Ascent");
293 key!(ASCII_HEX_DECODE, b"ASCIIHexDecode");
294 key!(ASCII_HEX_DECODE_ABBREVIATION, b"AHx");
295 key!(ASCII85_DECODE, b"ASCII85Decode");
296 key!(ASCII85_DECODE_ABBREVIATION, b"A85");
297 key!(ATTACHED, b"Attached");
298 key!(AUTHOR, b"Author");
299 key!(AVG_WIDTH, b"AvgWidth");
300
301 key!(B, b"B");
303 key!(BACKGROUND, b"Background");
304 key!(BASE_ENCODING, b"BaseEncoding");
305 key!(BASE_FONT, b"BaseFont");
306 key!(BASE_STATE, b"BaseState");
307 key!(BASE_VERSION, b"BaseVersion");
308 key!(BBOX, b"BBox");
309 key!(BC, b"BC");
310 key!(BE, b"BE");
311 key!(BEAD, b"BEAD");
312 key!(BEFORE, b"Before");
313 key!(BG, b"BG");
314 key!(BITS_PER_COMPONENT, b"BitsPerComponent");
315 key!(BITS_PER_COORDINATE, b"BitsPerCoordinate");
316 key!(BITS_PER_FLAG, b"BitsPerFlag");
317 key!(BITS_PER_SAMPLE, b"BitsPerSample");
318 key!(BL, b"Bl");
319 key!(BLACK_IS_1, b"BlackIs1");
320 key!(BLACK_POINT, b"BlackPoint");
321 key!(BLEED_BOX, b"BleedBox");
322 key!(BM, b"BM");
323 key!(BORDER, b"Border");
324 key!(BOUNDS, b"Bounds");
325 key!(BPC, b"BPC");
326 key!(BS, b"BS");
327 key!(BTN, b"Btn");
328 key!(BYTERANGE, b"ByteRange");
329
330 key!(C, b"C");
332 key!(C0, b"C0");
333 key!(C1, b"C1");
334 key!(CA, b"CA");
335 key!(CA_NS, b"ca");
336 key!(CALGRAY, b"CalGray");
337 key!(CALRGB, b"CalRGB");
338 key!(CALCMYK, b"CalCMYK");
339 key!(CAP, b"Cap");
340 key!(CAP_HEIGHT, b"CapHeight");
341 key!(CATALOG, b"Catalog");
342 key!(CCITTFAX_DECODE, b"CCITTFaxDecode");
343 key!(CCITTFAX_DECODE_ABBREVIATION, b"CCF");
344 key!(CENTER_WINDOW, b"CenterWindow");
345 key!(CERT, b"Cert");
346 key!(CERTS, b"Certs");
347 key!(CF, b"CF");
348 key!(CFM, b"CFM");
349 key!(CH, b"Ch");
350 key!(CHAR_PROCS, b"CharProcs");
351 key!(CHAR_SET, b"CharSet");
352 key!(CHECK_SUM, b"CheckSum");
353 key!(CI, b"CI");
354 key!(CICI_SIGNIT, b"CICI.SignIt");
355 key!(CID_FONT_TYPE0, b"CIDFontType0");
356 key!(CID_FONT_TYPE0C, b"CIDFontType0C");
357 key!(CID_FONT_TYPE2, b"CIDFontType2");
358 key!(CID_TO_GID_MAP, b"CIDToGIDMap");
359 key!(CID_SET, b"CIDSet");
360 key!(CIDSYSTEMINFO, b"CIDSystemInfo");
361 key!(CL, b"CL");
362 key!(CLASS_MAP, b"ClassMap");
363 key!(CLR_F, b"ClrF");
364 key!(CLR_FF, b"ClrFf");
365 key!(CMAP, b"CMap");
366 key!(CMAPNAME, b"CMapName");
367 key!(CMYK, b"CMYK");
368 key!(CO, b"CO");
369 key!(COLOR, b"Color");
370 key!(COLLECTION, b"Collection");
371 key!(COLLECTION_ITEM, b"CollectionItem");
372 key!(COLLECTION_FIELD, b"CollectionField");
373 key!(COLLECTION_SCHEMA, b"CollectionSchema");
374 key!(COLLECTION_SORT, b"CollectionSort");
375 key!(COLLECTION_SUBITEM, b"CollectionSubitem");
376 key!(COLOR_BURN, b"ColorBurn");
377 key!(COLOR_DODGE, b"ColorDodge");
378 key!(COLORANTS, b"Colorants");
379 key!(COLORS, b"Colors");
380 key!(COLORSPACE, b"ColorSpace");
381 key!(COLUMNS, b"Columns");
382 key!(COMPATIBLE, b"Compatible");
383 key!(COMPONENTS, b"Components");
384 key!(CONTACT_INFO, b"ContactInfo");
385 key!(CONTENTS, b"Contents");
386 key!(COORDS, b"Coords");
387 key!(COUNT, b"Count");
388 key!(CP, b"CP");
389 key!(CREATION_DATE, b"CreationDate");
390 key!(CREATOR, b"Creator");
391 key!(CRL, b"CRL");
392 key!(CRLS, b"CRLS");
393 key!(CROP_BOX, b"CropBox");
394 key!(CRYPT, b"Crypt");
395 key!(CS, b"CS");
396 key!(CYX, b"CYX");
397
398 key!(D, b"D");
400 key!(DA, b"DA");
401 key!(DARKEN, b"Darken");
402 key!(DATE, b"Date");
403 key!(DCT_DECODE, b"DCTDecode");
404 key!(DCT_DECODE_ABBREVIATION, b"DCT");
405 key!(DECODE, b"Decode");
406 key!(DECODE_PARMS, b"DecodeParms");
407 key!(DEFAULT, b"default");
408 key!(DEFAULT_CMYK, b"DefaultCMYK");
409 key!(DEFAULT_CRYPT_FILTER, b"DefaultCryptFilter");
410 key!(DEFAULT_GRAY, b"DefaultGray");
411 key!(DEFAULT_RGB, b"DefaultRGB");
412 key!(DESC, b"Desc");
413 key!(DESCENDANT_FONTS, b"DescendantFonts");
414 key!(DESCENT, b"Descent");
415 key!(DEST, b"Dest");
416 key!(DEST_OUTPUT_PROFILE, b"DestOutputProfile");
417 key!(DESTS, b"Dests");
418 key!(DEVICE_CMYK, b"DeviceCMYK");
419 key!(DEVICE_GRAY, b"DeviceGray");
420 key!(DEVICE_N, b"DeviceN");
421 key!(DEVICE_RGB, b"DeviceRGB");
422 key!(DI, b"Di");
423 key!(DIFFERENCE, b"Difference");
424 key!(DIFFERENCES, b"Differences");
425 key!(DIGEST_METHOD, b"DigestMethod");
426 key!(DIGEST_RIPEMD160, b"RIPEMD160");
427 key!(DIGEST_SHA1, b"SHA1");
428 key!(DIGEST_SHA256, b"SHA256");
429 key!(DIGEST_SHA384, b"SHA384");
430 key!(DIGEST_SHA512, b"SHA512");
431 key!(DIRECTION, b"Direction");
432 key!(DISPLAY_DOC_TITLE, b"DisplayDocTitle");
433 key!(DL, b"DL");
434 key!(DM, b"Dm");
435 key!(DOC, b"Doc");
436 key!(DOC_CHECKSUM, b"DocChecksum");
437 key!(DOC_TIME_STAMP, b"DocTimeStamp");
438 key!(DOCMDP, b"DocMDP");
439 key!(DOCUMENT, b"Document");
440 key!(DOMAIN, b"Domain");
441 key!(DOS, b"DOS");
442 key!(DP, b"DP");
443 key!(DR, b"DR");
444 key!(DS, b"DS");
445 key!(DSS, b"DSS");
446 key!(DUPLEX, b"Duplex");
447 key!(DUR, b"Dur");
448 key!(DV, b"DV");
449 key!(DW, b"DW");
450 key!(DW2, b"DW2");
451
452 key!(E, b"E");
454 key!(EARLY_CHANGE, b"EarlyChange");
455 key!(EF, b"EF");
456 key!(EMBEDDED_FDFS, b"EmbeddedFDFs");
457 key!(EMBEDDED_FILE, b"EmbeddedFile");
458 key!(EMBEDDED_FILES, b"EmbeddedFiles");
459 key!(EMPTY, b"");
460 key!(ENCODE, b"Encode");
461 key!(ENCODED_BYTE_ALIGN, b"EncodedByteAlign");
462 key!(ENCODING, b"Encoding");
463 key!(ENCODING_90MS_RKSJ_H, b"90ms-RKSJ-H");
464 key!(ENCODING_90MS_RKSJ_V, b"90ms-RKSJ-V");
465 key!(ENCODING_ETEN_B5_H, b"ETen-B5-H");
466 key!(ENCODING_ETEN_B5_V, b"ETen-B5-V");
467 key!(ENCRYPT, b"Encrypt");
468 key!(ENCRYPT_META_DATA, b"EncryptMetadata");
469 key!(ENCRYPTED_PAYLOAD, b"EncryptedPayload");
470 key!(END_OF_BLOCK, b"EndOfBlock");
471 key!(END_OF_LINE, b"EndOfLine");
472 key!(ENTRUST_PPKEF, b"Entrust.PPKEF");
473 key!(EXCLUSION, b"Exclusion");
474 key!(EXTENSIONS, b"Extensions");
475 key!(EXTENSION_LEVEL, b"ExtensionLevel");
476 key!(EX_DATA, b"ExData");
477 key!(EXPORT, b"Export");
478 key!(EXPORT_STATE, b"ExportState");
479 key!(EXT_G_STATE, b"ExtGState");
480 key!(EXTEND, b"Extend");
481 key!(EXTENDS, b"Extends");
482
483 key!(F, b"F");
485 key!(F_DECODE_PARMS, b"FDecodeParms");
486 key!(F_FILTER, b"FFilter");
487 key!(FB, b"FB");
488 key!(FDF, b"FDF");
489 key!(FF, b"Ff");
490 key!(FIELDS, b"Fields");
491 key!(FILESPEC, b"Filespec");
492 key!(FILTER, b"Filter");
493 key!(FIRST, b"First");
494 key!(FIRST_CHAR, b"FirstChar");
495 key!(FIT_WINDOW, b"FitWindow");
496 key!(FL, b"FL");
497 key!(FLAGS, b"Flags");
498 key!(FLATE_DECODE, b"FlateDecode");
499 key!(FLATE_DECODE_ABBREVIATION, b"Fl");
500 key!(FO, b"Fo");
501 key!(FOLDERS, b"Folders");
502 key!(FONT, b"Font");
503 key!(FONT_BBOX, b"FontBBox");
504 key!(FONT_DESC, b"FontDescriptor");
505 key!(FONT_FAMILY, b"FontFamily");
506 key!(FONT_FILE, b"FontFile");
507 key!(FONT_FILE2, b"FontFile2");
508 key!(FONT_FILE3, b"FontFile3");
509 key!(FONT_MATRIX, b"FontMatrix");
510 key!(FONT_NAME, b"FontName");
511 key!(FONT_STRETCH, b"FontStretch");
512 key!(FONT_WEIGHT, b"FontWeight");
513 key!(FORM, b"Form");
514 key!(FORMTYPE, b"FormType");
515 key!(FRM, b"FRM");
516 key!(FS, b"FS");
517 key!(FT, b"FT");
518 key!(FUNCTION, b"Function");
519 key!(FUNCTION_TYPE, b"FunctionType");
520 key!(FUNCTIONS, b"Functions");
521
522 key!(G, b"G");
524 key!(GAMMA, b"Gamma");
525 key!(GROUP, b"Group");
526 key!(GTS_PDFA1, b"GTS_PDFA1");
527
528 key!(H, b"H");
530 key!(HARD_LIGHT, b"HardLight");
531 key!(HEIGHT, b"Height");
532 key!(HELV, b"Helv");
533 key!(HIDE_MENUBAR, b"HideMenubar");
534 key!(HIDE_TOOLBAR, b"HideToolbar");
535 key!(HIDE_WINDOWUI, b"HideWindowUI");
536 key!(HUE, b"Hue");
537
538 key!(I, b"I");
540 key!(IC, b"IC");
541 key!(ICC_BASED, b"ICCBased");
542 key!(ID, b"ID");
543 key!(ID_TREE, b"IDTree");
544 key!(IDENTITY, b"Identity");
545 key!(IDENTITY_H, b"Identity-H");
546 key!(IDENTITY_V, b"Identity-V");
547 key!(IF, b"IF");
548 key!(ILLUSTRATOR, b"Illustrator");
549 key!(IM, b"IM");
550 key!(IMAGE, b"Image");
551 key!(IMAGE_MASK, b"ImageMask");
552 key!(INDEX, b"Index");
553 key!(INDEXED, b"Indexed");
554 key!(INFO, b"Info");
555 key!(INKLIST, b"InkList");
556 key!(INTENT, b"Intent");
557 key!(INTERPOLATE, b"Interpolate");
558 key!(IRT, b"IRT");
559 key!(IT, b"IT");
560 key!(ITALIC_ANGLE, b"ItalicAngle");
561 key!(ISSUER, b"Issuer");
562 key!(IX, b"IX");
563
564 key!(JAVA_SCRIPT, b"JavaScript");
566 key!(JBIG2_DECODE, b"JBIG2Decode");
567 key!(JBIG2_GLOBALS, b"JBIG2Globals");
568 key!(JPX_DECODE, b"JPXDecode");
569 key!(JS, b"JS");
570
571 key!(K, b"K");
573 key!(KEYWORDS, b"Keywords");
574 key!(KEY_USAGE, b"KeyUsage");
575 key!(KIDS, b"Kids");
576
577 key!(L, b"L");
579 key!(LAB, b"Lab");
580 key!(LANG, b"Lang");
581 key!(LAST, b"Last");
582 key!(LAST_CHAR, b"LastChar");
583 key!(LAST_MODIFIED, b"LastModified");
584 key!(LC, b"LC");
585 key!(LE, b"LE");
586 key!(LEADING, b"Leading");
587 key!(LEGAL_ATTESTATION, b"LegalAttestation");
588 key!(LENGTH, b"Length");
589 key!(LENGTH1, b"Length1");
590 key!(LENGTH2, b"Length2");
591 key!(LENGTH3, b"Length3");
592 key!(LIGHTEN, b"Lighten");
593 key!(LIMITS, b"Limits");
594 key!(LINEARIZED, b"Linearized");
595 key!(LJ, b"LJ");
596 key!(LL, b"LL");
597 key!(LLE, b"LLE");
598 key!(LLO, b"LLO");
599 key!(LOCATION, b"Location");
600 key!(LUMINOSITY, b"Luminosity");
601 key!(LW, b"LW");
602 key!(LZW_DECODE, b"LZWDecode");
603 key!(LZW_DECODE_ABBREVIATION, b"LZW");
604
605 key!(M, b"M");
607 key!(MAC, b"Mac");
608 key!(MAC_EXPERT_ENCODING, b"MacExpertEncoding");
609 key!(MAC_ROMAN_ENCODING, b"MacRomanEncoding");
610 key!(MARK_INFO, b"MarkInfo");
611 key!(MASK, b"Mask");
612 key!(MATRIX, b"Matrix");
613 key!(MATTE, b"Matte");
614 key!(MAX_LEN, b"MaxLen");
615 key!(MAX_WIDTH, b"MaxWidth");
616 key!(MCID, b"MCID");
617 key!(MDP, b"MDP");
618 key!(MEDIA_BOX, b"MediaBox");
619 key!(MEASURE, b"Measure");
620 key!(METADATA, b"Metadata");
621 key!(MISSING_WIDTH, b"MissingWidth");
622 key!(MIX, b"Mix");
623 key!(MK, b"MK");
624 key!(ML, b"ML");
625 key!(MM_TYPE1, b"MMType1");
626 key!(MOD_DATE, b"ModDate");
627 key!(MULTIPLY, b"Multiply");
628
629 key!(N, b"N");
631 key!(NAME, b"Name");
632 key!(NAMES, b"Names");
633 key!(NAVIGATOR, b"Navigator");
634 key!(NEED_APPEARANCES, b"NeedAppearances");
635 key!(NEW_WINDOW, b"NewWindow");
636 key!(NEXT, b"Next");
637 key!(NM, b"NM");
638 key!(NON_EFONT_NO_WARN, b"NonEFontNoWarn");
639 key!(NON_FULL_SCREEN_PAGE_MODE, b"NonFullScreenPageMode");
640 key!(NONE, b"None");
641 key!(NORMAL, b"Normal");
642 key!(NUMS, b"Nums");
643
644 key!(O, b"O");
646 key!(OBJ, b"Obj");
647 key!(OBJR, b"OBJR");
648 key!(OBJ_STM, b"ObjStm");
649 key!(OC, b"OC");
650 key!(OCG, b"OCG");
651 key!(OCGS, b"OCGs");
652 key!(OCMD, b"OCMD");
653 key!(OCPROPERTIES, b"OCProperties");
654 key!(OCSP, b"OCSP");
655 key!(OCSPS, b"OCSPs");
656 key!(OE, b"OE");
657 key!(OID, b"OID");
658 key!(OFF, b"OFF");
659 key!(ON, b"ON");
660 key!(OP, b"OP");
661 key!(OP_NS, b"op");
662 key!(OPEN_ACTION, b"OpenAction");
663 key!(OPEN_TYPE, b"OpenType");
664 key!(OPI, b"OPI");
665 key!(OPM, b"OPM");
666 key!(OPT, b"Opt");
667 key!(ORDER, b"Order");
668 key!(ORDERING, b"Ordering");
669 key!(OS, b"OS");
670 key!(OUTLINES, b"Outlines");
671 key!(OUTPUT_CONDITION, b"OutputCondition");
672 key!(OUTPUT_CONDITION_IDENTIFIER, b"OutputConditionIdentifier");
673 key!(OUTPUT_INTENT, b"OutputIntent");
674 key!(OUTPUT_INTENTS, b"OutputIntents");
675 key!(OVERLAY, b"Overlay");
676
677 key!(P, b"P");
679 key!(PA, b"PA");
680 key!(PAGE, b"Page");
681 key!(PAGE_LABELS, b"PageLabels");
682 key!(PAGE_LAYOUT, b"PageLayout");
683 key!(PAGE_MODE, b"PageMode");
684 key!(PAGES, b"Pages");
685 key!(PAINT_TYPE, b"PaintType");
686 key!(PANOSE, b"Panose");
687 key!(PARAMS, b"Params");
688 key!(PARENT, b"Parent");
689 key!(PARENT_TREE, b"ParentTree");
690 key!(PARENT_TREE_NEXT_KEY, b"ParentTreeNextKey");
691 key!(PART, b"Part");
692 key!(PATH, b"Path");
693 key!(PATTERN, b"Pattern");
694 key!(PATTERN_TYPE, b"PatternType");
695 key!(PC, b"PC");
696 key!(PDF_DOC_ENCODING, b"PDFDocEncoding");
697 key!(PERMS, b"Perms");
698 key!(PERCEPTUAL, b"Perceptual");
699 key!(PIECE_INFO, b"PieceInfo");
700 key!(PG, b"Pg");
701 key!(PI, b"PI");
702 key!(PO, b"PO");
703 key!(POPUP, b"Popup");
704 key!(PRE_RELEASE, b"PreRelease");
705 key!(PREDICTOR, b"Predictor");
706 key!(PREV, b"Prev");
707 key!(PRINT, b"Print");
708 key!(PRINT_AREA, b"PrintArea");
709 key!(PRINT_CLIP, b"PrintClip");
710 key!(PRINT_SCALING, b"PrintScaling");
711 key!(PRINT_STATE, b"PrintState");
712 key!(PRIVATE, b"Private");
713 key!(PROC_SET, b"ProcSet");
714 key!(PROCESS, b"Process");
715 key!(PRODUCER, b"Producer");
716 key!(PROP_BUILD, b"Prop_Build");
717 key!(PROPERTIES, b"Properties");
718 key!(PS, b"PS");
719 key!(PT_DATA, b"PtData");
720 key!(PUB_SEC, b"PubSec");
721 key!(PV, b"PV");
722
723 key!(Q, b"Q");
725 key!(QUADPOINTS, b"QuadPoints");
726
727 key!(R, b"R");
729 key!(RANGE, b"Range");
730 key!(RC, b"RC");
731 key!(RD, b"RD");
732 key!(REASON, b"Reason");
733 key!(REASONS, b"Reasons");
734 key!(RECIPIENTS, b"Recipients");
735 key!(RECT, b"Rect");
736 key!(REF, b"Ref");
737 key!(REFERENCE, b"Reference");
738 key!(REGISTRY, b"Registry");
739 key!(REGISTRY_NAME, b"RegistryName");
740 key!(RELATIVE_COLORIMETRIC, b"RelativeColorimetric");
741 key!(RENAME, b"Rename");
742 key!(REPEAT, b"Repeat");
743 key!(RES_FORK, b"ResFork");
744 key!(RESOURCES, b"Resources");
745 key!(RGB, b"RGB");
746 key!(RI, b"RI");
747 key!(ROLE_MAP, b"RoleMap");
748 key!(ROOT, b"Root");
749 key!(ROTATE, b"Rotate");
750 key!(ROWS, b"Rows");
751 key!(RT, b"RT");
752 key!(RUN_LENGTH_DECODE, b"RunLengthDecode");
753 key!(RUN_LENGTH_DECODE_ABBREVIATION, b"RL");
754 key!(RV, b"RV");
755
756 key!(S, b"S");
758 key!(SA, b"SA");
759 key!(SATURATION, b"Saturation");
760 key!(SCHEMA, b"Schema");
761 key!(SCREEN, b"Screen");
762 key!(SE, b"SE");
763 key!(SEPARATION, b"Separation");
764 key!(SET_F, b"SetF");
765 key!(SET_FF, b"SetFf");
766 key!(SHADING, b"Shading");
767 key!(SHADING_TYPE, b"ShadingType");
768 key!(SIG, b"Sig");
769 key!(SIG_FLAGS, b"SigFlags");
770 key!(SIG_REF, b"SigRef");
771 key!(SIZE, b"Size");
772 key!(SM, b"SM");
773 key!(SMASK, b"SMask");
774 key!(SMASK_IN_DATA, b"SMaskInData");
775 key!(SOFT_LIGHT, b"SoftLight");
776 key!(SORT, b"Sort");
777 key!(SOUND, b"Sound");
778 key!(SPLIT, b"Split");
779 key!(SS, b"SS");
780 key!(ST, b"St");
781 key!(STANDARD_ENCODING, b"StandardEncoding");
782 key!(STATE, b"State");
783 key!(STATE_MODEL, b"StateModel");
784 key!(STATUS, b"Status");
785 key!(STD_CF, b"StdCF");
786 key!(STEM_H, b"StemH");
787 key!(STEM_V, b"StemV");
788 key!(STM_F, b"StmF");
789 key!(STR_F, b"StrF");
790 key!(STRUCT_ELEM, b"StructElem");
791 key!(STRUCT_PARENT, b"StructParent");
792 key!(STRUCT_PARENTS, b"StructParents");
793 key!(STRUCT_TREE_ROOT, b"StructTreeRoot");
794 key!(STYLE, b"Style");
795 key!(SUB_FILTER, b"SubFilter");
796 key!(SUBJ, b"Subj");
797 key!(SUBJECT, b"Subject");
798 key!(SUBJECT_DN, b"SubjectDN");
799 key!(SUBTYPE, b"Subtype");
800 key!(SUPPLEMENT, b"Supplement");
801 key!(SV, b"SV");
802 key!(SV_CERT, b"SVCert");
803 key!(SW, b"SW");
804 key!(SY, b"Sy");
805 key!(SYNCHRONOUS, b"Synchronous");
806 key!(T, b"T");
807 key!(TARGET, b"Target");
808 key!(TEMPLATES, b"Templates");
809 key!(THREAD, b"Thread");
810 key!(THREADS, b"Threads");
811 key!(THREE_DD, b"3DD");
812 key!(THUMB, b"Thumb");
813 key!(TI, b"TI");
814 key!(TILING_TYPE, b"TilingType");
815 key!(TIME_STAMP, b"TimeStamp");
816 key!(TITLE, b"Title");
817 key!(TK, b"TK");
818 key!(TM, b"TM");
819 key!(TO_UNICODE, b"ToUnicode");
820 key!(TR, b"TR");
821 key!(TR2, b"TR2");
822 key!(TRAPPED, b"Trapped");
823 key!(TRANS, b"Trans");
824 key!(TRANSFORM_METHOD, b"TransformMethod");
825 key!(TRANSFORM_PARAMS, b"TransformParams");
826 key!(TRANSPARENCY, b"Transparency");
827 key!(TREF, b"TRef");
828 key!(TRIM_BOX, b"TrimBox");
829 key!(TRUE_TYPE, b"TrueType");
830 key!(TRUSTED_MODE, b"TrustedMode");
831 key!(TU, b"TU");
832 key!(TX, b"Tx");
833 key!(TYPE, b"Type");
834 key!(TYPE0, b"Type0");
835 key!(TYPE1, b"Type1");
836 key!(TYPE3, b"Type3");
837
838 key!(U, b"U");
840 key!(UE, b"UE");
841 key!(UF, b"UF");
842 key!(UNCHANGED, b"Unchanged");
843 key!(UNIX, b"Unix");
844 key!(URI, b"URI");
845 key!(URL, b"URL");
846 key!(URL_TYPE, b"URLType");
847 key!(USAGE, b"Usage");
848 key!(USE_CMAP, b"UseCMap");
849 key!(USER_UNIT, b"UserUnit");
850
851 key!(V, b"V");
853 key!(VE, b"VE");
854 key!(VERISIGN_PPKVS, b"VeriSign.PPKVS");
855 key!(VERSION, b"Version");
856 key!(VERTICES, b"Vertices");
857 key!(VERTICES_PER_ROW, b"VerticesPerRow");
858 key!(VIEW, b"View");
859 key!(VIEW_AREA, b"ViewArea");
860 key!(VIEW_CLIP, b"ViewClip");
861 key!(VIEW_STATE, b"ViewState");
862 key!(VIEWER_PREFERENCES, b"ViewerPreferences");
863 key!(VOLUME, b"Volume");
864 key!(VP, b"VP");
865 key!(VRI, b"VRI");
866
867 key!(W, b"W");
869 key!(W2, b"W2");
870 key!(WC, b"WC");
871 key!(WHITE_POINT, b"WhitePoint");
872 key!(WIDGET, b"Widget");
873 key!(WIDTH, b"Width");
874 key!(WIDTHS, b"Widths");
875 key!(WIN, b"Win");
876 key!(WIN_ANSI_ENCODING, b"WinAnsiEncoding");
877 key!(WMODE, b"WMode");
878 key!(WP, b"WP");
879 key!(WS, b"WS");
880
881 key!(X, b"X");
883 key!(XFA, b"XFA");
884 key!(X_STEP, b"XStep");
885 key!(XHEIGHT, b"XHeight");
886 key!(XOBJECT, b"XObject");
887 key!(XREF, b"XRef");
888 key!(XREF_STM, b"XRefStm");
889
890 key!(Y, b"Y");
892 key!(Y_STEP, b"YStep");
893 key!(YES, b"Yes");
894
895 key!(ZA_DB, b"ZaDb");
897}
898
899#[cfg(test)]
900mod tests {
901 use crate::object::Name;
902 use crate::object::Number;
903 use crate::object::dict::{Dict, InlineImageDict};
904 use crate::object::string;
905 use crate::reader::{Reader, ReaderContext};
906
907 fn dict_impl(data: &[u8]) -> Option<Dict<'_>> {
908 Reader::new(data).read_with_context::<Dict>(ReaderContext::dummy())
909 }
910
911 #[test]
912 fn empty_dict_1() {
913 let dict_data = b"<<>>";
914 let dict = dict_impl(dict_data).unwrap();
915
916 assert_eq!(dict.len(), 0);
917 }
918
919 #[test]
920 fn empty_dict_2() {
921 let dict_data = b"<< \n >>";
922 let dict = dict_impl(dict_data).unwrap();
923
924 assert_eq!(dict.len(), 0);
925 }
926
927 #[test]
928 fn dict_1() {
929 let dict_data = b"<< /Hi 34.0 >>";
930 let dict = dict_impl(dict_data).unwrap();
931
932 assert_eq!(dict.len(), 1);
933 assert!(dict.get::<Number>(Name::new(b"Hi")).is_some());
934 }
935
936 #[test]
937 fn dict_2() {
938 let dict_data = b"<< /Hi \n 34.0 /Second true >>";
939 let dict = dict_impl(dict_data).unwrap();
940
941 assert_eq!(dict.len(), 2);
942 assert!(dict.get::<Number>(Name::new(b"Hi")).is_some());
943 assert!(dict.get::<bool>(Name::new(b"Second")).is_some());
944 }
945
946 #[test]
947 fn dict_with_null() {
948 let dict_data = b"<< /Entry null /Second (Hi) >>";
949 let dict = dict_impl(dict_data).unwrap();
950
951 assert_eq!(dict.len(), 1);
952 }
953
954 #[test]
955 fn dict_complex() {
956 let data = "<< /Type /Example
957/Subtype /DictionaryExample
958/Version 0.01
959/IntegerItem 12
960/StringItem ( a string )
961/Subdictionary << /Item1 0.4
962 /Item2 true
963 /LastItem ( not ! )
964 /VeryLastItem ( OK )
965 >>
966>>";
967
968 let dict = Reader::new(data.as_bytes())
969 .read_with_context::<Dict>(ReaderContext::dummy())
970 .unwrap();
971 assert_eq!(dict.len(), 6);
972 assert!(dict.get::<Name>(Name::new(b"Type")).is_some());
973 assert!(dict.get::<Name>(Name::new(b"Subtype")).is_some());
974 assert!(dict.get::<Number>(Name::new(b"Version")).is_some());
975 assert!(dict.get::<i32>(Name::new(b"IntegerItem")).is_some());
976 assert!(
977 dict.get::<string::String>(Name::new(b"StringItem"))
978 .is_some()
979 );
980 assert!(dict.get::<Dict>(Name::new(b"Subdictionary")).is_some());
981 }
982
983 #[test]
984 fn dict_with_trailing() {
985 let dict_data = b"<< /Hi 67.0 >>trailing data";
986 let dict = dict_impl(dict_data).unwrap();
987
988 assert_eq!(dict.len(), 1);
989 }
990
991 #[test]
992 fn dict_with_comment() {
993 let dict_data = b"<< /Hi % A comment \n 67.0 % Another comment \n >>";
994 let dict = dict_impl(dict_data).unwrap();
995
996 assert_eq!(dict.len(), 1);
997 }
998
999 #[test]
1000 fn inline_dict() {
1001 let dict_data = b"/W 17 /H 17 /CS /RGB /BPC 8 /F [ /A85 /LZW ] ID ";
1002
1003 let dict = Reader::new(&dict_data[..])
1004 .read_with_context::<InlineImageDict>(ReaderContext::dummy())
1005 .unwrap();
1006
1007 assert_eq!(dict.get_dict().len(), 5);
1008 }
1009
1010 #[test]
1011 fn dict_with_escaped_name() {
1012 let dict_data = b"<< /PANTONE#20104#20C 234 >>";
1013 let dict = dict_impl(dict_data).unwrap();
1014
1015 assert!(dict.contains_key(b"PANTONE 104 C".as_ref()));
1016 }
1017}