0

У меня есть открытый pdf-файл в uiwebview, добавьте изображение и текст в подпрограмме uiwebview. Затем я попытался создать pdf-файл. Ниже образца, который я использовал для создания pdf-файла. Многостраничная запись на одной странице. Как я могу написать качество образца и точный размер. Пожалуйста, проверьте снимки экрана и ниже источника enter image description hereПроблемы с созданием PDF из uiwebview в объекте c

UIGraphicsBeginPDFContextToData(pdfData, CGRectZero, nil); 

for (int i = 0; i < 10; i++) { 

    CGRect f = [pdfView frame]; 
    [pdfView setFrame: f]; 

    UIGraphicsBeginPDFPage(); 
    CGContextRef currentContext = UIGraphicsGetCurrentContext(); 
    CGContextTranslateCTM(currentContext, 72, 72); // Translate for 1" margins 
    [[[pdfView subviews] lastObject] setContentOffset:CGPointMake(0, 648 * i) animated:NO]; 
    [pdfView.layer renderInContext:currentContext]; 
} 

UIGraphicsEndPDFContext(); 

, а также я попробовал эту ссылку, но я не мог добавить UIWebView подвида писать PDF. http://b2cloud.com.au/tutorial/drawing-over-a-pdf-in-ios-pdf-template/

ответ

1

Мне кажется, что вы просто пытаетесь добавить контент в существующий PDF-файл, верно?

- (void) drawCustomPDFContent 
{ 
    // Put your drawing calls here 
    // Draw a red box 
    [[UIColor redColor] set]; 
    UIRectFill(CGRectMake(20, 20, 100, 100)); 

    // Example of drawing your view into PDF, note that this will be a rasterized bitmap, including the text. 
    // To get smoother text you'll need to use the NSString draw methods 
    CGContextRef ctx = UIGraphicsGetCurrentContext(); 
    [view.layer renderInContext:ctx]; 
} 

- (void) createCustomPDF 
{ 
    NSURL* pdfURL = ... /* URL to pdf file */; 
    CGPDFDocumentRef pdf = CGPDFDocumentCreateWithURL((CFURLRef)pdfURL); 

    const size_t numberOfPages = CGPDFDocumentGetNumberOfPages(pdf); 

    NSMutableData* data = [NSMutableData data]; 
    UIGraphicsBeginPDFContextToData(data, CGRectZero, nil); 

    for(size_t page = 1; page <= numberOfPages; page++) 
    { 
     // Get the current page and page frame 
     CGPDFPageRef pdfPage = CGPDFDocumentGetPage(pdf, page); 
     const CGRect pageFrame = CGPDFPageGetBoxRect(pdfPage, kCGPDFMediaBox); 

     UIGraphicsBeginPDFPageWithInfo(pageFrame, nil); 

     // Draw the page (flipped) 
     CGContextRef ctx = UIGraphicsGetCurrentContext(); 
     CGContextSaveGState(ctx); 
     CGContextScaleCTM(ctx, 1, -1); 
     CGContextTranslateCTM(ctx, 0, -pageFrame.size.height); 
     CGContextDrawPDFPage(ctx, pdfPage); 
     CGContextRestoreGState(ctx); 

     if(page == 1) 
     { 
      [self drawCustomPDFContent]; 
     } 
    } 

    UIGraphicsEndPDFContext(); 

    CGPDFDocumentRelease(pdf); 
    pdf = nil; 

    // Do something with data here 
    [data writeToFile:... atomically:YES]; 
} 

Части ссылочные от:

http://b2cloud.com.au/tutorial/drawing-over-a-pdf-in-ios-pdf-template/

+0

Да, я просто рисую контент в существующем PDF. Я просмотрел файл pdf в uiwebview. – 2vision2

+0

Если проблема у вас есть, опираясь на существующий PDF, дайте мой код выстрелу, вам нужно будет сделать несколько изменений, чтобы заставить его работать для вашего сценария. – SomeGuy

+0

Как добавить ничему все подзаголовки (подробнее)? Пожалуйста, совет – 2vision2

1

Вы можете попробовать this.It работал для меня :)

https://github.com/iclems/iOS-htmltopdf/blob/master/NDHTMLtoPDF.h

NSString *html = [webView stringByEvaluatingJavaScriptFromString:@"document.documentElement.outerHTML"]; 

self.PDFCreator = [NDHTMLtoPDF createPDFWithHTML:html 
              pathForPDF:[path stringByExpandingTildeInPath] 
              delegate:self 
              pageSize:CGSizeMake(595,847) 
              margins:UIEdgeInsetsMake(105, 0, 0, 0)]; 

Пропустите WebView как этот

+0

благодаря NikitA Постараюсь тогда пусть вы знаете. Пожалуйста, согласитесь ли вы использовать subview в uiwebview? – 2vision2

+0

Никита вы дали один пример кода, код которого вы экспортируете PDF напрямую из PDF-url. Но в желании Uiwebview и Uiwebview.subview.it возможно в этом примере? – 2vision2

+0

Да, я могу это сделать –

2

Вы можете использовать следующую категорию на UIView, чтобы создать PDF файл:

#import <QuartzCore/QuartzCore.h> 

@implementation UIView(PDFWritingAdditions) 

- (void)renderInPDFFile:(NSString*)path 
{ 
    CGRect mediaBox = self.bounds; 
    CGContextRef ctx = CGPDFContextCreateWithURL((CFURLRef)[NSURL fileURLWithPath:path], &mediaBox, NULL); 

    CGPDFContextBeginPage(ctx, NULL); 
    CGContextScaleCTM(ctx, 1, -1); 
    CGContextTranslateCTM(ctx, 0, -mediaBox.size.height); 
    [self.layer renderInContext:ctx]; 
    CGPDFContextEndPage(ctx); 
    CFRelease(ctx); 
} 

@end 

Плохая новость: UIWebView не создает приятные фигуры и текст в PDF, а делает себя как изображение в PDF.

ИЛИ

How to Convert UIView to PDF within iOS?

ИЛИ

Creating PDF file from UIWebView

Это может поможет :)

+0

Спасибо, что ответили. Я проверю его, а затем дам вам знать. Но одно, если добавить «renderInContext», мы потеряли наше качество. – 2vision2

+0

Я попытался создать PDF-файл из UIwebview, но im получил строку высоты в пустом. NSString * heightStr = [webView stringByEvaluatingJavaScriptFromString: @ "document.body.scrollHeight;"]; – 2vision2

+0

, если мы используем качество «renderInContext». Пожалуйста, совет – 2vision2

2

Я также использовал тот же его работает нормально Надеюсь, что это быть полезными для лет и.

Создать блок:
typedef void (^ PdfCompletion) (статус BOOL, NSString * filePath, NSArray * fbArr);

-(void)addData 
{ 
    [MBProgressHUD showHUDAddedTo:self.view animated:YES]; 
    NSMutableDictionary *contactDict = [[NSMutableDictionary alloc] init]; 
    [contactDict setObject:contactTextField.text forKey:@"phonenumber"]; 
    [contactDict setObject:emailTextField.text forKey:@"emailid"]; 
    [contactDict setObject:userNameLabel.text forKey:@"displayname"]; 
    [self drawPdf:contactDict completion:^(BOOL status,NSString *filePath,NSArray *fbArr) 
    { 
     if (status) 
     { 
      NSMutableArray *arr; 
      arr = [[NSMutableArray alloc] init]; 
      NSData *filedata; 
      filedata = [NSData dataWithContentsOfFile:filePath]; 
      double locaTotalFileSize = filedata.length +498; 
      totalFileSize += locaTotalFileSize; 
      NSMutableDictionary *fileDict = [[NSMutableDictionary alloc] init]; 
      [fileDict setObject:userPicImageView.image forKey:@"image"]; 
      [fileDict setObject:filePath forKey:@"filePath"]; 
      [fileDict setObject:@"txt" forKey:@"fileType"]; 
      [fileDict setObject:[NSString stringWithFormat:@"%@_%@_%@",@"contact",[self getFbID],[self CurrentSystemTime]] forKey:@"fileName"]; 
      [fileDict setObject:@"1" forKey:@"uploadStatus"]; 
      [fileDict setObject:@"0 KB/0 KB" forKey:@"fileSizeStatus"]; 
      [fileDict setObject:@"0 KB/0 KB" forKey:@"ContentSize"]; 
      [arr addObject:fileDict]; 
      [self switchToReviewFiles:arr]; 
      //////NSLog(@"pdf convrt successfull"); 
     } 
     else 
     { 
      //////NSLog(@"Error to convert into pdf"); 
     } 
    }]; 
} 


// Then Call The DrawPDF Method::-- 

-(void)drawPdf:(NSMutableDictionary *)drawText completion:(PdfCompletion)callback 
{ 
    NSString* fileName = @"contact_card.txt"; 

    NSArray *arrayPaths = 
    NSSearchPathForDirectoriesInDomains(
             NSDocumentDirectory, 
             NSUserDomainMask, 
             YES); 
    NSString *path = [arrayPaths objectAtIndex:0]; 
    NSString* txtFileName = [path stringByAppendingPathComponent:fileName]; 

    NSData *data = [NSJSONSerialization dataWithJSONObject:drawText options:NSJSONWritingPrettyPrinted error:nil]; 
    [data writeToFile:txtFileName atomically:YES]; 
    callback(YES,txtFileName,nil); 

} 
+0

Vinod Pandey благодарит за ваш ответ. я буду тестировать, а затем обновить вас. сегодня только я пришел после долгого отпуска – 2vision2

0

Вы действительно очень близко к коду, который у вас есть. У меня есть ощущение самой большой проблемой является захват новой CGContextRef с каждой итерации цикла ..

UIGraphicsBeginPDFContextToData(pdfData, CGRectZero, nil); 
CGContextRef currentContext = UIGraphicsGetCurrentContext();//movedByJef 

    // default pdf.. 
    // 8.5 X 11 inch 
    // 612 x 792 


for (int i = 0; i < 10; i++) { 

    CGContextSaveGstate(currentContext); //addedByJef 

    CGRect f = [pdfView frame]; 
    [pdfView setFrame: f]; // hmm what does this even do?? 

    UIGraphicsBeginPDFPage(); 
    CGContextTranslateCTM(currentContext, -72, -72); // Translate for 1" margins ///editedByJef, you had it backwards.. 

//assuming you want a 72pt margin on right and bottom as well.. 
//we want to reduce our size (612 x 792) by 72pts on all four sides.. 

CGSize printPageSize = CGSizeMake((612.0 - (72.0 * 2.0)), (792.0 -(72.0*2.0))); 
CGSize layrSize = self.layer.bounds.size; 

//so we translate the context so our view fills it nicely.. 
CGFloat xScaler = layrSize.width/printPageSize.width; 
CGFloat yScaler = layrSize.height/printPageSize.height; 

CGContextConcatCTM(currentContext, CGAffineTransformMakeScale(xScaler, yScaler)); 


    [[[pdfView subviews] lastObject] setContentOffset:CGPointMake(0, 648 * i) animated:NO]; 
    [pdfView.layer renderInContext:currentContext]; 

CGContextRestoreGstate(currentContext);//added by jef 
} 

UIGraphicsEndPDFContext(); 

дайте мне знать, как вы идете с этим, Там, несомненно, будет немного перетасовки в порядке преобразования, может быть, для перевода необходима любая сторона масштабирования, но это должно быть очень близко.

+0

Jef спасибо за ваш ответ. я буду тестировать, а затем обновить вас. сегодня только я пришел после долгого отпуска – 2vision2