1

A4サイズの用紙のUIView For Drawing pdfのサイズを教えてください。

以下のサイズを使用していますが、ラベルなどの pdfView オブジェクト、描画用に提供するサイズの画像ではありません。

.xib を作成し、手動で UILabels、画像、および線を描画します。次に、タグ プロパティを使用して、描画用のフレームを提供しますが、.xib に従って異なる場所を描画します。.xib (0、0、792、 1122)。

UIGraphicsBeginPDFPageWithInfo(CGRectMake(0, 0, 792, 1122), nil);

+(void)drawLabels:(NSMutableArray*)arr isData:(BOOL)isdata
{

    NSArray* objects = [[NSBundle mainBundle] loadNibNamed:@"PDFView" owner:nil options:nil];

    UIView* mainView = [objects objectAtIndex:0];


    if (isdata) 
    {
        for (int i=1;i<=[arr count];i++)
        {
            UILabel *lbl=(UILabel*)[mainView viewWithTag:i];
            [self drawText:[arr objectAtIndex:i-1] inFrame:lbl.frame isData:isdata];
        }
    }
}

//これが私の Draw メソッドです

+(void)drawText:(NSString*)textToDraw inFrame:(CGRect)frameRect isData:(BOOL)isdata
{
    int length=[textToDraw length];
    CFStringRef string = (__bridge CFStringRef) textToDraw; 
    CFMutableAttributedStringRef currentText = CFAttributedStringCreateMutable(kCFAllocatorDefault, 0); 
    CTFontRef font = CTFontCreateWithName((CFStringRef)@"Helvetica Neue Bold", 12.0f, nil);
    if (isdata) 
    {
        font = CTFontCreateWithName((CFStringRef)@"Helvetica Neue ", 12.0f, nil);
    }
    CFAttributedStringReplaceString (currentText,CFRangeMake(0, 0), string);
    CFAttributedStringSetAttribute(currentText,CFRangeMake(0, length),kCTFontAttributeName,font);
    CTFramesetterRef framesetter = CTFramesetterCreateWithAttributedString(currentText);
    CGMutablePathRef framePath = CGPathCreateMutable();
    CGPathAddRect(framePath, NULL, frameRect);
    CFRange currentRange = CFRangeMake(0, 0);
    CTFrameRef frameRef = CTFramesetterCreateFrame(framesetter, currentRange, framePath, NULL);
    CGPathRelease(framePath);
    CGContextRef    currentContext = UIGraphicsGetCurrentContext();
    CGContextSetTextMatrix(currentContext, CGAffineTransformIdentity);
    CGContextTranslateCTM(currentContext, 0, frameRect.origin.y*2);
    CGContextScaleCTM(currentContext, 1.0, -1.0);
    CTFrameDraw(frameRef, currentContext);
    CGContextScaleCTM(currentContext, 1.0, -1.0);
    CGContextTranslateCTM(currentContext, 0, (-1)*frameRect.origin.y*2);
    CFRelease(frameRef);
    CFRelease(framesetter);
}

// 線画の場合、以下のコードを使用しています

for (int j=1001;j<=1003;j++)
        {
            UILabel *lbl=(UILabel*)[mainView viewWithTag:j];

            CGPoint lblPoint=CGPointMake(lbl.frame.origin.x, lbl.frame.origin.y);
            CGPoint lblPoint2=CGPointMake(lbl.frame.origin.x+lbl.frame.size.width, lbl.frame.origin.y);
            [self drawLineFromPoint:lblPoint toPoint:lblPoint2];
        }

+(void)drawLineFromPoint:(CGPoint)from toPoint:(CGPoint)to
{
    CGContextRef context = UIGraphicsGetCurrentContext();
    CGContextSetLineWidth(context, 2.0);
    CGColorSpaceRef colorspace = CGColorSpaceCreateDeviceRGB();
    CGFloat components[] = {0.2, 0.3, 0.2, 0.4};
    CGColorRef color = CGColorCreate(colorspace, components);
    CGContextSetStrokeColorWithColor(context, color);
    CGContextMoveToPoint(context, from.x, from.y);
    CGContextAddLineToPoint(context, to.x, to.y);
    CGContextStrokePath(context);
    CGColorSpaceRelease(colorspace);
    CGColorRelease(color);
}

これが私の.xibです ここに画像の説明を入力

これが描画後の私の.pdfファイルです

ここに画像の説明を入力

4

2 に答える 2

3

http://www.raywenderlich.com/6818/how-to-create-a-pdf-with-quartz-2d-in-ios-5-tutorial-part-2からプロジェクトをダウンロードした場合、メソッドの CTM 計算をdrawText:改善できます。問題は、変換行列を変更するときに四角形の高さが考慮されないことです。

交換すれば

CGContextTranslateCTM(currentContext, 0, frameRect.origin.y*2);
...
CGContextTranslateCTM(currentContext, 0, (-1)*frameRect.origin.y*2);

CGContextTranslateCTM(currentContext, 0, frameRect.origin.y*2 + frameRect.size.height);
...
CGContextTranslateCTM(currentContext, 0, (-1)*frameRect.origin.y*2 - frameRect.size.height);

結果はより正確に見えます。

また、Xcode 静的アナライザーはそのメソッドでのメモリ リークを報告するcurrentTextため、追加する必要があります。

CFRelease(currentText);

の末尾を追加しdrawText:ます。

于 2012-09-26T18:17:33.390 に答える
1

これを行う:

NSArray *aArrPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) ;

NSString *aStrPrintPdfPath = [[aArrPaths objectAtIndex:0] stringByAppendingPathComponent:@"MyDocument.pdf"];
CGContextRef aCgPDFContextRef = [self createPDFContext:CGRectMake(0, 0, 612, 892) path:(__bridge_retained CFStringRef)aStrPrintPdfPath];

CGContextBeginPage(aCgPDFContextRef,nil);
  //turn PDF upsidedown
    CGAffineTransform aCgAffTrans = CGAffineTransformIdentity;
    aCgAffTrans = CGAffineTransformMakeTranslation(0,892);
    aCgAffTrans = CGAffineTransformScale(aCgAffTrans, 1.0, -1.0);
    CGContextConcatCTM(aCgPDFContextRef, aCgAffTrans);

//capture whole view screenshot
[self.view.layer renderInContext:aCgPDFContextRef]; //add QuartzCore framework and import it
    [aPageNote release]; 
    CGContextEndPage (aCgPDFContextRef);

CGContextRelease (aCgPDFContextRef);
NSLog(@"Pdf Successfully Created");

このメソッドも追加します。

-(CGContextRef) createPDFContext:(CGRect)aCgRectinMediaBox path:(CFStringRef) aCfStrPath
{

  CGContextRef aCgContextRefNewPDF = NULL;
  CFURLRef aCfurlRefPDF;
  aCfurlRefPDF = CFURLCreateWithFileSystemPath (NULL,aCfStrPath,kCFURLPOSIXPathStyle,false);
  if (aCfurlRefPDF != NULL) {
    aCgContextRefNewPDF = CGPDFContextCreateWithURL (aCfurlRefPDF,&aCgRectinMediaBox,NULL);
    CFRelease(aCfurlRefPDF); 
  }
  return aCgContextRefNewPDF;
}
于 2012-09-25T12:23:08.593 に答える