1

NSMutableArray の内容を NSData に変換してから、pdf に変換したいと考えています。次のコードを使用して NSdata を変換していますが、エラーが発生します。多くの記事を検索しましたが、何も取得できませんでした

  myArray=[[NSMutableArray alloc]init];


  [myArray addObject:@"Jamshed"];
  [myArray addObject:@"Imran"];
  [myArray addObject:@"Ali"];
  [myArray addObject:@"Hussain"];
  [myArray addObject:@"Faisal"];

 for (int i=0; i<[myArray count]; i++)
 {
NSData *data = [NSKeyedArchiver archivedDataWithRootObject:[myArray objectAtIndex:i]];
NSLog(@"data %@",data);
//create code for pdf file for write b4 read and concatenate readed string with data to write in pdf file.  
 }




   - (NSData*) pdfDataWithSomeText;
   {
// For more on generating PDFs, see http://developer.apple.com/library/ios/#documentation/2DDrawing/Conceptual/DrawingPrintingiOS/GeneratingPDF/GeneratingPDF.html
// The PDF content will be accumulated into this data object.
 NSMutableData *pdfData = [NSMutableData data];

// Use the system default font.
 UIFont *font = [UIFont systemFontOfSize:[UIFont systemFontSize]];

// Use the default page size of 612*792.
 CGRect pageRect = CGRectMake(0, 0, 612, 792);

// Use the defaults for the document, and no metadata.
 UIGraphicsBeginPDFContextToData(pdfData, CGRectZero, nil);

// Create a page.
 UIGraphicsBeginPDFPageWithInfo(pageRect, nil);

// Store some placeholder text.
 NSString *topLine = @"PDF Sample from";
 NSString *bottomLine = @"http://stackoverflow.com/q/10122216/1318452";

// Draw that placeholder text, starting from the top left.
 CGPoint topLeft = CGPointZero;
 CGSize lineSize = [topLine sizeWithFont:font];
 [topLine drawAtPoint:topLeft withFont:font];
// Move down by the size of the first line before drawing the second.
 topLeft.y += lineSize.height;
 [bottomLine drawAtPoint:topLeft withFont:font];

// Close the PDF context.
 UIGraphicsEndPDFContext();  

// The pdfData object has now had a complete PDF file written to it.
 return pdfData;
 }
4

4 に答える 4

3

文字列を PDF に書き込むことは、それらの文字列から NSData を生成するほど単純ではありません。iOSの描画および印刷ガイド - PDF コンテンツの生成 を参照してください。はい、それは大きな文書です。それを読んで。そこから例を試してみてください。例に独自の文字列を追加してみてください。次に、ほとんど機能するものがある場合は、ここに戻ってそれについて質問してください。

PDF の生成

上記のリンクのコードは次のとおりです。Core Text の代わりに NSString を使用して描画することで、さらに単純化されています。入力配列を描画しますが、おそらくより良い演算が必要になるでしょう。より構造化された方法で描画できますか?

- (NSData*) pdfDataWithStrings:(NSArray*) strings;
{
    // For more on generating PDFs, see http://developer.apple.com/library/ios/#documentation/2DDrawing/Conceptual/DrawingPrintingiOS/GeneratingPDF/GeneratingPDF.html
    strings = [strings arrayByAddingObject:@"https://stackoverflow.com/q/10122216/1318452"];
    // The PDF content will be accumulated into this data object.
    NSMutableData *pdfData = [NSMutableData data];

    // Use the system default font.
    UIFont *font = [UIFont systemFontOfSize:[UIFont systemFontSize]];

    // Use the default page size of 612*792.
    CGRect pageRect = CGRectMake(0, 0, 612, 792);

    // Use the defaults for the document, and no metadata.
    UIGraphicsBeginPDFContextToData(pdfData, CGRectZero, nil);

    // Create a page.
    UIGraphicsBeginPDFPageWithInfo(pageRect, nil);

    // Add the strings within the space of the pageRect.
    // If you want to draw the strings in a column or row, in order, you will need to change this bit.
    for (NSString *line in strings)
    {
        // Hint: you will still need to know the lineSize.
        CGSize lineSize = [line sizeWithFont:font];
        CGFloat x = pageRect.origin.x + (arc4random_uniform(RAND_MAX)/(CGFloat) RAND_MAX*(pageRect.size.width-lineSize.width));
        CGFloat y = pageRect.origin.y + (arc4random_uniform(RAND_MAX)/(CGFloat) RAND_MAX*(pageRect.size.height-lineSize.height));
        CGPoint lineTopLeft = CGPointMake(x, y);

        // Having worked out coordinates, draw the line.
        [line drawAtPoint:lineTopLeft withFont:font];
    }

    // Close the PDF context.
    UIGraphicsEndPDFContext();  

    // The pdfData object has now had a complete PDF file written to it.
    return pdfData;
}

ドキュメント ディレクトリに保存する

ドキュメントを保存するには、ユーザーのドキュメントが保存されているパスを見つける必要があります。

NSArray* paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsPath = [paths objectAtIndex:0];

そのパス内にファイルを保存します。最終的なアプリでは、ユーザーが自分の名前を選択できるようにします。この例では、名前はプログラムに組み込まれます。

NSString *pdfFilename = @"StackOverflow.pdf";

NSString にはいくつかの優れたパス操作メソッドがあり、書き込み先のパスを簡単に作成できます。

NSString *pdfPath = [documentsPath stringByAppendingPathComponent:pdfFilename];

次に、そのパスに書き込むデータを取得します。ここで、上で宣言したメソッドを呼び出します。

NSData *pdfData = [self pdfDataWithStrings:myArray];

それらのデータをパスに書き込みます。より良いアプリのために、ある時点で [pdfData writeToFile:options:error:] を呼び出して、問題が発生したものをすべて表示できるようにすることができます。

[pdfData writeToFile:pdfPath atomically:NO];

これが機能したかどうかはどうやってわかりますか?シミュレーターでは、書き込み先のパスをログに記録できます。このパスを Finder で開き、目的の PDF が含まれているかどうかを確認します。

NSLog(@"Wrote PDF to %@", pdfPath);

実際のデバイスでは、iTunes ファイル共有を有効にすることができます。アプリのファイル共有を有効にする方法を参照してください。

于 2012-04-12T12:07:39.583 に答える
0

を使用してjsonに変換できます

 NSData *jsonData        =   [NSJSONSerialization dataWithJSONObject:finalDict options:NSJSONWritingPrettyPrinted error:nil];
于 2012-04-12T11:19:19.920 に答える
0

のようにする前に

NSData *data = [NSKeyedArchiver archivedDataWithRootObject: myArray];

最初に配列をjson文字列に変換します

NSString *jsonString = [myArray JSONRepresentation];

最初に json.h API をインポートする必要があります

于 2012-04-12T11:02:59.723 に答える
-1
myArray=[[NSMutableArray alloc]init];


[myArray addObject:@"Jamshed"];
[myArray addObject:@"Imran"];
[myArray addObject:@"Ali"];
[myArray addObject:@"Hussain"];
[myArray addObject:@"Faisal"];

for (int i=0; i<[myArray count]; i++)
{
    NSData *data = [NSKeyedArchiver archivedDataWithRootObject:[myArray objectAtIndex:i]];
    NSLog(@"data %@",data);
    //create code for pdf file for write b4 read and concatenate readed string with data to write in pdf file.  
}
于 2012-04-12T11:53:39.577 に答える