Display and manipulate PDF documents in your applications using PDFKit.

PDFKit Documentation

Posts under PDFKit tag

72 Posts
Sort by:
Post not yet marked as solved
1 Replies
357 Views
Hi everyone, I'm trying to make a custom highlight functionality in PDFKit's PDFView on iOS 16. I've tried everything recommended online, and it seems like there's no way to fully override the menu and remove the normal "Highlight" action which actually does nothing if you tap it. I'd be okay with being able to either remove the base Highlight action because I'm able to add my own, or figure out how to handle a tap on that button. Here's what I've tried, and the result: override func buildMenu(with builder: UIMenuBuilder) { super.buildMenu(with: builder) builder.remove(menu: .application) builder.remove(menu: .lookup) builder.remove(menu: .learn) builder.remove(menu: .find) builder.remove(menu: .file) builder.remove(menu: .edit) builder.remove(menu: .services) if #available(iOS 16.0, *) { builder.remove(menu: .document) } let highlightAction = UIAction(title: "Highlight 2", attributes: []) { _ in print("This works") } } let highlightMenu = UIMenu(title: "Highlight 2", options: [.displayInline], children: [highlightAction]) builder.remove(menu: .standardEdit) builder.remove(menu: .share) builder.remove(menu: .toolbar) builder.remove(menu: .text) builder.remove(menu: .font) builder.remove(menu: .format) builder.remove(menu: .transformations) builder.remove(menu: .preferences) builder.remove(menu: .window) builder.remove(menu: .view) builder.replaceChildren(ofMenu: .root, from: { _ in [highlightAction] }) } Please help!
Posted
by shreyas-n.
Last updated
.
Post not yet marked as solved
0 Replies
325 Views
Hi, I encounter various problems with inserting PKDrawing into a PDFAnnotation : First : After "page.addAnnotation(myCustomAnnotation)", saved document seems corrupted (affected pages are displayed with a "X" watermark covering the whole page), Second : The only way to extract PKDrawing from the annotation is unarchiveTopLevelObjectWithData: which is deprecated, Final : I'm not able to re-read PKDrawings to restore PKCanvasView undoManager. Does anyone have an idea on a correct way to do this? Thank you in advance and happy new year everyone!
Posted
by Aflaf.
Last updated
.
Post not yet marked as solved
0 Replies
316 Views
I am creating a PDF document with the information from the database. For iOS I have it working completely, but for macOs I can't get it to work no matter what I try. I now have this code: func generateRentalPDF(_ invoiceModel: InvoiceModel, _ customerInfo: CustomerModel, _ completion: @escaping (Data?) -> Void) { guard let baseDocument = loadBasePDF(), let page = baseDocument.page(at: 0) else { completion(nil) return } var pageBounds = page.bounds(for: .mediaBox) let pdfData = NSMutableData() guard let dataConsumer = CGDataConsumer(data: pdfData as CFMutableData), let pdfContext = CGContext(consumer: dataConsumer, mediaBox: &pageBounds, nil) else { completion(nil) return } pdfContext.beginPDFPage(nil) if let cgPage = page.pageRef { pdfContext.drawPDFPage(cgPage) } // Set text attributes let textString = "Invoice Number: \(invoiceModel.invoiceNumber)" let textStyle = NSMutableParagraphStyle() textStyle.alignment = .left let textAttributes: [NSAttributedString.Key: Any] = [ .font: NSFont.systemFont(orSize: 18), .foregroundColor: NSColor.black, .paragraphStyle: textStyle ] // Calculate text position let textRect = CGRect(x: 100, y: pageBounds.height - 150, width: 300, height: 50) // Draw the text pdfContext.saveGState() pdfContext.translateBy(x: 0, y: pageBounds.height) pdfContext.scaleBy(x: 1.0, y: -1.0) let attributedText = NSAttributedString(string: textString, attributes: textAttributes) attributedText.draw(in: textRect) pdfContext.restoreGState() pdfContext.endPDFPage() pdfContext.closePDF() completion(pdfData as Data) } When I open the document in the app, I do see the base document. Even if I put a stroke around the text, I also see the stroke. However, the text does not appear on the screen. What am I overlooking or what am I doing wrong? I hope someone here has an answer for me, thank you very much in advance.
Posted
by BoudB.
Last updated
.
Post not yet marked as solved
5 Replies
788 Views
The following situation is given: In your code you have a PDFDocument object. This contains a PDF file with form fields that are filled with text. If you call the dataRepresentation() method on this PDFDocument object, you get back a data object: let myDocumentData: Data = pdfDocument.dataRepresentation()! If you now want to initialize a new PDFDocument object with this data object, the contents of the form fields are duplicated within the PDF. let newPDF: PDFDocument = PDFDocument(data: myDocumentData) If you now want to print the newPDF PDFDocument object by creating a new print job, you will get the following result: What you actually expect to see: You only see this behavior when you want to print or share the PDF. You won't see this behaviour inside a PDF View in your application. This behaviour only appears since iOS/iPadOS 17.2 Steps to reproduce: Get a PDF file with form fields, especially text fields fill out these text fields with text create a PDFDocument object with this PDF file call the dataRepresentation() method on this PDFDocument object and store the result in a new variable create a new PDFDocument object with the data object created in the previous step:PDFDocument(data: <data>) Print the new created PDFDocument within iOS/iPadOS 17.2 or share it for example via email I hope Apple will fix this bug soon!
Posted
by Johnny44.
Last updated
.
Post not yet marked as solved
8 Replies
1.4k Views
Hello y'all, I would like to discuss here if anyone else is noticing that some PDF files are not rendered as expected in iOS/iPadOS 17, it seems that some text with background (screenshot attached) are not rendered and you can only see the back color. The issue is reproducible on Preview, Safari, where I guess Apple is using PDFKit framework too. We submitted different issues with Feedback Assistant, however I've not hear back from Apple yet. Is anyone else able to reproduce the issue? Thanks,
Posted
by lisandr0.
Last updated
.
Post not yet marked as solved
1 Replies
443 Views
I am trying to generate a PDF file with certain components draw with Spot Colours. Spot colours are used for printing and I am not clear on how one would do that but I think that if I can create a custom ColorSpace with a specific name or a color that has a specific name - our printer looks for the name Spot1 and they use the colour green. Can anyone shed any light on how I might be able to do this. For reference I have attached two pdf files with two different spot colours in them. I need to be able to create similar using CGContext and CGPDFDocument. I can already generate the PDF documents using CMYK colors but don't know how I can create the equivalent "spot" colors. At the moment I am loading the page from these attached pdf files and scaling them to fill the page to get a background with the spot color. This works fine but I also need to generate text and lines using this same spot color and I am not clear how I could do that using the Core Graphics APIs. My guess is I need to create a custom ColorSpace with a single color and then use that color for drawing with. The only 'custom' option for creating a ColorSpace seems to be the CGColorSpace(propertyListPList:) constructor, however there does not appear to be any documentation on what needs to be in the property list to do so. Nor can I find any examples of that. Any pointers would be appreciated. Regards
Posted
by duncang.
Last updated
.
Post not yet marked as solved
2 Replies
541 Views
We have an app that exports PDFs with a custom page size, using PSDKit. In iOS16 the PDF export would have the correct page size dimensions, but now iOS17 exports everything to a Letter (8.5x11) size, regardless of what the PDF size specs are defined in the code: let pageWidth: CGFloat = 86.0 / 25.4 * 72 let pageHeight: CGFloat = 54.0 / 25.4 * 72 let pageSize = CGRect(x: 0, y: 0, width: pageWidth, height: pageHeight) Any thoughts as to how to fix this?
Posted Last updated
.
Post not yet marked as solved
0 Replies
290 Views
On macOS page(for: viewPoint, nearest: false) returns the wrong page. If I enter a coordinate on page 1 less than 1/3 of the way down, it returns that it is on page 0. Likewise on page 2 it will say page 1 anywhere in the top third. Also PDFView's convert(point, to: page) will return seemingly random values for the document point's y value, but in the expected range of 0 to about 792 (for an 11" page at 72dpi). Displaying the document horizontal/vertical doesn't matter. The x value of the point is always correct and everything works correctly on iOS. I've tried Xcode 15.0 and 15.1 beta 3. Anyone using these functions correctly, or seeing the same issue?
Posted Last updated
.
Post marked as solved
1 Replies
452 Views
2 versions 1 works 1 doesn't. UIViewRepresentable to show a PDF @AppStorage(DefaultsKey.userActiveBook.rawValue) var activeBook : URL = Bundle.main.url(forResource: "BookPlaceHolder", withExtension: "pdf")! func makeUIView(context: Context) -&gt; PDFView { do { let pdfData = try Data(contentsOf: activeBook) pdfView.document = PDFDocument(data: pdfData) //&lt;---- is nil ... } catch let Error { print(Error) } } fails with Error Domain=NSCocoaErrorDomain Code=260 "The file “BookPlaceHolder.pdf” couldn’t be opened because there is no such file." func makeUIView(context: Context) -&gt; PDFView { do { let pdfData = try Data(contentsOf: Bundle.main.url(forResource: "BookPlaceHolder", withExtension: "pdf")!) pdfView.document = PDFDocument(data: pdfData) ... } catch let Error { print(Error) } } Works perfectly. What is it with using @AppStorage to access the exact same URL causing the discrepancies ?
Posted
by RyanTCB.
Last updated
.
Post not yet marked as solved
0 Replies
291 Views
I am trying to set the top anchor point of a pdf that is inside of a view with the .ignoresSafeArea() modifier. I would also like it to work on the edges when the phone is in landscape although for simplicity I will only explain what I want for the top. I want it to function like the iOS Files app pdf viewer where when tapped it hides the navigation bars but the top of the pdf stays at the same place, but when you zoom in on the pdf it can fill the whole screen. When you zoom back out the top should return to the same place as before. Here is a simple view to show how it is being used: @MainActor struct ContentView: View { @State var showBars: Bool = true @State var pdfUrl: URL? var body: some View { NavigationStack { GeometryReader { geo in ScrollView { TabView { if let url = pdfUrl { PDFViewer(pdfUrl: url) .onTapGesture { withAnimation { showBars.toggle() } } } } .tabViewStyle(.page(indexDisplayMode: .never)) .frame(width: geo.size.width, height: geo.size.height) } .scrollDisabled(true) } .ignoresSafeArea(edges: !showBars ? .all : []) } .task { pdfUrl = renderPDF() } } func renderPDF() -> URL { let renderer = ImageRenderer(content: VStack {}) let url = URL.documentsDirectory.appending(path: "samplepdf.pdf") renderer.render { size, context in guard let pdf = CGContext(url as CFURL, mediaBox: nil, nil) else { return } pdf.beginPDFPage(nil) context(pdf) pdf.endPDFPage() pdf.beginPDFPage(nil) context(pdf) pdf.endPDFPage() pdf.closePDF() } return url } } And here is what my pdfView looks like so far: struct PDFViewer: View { var pdfUrl: URL var body: some View { PDFSheetView(document: .init(url: pdfUrl)) } } class PDFViewController: UIViewController { let document: PDFDocument? var pdfView: PDFView! init(document: PDFDocument?) { self.document = document super.init(nibName: nil, bundle: nil) } override func loadView() { let view = PDFView() self.view = view self.pdfView = view view.document = document view.displayDirection = .vertical view.autoScales = true view.topAnchor.constraint(equalTo: view.safeAreaLayoutGuide.topAnchor).isActive = true view.leadingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.leadingAnchor).isActive = true view.trailingAnchor.constraint(equalTo: view.safeAreaLayoutGuide.trailingAnchor).isActive = true } required init?(coder: NSCoder) { document = nil super.init(coder: coder) return nil } override func viewDidLayoutSubviews() { let bounds = view.bounds if let document { if let page = document.page(at: 0) { let pageBounds = page.bounds(for: .mediaBox) if bounds.width > 0 && pageBounds.width > 0 { let scaleFactor = bounds.width / pageBounds.width let subtractionFactor = scaleFactor * 0.0125 pdfView.minScaleFactor = scaleFactor - subtractionFactor } } } } } struct PDFSheetView: UIViewControllerRepresentable { typealias UIViewControllerType = PDFViewController let document: PDFDocument? func makeUIViewController(context: Context) -> PDFViewController { let controller = PDFViewController(document: document) return controller } func updateUIViewController(_ uiViewController: PDFViewController, context: Context) { } } Is this possible to do? Like I said before, I want it to function just like the iOS Files app pdf viewer.
Posted Last updated
.
Post not yet marked as solved
1 Replies
387 Views
How to fix it? Errors: "Cannot find type 'UIViewRepresentable' in scope" "Cannot find type 'Context' in scope" "Cannot find type 'Context' in scope" I tried: Re-installed the Xcode Re-started computer Great thanks. import SwiftUI import PDFKit struct PDFViewerView: UIViewRepresentable { var url: URL func makeUIView(context: Context) -> PDFView { let pdfView = PDFView() pdfView.document = PDFDocument(url: self.url) return pdfView } func updateUIView(_ uiView: PDFView, context: Context) { // Update the view. } } Xcode Version 15.0.1 (15A507)
Posted Last updated
.
Post not yet marked as solved
0 Replies
349 Views
Hi there, I have watched the keynote of WWDC23 and like to have technical information on how to implement Filling forms for iPad OS using PDFKIT into our App. I have reviewed PDFKit API documentation, but there are no any documentation about how to use that technology and no any changes to API. Thanks, Eduard
Posted
by Eddie1994.
Last updated
.
Post marked as solved
2 Replies
1.4k Views
I try to rotate a page 180° in a pdf file. I nearly get it, but the page is also mirrored horizontally. Some images to illustrate: Initial page: Result after rotation (see code): it is rotated 180° BUT mirrored horizontally as well: The expected result It is just as if it was rotated 180°, around the x axis of the page. And I would need to rotate 180° around z axis (perpendicular to the page). It is probably the result of writeContext!.scaleBy(x: 1, y: -1) I have tried a lot of changes for transform, translate, scale parameters, including removing calls to some of them, to no avail. @IBAction func createNewPDF(_ sender: UIButton) { var originalPdfDocument: CGPDFDocument! let urls = FileManager.default.urls(for: .documentDirectory, in: .userDomainMask) let documentsDirectory = urls[0] // read some pdf from bundle for test if let path = Bundle.main.path(forResource: "Test", ofType: "pdf"), let pdf = CGPDFDocument(URL(fileURLWithPath: path) as CFURL) { originalPdfDocument = pdf } else { return } // create new pdf let modifiedPdfURL = documentsDirectory.appendingPathComponent("Modified.pdf") guard let page = originalPdfDocument.page(at: 1) else { return } // Starts at page 1 var mediaBox: CGRect = page.getBoxRect(CGPDFBox.mediaBox) // mediabox which will set the height and width of page let writeContext = CGContext(modifiedPdfURL as CFURL, mediaBox: &mediaBox, nil) // get the context var pageRect: CGRect = page.getBoxRect(CGPDFBox.mediaBox) // get the page rect writeContext!.beginPage(mediaBox: &pageRect) let m = page.getDrawingTransform(.mediaBox, rect: mediaBox, rotate: 0, preserveAspectRatio: true) // Because of rotate 0, no effect ; changed rotate to 180, then get an empty page writeContext!.translateBy(x: 0, y: pageRect.size.height) writeContext!.scaleBy(x: 1, y: -1) writeContext!.concatenate(m) writeContext!.clip(to: pageRect) writeContext!.drawPDFPage(page) // draw content in page writeContext!.endPage() // end the current page writeContext!.closePDF() } Note: This is a follow up of a previous thread, https://developer.apple.com/forums/thread/688436
Posted
by Claude31.
Last updated
.
Post not yet marked as solved
1 Replies
343 Views
RB24 is my pdf doc. Im using a "view" inside my View Controller and the Class for that view is a PDFView. When I see the pdf on my app, I can't do a search inside the pdf document. How can I achieve that? When you open a pdf in your iPhone, iPhone uses an app that lets you do search and annotations on the pdf. Is there any way to do that for your app ? Any help will be greatly appreciated ! UIKit import PDFKit class ViewControllerRB: UIViewController { @IBOutlet weak var PDFViewRB: PDFView! override func viewDidLoad() { super.viewDidLoad() let url = Bundle.main.url(forResource: "RB24", withExtension: "pdf") if let pdfDocument = PDFDocument(url: url!) { PDFViewRB.autoScales = true PDFViewRB.displayMode = .singlePageContinuous PDFViewRB.displayDirection = .vertical PDFViewRB.document = pdfDocument
Posted
by EddieRS.
Last updated
.
Post not yet marked as solved
0 Replies
292 Views
I am refreshing an old app that used the .pageCurl transition allowing user to drop pages in a multipage PDF file like turning the pages in a book. I am committed to using multipage PDF files. I can use UIPageViewController with .pageCurl transition when I am just using multiple UIViews supplied from my DataSource delegate. I cannot see how to use this with a multipage PDF file. I am committed to using SwiftUI and SwiftData which has new app targeting iOS 17. Can anyone point me to some (preferably Apple) example code to do this (that does not involve using non-Apple third party code).
Posted
by ajga.
Last updated
.
Post marked as solved
2 Replies
569 Views
I am new to developing native Apple apps and must familiarize myself with the Apple development frameworks. I am starting to create a personal document-based Apple App that can run on iOS, iPadOS, and macOS. The document will contain the following: HTML, PDF, images, video, and audio files. So, I think the document format could be HTML. I need the capability to read, edit (WYSIWYG Editor), save, and share documents with other users using the same app. The data is stored in the user's device and iCloud. I need guidance about what Apple framework I should use to edit the documents using WYSIWYG editing principles. I would really appreciate any recommendation you can provide. Many thanks for considering my request. Thank you so much for your attention and participation.
Posted
by olopul.
Last updated
.
Post not yet marked as solved
0 Replies
381 Views
The specific pdf when opened in an macOS or web orA Adobe iOS App, it shows the highlighted texts as expected But when opened through any IOS app (except the adobe app) or our native app using pdfkit , the highlights are gone . It disappeared Even the pdf when opened in files app has this issue. Don’t know what’s the problem with the iOS. I have attached the screenshot for the pdf when opened in mac versus the pdf opened in any iOS app. **PDF when opened via Adobe App, ** Pdf when opened via our native app, Raised a feedback regarding this unexpected behaviour . FB Id - FB13326307 Do anyone faced the same issue? Anything am i missing regarding this>
Posted Last updated
.
Post not yet marked as solved
0 Replies
333 Views
Hi there, I am currently developing an app. I would like to make NavigationLinks from certain words inside an implemented .pdf-file to other Swift view files. Is there a possibility to do this? Here is my code: import PDFKit struct BasismassnahmenPDF: UIViewRepresentable { let pdfDocument: PDFDocument init(showing pdfDoc: PDFDocument) { self.pdfDocument = pdfDoc } func makeUIView(context: Context) -> PDFView { let pdfView = PDFView() pdfView.document = pdfDocument pdfView.autoScales = true return pdfView } func updateUIView(_ pdfView: PDFView, context: Context) { pdfView.document = pdfDocument pdfView.minScaleFactor = 0.6 pdfView.scaleFactor = pdfView.scaleFactorForSizeToFit } } struct Basismassnahmen: View { let pdfDoc: PDFDocument init() { let url = Bundle.main.url(forResource: "Basismassnahmen", withExtension: "pdf")! pdfDoc = PDFDocument(url: url)! } var body: some View { BasismassnahmenPDF(showing: pdfDoc) } } #Preview { Basismassnahmen() } Thank you so much for your help! Laurin
Posted
by rinuality.
Last updated
.
Post marked as solved
2 Replies
1.3k Views
Hey there, I am quite new to SwiftUI and currently trying to implement a pdf file into my app. When run the app on my iPhone the pdf file opens without any problems but I always get this Error: Unable to open mach-O at path: default.metallib Error:2 I do not actually understand the code completely I found on multiple websites, but what am I doing wrong? I attached my used code. Thanks for your help! Laurin import PDFKit struct PDFKitView: UIViewRepresentable { let pdfDocument: PDFDocument init(showing pdfDoc: PDFDocument) { self.pdfDocument = pdfDoc } func makeUIView(context: Context) -> PDFView { let pdfView = PDFView() pdfView.document = pdfDocument pdfView.autoScales = true return pdfView } func updateUIView(_ pdfView: PDFView, context: Context) { pdfView.document = pdfDocument } } struct Hypoglykaemie: View { let pdfDoc: PDFDocument init() { let url = Bundle.main.url(forResource: "hypoglykaemie", withExtension: "pdf")! pdfDoc = PDFDocument(url: url)! } var body: some View { PDFKitView(showing: pdfDoc) } } #Preview { Hypoglykaemie() }
Posted
by rinuality.
Last updated
.
Post not yet marked as solved
1 Replies
569 Views
I'm using PDFKit to show a PDF which contains some hidden fields. Unfortunately, PDFKit seems to ignore that property, annotation.shouldDisplay is always YES. I have to set shouldDisplay by my own depending on the annotation's internal flags: // see Chapter 8.4.2 Annotation Flags in PDF Reference for PDF 1.7 // https://opensource.adobe.com/dc-acrobat-sdk-docs/pdfstandards/pdfreference1.7old.pdf static const NSUInteger PDFAnnotationFlagInvisible = 1; static const NSUInteger PDFAnnotationFlagHidden = 1 << 1; // ... for (PDFAnnotation* annotation in page.annotations) { id value = [annotation valueForAnnotationKey:PDFAnnotationKeyFlags]; if (value != nil) { NSInteger annotationFlags = [value integerValue]; if (annotationFlags & (PDFAnnotationFlagInvisible | PDFAnnotationFlagHidden)) { annotation.shouldDisplay = NO; } } } It doesn't feel right that this snippet is needed. So is this a bug / known issue in PDFKit or is my PDF somehow "wrong".
Posted
by chkpnt.
Last updated
.