Display and manipulate PDF documents in your applications using PDFKit.

Posts under PDFKit tag

200 Posts

Post

Replies

Boosts

Views

Activity

Does UIGraphicsEndPDFContext flush and close the context file?
I'm getting infrequent crashes when I try to show a newly created PDF. The PDF is file based, and shortly after UIGraphicsEndPDFContext its shown. The crash reports make it appear that the file itself is being mutated after its displayed. So my question: is the file (self.filePath) absolutely flushed and closed when UIGraphicsEndPDFContext returns? If not, is there some way to detect when it has finished? Thanks! David `func addPageNumbers() { let url = URL(fileURLWithPath: filePath) guard let document = CGPDFDocument(url as CFURL) else { return } // You have to change the file path otherwise it can cause blank white pages to be drawn. self.filePath = "\(filePath)-final.pdf" UIGraphicsBeginPDFContextToFile(filePath, .zero, nil) let pageCount = document.numberOfPages for i in 1...pageCount { ... } } UIGraphicsEndPDFContext() }
1
0
1.2k
Jan ’24
PDFView highlight button doing nothing & can't override
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!
2
1
1.1k
Jan ’24
wwdc2022-10089 and various issues
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!
0
0
1k
Jan ’24
PDFKit is not working in MacOs
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.
1
0
878
Dec ’23
iOS/iPadOS 17.2 Bug in PDFKit duplicates content of filled PDF form fields
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!
7
5
1.8k
Dec ’23
Create PDF file with Spot Colors
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
1
0
1.9k
Dec ’23
ios17 breaks custom page size for PDF export
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?
3
0
1.6k
Dec ’23
PDFKit on macOS. Nearest page & converting point to document point not working.
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?
0
0
782
Dec ’23
Why does it not exist via @AppStorage
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 ?
2
0
1.1k
Dec ’23
How to set the Anchors Points of a PDF in PDFKit?
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.
0
0
718
Nov ’23
Problems with PDFKit
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)
1
0
1k
Nov ’23
Rotating a page in a pdf file - and get a mirrored image
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
2
0
2.7k
Nov ’23
search for specific words inside a pdf document in Xcode
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
1
0
902
Nov ’23
.pageCurl
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).
0
0
695
Nov ’23
Document-based Apple App that can run on iOS, iPadOS, and macOS
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.
2
0
1.6k
Nov ’23
Highlighter texts in a pdf are not showing as expected in IOS
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>
0
0
860
Nov ’23
NavigationLink from PDF
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
0
0
810
Oct ’23
Unable to open mach-O at path: default.metallib Error:2
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() }
2
1
5.5k
Oct ’23
Does UIGraphicsEndPDFContext flush and close the context file?
I'm getting infrequent crashes when I try to show a newly created PDF. The PDF is file based, and shortly after UIGraphicsEndPDFContext its shown. The crash reports make it appear that the file itself is being mutated after its displayed. So my question: is the file (self.filePath) absolutely flushed and closed when UIGraphicsEndPDFContext returns? If not, is there some way to detect when it has finished? Thanks! David `func addPageNumbers() { let url = URL(fileURLWithPath: filePath) guard let document = CGPDFDocument(url as CFURL) else { return } // You have to change the file path otherwise it can cause blank white pages to be drawn. self.filePath = "\(filePath)-final.pdf" UIGraphicsBeginPDFContextToFile(filePath, .zero, nil) let pageCount = document.numberOfPages for i in 1...pageCount { ... } } UIGraphicsEndPDFContext() }
Replies
1
Boosts
0
Views
1.2k
Activity
Jan ’24
PDFView highlight button doing nothing & can't override
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!
Replies
2
Boosts
1
Views
1.1k
Activity
Jan ’24
wwdc2022-10089 and various issues
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!
Replies
0
Boosts
0
Views
1k
Activity
Jan ’24
PDFKit is not working in MacOs
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.
Replies
1
Boosts
0
Views
878
Activity
Dec ’23
iOS/iPadOS 17.2 Bug in PDFKit duplicates content of filled PDF form fields
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!
Replies
7
Boosts
5
Views
1.8k
Activity
Dec ’23
Create PDF file with Spot Colors
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
Replies
1
Boosts
0
Views
1.9k
Activity
Dec ’23
ios17 breaks custom page size for PDF export
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?
Replies
3
Boosts
0
Views
1.6k
Activity
Dec ’23
PDFKit on macOS. Nearest page & converting point to document point not working.
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?
Replies
0
Boosts
0
Views
782
Activity
Dec ’23
Why does it not exist via @AppStorage
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 ?
Replies
2
Boosts
0
Views
1.1k
Activity
Dec ’23
How to set the Anchors Points of a PDF in PDFKit?
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.
Replies
0
Boosts
0
Views
718
Activity
Nov ’23
Problems with PDFKit
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)
Replies
1
Boosts
0
Views
1k
Activity
Nov ’23
Rotating a page in a pdf file - and get a mirrored image
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
Replies
2
Boosts
0
Views
2.7k
Activity
Nov ’23
search for specific words inside a pdf document in Xcode
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
Replies
1
Boosts
0
Views
902
Activity
Nov ’23
.pageCurl
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).
Replies
0
Boosts
0
Views
695
Activity
Nov ’23
Document-based Apple App that can run on iOS, iPadOS, and macOS
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.
Replies
2
Boosts
0
Views
1.6k
Activity
Nov ’23
Highlighter texts in a pdf are not showing as expected in IOS
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>
Replies
0
Boosts
0
Views
860
Activity
Nov ’23
NavigationLink from PDF
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
Replies
0
Boosts
0
Views
810
Activity
Oct ’23
Unable to open mach-O at path: default.metallib Error:2
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() }
Replies
2
Boosts
1
Views
5.5k
Activity
Oct ’23