123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114 |
- //
- // KMOCTool.m
- // PDF Master
- //
- // Created by liujiajie on 2023/11/15.
- //
- #import "KMOCTool.h"
- #import <Foundation/Foundation.h>
- #import <CoreGraphics/CoreGraphics.h>
- #import <Cocoa/Cocoa.h>
- #import <PDF_Master-Swift.h>
- @implementation KMOCTool
- + (void)createPDFFile:(NSString *)filePath imagePaths:(NSArray *)paths results:(NSArray *)resultsArray scale:(CGFloat)scale {
- if (paths.count < 1) {
- return;
- }
-
- CFStringRef path = (__bridge CFStringRef)filePath;
- CFURLRef url = CFURLCreateWithFileSystemPath(NULL, path, kCFURLPOSIXPathStyle, 0);
- CFMutableDictionaryRef myDictionary = CFDictionaryCreateMutable(NULL,
- 0,
- &kCFTypeDictionaryKeyCallBacks,
- &kCFTypeDictionaryValueCallBacks);
- CFDictionarySetValue(myDictionary, kCGPDFContextCreator, CFSTR("Kdan Mobile PDF Reader"));
-
- CGContextRef pdfContext = CGPDFContextCreateWithURL(url, &CGRectZero, myDictionary);
- CGContextSetRGBFillColor(pdfContext, 1.0, 0.0, 0.0, 0.0);
- CGContextSetTextDrawingMode(pdfContext, kCGTextFill);
-
- CFRelease(myDictionary);
- CFRelease(url);
-
- for (int i=0; i<paths.count; i++) {
- NSString *path = [paths objectAtIndex:i];
- NSImage *image = [[NSImage alloc] initWithContentsOfFile:path];
- CIImage *imageCIImage = [CIImage imageWithContentsOfURL:[NSURL fileURLWithPath:path]];
- NSSize size = [imageCIImage extent].size;
- CGRect pageRect = CGRectMake(0, 0, size.width/scale, size.height/scale);
-
- CFMutableDictionaryRef pageDictionary = CFDictionaryCreateMutable(NULL,
- 0,
- &kCFTypeDictionaryKeyCallBacks,
- &kCFTypeDictionaryValueCallBacks);
- CFDataRef boxData = CFDataCreate(NULL,(const UInt8 *)&pageRect, sizeof (CGRect));
- CFDictionarySetValue(pageDictionary, kCGPDFContextMediaBox, boxData);
- CGPDFContextBeginPage (pdfContext, pageDictionary);
- NSData *imageData = [NSData dataWithContentsOfFile:path];
- CGImageSourceRef imageSource = CGImageSourceCreateWithData((CFDataRef)imageData, NULL);
- CGImageRef imageRef = CGImageSourceCreateImageAtIndex(imageSource, 0, NULL);
- CGContextSaveGState(pdfContext);
- CGContextDrawImage(pdfContext, pageRect, imageRef);
- CGContextRestoreGState(pdfContext);
- CGImageRelease(imageRef);
-
- [NSGraphicsContext saveGraphicsState];
- [NSGraphicsContext setCurrentContext:[NSGraphicsContext graphicsContextWithCGContext:pdfContext flipped:NO]];
- NSArray *results = nil;
- if (i < resultsArray.count) {
- results = resultsArray[i];
- CGFloat newScale = scale;
- if([KMGOCRManager defaultManager].OCRType == KMOCRType_Apple)
- newScale = 1;
- if (results.count == 1) {
- KMGOCRResult *result = results[0];
- NSRect bounds = NSMakeRect((result.textBounds.origin.x)/newScale,
- pageRect.size.height-(result.textBounds.origin.y+result.textBounds.size.height)/newScale,
- (result.textBounds.size.width)/newScale,
- (result.textBounds.size.height)/newScale);
- NSDictionary *dic = @{NSFontAttributeName:FontWithSize(result.text, CGSizeMake(result.textBounds.size.width/newScale, result.textBounds.size.height/newScale)),
- NSForegroundColorAttributeName:[NSColor clearColor]};
- [result.text drawInRect:bounds withAttributes:dic];
- } else {
- for (int i=1; i<results.count; i++) {
- KMGOCRResult *result = results[i];
- NSRect bounds = NSMakeRect((result.textBounds.origin.x)/newScale,
- pageRect.size.height-(result.textBounds.origin.y+result.textBounds.size.height)/newScale,
- (result.textBounds.size.width)/newScale,
- (result.textBounds.size.height)/newScale);
- NSDictionary *dic = @{NSFontAttributeName:FontWithSize(result.text, CGSizeMake(result.textBounds.size.width/newScale, result.textBounds.size.height/newScale)),
- NSForegroundColorAttributeName:[NSColor clearColor]};
- [result.text drawInRect:bounds withAttributes:dic];
- }
- }
- }
- [NSGraphicsContext restoreGraphicsState];
-
- CGPDFContextEndPage (pdfContext);
-
- CFRelease(pageDictionary);
- CFRelease(boxData);
- image = nil;
- }
-
- CGPDFContextClose(pdfContext);
- CGContextRelease (pdfContext);
- }
- static inline NSFont * FontWithSize(NSString *strChar, CGSize size) {
- CGFloat fontsize = 1.0;
- NSFont *font = [NSFont systemFontOfSize:fontsize];
- CGSize strSize = [strChar sizeWithAttributes:@{NSFontAttributeName:font}];
- while ((fontsize<127) && (strSize.width<size.width || strSize.height<size.height)) {
- fontsize += 1.0;
- font = [NSFont systemFontOfSize:fontsize];
- strSize = [strChar sizeWithAttributes:@{NSFontAttributeName:font}];
- }
- return [NSFont systemFontOfSize:fontsize-1];
- }
- @end
|