0

Web サービスから NSString を取得し、メソッド dataWithBase64EncodedString を使用してそれを NSData に変換し、次のコードで NSData を pdf に変換します。

CFDataRef myPDFData = (__bridge CFDataRef) retrievedData;
    CGDataProviderRef provider = CGDataProviderCreateWithCFData(myPDFData);
    CGPDFDocumentRef pdf = (CGPDFDocumentCreateWithProvider(provider));

このpdfをiPhoneの画面に表示する方法がわかりません。

+ (id)dataWithBase64EncodedString:(NSString *)string;
{
if (string == nil)
    [NSException raise:NSInvalidArgumentException format:nil];
if ([string length] == 0)
    return [NSData data];

static char *decodingTable = NULL;
if (decodingTable == NULL)
{
    decodingTable = malloc(256);
    if (decodingTable == NULL)
        return nil;
    memset(decodingTable, CHAR_MAX, 256);
    NSUInteger i;
    for (i = 0; i < 64; i++)
        decodingTable[(short)encodingTable[i]] = i;
}

const char *characters = [string cStringUsingEncoding:NSASCIIStringEncoding];
if (characters == NULL)     //  Not an ASCII string!
    return nil;
char *bytes = malloc((([string length] + 3) / 4) * 3);
if (bytes == NULL)
    return nil;
NSUInteger length = 0;

NSUInteger i = 0;
while (YES)
{
    char buffer[4];
    short bufferLength;
    for (bufferLength = 0; bufferLength < 4; i++)
    {
        if (characters[i] == '\0')
            break;
        if (isspace(characters[i]) || characters[i] == '=')
            continue;
        buffer[bufferLength] = decodingTable[(short)characters[i]];
        if (buffer[bufferLength++] == CHAR_MAX)      //  Illegal character!
        {
            free(bytes);
            return nil;
        }
    }

    if (bufferLength == 0)
        break;
    if (bufferLength == 1)      //  At least two characters are needed to produce one byte!
    {
        free(bytes);
        return nil;
    }

    //  Decode the characters in the buffer to bytes.
    bytes[length++] = (buffer[0] << 2) | (buffer[1] >> 4);
    if (bufferLength > 2)
        bytes[length++] = (buffer[1] << 4) | (buffer[2] >> 2);
    if (bufferLength > 3)
        bytes[length++] = (buffer[2] << 6) | buffer[3];
}

realloc(bytes, length);
return [NSData dataWithBytesNoCopy:bytes length:length];
}
4

2 に答える 2

1

コンテキストがない場合はコンテキストを作成し、特定のページ ( index) に対して次のことを行います。

- (void)drawPDF:(CGPDFDocumentRef)pdf pageIndex:(NSUInteger)index context:(CGContextRef)ctx {

    CGPDFPageRef page = CGPDFDocumentGetPage(pdf, index);
    CGAffineTransform transform = aspectFit(CGPDFPageGetBoxRect(page, kCGPDFMediaBox),
                                        CGContextGetClipBoundingBox(ctx));
    CGContextConcatCTM(ctx, transform);
    CGContextDrawPDFPage(ctx, page);
}

描画するコンテキストを取得するには、次のようにします。

CGSize pageSize = ...;
UIGraphicsBeginImageContextWithOptions(pageSize, YES, 0.0);
CGContextRef context = UIGraphicsGetCurrentContext();
CGContextClipToRect(context, CGRectMake(0, 0, pageSize.width, pageSize.height));

    <DRAW PAGE HERE>
    [self drawPDF:pdf pageIndex:N context:context];

UIGraphicsEndImageContext();

編集すると、PDF をビュー サイズにスケーリングする処理を行う次の C 関数 (クラス外) も定義する必要があります。

CGAffineTransform aspectFit(CGRect innerRect, CGRect outerRect) {
  CGFloat scaleFactor = MIN(outerRect.size.width/innerRect.size.width, outerRect.size.height/innerRect.size.height);
  CGAffineTransform scale = CGAffineTransformMakeScale(scaleFactor, scaleFactor);
  CGRect scaledInnerRect = CGRectApplyAffineTransform(innerRect, scale);
  CGAffineTransform translation = 
  CGAffineTransformMakeTranslation((outerRect.size.width - scaledInnerRect.size.width) / 2 - scaledInnerRect.origin.x, 
                                 (outerRect.size.height - scaledInnerRect.size.height) / 2 - scaledInnerRect.origin.y);
  return CGAffineTransformConcat(scale, translation);
}

または、次の行を削除できます。

    CGAffineTransform transform = aspectFit(CGPDFPageGetBoxRect(page, kCGPDFMediaBox),
                                        CGContextGetClipBoundingBox(ctx));
    CGContextConcatCTM(ctx, transform);
于 2012-11-29T09:41:11.200 に答える
0

PDFファイルをUIWebviewにロードすると、多くのPDFリーダー機能が表示されます。

于 2012-11-29T10:06:44.530 に答える