在更新我的iPad应用程序的过程中,我一直在尝试将现有PDF文档中的页面绘制到核心图形上下文中,然后将其另存为新PDF,但很难正确显示文本。新创建的PDF中的图像看起来很棒,但文本很少正确显示:更常见的是它看起来不是白色/不可见或乱码。当文本不可见时,我仍然可以选择它应该在哪里并正确地复制/粘贴到文本编辑器中。这是否与iPad上可用字体数量有限有关?
我的代码如下:
CGPDFDocumentRef document = CGPDFDocumentCreateWithProvider(dataProvider);
CGPDFPageRef page = CGPDFDocumentGetPage(document, pageNumberToRetrieve);
CGRect pageRect = CGPDFPageGetBoxRect(page, kCGPDFMediaBox);
UIGraphicsBeginPDFContextToFile(pathToFile, pageRect, nil);
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextBeginPage(context, NULL);
// I don't think this line is necessary, but I have tried both with and without it.
CGContextSetTextDrawingMode (context, kCGTextFill);
CGContextDrawPDFPage(context, page);
CGContextEndPage(context);
UIGraphicsEndPDFContext();
CGDataProviderRelease(dataProvider);
CGPDFDocumentRelease(document);
如果有人有任何建议我会非常感谢听到他们。
感谢您的时间。
罗布
答案 0 :(得分:2)
绘制图像上下文不会造成问题(文本正确显示)。
我要做的是创建一个-new- PDF文件,其中只包含原始PDF中的几页。由于某种原因,文本似乎无法正确地绘制到新文件中。
信息在那里(我可以通过'猜测'在预览中应该选择的位置来选择文本),但它不会呈现。我假设CGContextDrawPDFPage将字符串写入PDF文件,但是没有绘制它,因为它不知道该字体的字符“看起来像什么”?
我认为PDF中嵌入字体的意思是,即使系统上没有安装该字体(在这种情况下,iPad),程序也能够执行这些操作。这是格式的限制,还是Quartz框架?
答案 1 :(得分:0)
你想在屏幕上渲染吗?我不认为需要UIGraphicsBeginPDFContextToFile? 但是,要在屏幕上呈现,您可以使用以下内容:
pageReference = CGPDFDocumentGetPage(pdfReference, page);
CGContextRef context = UIGraphicsGetCurrentContext();
@try {
CGContextTranslateCTM(context, 0.0, self.bounds.size.height);
CGContextScaleCTM(context, scale, -scale);
CGContextSaveGState(context);
@try {
CGAffineTransform pdfTransform = CGPDFPageGetDrawingTransform(pageReference, kCGPDFCropBox, self.bounds, 0, true);
CGContextConcatCTM(context, pdfTransform);
CGContextDrawPDFPage(context, pageReference);
}
@finally {
CGContextRestoreGState(context);
}
}
@finally {
UIGraphicsEndImageContext();
}