-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathDocumentProcessor.m
105 lines (90 loc) · 3.88 KB
/
DocumentProcessor.m
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
//
// DocumentProcessor.m
// PDFFonts
//
// Created by Philipp Stephani on 20.12.09.
// Copyright 2010, 2011 Philipp Stephani. All rights reserved.
//
// Redistribution and use in source and binary forms, with or without modification, are
// permitted provided that the following conditions are met:
//
// 1. Redistributions of source code must retain the above copyright notice, this list of
// conditions and the following disclaimer.
//
// 2. Redistributions in binary form must reproduce the above copyright notice, this list
// of conditions and the following disclaimer in the documentation and/or other materials
// provided with the distribution.
//
// THIS SOFTWARE IS PROVIDED BY PHILIPP STEPHANI "AS IS" AND ANY EXPRESS OR IMPLIED
// WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
// FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL PHILIPP STEPHANI OR
// CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
// ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
// NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
// ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
//
// The views and conclusions contained in the software and documentation are those of the
// authors and should not be interpreted as representing official policies, either expressed
// or implied, of Philipp Stephani.
//
#import "DocumentProcessor.h"
#import "FontProperties.h"
static void processFontDictionary(const char *key, CGPDFObjectRef object, void *info);
@implementation DocumentProcessor
- (id)initWithURL:(NSURL *)aURL fontList:(FontList *)aResult {
if ((self = [super init])) {
url = aURL;
result = aResult;
}
return self;
}
- (void)processDocument {
CGPDFDocumentRef document = CGPDFDocumentCreateWithURL((CFURLRef)url);
if (document) {
for (size_t index = 1, count = CGPDFDocumentGetNumberOfPages(document); index <= count; ++index) {
CGPDFPageRef page = CGPDFDocumentGetPage(document, index);
if (page) {
[self processPage:page];
}
}
CGPDFDocumentRelease(document);
} else {
NSLog(@"Cannot process document with URL %@", url);
}
}
- (void)processPage:(CGPDFPageRef)page {
CGPDFDictionaryRef pageDictionary = CGPDFPageGetDictionary(page);
CGPDFDictionaryRef resourceDictionary = nil;
if (CGPDFDictionaryGetDictionary(pageDictionary, "Resources", &resourceDictionary)) {
CGPDFDictionaryRef fontResourceDictionary = nil;
if (CGPDFDictionaryGetDictionary(resourceDictionary, "Font", &fontResourceDictionary)) {
CGPDFDictionaryApplyFunction(fontResourceDictionary, processFontDictionary, (__bridge void *)(self));
}
}
}
- (void)processFontDictionary:(CGPDFDictionaryRef)fontDictionary {
NSString *type = [DocumentProcessor nameFromDictionary:fontDictionary key:"Subtype"];
NSString *name = [DocumentProcessor nameFromDictionary:fontDictionary key:"BaseFont"];
FontProperties *properties = [[FontProperties alloc] initWithType:type name:name];
[result addFontProperties:properties];
}
+ (NSString *)nameFromDictionary:(CGPDFDictionaryRef)dictionary key:(const char*)key {
const char *result = nil;
if (CGPDFDictionaryGetName(dictionary, key, &result)) {
return [NSString stringWithUTF8String:result];
} else {
return nil;
}
}
@end
static void processFontDictionary(const char *key, CGPDFObjectRef object, void *info) {
CGPDFDictionaryRef fontDictionary = NULL;
if (CGPDFObjectGetValue(object, kCGPDFObjectTypeDictionary, &fontDictionary)) {
id documentProcessor = (__bridge id)info;
[documentProcessor processFontDictionary:fontDictionary];
} else {
NSLog(@"Font resource item does not point to a dictionary");
}
}