Skip to content

Commit

Permalink
Merge from dzindra.
Browse files Browse the repository at this point in the history
  • Loading branch information
KurtCode committed Jul 8, 2013
1 parent 08d3584 commit 52ef516
Show file tree
Hide file tree
Showing 10 changed files with 125 additions and 144 deletions.
3 changes: 0 additions & 3 deletions PDFKitten/CMap.h
Expand Up @@ -10,10 +10,7 @@ extern NSValue *rangeValue(unsigned int from, unsigned int to);
@end

@interface CMap : NSObject {
NSMutableArray *offsets;
NSMutableDictionary *chars;
NSMutableDictionary *context;
NSString *currentEndToken;

/* CMap ranges */
NSMutableArray *codeSpaceRanges;
Expand Down
197 changes: 84 additions & 113 deletions PDFKitten/CMap.m
Expand Up @@ -21,6 +21,14 @@ + (Operator *)operatorWithStart:(NSString *)start end:(NSString *)end handler:(S
return op;
}

- (void)dealloc
{
[start release];
[end release];

[super dealloc];
}

@synthesize start, end, handler;
@end

Expand All @@ -29,10 +37,10 @@ - (void)handleCodeSpaceRange:(NSString *)string;
- (void)handleCharacter:(NSString *)string;
- (void)handleCharacterRange:(NSString *)string;
- (void)parse:(NSString *)cMapString;
@property (readonly) NSCharacterSet *tokenDelimiterSet;
@property (nonatomic, retain) NSMutableDictionary *context;
@property (nonatomic, readonly) NSCharacterSet *tagSet;
@property (nonatomic, readonly) NSSet *operators;
@property(nonatomic, retain) NSMutableDictionary *context;
@property(readonly) NSCharacterSet *tokenDelimiterSet;
@property(readonly) NSCharacterSet *tagSet;
@property(readonly) NSSet *operators;
@end

@implementation CMap
Expand Down Expand Up @@ -69,12 +77,14 @@ - (BOOL)isInCodeSpaceRange:(unichar)cid
return NO;
}

#pragma mark - Public methods

/**!
* Returns the unicode value mapped by the given character ID
*/
- (unichar)unicodeCharacter:(unichar)cid
{
if (![self isInCodeSpaceRange:cid]) return 0;
if (![self isInCodeSpaceRange:cid]) return (unichar) NSNotFound;

NSArray *mappedRanges = [self.characterRangeMappings allKeys];
for (NSValue *rangeValue in mappedRanges)
Expand All @@ -86,89 +96,66 @@ - (unichar)unicodeCharacter:(unichar)cid
return cid + [offsetValue intValue];
}
}

NSArray *mappedValues = [self.characterMappings allKeys];
for (NSNumber *from in mappedValues)
{
if ([from intValue] == cid)
{
return [[self.characterMappings objectForKey:from] intValue];
}
}

return (unichar) NSNotFound;

NSNumber *result = [self.characterMappings objectForKey:[NSNumber numberWithInt:cid]];
if (result) {
return [result intValue];
}

return (unichar) NSNotFound;
}

- (NSSet *)operators
{
@synchronized (self)
- (unichar)cidCharacter:(unichar)unicode {
__block unichar result = NSNotFound;

[self.characterRangeMappings enumerateKeysAndObjectsUsingBlock:^(NSValue *rangeValue, NSNumber *offset, BOOL *stop) {
NSRange range = [rangeValue rangeValue];
range.location += [offset intValue];
if (unicode >= range.location && unicode <= NSMaxRange(range)) {
result = unicode - [offset intValue];
*stop = YES;
}
}];
if (result != NSNotFound)
return result;

NSArray *keys = [self.characterMappings allKeysForObject:[NSNumber numberWithInt:unicode]];
if (keys.count) {
if (keys.count > 1) {
NSLog(@"more keys for character %C keys = %@", unicode, keys);
}
return [[keys lastObject]intValue];
} else {
return NSNotFound;
}
/*
// Look up the offsets dictionary for this unicode
for (NSDictionary *dict in offsets)
{
if (!sharedOperators)
{
sharedOperators = [[NSMutableSet alloc] initWithObjects:
[Operator operatorWithStart:@"begincodespacerange"
end:@"endcodespacerange"
handler:@selector(handleCodeSpaceRange:)],
[Operator operatorWithStart:@"beginbfchar"
end:@"endbfchar"
handler:@selector(handleCharacter:)],
[Operator operatorWithStart:@"beginbfrange"
end:@"endbfrange"
handler:@selector(handleCharacterRange:)],
nil];
}
return sharedOperators;
}
int firstChar = [[dict objectForKey:@"First"] intValue];
int lastChar = [[dict objectForKey:@"Last"] intValue];
int offset = [[dict objectForKey:@"Offset"] intValue];
for (int i = 0 ; i <= lastChar-firstChar ; i++) {
unichar dictUnicode = offset+i;
if (dictUnicode == unicode) {
return i;
}
}
} */
}

#pragma mark -
#pragma mark Scanner

- (Operator *)operatorWithStartingToken:(NSString *)token {
NSString *content = nil;
NSCharacterSet *newLineSet = [NSCharacterSet newlineCharacterSet];
NSCharacterSet *tagSet = [NSCharacterSet characterSetWithCharactersInString:@"<>"];
NSString *separatorString = @"> <";

chars = [[NSMutableDictionary alloc] init];
NSScanner *rangeScanner = [NSScanner scannerWithString:content];
while (![rangeScanner isAtEnd])
{
NSString *line = nil;
[rangeScanner scanUpToCharactersFromSet:newLineSet intoString:&line];
line = [line stringByTrimmingCharactersInSet:tagSet];
NSArray *parts = [line componentsSeparatedByString:separatorString];

NSUInteger from, to;
NSScanner *scanner = [NSScanner scannerWithString:[parts objectAtIndex:0]];
[scanner scanHexInt:&from];
NSNumber *fromNumber = [NSNumber numberWithInt:from];

NSString *toString = [parts objectAtIndex:1];
int charLen = 4;
if ([toString length] > charLen) {
NSMutableArray *toArray = [NSMutableArray arrayWithCapacity: [toString length]/4 + ([toString length]%4 > 0 ? 1 : 0)];
NSRange range;
NSString *nextTo;
for (int offset = 0; offset < [toString length]/4; offset++) {
range = NSMakeRange(offset * charLen, charLen);
nextTo = [toString substringWithRange: range];
scanner = [NSScanner scannerWithString: nextTo];
[scanner scanHexInt: &to];
[toArray addObject: [NSNumber numberWithInt:to]];
if (token) {
for (Operator *op in self.operators) {
if ([op.start isEqualToString:token]) {
return op;
}
[chars setObject: toArray forKey:fromNumber];
}
else
{
scanner = [NSScanner scannerWithString:[parts objectAtIndex:1]];
[scanner scanHexInt:&to];
NSNumber *toNumber = [NSNumber numberWithInt:to];
[chars setObject:toNumber forKey:fromNumber];

}
}

return nil;
}

Expand Down Expand Up @@ -320,6 +307,23 @@ - (void)handleCharacterRange:(NSString *)token
#pragma mark -
#pragma mark Accessor methods

- (NSSet *)operators {
if (!sharedOperators) {
sharedOperators = [[NSMutableSet alloc] initWithObjects:
[Operator operatorWithStart:@"begincodespacerange"
end:@"endcodespacerange"
handler:@selector(handleCodeSpaceRange:)],
[Operator operatorWithStart:@"beginbfchar"
end:@"endbfchar"
handler:@selector(handleCharacter:)],
[Operator operatorWithStart:@"beginbfrange"
end:@"endbfrange"
handler:@selector(handleCharacterRange:)],
nil];
}
return sharedOperators;
}

- (NSCharacterSet *)tagSet {
if (!sharedTagSet) {
sharedTagSet = [[NSCharacterSet characterSetWithCharactersInString:@"<>"] retain];
Expand Down Expand Up @@ -355,48 +359,15 @@ - (NSMutableDictionary *)characterRangeMappings {
return characterRangeMappings;
}

- (unichar)cidCharacter:(unichar)unicode
{
//TODO: search in range dictionary

// Look up the offsets dictionary for this unicode
for (NSDictionary *dict in offsets)
{
int firstChar = [[dict objectForKey:@"First"] intValue];
int lastChar = [[dict objectForKey:@"Last"] intValue];
int offset = [[dict objectForKey:@"Offset"] intValue];

for (int i = 0 ; i <= lastChar-firstChar ; i++) {
unichar dictUnicode = offset+i;
if (dictUnicode == unicode) {
return i;
}
}
}

if (chars) {
NSEnumerator *keys = [chars keyEnumerator];
NSObject *value;
NSObject *key;
while (key = [keys nextObject]) {
value = [chars objectForKey: key];
if ([value isKindOfClass: [NSNumber class]]) {
if ([(NSNumber *)value intValue] == unicode) {
return [(NSNumber *)key intValue];
}
}
}
}
return unicode;
}

- (void)dealloc
{
[offsets release];
[context release];
[characterMappings release];
[characterRangeMappings release];
[codeSpaceRanges release];
[super dealloc];
}

@synthesize operators, context;
@synthesize context;
@synthesize codeSpaceRanges, characterMappings, characterRangeMappings;
@end
4 changes: 2 additions & 2 deletions PDFKitten/FontDescriptor.m
Expand Up @@ -91,11 +91,11 @@ - (id)initWithPDFDictionary:(CGPDFDictionaryRef)dict
{
CGPDFDataFormat format;
NSData *data = (NSData *) CGPDFStreamCopyData(fontFileStream, &format);

/*
NSString *path = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
path = [path stringByAppendingPathComponent:@"fontfile"];
[data writeToFile:path atomically:YES];

*/
fontFile = [[FontFile alloc] initWithData:data];
[data release];
}
Expand Down
1 change: 1 addition & 0 deletions PDFKitten/Scanner.h
Expand Up @@ -8,6 +8,7 @@
@interface Scanner : NSObject <StringDetectorDelegate> {
CGPDFPageRef pdfPage;
NSMutableArray *selections;
Selection *possibleSelection;

StringDetector *stringDetector;
FontCollection *fontCollection;
Expand Down
14 changes: 10 additions & 4 deletions PDFKitten/Scanner.m
Expand Up @@ -18,6 +18,7 @@ - (id)initWithPage:(CGPDFPageRef)page {
}

- (NSArray *)select:(NSString *)keyword {
self.content = [NSMutableString string];
self.stringDetector = [StringDetector detectorWithKeyword:keyword delegate:self];
[self.selections removeAllObjects];
self.renderingStateStack = [RenderingStateStack stack];
Expand Down Expand Up @@ -110,20 +111,25 @@ - (void)detector:(StringDetector *)detector didScanCharacter:(unichar)character
[self.renderingState translateTextPosition:CGSizeMake(width, 0)];
}

- (void)detectorDidStartMatching:(StringDetector *)stringDetector {
[self.selections addObject:[Selection selectionWithState:self.renderingState]];
- (void)detectorDidStartMatching:(StringDetector *)detector {
possibleSelection = [[Selection selectionWithState:self.renderingState] retain];
}

- (void)detectorFoundString:(StringDetector *)detector {
Selection *selection = [self.selections lastObject];
selection.finalState = self.renderingState;
if (possibleSelection) {
possibleSelection.finalState = self.renderingState;
[self.selections addObject:possibleSelection];
[possibleSelection release];
possibleSelection = nil;
}
}

- (RenderingState *)renderingState {
return [self.renderingStateStack topRenderingState];
}

- (void)dealloc {
[possibleSelection release];
[fontCollection release];
[selections release];
[renderingStateStack release];
Expand Down
29 changes: 19 additions & 10 deletions PDFKitten/SimpleFont.m
Expand Up @@ -48,31 +48,29 @@ - (void)setEncodingWithFontDictionary:(CGPDFDictionaryRef)dict
- (NSString *)stringWithPDFString:(CGPDFStringRef)pdfString
{
const unsigned char *bytes = CGPDFStringGetBytePtr(pdfString);
NSInteger length = CGPDFStringGetLength(pdfString);
NSData *rawBytes = [NSData dataWithBytes:bytes length:length];
NSUInteger length = CGPDFStringGetLength(pdfString);
if (!self.encoding && self.toUnicode)
{
// Use ToUnicode map
NSString *str = (NSString *) CGPDFStringCopyTextString(pdfString);
NSMutableString *unicodeString = [NSMutableString string];

// Translate to Unicode
for (int i = 0; i < [str length]; i++)
for (int i = 0; i < length; i++)
{
unichar cid = [str characterAtIndex:i];
[unicodeString appendFormat:@"%C", [self.toUnicode unicodeCharacter:cid]];
unichar cid = bytes[i];
unichar uni = [self.toUnicode unicodeCharacter:cid];
//NSLog(@"(%hu) %C -> (%hu) %C", cid, cid, uni, uni);
[unicodeString appendFormat:@"%C", uni];
}

[str release];
return unicodeString;
}
else if (!self.encoding)
{
return [super stringWithPDFString:pdfString];
// NSString *string = [[NSString alloc] initWithData:rawBytes encoding:NSMacOSRomanStringEncoding];
// return [string autorelease];
}
NSString *string = [[NSString alloc] initWithData:rawBytes encoding:self.encoding];
NSData *rawBytes = [NSData dataWithBytes:bytes length:length];
NSString *string = [[NSString alloc] initWithData:rawBytes encoding:nativeEncoding(self.encoding)];

return [string autorelease];
}
Expand Down Expand Up @@ -121,4 +119,15 @@ - (void)setEncodingWithEncodingObject:(CGPDFObjectRef)object
// return [NSString stringWithCString:characters encoding:encoding];
//}

- (CGFloat)widthOfSpace
{
unichar c = 0x20;
if (self.toUnicode) {
c = [self.toUnicode cidCharacter:c];
if (c == NSNotFound)
return 0;
}
return [self widthOfCharacter:c withFontSize:1.0];
}

@end
1 change: 0 additions & 1 deletion PDFKitten/StringDetector.h
Expand Up @@ -22,7 +22,6 @@
- (void)setKeyword:(NSString *)kword;
- (void)reset;

- (NSString *)appendPDFString:(CGPDFStringRef)string withFont:(Font *)font;
- (NSString *)appendString:(NSString *)inputString;

@property (nonatomic, assign) id<StringDetectorDelegate> delegate;
Expand Down

0 comments on commit 52ef516

Please sign in to comment.