[iphone] iOS SDK - برمجيا إنشاء ملف PDF


Answers

انها الرد في وقت متأخر ، ولكن كما جاهدت كثيرا مع قوات الدفاع الشعبي جيل ، واعتبر أنه من المجدي لتبادل وجهات نظري. بدلاً من الرسومات الأساسية ، لإنشاء سياق ، يمكنك أيضًا استخدام أساليب UIKit لإنشاء ملف pdf.

قامت Apple بتوثيقها بشكل جيد في دليل الرسم والطباعة.

Question

إن استخدام إطار CoreGraphics عمل مضجر ، في رأيي الصادق ، عندما يتعلق الأمر برسم ملف PDF برمجيًا.

أرغب في إنشاء ملف PDF برمجيًا باستخدام كائنات متنوعة من المشاهدات عبر تطبيقي.

أنا مهتم بمعرفة ما إذا كانت هناك أي برامج تعليمية جيدة حول PDF لـ iOS SDK ، أو ربما انخفاض في المكتبة.

لقد رأيت هذا البرنامج التعليمي ، برنامج PDF Creation Tutorial ، لكنه كتب في الغالب باللغة C. يبحث عن أسلوب Objective-C أكثر. هذا يبدو أيضًا طريقة سخيفة للكتابة إلى ملف PDF ، حيث يجب حساب الخطوط والأشياء الأخرى التي سيتم وضعها فيها.

void CreatePDFFile (CGRect pageRect, const char *filename) 
{   
    // This code block sets up our PDF Context so that we can draw to it
    CGContextRef pdfContext;
    CFStringRef path;
    CFURLRef url;
    CFMutableDictionaryRef myDictionary = NULL;

    // Create a CFString from the filename we provide to this method when we call it
    path = CFStringCreateWithCString (NULL, filename,
                                      kCFStringEncodingUTF8);

    // Create a CFURL using the CFString we just defined
    url = CFURLCreateWithFileSystemPath (NULL, path,
                                         kCFURLPOSIXPathStyle, 0);
    CFRelease (path);
    // This dictionary contains extra options mostly for 'signing' the PDF
    myDictionary = CFDictionaryCreateMutable(NULL, 0,
                                             &kCFTypeDictionaryKeyCallBacks,
                                             &kCFTypeDictionaryValueCallBacks);

    CFDictionarySetValue(myDictionary, kCGPDFContextTitle, CFSTR("My PDF File"));
    CFDictionarySetValue(myDictionary, kCGPDFContextCreator, CFSTR("My Name"));
    // Create our PDF Context with the CFURL, the CGRect we provide, and the above defined dictionary
    pdfContext = CGPDFContextCreateWithURL (url, &pageRect, myDictionary);
    // Cleanup our mess
    CFRelease(myDictionary);
    CFRelease(url);
    // Done creating our PDF Context, now it's time to draw to it

    // Starts our first page
    CGContextBeginPage (pdfContext, &pageRect);

    // Draws a black rectangle around the page inset by 50 on all sides
    CGContextStrokeRect(pdfContext, CGRectMake(50, 50, pageRect.size.width - 100, pageRect.size.height - 100));

    // This code block will create an image that we then draw to the page
    const char *picture = "Picture";
    CGImageRef image;
    CGDataProviderRef provider;
    CFStringRef picturePath;
    CFURLRef pictureURL;

    picturePath = CFStringCreateWithCString (NULL, picture,
                                             kCFStringEncodingUTF8);
    pictureURL = CFBundleCopyResourceURL(CFBundleGetMainBundle(), picturePath, CFSTR("png"), NULL);
    CFRelease(picturePath);
    provider = CGDataProviderCreateWithURL (pictureURL);
    CFRelease (pictureURL);
    image = CGImageCreateWithPNGDataProvider (provider, NULL, true, kCGRenderingIntentDefault);
    CGDataProviderRelease (provider);
    CGContextDrawImage (pdfContext, CGRectMake(200, 200, 207, 385),image);
    CGImageRelease (image);
    // End image code

    // Adding some text on top of the image we just added
    CGContextSelectFont (pdfContext, "Helvetica", 16, kCGEncodingMacRoman);
    CGContextSetTextDrawingMode (pdfContext, kCGTextFill);
    CGContextSetRGBFillColor (pdfContext, 0, 0, 0, 1);
    const char *text = "Hello World!";
    CGContextShowTextAtPoint (pdfContext, 260, 390, text, strlen(text));
    // End text

    // We are done drawing to this page, let's end it
    // We could add as many pages as we wanted using CGContextBeginPage/CGContextEndPage
    CGContextEndPage (pdfContext);

    // We are done with our context now, so we release it
    CGContextRelease (pdfContext);
}

EDIT: إليك مثال على GitHub باستخدام libHaru في مشروع iPhone.




في وقت متأخر ، ولكن ربما مفيد للآخرين. يبدو أن نمط تشغيل قالب PDF قد يكون الطريقة التي تريدها بدلاً من بناء ملف PDF في التعليمات البرمجية. نظرًا لأنك ترغب في إرساله بالبريد الإلكتروني على أي حال ، فأنت متصل بالشبكة بحيث يمكنك استخدام شيء مثل خدمة السحابة Docmosis التي تعتبر خدمة دمج البريد بشكل فعال. أرسلها إلى البيانات / الصور للدمج مع القالب الخاص بك. يتمتع هذا النوع من النهج بفائدة أقل بكثير على الشفرة وتفريغ معظم المعالجة من تطبيق iPad الخاص بك. لقد رأيت أنه مستخدم في تطبيق iPad وكان لطيفًا.




Links