7

iOS 6 アプリで見栄えの良い PDF を生成したいと考えています。

私はもう試した:

  • コンテキストで UIView をレンダリングする
  • CoreText の使用
  • NSString drawInRect の使用
  • UILabel drawRect の使用

コード例を次に示します。

-(CGContextRef) createPDFContext:(CGRect)inMediaBox path:(NSString *) path
{
    CGContextRef myOutContext = NULL;
    NSURL * url;

    url = [NSURL fileURLWithPath:path];
    if (url != NULL) {
        myOutContext = CGPDFContextCreateWithURL ((__bridge CFURLRef) url,
                                                  &inMediaBox,
                                                  NULL);
    }


    return myOutContext;
}

-(void)savePdf:(NSString *)outputPath
{
    if (!pageViews.count)
        return;

    UIView * first = [pageViews objectAtIndex:0];

    CGContextRef pdfContext = [self createPDFContext:CGRectMake(0, 0, first.frame.size.width, first.frame.size.height) path:outputPath];

    for(UIView * v in pageViews)
    {
        CGContextBeginPage (pdfContext,nil);
        CGAffineTransform transform = CGAffineTransformIdentity;
        transform = CGAffineTransformMakeTranslation(0, (int)(v.frame.size.height));
        transform = CGAffineTransformScale(transform, 1, -1);
        CGContextConcatCTM(pdfContext, transform);

        CGContextSetFillColorWithColor(pdfContext, [UIColor whiteColor].CGColor);
        CGContextFillRect(pdfContext, v.frame);

        [v.layer renderInContext:pdfContext];

        CGContextEndPage (pdfContext);
    }

    CGContextRelease (pdfContext);
}

レンダリングされる UIView には、UIImageView + 一連の UILabels (境界線のあるものとないもの) のみが含まれます。

また、stackoverflow で見つかった提案を試しました: UILabel をサブクラス化し、これを実行します:

- (void)drawLayer:(CALayer *)layer inContext:(CGContextRef)ctx {
    BOOL isPDF = !CGRectIsEmpty(UIGraphicsGetPDFContextBounds());
    if (!layer.shouldRasterize && isPDF)
        [self drawRect:self.bounds]; // draw unrasterized
    else
        [super drawLayer:layer inContext:ctx];
}

しかし、それも何も変わりませんでした。

私が何をしても、プレビューでPDFを開くと、テキスト部分はブロックとして選択できますが、文字ごとには選択できません.pdfをズームすると、実際にはビットマップ画像であることがわかります。

助言がありますか?

4

3 に答える 3

2

Raywenderlich のこのチュートリアルは、私の一日を救ってくれました。 http://www.raywenderlich.com/6818/how-to-create-a-pdf-with-quartz-2d-in-ios-5-tutorial-part-2

于 2012-11-22T13:50:27.317 に答える
1

私が昨年これを行ったときの私の経験は、Appleがそれを行うためのライブラリを提供していなかったということでした。結局、オープンソースのCライブラリ(libHaru)をインポートしました。次に、ビュー階層の各クラスに出力する関数を追加しました。サブビューを持つビューは、そのサブビューでrenderを呼び出します。私のUILabels、UITextFields、UIImageViews、UISwitchesなどは、コンテンツをテキストまたはグラフィックとして出力するため、一部のビューの背景色もレンダリングしました。

それほど難しいことではありませんでしたが、libHaruでフォントに問題が発生したため、iircではデフォルトのフォントとフォントサイズを使用することになりました。

于 2012-11-28T22:18:50.613 に答える
0

バグを回避する必要があることを除いて、UILabels でうまく機能します。

iPad で UIView をベクトルとして PDF にレンダリングする - 時にはビットマップとして、時にはベクトルとしてレンダリングします

于 2018-12-19T08:45:45.217 に答える