gpt4 book ai didi

objective-c - iPad 视网膜显示有没有办法减少用 CGContextBeginPage 创建的 PDF 的文件大小?

转载 作者:行者123 更新时间:2023-12-04 05:01:20 25 4
gpt4 key购买 nike

我正在使用具有 Retina Display 2048x1536 分辨率(2x 比例)的全屏 iPad 从 UIViews 创建 PDF 文件。生成的文件非常大,对于 2 页相当简单的 View ,我得到了 6-10 mb 的文件。理想情况下,每个文档我会达到 4-5 页,但当前的方法会使 PDF 大小过大。

有没有办法使以这种方式创建的 PDF 更小? 就像创建 View 的屏幕截图,将其转换为 JPG,然后将其写入 PDF 上下文?或者是否有一些我缺少的质量选项?

这是从单个 View 创建 PDF 的代码:

+(NSMutableData *)createPDFDatafromUIView:(UIView*)aView 
{
// Creates a mutable data object for updating with binary data, like a byte array
NSMutableData *pdfData = [NSMutableData data];

// Points the pdf converter to the mutable data object and to the UIView to be converted
UIGraphicsBeginPDFContextToData(pdfData, aView.bounds, nil);
UIGraphicsBeginPDFPage();
CGContextRef pdfContext = UIGraphicsGetCurrentContext();


// draws rect to the view and thus this is captured by UIGraphicsBeginPDFContextToData

[aView.layer renderInContext:pdfContext];

// remove PDF rendering context
UIGraphicsEndPDFContext();

return pdfData;
}

+(NSString*)createPDFfromUIView:(UIView*)aView saveToFilepath:(NSString*)filepath
{
// Creates a mutable data object for updating with binary data, like a byte array
NSMutableData *pdfData = [AppGraphics createPDFDatafromUIView:aView];


// instructs the mutable data object to write its context to a file on disk
[pdfData writeToFile:filepath atomically:YES];
DLog(@"saving PDF to: %@",filepath);
DLog(@"file exists: %@",[[NSFileManager defaultManager] fileExistsAtPath:filepath]?@"YES":@"NO");
return filepath;
}

这是我用来将多个 PDF 连接在一起的内容
+ (NSString *)joinPDF:(NSArray *)listOfPaths saveToPath:(NSString*)path
{


CFURLRef pdfURLOutput = ( CFURLRef)CFBridgingRetain([NSURL fileURLWithPath:path]);

NSInteger numberOfPages = 0;
// Create the output context
CGContextRef writeContext = CGPDFContextCreateWithURL(pdfURLOutput, NULL, NULL);

for (NSString *source in listOfPaths) {
CFURLRef pdfURL = ( CFURLRef)CFBridgingRetain([[NSURL alloc] initFileURLWithPath:source]);

//file ref
CGPDFDocumentRef pdfRef = CGPDFDocumentCreateWithURL((CFURLRef) pdfURL);
numberOfPages = CGPDFDocumentGetNumberOfPages(pdfRef);

// Loop variables
CGPDFPageRef page;
CGRect mediaBox;

// Read the first PDF and generate the output pages
DLog(@"GENERATING PAGES FROM PDF 1 (%@)...", source);
for (int i=1; i<=numberOfPages; i++) {
page = CGPDFDocumentGetPage(pdfRef, i);
mediaBox = CGPDFPageGetBoxRect(page, kCGPDFMediaBox);
CGContextBeginPage(writeContext, &mediaBox);
CGContextDrawPDFPage(writeContext, page);
CGContextEndPage(writeContext);
}

CGPDFDocumentRelease(pdfRef);
CFRelease(pdfURL);
}
CFRelease(pdfURLOutput);

// Finalize the output file
CGPDFContextClose(writeContext);
CGContextRelease(writeContext);

return path;
}

最佳答案

解决方案确实是在 PDF 上下文中将图像呈现为 JPG。生成的压缩 PDF 大小更小 - 每页约 300-400kb!

//aView is used for its bounds property
//screenshot is the screenshot of the view within its bounds
//compression quality 0.55 is 380kb/page 0.66 is 450kb/page
+(NSString*)createPDFDataFromUIView:(UIView*)aView withScreenshot:(UIImage*)screenshot compressionQuality:(float)compression writeToFile:(NSString*)filepath
{

//prepare JPEG data for rendering into PDF content
NSData *jpegData = UIImageJPEGRepresentation(screenshot, compression);
CGDataProviderRef dp = CGDataProviderCreateWithCFData((__bridge CFDataRef)jpegData);
CGImageRef cgImage = CGImageCreateWithJPEGDataProvider(dp, NULL, true, kCGRenderingIntentDefault);


NSMutableData *pdfData = [NSMutableData data];

// Points the pdf converter to the mutable data object and to the UIView to be converted
UIGraphicsBeginPDFContextToData(pdfData, aView.bounds, nil);
UIGraphicsBeginPDFPage();
CGContextRef pdfContext = UIGraphicsGetCurrentContext();


// draws rect to the view and thus this is captured by UIGraphicsBeginPDFContextToData


//we need to change the coordinate system, otherwise the image is drawn upside down
CGContextTranslateCTM(pdfContext, 0, aView.bounds.size.height);
CGContextScaleCTM(pdfContext, 1.0, -1.0);

//this creates pixels within PDF context
CGContextDrawImage(pdfContext, aView.bounds, cgImage);

// remove PDF rendering context
UIGraphicsEndPDFContext();

[pdfData writeToFile:filepath atomically:YES];

//memory cleanup
CGDataProviderRelease(dp);
CGImageRelease(cgImage);
return filepath;

}

关于objective-c - iPad 视网膜显示有没有办法减少用 CGContextBeginPage 创建的 PDF 的文件大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16127974/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com