Конвертировать PDF файл в текстовый файл - PullRequest
5 голосов
/ 29 июля 2011

Привет всем, я работаю над Objective-C.мой предыдущий вопрос был Как я могу редактировать PDF-файлы в приложении для iOS? после долгих поисков я обнаружил следующее.отобразите PDF в UIWebView, извлеките данные с помощью C / javascript и отредактируйте их.Я все еще не уверен в этой процедуре.теперь я планировал

1) отобразить pdf

2) когда пользователь захочет отредактировать pdf, я преобразую pdf в текст и разрешу ему редактировать его

3) попытаться сохранить, преобразует ли содержимое обратно в pdf.

это гуд-способ продолжить ??im k с шагом 1. теперь, как мне преобразовать pdf -> текст и текст -> pdf.

заранее спасибо

1 Ответ

2 голосов
/ 30 июля 2011

Когда вы загружаете пользовательский тип документа (doc, ppt, pdf и т. Д.) В UIWebView, веб-представление возвращает нулевую строку HTML, даже через javascript.Есть несколько предложений по извлечению текста PDF здесь .

Но превращение строки обратно в PDF отличается.Если вы хотите сохранить форматирование оригинального PDF, я уверен, что это невозможно, потому что NSAttributedString на iOS мало что делает.Но это будет работать для простого текста или NSAttributedString, если это возможно:

NSData *PDFDataFromString(NSString *str) {
    NSMutableData *data = [NSMutableData data];

    //Create an NSAttributedString for CoreText. If you find a way to translate
    //PDF into an NSAttributedString, you can skip this step and simply use an
    //NSAttributedString for this method's argument.

    NSAttributedString* string = [[[NSAttributedString alloc] initWithString:str] autorelease];

    //612 and 792 are the dimensions of the paper in pixels. (8.5" x 11")
    CGRect paperRect = CGRectMake(0.0, 0.0, 612, 792);

    CTFramesetterRef framesetter = CTFramesetterCreateWithAttributedString((CFAttributedStringRef) string);
    CGSize requiredSize = CTFramesetterSuggestFrameSizeWithConstraints(framesetter, CFRangeMake(0, [string length]), NULL, CGSizeMake(paperRect.size.width - 144, 1e40), NULL);

    //Subtract the top and bottom margins (72 and 72), so they aren't factored in page count calculations.
    NSUInteger pageCount = ceill(requiredSize.height / (paperRect.size.height - 144));
    CFIndex resumePageIndex = 0;
    UIGraphicsBeginPDFContextToData(data, paperRect, nil);

    for(NSUInteger i = 0; i < pageCount; i++) 
    {

    //After calculating the required number of pages, break up the string and
    //draw them into sequential pages.

        UIGraphicsBeginPDFPage();
        CGContextRef currentContext = UIGraphicsGetCurrentContext();
        CGContextSaveGState (currentContext);
        CGContextSetTextMatrix(currentContext, CGAffineTransformIdentity);
        CGMutablePathRef framePath = CGPathCreateMutable();

        //72 and 72 are the X and Y margins of the page in pixels.
        CGPathAddRect(framePath, NULL, CGRectInset(paperRect, 72.0, 72.0));

        CTFrameRef frameRef = CTFramesetterCreateFrame(framesetter, CFRangeMake(resumePageIndex, 0), framePath, NULL);
        resumePageIndex += CTFrameGetVisibleStringRange(frameRef).length;
        CGPathRelease(framePath);
        CGContextTranslateCTM(currentContext, 0, paperRect.size.height);
        CGContextScaleCTM(currentContext, 1.0, -1.0);
        CTFrameDraw(frameRef, currentContext);
        CFRelease(frameRef);    
        CGContextRestoreGState (currentContext);
    }
    CFRelease(framesetter);
    UIGraphicsEndPDFContext();
    return data;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...