3

現在のビューを取得してページに分割し、PDFドキュメントをレンダリングするUIView+PDFViewというUIView拡張クラスがあります。私の問題はレンダリング部分にあります。コンテンツのページを正常に「作成」できますが、最初のページ以降のすべてのページが空白になります。私の最終目標は、現在のビューを取得し、ページに等しい幅を「拡大縮小」し、PDF内の残りのビューをページ分割することです。

問題ではないもの:

  • PDFを電子メールに添付する
  • PDFをプリンター/印刷シミュレーターに送信する
  • 実際にPDFを正しく生成しながら1ページだけを印刷する
  • ビューのサイズを正しく変更する(SO質問4919388)
    • メソッドに送信する前にこれを行います。フレームの高さを10ピクセルにして確認しましたが、1ページ(および1ページのみ)を印刷します
  • ビューを正しく翻訳します。翻訳とスケールの両方を行うことによって検証されました。どちらもビューを正しく変更しましたが、どちらも最初のページ以上にレンダリングされませんでした。

私のコードは次のとおりです。

@interface UIView (PDFView)
-(id)createPDFAndSaveToDocumentsWithFileName:(NSString*)aFilename andDocumentInfo:(NSDictionary *)documentInfo;
@end

@implementation UIView (PDFView)

-(id)createPDFAndSaveToDocumentsWithFileName:(NSString*)aFilename andDocumentInfo:(NSDictionary *)documentInfo {
    // http://developer.apple.com/library/ios/DOCUMENTATION/GraphicsImaging/Reference/CGPDFContext/Reference/reference.html#//apple_ref/doc/constant_group/Auxiliary_Dictionary_Keys

    // 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
    CGSize pageSize = CGSizeMake(self.bounds.size.width, 792);
    UIGraphicsBeginPDFContextToData(pdfData, CGRectZero, documentInfo);
    CGContextRef pdfContext = UIGraphicsGetCurrentContext();

    NSInteger currentPage = 0;
    BOOL done = NO;

    do {
        CGRect currentPageRect = CGRectMake(0, (pageSize.height*currentPage), pageSize.width, pageSize.height);
        UIGraphicsBeginPDFPageWithInfo(currentPageRect, nil);

        // draws rect to the view and thus this is captured by UIGraphicsBeginPDFContextToData
        [self.layer renderInContext:pdfContext];

        // If we're at the end of the view, exit the loop.
        if ((pageSize.height*currentPage) > self.bounds.size.height) {
            done = YES;
        } else {
            currentPage++;
        }
    } while (!done);

    // remove PDF rendering context
    UIGraphicsEndPDFContext();

    if (aFilename == nil) {
        return pdfData;
    } else {
        // Retrieves the document directories from the iOS device
        NSArray* documentDirectories = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask,YES);

        NSString* documentDirectory = [documentDirectories objectAtIndex:0];
        NSString* documentDirectoryFilename = [documentDirectory stringByAppendingPathComponent:aFilename];

        // instructs the mutable data object to write its context to a file on disk
        [pdfData writeToFile:documentDirectoryFilename atomically:YES];
        NSLog(@"documentDirectoryFileName: %@",documentDirectoryFilename);
        return nil;
    }
}
4

1 に答える 1

4

あなたの問題は嘘だと思います

CGRect currentPageRect = CGRectMake(0, (pageSize.height*currentPage), pageSize.width, pageSize.height);

その代わりに、以下のステートメントのいずれかを使用してみてください

UIGraphicsBeginPDFPageWithInfo(CGRectMake(0.0, 0.0, 612.0, 792.0), nil);
UIGraphicsBeginPDFPage();

コンテキストに新しいページを追加するたびに、上記のステートメントを使用すると、コンテキストにページを追加できます。

ページのデフォルト サイズ、つまり 612 X 792 を使用する場合は、直接使用できます。UIGraphicsBeginPDFPage();

使用できるカスタムページサイズUIGraphicsBeginPDFPageWithInfo(CGRectMake(0.0, 0.0, 612.0, 792.0), nil);

それはあなたの問題を解決するはずだと思います。

于 2012-05-04T18:11:12.990 に答える