2012-06-04 46 views
14

我知道採取UIWebView的截圖並將其轉換爲PDF,但我需要生成一個正確的PDF(文本爲文本,而不是截圖)。 Save2PDF是創建正確PDF的應用程序。有人有一個想法,他們如何做到這一點?iOS上的HTML到PDF轉換?

+0

也許這可能有所幫助:http://stackoverflow.com/questions/5443166/how-to-convert-uiview-to-pdf-within-ios – CarlJ

+0

感謝meccan,但它似乎只是一個截圖方法。我知道利哈魯,但它也是一個漫長的過程。 – Salil

+7

這個問題已經關閉了,這是**精神病。 *「這個問題很可能會引起辯論,爭辯,投票或擴大討論」* ......這在這裏如何適用?諸如「什麼更好,石頭或披頭士」或「Mac或PC更好!!」等問題......爭辯,爭論等等。這是一個直截了當的技術工程問題。 「如何將HTML轉換爲PDF,在iOS上」..有什麼可以更清晰?離奇。 – Fattie

回答

-1

這個問題的全部要點是文本作爲和不截圖

以下的答案必須說明如何使一個位圖的截圖,在PDF容器......

#import <QuartzCore/CALayer.h> 

- (NSString *)pdfPath { 
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentsDirectory = [paths objectAtIndex:0]; 
    NSString *writableDBPath = [documentsDirectory stringByAppendingPathComponent:@"tmp.pdf"]; 
    return writableDBPath; 
} 

- (NSDictionary *)pdfContextDictionary { 
    NSDictionary *d = [NSDictionary dictionaryWithObjectsAndKeys:@"J. P. Author", kCGPDFContextAuthor, 
        @"My Cool App", kCGPDFContextCreator, 
        @"This is the Output", kCGPDFContextTitle, 
        nil]; 
    return d; 
} 

- (void)printToPDF { 
    NSString *path = [self pdfPath]; 
    UIView *displayView = self.view; 
    CGRect pageRect = displayView.bounds; 
    if (UIGraphicsBeginPDFContextToFile(path, pageRect, [self pdfContextDictionary]) == NO) { 
    return; // error 
    } 
    UIGraphicsBeginPDFPage(); 
    CGContextRef context = UIGraphicsGetCurrentContext(); 
    CALayer *layer = displayView.layer; 
    [layer renderInContext:context]; 
    UIGraphicsEndPDFContext(); 
    NSLog(@"[%@ %@] %@", NSStringFromClass([self class]), NSStringFromSelector(_cmd), path); 
} 
+1

謝謝,但對我來說,這似乎是截圖視圖。使用這種方法將文本呈現爲文本而不是圖像? – Salil

+3

根據我的經驗,'-renderInContext:'僅在渲染到PDF上下文時才爲子圖層輸出基於柵格的位圖,將像文本這樣的矢量元素轉換爲像素化的柵格圖形。 –

+1

謝謝大家的幫助!我發現這個解決方案使用這個線程http://stackoverflow.com/questions/4356436/generating-a-pdf-using-the-new-printing-stuff-in-ios-4-2這對我來說非常完美!我很抱歉,因爲我之前的搜索沒有顯示我的線程。 – Salil

29

我創建一個基於我發現的每一個好建議的課程。我一直在挖掘很多,我希望我的課程能夠爲嘗試從某些HTML源代碼直接創建多頁PDF的人提供一些良好的開端。

你會一些基本的示例代碼在這裏找到整個代碼:https://github.com/iclems/iOS-htmltopdf

我剛剛同一個問題,因爲你和我的要求是: - 完整的PDF(真正的文本,沒有位圖) - 智能多頁(與每X像素切割全高度webview相比...)

因此,我使用的解決方案非常好,因爲它使用iOS用於分割頁面以供打印的相同工具。

讓我解釋一下,我安裝一個UIPrintPageRenderer基於Web視圖的打印格式(第一尖):

UIPrintPageRenderer *render = [[UIPrintPageRenderer alloc] init]; 

[render addPrintFormatter:webView.viewPrintFormatter startingAtPageAtIndex:0]; 

CGRect printableRect = CGRectMake(self.pageMargins.left, 
           self.pageMargins.top, 
           self.pageSize.width - self.pageMargins.left - self.pageMargins.right, 
           self.pageSize.height - self.pageMargins.top - self.pageMargins.bottom); 

CGRect paperRect = CGRectMake(0, 0, self.pageSize.width, self.pageSize.height); 

[render setValue:[NSValue valueWithCGRect:paperRect] forKey:@"paperRect"]; 
[render setValue:[NSValue valueWithCGRect:printableRect] forKey:@"printableRect"]; 

NSData *pdfData = [render printToPDF]; 

[pdfData writeToFile: self.PDFpath atomically: YES]; 

在此期間,我創建了UIPrintPageRenderer類別支持:

- (NSData*) printToPDF 
{ 
    NSMutableData *pdfData = [NSMutableData data]; 

    UIGraphicsBeginPDFContextToData(pdfData, CGRectZero, nil); 

    [self prepareForDrawingPages: NSMakeRange(0, self.numberOfPages)]; 

    CGRect bounds = UIGraphicsGetPDFContextBounds(); 

    for (int i = 0 ; i < self.numberOfPages ; i++) 
    { 
     UIGraphicsBeginPDFPage(); 

     [self drawPageAtIndex: i inRect: bounds]; 
    } 

    UIGraphicsEndPDFContext(); 

    return pdfData; 
} 
+0

此代碼運行良好,但我的理解是'[render setValue:..]'語句使用未記錄的方法,App Store將拒絕此代碼。 – brainjam

+0

編號'-setValue:forKey:'不是私有api的一部分。我一直在使用它只讀屬性和蘋果批准我的應用程序。 – akashivskyy

+0

您好我有一個要求,我必須加載一個HTML文件,該HTML文件將具有文本字段,標籤,複選框按鈕等。我必須得到數據無論用戶將進入,然後我必須將其轉換爲PDF用戶輸入數據。 –