Ada banyak sumber daya tentang cara menampilkan PDF di Aplikasi UIView
. Apa yang saya kerjakan sekarang adalah membuat PDF dari UIViews
.
Sebagai contoh, saya memiliki UIView
, dengan subviews seperti TextViews, UILabels
, UIImages
, jadi bagaimana bisa saya mengkonversi besar UIView
secara keseluruhan termasuk semua subviews dan subsubviews ke PDF?
Saya telah memeriksa referensi iOS Apple . Namun, ini hanya berbicara tentang menulis potongan teks / gambar ke file PDF.
Masalah yang saya hadapi adalah banyak konten yang ingin saya tulis ke file sebagai PDF. Jika saya menuliskannya ke PDF sepotong demi sepotong, itu akan menjadi pekerjaan besar yang harus dilakukan. Itulah mengapa saya mencari cara untuk menulis UIViews
ke PDF atau bahkan bitmap.
Saya telah mencoba kode sumber yang saya salin dari Q / A lain dalam Stack Overflow. Tapi itu hanya memberi saya PDF kosong dengan UIView
ukuran batas.
-(void)createPDFfromUIView:(UIView*)aView saveToDocumentsWithFileName:(NSString*)aFilename
{
// Creates a mutable data object for updating with binary data, like a byte array
NSMutableData *pdfData = [NSMutableData data];
// Points the pdf converter to the mutable data object and to the UIView to be converted
UIGraphicsBeginPDFContextToData(pdfData, aView.bounds, nil);
UIGraphicsBeginPDFPage();
// draws rect to the view and thus this is captured by UIGraphicsBeginPDFContextToData
[aView drawRect:aView.bounds];
// remove PDF rendering context
UIGraphicsEndPDFContext();
// Retrieves the document directories from the iOS device
NSArray* documentDirectories = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask,YES);
NSString* documentDirectory = [documentDirectories objectAtIndex:0];
NSString* documentDirectoryFilename = [documentDirectory stringByAppendingPathComponent:aFilename];
// instructs the mutable data object to write its context to a file on disk
[pdfData writeToFile:documentDirectoryFilename atomically:YES];
NSLog(@"documentDirectoryFileName: %@",documentDirectoryFilename);
}
Selain itu, jika ada yang tertarik, berikut adalah kode Swift 3:
func createPdfFromView(aView: UIView, saveToDocumentsWithFileName fileName: String) { let pdfData = NSMutableData() UIGraphicsBeginPDFContextToData(pdfData, aView.bounds, nil) UIGraphicsBeginPDFPage() guard let pdfContext = UIGraphicsGetCurrentContext() else { return } aView.layer.render(in: pdfContext) UIGraphicsEndPDFContext() if let documentDirectories = NSSearchPathForDirectoriesInDomains(.documentDirectory, .userDomainMask, true).first { let documentsFileName = documentDirectories + "/" + fileName debugPrint(documentsFileName) pdfData.write(toFile: documentsFileName, atomically: true) } }
sumber
Jika seseorang tertarik, inilah kode Swift 2.1:
func createPdfFromView(aView: UIView, saveToDocumentsWithFileName fileName: String) { let pdfData = NSMutableData() UIGraphicsBeginPDFContextToData(pdfData, aView.bounds, nil) UIGraphicsBeginPDFPage() guard let pdfContext = UIGraphicsGetCurrentContext() else { return } aView.layer.renderInContext(pdfContext) UIGraphicsEndPDFContext() if let documentDirectories = NSSearchPathForDirectoriesInDomains(.DocumentDirectory, .UserDomainMask, true).first { let documentsFileName = documentDirectories + "/" + fileName debugPrint(documentsFileName) pdfData.writeToFile(documentsFileName, atomically: true) } }
sumber
completion: (success: Bool) -> ()
untuk kasus pengembalian penjagaCara super mudah untuk membuat PDF dari UIView adalah menggunakan Ekstensi UIView
Swift 4.2.0
extension UIView { // Export pdf from Save pdf in drectory and return pdf file path func exportAsPdfFromView() -> String { let pdfPageFrame = self.bounds let pdfData = NSMutableData() UIGraphicsBeginPDFContextToData(pdfData, pdfPageFrame, nil) UIGraphicsBeginPDFPageWithInfo(pdfPageFrame, nil) guard let pdfContext = UIGraphicsGetCurrentContext() else { return "" } self.layer.render(in: pdfContext) UIGraphicsEndPDFContext() return self.saveViewPdf(data: pdfData) } // Save pdf file in document directory func saveViewPdf(data: NSMutableData) -> String { let paths = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask) let docDirectoryPath = paths[0] let pdfPath = docDirectoryPath.appendingPathComponent("viewPdf.pdf") if data.write(to: pdfPath, atomically: true) { return pdfPath.path } else { return "" } } }
Kredit: http://www.swiftdevcenter.com/create-pdf-from-uiview-wkwebview-and-uitableview/
sumber
Dengan Swift 5 / iOS 12, Anda dapat menggabungkan
CALayer
'srender(in:)
metode denganUIGraphicsPDFRenderer
' swritePDF(to:withActions:)
metode untuk membuat file PDF dariUIView
contoh.Kode contoh Playground berikut menunjukkan cara menggunakan
render(in:)
danwritePDF(to:withActions:)
:import UIKit import PlaygroundSupport let view = UIView(frame: CGRect(x: 0, y: 0, width: 100, height: 100)) view.backgroundColor = .orange let subView = UIView(frame: CGRect(x: 20, y: 20, width: 40, height: 60)) subView.backgroundColor = .magenta view.addSubview(subView) let outputFileURL = PlaygroundSupport.playgroundSharedDataDirectory.appendingPathComponent("MyPDF.pdf") let pdfRenderer = UIGraphicsPDFRenderer(bounds: view.bounds) do { try pdfRenderer.writePDF(to: outputFileURL, withActions: { context in context.beginPage() view.layer.render(in: context.cgContext) }) } catch { print("Could not create PDF file: \(error)") }
Catatan: untuk menggunakan
playgroundSharedDataDirectory
Playground, Anda harus terlebih dahulu membuat folder bernama "Shared Playground Data" di folder "Documents" macOS Anda.The
UIViewController
implementasi lengkap subclass di bawah ini menunjukkan sebuah cara yang mungkin untuk refactor contoh sebelumnya untuk aplikasi iOS:import UIKit class ViewController: UIViewController { override func viewDidLoad() { super.viewDidLoad() let view = UIView(frame: CGRect(x: 0, y: 0, width: 100, height: 100)) view.backgroundColor = .orange let subView = UIView(frame: CGRect(x: 20, y: 20, width: 40, height: 60)) subView.backgroundColor = .magenta view.addSubview(subView) createPDF(from: view) } func createPDF(from view: UIView) { let documentDirectory = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask).first! let outputFileURL = documentDirectory.appendingPathComponent("MyPDF.pdf") print("URL:", outputFileURL) // When running on simulator, use the given path to retrieve the PDF file let pdfRenderer = UIGraphicsPDFRenderer(bounds: view.bounds) do { try pdfRenderer.writePDF(to: outputFileURL, withActions: { context in context.beginPage() view.layer.render(in: context.cgContext) }) } catch { print("Could not create PDF file: \(error)") } } }
sumber
Ini akan menghasilkan PDF dari UIView dan membuka dialog cetak, tujuan C. Lampirkan
- (IBAction)PrintPDF:(id)sender
tombol Anda di layar. Tambahkan#import <QuartzCore/QuartzCore.h>
kerangka kerjaFile H
@interface YourViewController : UIViewController <MFMailComposeViewControllerDelegate,UIPrintInteractionControllerDelegate> { UIPrintInteractionController *printController; } - (IBAction)PrintPDF:(id)sender;
M File
-(void)createPDFfromUIView:(UIView*)aView saveToDocumentsWithFileName:(NSString*)aFilename { NSMutableData *pdfData = [NSMutableData data]; UIGraphicsBeginPDFContextToData(pdfData, aView.bounds, nil); UIGraphicsBeginPDFPage(); CGContextRef pdfContext = UIGraphicsGetCurrentContext(); [aView.layer renderInContext:pdfContext]; UIGraphicsEndPDFContext(); NSArray* documentDirectories = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask,YES); NSString* documentDirectory = [documentDirectories objectAtIndex:0]; NSString* documentDirectoryFilename = [documentDirectory stringByAppendingPathComponent:aFilename]; NSString *file = [documentDirectory stringByAppendingPathComponent:@"yourPDF.pdf"]; NSURL *urlPdf = [NSURL fileURLWithPath: file]; [pdfData writeToFile:documentDirectoryFilename atomically:YES]; NSLog(@"documentDirectoryFileName: %@",documentDirectoryFilename); } - (IBAction)PrintPDF:(id)sender { [self createPDFfromUIView:self.view saveToDocumentsWithFileName:@"yourPDF.pdf"]; NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); NSString *documentsDirectory = [paths objectAtIndex:0]; NSString *path = [documentsDirectory stringByAppendingPathComponent:@"yourPDF.pdf"]; NSData *myData = [NSData dataWithContentsOfFile: path]; UIPrintInteractionController *pic = [UIPrintInteractionController sharedPrintController]; if(pic && [UIPrintInteractionController canPrintData: myData] ) { pic.delegate = self; UIPrintInfo *printInfo = [UIPrintInfo printInfo]; printInfo.outputType = UIPrintInfoOutputGeneral; printInfo.jobName = [path lastPathComponent]; printInfo.duplex = UIPrintInfoDuplexLongEdge; pic.printInfo = printInfo; pic.showsPageRange = YES; pic.printingItem = myData; void (^completionHandler)(UIPrintInteractionController *, BOOL, NSError *) = ^(UIPrintInteractionController *pic, BOOL completed, NSError *error) { //self.content = nil; if(!completed && error){ NSLog(@"Print Error: %@", error); } }; [pic presentAnimated:YES completionHandler:completionHandler]; } }
sumber
Saya tidak tahu mengapa, tetapi jawaban casilic memberi saya layar kosong di iOS6.1. Kode di bawah berfungsi.
-(NSMutableData *)createPDFDatafromUIView:(UIView*)aView { // Creates a mutable data object for updating with binary data, like a byte array NSMutableData *pdfData = [NSMutableData data]; // Points the pdf converter to the mutable data object and to the UIView to be converted UIGraphicsBeginPDFContextToData(pdfData, aView.bounds, nil); UIGraphicsBeginPDFPage(); CGContextRef pdfContext = UIGraphicsGetCurrentContext(); // draws rect to the view and thus this is captured by UIGraphicsBeginPDFContextToData [aView.layer renderInContext:pdfContext]; // remove PDF rendering context UIGraphicsEndPDFContext(); return pdfData; } -(NSString*)createPDFfromUIView:(UIView*)aView saveToDocumentsWithFileName:(NSString*)aFilename { // Creates a mutable data object for updating with binary data, like a byte array NSMutableData *pdfData = [self createPDFDatafromUIView:aView]; // Retrieves the document directories from the iOS device NSArray* documentDirectories = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask,YES); NSString* documentDirectory = [documentDirectories objectAtIndex:0]; NSString* documentDirectoryFilename = [documentDirectory stringByAppendingPathComponent:aFilename]; // instructs the mutable data object to write its context to a file on disk [pdfData writeToFile:documentDirectoryFilename atomically:YES]; NSLog(@"documentDirectoryFileName: %@",documentDirectoryFilename); return documentDirectoryFilename; }
sumber