Post not yet marked as solved
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!
Post not yet marked as solved
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.
Post not yet marked as solved
Dear Developer Community,
My app is saving handwritten notes, forms and images as annotations in PDF documents by using PDFKit.
Since iPadOS 17.2, the content of the annotations within the annotation boundaries is scaled down when saving the annotated PDF file. I.e. the annotation boundaries remain unchanged, but the displayed annotation content shrinks and no longer fills the boundaries. This gets worse with every save operation and applies both to newly created annotations and to elements that were saved before iPadOS 17.2.
This issue only occurred after updating to iPadOS 17.2. The same code on my test device with iPadOS 17.1 works perfectly.
Does anybody have a similar issue and/or found a workaround to solve this problem?
Thanks for any idea!
Post not yet marked as solved
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!
Post not yet marked as solved
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?
Post not yet marked as solved
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
Post not yet marked as solved
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?
Post not yet marked as solved
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.
Post not yet marked as solved
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)
Post not yet marked as solved
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
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) -> PDFView {
do {
let pdfData = try Data(contentsOf: activeBook)
pdfView.document = PDFDocument(data: pdfData) //<---- 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) -> 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 ?
Post not yet marked as solved
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
Post not yet marked as solved
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).
Post not yet marked as solved
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>
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.
Post not yet marked as solved
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
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()
}
Post not yet marked as solved
Currently I am displaying a pdf in one of my apps using the PDFKit. When I tap on the pdf view there is a strange crash happening related to the the text ranges conversion. No issues with iOS 16, seems to happen only in iOS 17
0x0000000117092fa1 in void PageLayout::ConvertTextRangesToStringRanges<std::__1::span<CFRange, 18446744073709551615ul>, std::__1::back_insert_iterator<std::__1::vector<CFRange, std::__1::allocator<CFRange> > > >(std::__1::span<CFRange, 18446744073709551615ul>&&, std::__1::back_insert_iterator<std::__1::vector<CFRange, std::__1::allocator<CFRange> > >&&) const ()
Post not yet marked as solved
I have a 52-page document authored in Pages that contains many equations, most of them pertaining to matrix algebra with many subscripts. Using Pages v13.2 on macOS 14.0 Sonoma (23A344), the exported PDF version of the document does not render the equations correctly. In particular, equations containing a vertical bar "|" are rendered without the vertical bar in the PDF document. For example, an equation for a probability expression of "P(x|y)" gets exported to PDF as "P(x y)".
In particular, the Pages "blahtex" form for a discrete-time system equation is
\mathbf{x}_{k+1} = \mathbf{\Phi}_{k+1|k} \mathbf{x}_k + \mathbf{u}_k + \mathbf{\Gamma}_{k+1|k} \mathbf{w}_k
In Pages, this gets correctly rendered as
whereas, in the exported PDF document, it gets incorrectly rendered as
Also, using \vert or \mid to generate the "|" in the equation does not help; the PDF export is still missing the "|" symbol.
If I save the document in Microsoft Word format and then export to PDF, the equations are rendered correctly.
Reverting to Pages v13.1 from Time Machine does not fix the issue; the exported PDF is still wrong. It should be noted that when I used Pages v13.1 in Ventura, exported PDF equations rendered correctly.
There may be other formulations that are broken that I have not yet encountered. In addition, my equations in Keynote suffer from the same problem when I export them to PDF. I know that macOS Sonoma removed EPS support, but it looks like other things got broken with this change.
I don't want to convert all of my Pages documents to Microsoft Word, but unless this gets fixed, Pages has become useless to me for technical documentation. I'm an engineer with a lot of documents, so this has pretty much brought my workflow to a halt.
I've submitted a bug report to Apple (FB13208972), but I am interested if anyone else is experiencing this problem.
I have a problem with the Notes app on ios17. When I open a pdf file that I created from scanning a document with my iPhone 14, I can't select any text from the pdf. This makes it impossible to copy and paste anything from my pdf. Is anyone else having this issue?