./serve.sh in this directory.
Embed PDFCora.xcframework from a release, or add the package:
.package(url: "https://github.com/pdfcora/pdfcora-swift", from: "0.1.0")
import PDFCora let document = try await PdfDocument(data: data) let page = try await document.page(0) let image = try await page.render(width: 1024, options: [.annotations, .forms])
let transform = PdfViewTransform(page: try await page.size, fittingWidth: view.bounds.width)
for field in try await page.formFields() {
let box = transform.toView(field.base.rect) // top-left origin, ready for UIKit
}
for signature in try await document.signatures() {
print(signature.subFilter ?? "?", signature.signingTime ?? "?")
if !signature.coversWholeDocument {
// Valid, but content was appended after signing and is not protected.
}
}
switch await document.verify(signature, options: .init(trustAnchors: roots)) {
case .valid(let signer, _): print("signed by", signer.commonName ?? "?")
case .digestMismatch: print("the bytes changed after signing")
case .untrusted(let chain, _): print("intact, but not trusted", chain.count)
default: break
}
let report = try await document.redact([
.region(rect, pageIndex: 0),
.textMatches("account number"),
])
let clean = try await document.data(mode: .full) // full, always
let signer = try Pkcs12Signer(pkcs12: p12, password: password)
let signed = try await document.sign(PdfSignOptions(
signer: signer,
reason: "Approved",
timestampUrl: URL(string: "https://your-tsa.example/tsr"))) // optional, PAdES B-T
do { _ = try await PdfDocument(data: data) }
catch PdfError.passwordRequired { /* prompt */ }
catch let error as PdfError { print(error.description) }