2

我想我一定是从错误的角度来的。这是我第一次使用 Quartz 涉足 PDF。我希望能够打印输入到我的应用程序中的文本,但我可能需要在此版本中删除它。

我已经阅读了我可以从 Apple 和 Web 获得的所有内容,但我似乎无法让我的东西正常工作。我可以将文档送到打印机,但它总是打印空白。我正在使用的过程是:

  1. 获取文本作为 NSString。
  2. 将字符串转换为 NSData 对象中的 PDF。
  3. 打印它。

我的文本项目中有两种方法。这只是一个测试,所以没有花里胡哨,可能存在内存泄漏,我只是想让它工作。

提前感谢您的帮助。

首先将 PDF 文档创建为 NSData。

- (NSData *)createPdfAsDataWithAttributedString:(NSAttributedString *)text {
    // Save the text just in case…
    _pdfText = [text copy];

    // Allocate the pdf Context.
    CGContextRef pdfContext;

    // Create the PDF Attribute Dictionary.
    CFMutableDictionaryRef pdfAttributeDictionary = NULL;
    pdfAttributeDictionary = CFDictionaryCreateMutable(NULL, 0, &kCFTypeDictionaryKeyCallBacks, &kCFTypeDictionaryValueCallBacks);
    CFDictionarySetValue(pdfAttributeDictionary, kCGPDFContextTitle, CFSTR("My Note"));
    CFDictionarySetValue(pdfAttributeDictionary, kCGPDFContextCreator, CFSTR("Me"));

    // Create the data referece as a mutable data type.
    NSData *pdfData = [[NSMutableData alloc] init];

    // User the data consumer using the data reference.
    CGDataConsumerRef pdfDataConsumer = CGDataConsumerCreateWithCFData((CFMutableDataRef)pdfData);

    // Finally the pdfContext can be created.
    pdfContext = CGPDFContextCreate(pdfDataConsumer, NULL, pdfAttributeDictionary);

    // Start the first page.
    CGContextBeginPage(pdfContext, NULL);

    // Set the font
    CGContextSelectFont(pdfContext, "Helvetica", 16.0f, kCGEncodingMacRoman);
    CGContextSetTextDrawingMode(pdfContext, kCGTextFill);
    CGContextSetRGBFillColor(pdfContext, 0, 0, 0, 1);

    // Print the text
    NSString *regText = [text string];
    const char *pdfText = [regText cStringUsingEncoding:NSUTF8StringEncoding];
    CGContextShowText(pdfContext, pdfText, strlen(pdfText));

    // End the page.
    CGContextEndPage(pdfContext);

    // Save the current state
    CGContextSaveGState(pdfContext);    

    // Release the PDF context
    CGContextRelease(pdfContext);

    return [pdfData autorelease];
}

二是印刷。

- (IBAction)printPdfTouchUpInside:(id)sender {
    PDFCreator *pdfCreator = [[PDFCreator alloc] init];
    NSData *pdfData = [pdfCreator createPdfAsDataWithAttributedString:_printableText];
    UIPrintInteractionController *printController = [UIPrintInteractionController sharedPrintController];
    UIPrintInfo *printInfo = [UIPrintInfo printInfo];
    [printInfo setPrinterID:@"Canon MP620 series"];
    [printInfo setOrientation:UIPrintInfoOrientationPortrait];
    [printInfo setOutputType:UIPrintInfoOutputGeneral];
    [printInfo setJobName:@"Test Print"];

    [printController setPrintInfo:printInfo];
    [printController setPrintingItem:pdfData];

    void (^completionHandler)(UIPrintInteractionController *, BOOL, NSError *) = ^(UIPrintInteractionController *printController, BOOL completed, NSError *error) {
        if (!completed && error) {
            NSLog(@"FAILED!  due to error in domain %@ with error code %u", error.domain, error.code);
        }
    };

    [printController presentFromRect:[sender bounds] inView:sender animated:YES completionHandler:completionHandler];
}
4

0 回答 0