Development

Blog Image
DEVELOPMENT  |  Development • iOS • Testing

Automating Test Retries

We walk through our experience of dealing with flaky tests by automatically retrying them.

Blog Image
DEVELOPMENT  |  iOS • Development • Debugging • Swift

Debugging Image Loading and Cropping Performance on iOS

We talk about using the Image I/O and Core Graphics APIs to improve the image loading and cropping performance in the PSPDFKit iOS SDK.

Blog Image
DEVELOPMENT  |  Development • PDF • Debugging • Support

How We Debugged a Customer Problem with a Signed PDF

This blog post details how the PDF expertise of the PSPDFKit team helped unblock a customer with a tricky PDF problem.

Blog Image
DEVELOPMENT  |  Server • Development • JavaScript

Load Testing PSPDFKit Server

How we figured out what it takes to run PSPDFKit Server.

Blog Image
DEVELOPMENT  |  iOS • Development • How To

Automating Mac Catalyst Distribution with fastlane

We recently automated PDF Viewer for Mac distribution via fastlane. Here’s how you can do the same for your Mac Catalyst app.

Blog Image
DEVELOPMENT  |  PDF • Development

Optimizing PDFs for Printers

How to make sure your users get a good experience when your PDF is printed.

Blog Image
DEVELOPMENT  |  Development • Testing • Android • Web

Why Should You Care about Manual Testing?

How to approach manual testing pragmatically for quality products you can be proud of.

Blog Image
DEVELOPMENT  |  Development • PDF

How a B-Tree Helped Reduce Memory Usage in Our Framework

This blog post describes the approach we took to save around 15 percent of memory in our framework by first identifying bottlenecks, and then changing one of our dictionary implementations to use a specialized data structure known as a B-tree.

Blog Image
DEVELOPMENT  |  Processor • Web • Development

A Brief Tour of Multipart Requests

...Or, how your files travel over the internet.

Blog Image
DEVELOPMENT  |  PDF • Office • Word

Why PDF Uses Floats and Word Uses EMUs

This post explores and gives examples of the units of length in Word documents.

Blog Image
DEVELOPMENT  |  PDF

What Contributes to Slow PDF Rendering?

We briefly cover how PDF rendering works and some reasons why rendering a PDF can be slow.

Blog Image
DEVELOPMENT  |  SwiftUI • iOS

SwiftUI In Production

We recently shipped a major new feature in SwiftUI while still supporting iOS 12 in our SDK. Here's what we learned.

Blog Image
DEVELOPMENT  |  Web • Products • Development

Server Development on Apple Silicon

A short post about the experience of using an M1 MacBook for working on our Server product.

Blog Image
DEVELOPMENT  |  Web • Server • Development

Our Journey to ARM

A recollection of the events that led to PSPDFKit supporting ARM for our server-based products.

Blog Image
DEVELOPMENT  |  PDF • C++

Tackling PDF Performance Issues

Digging into the internals of PSPDFKit to improve PDF performance.

Blog Image
DEVELOPMENT  |  Android • Development • How To • Flutter

How to Customize Our Flutter PDF SDK

How to fork and modify the PSPDFKit Flutter PDF SDK for your own application.

Blog Image
DEVELOPMENT  |  Web • Development • Elixir

The Perils of Large Files in Elixir

A post about dealing with large files in Elixir applications.

Blog Image
DEVELOPMENT  |  Development • iOS • Swift

Streams of Cocoa: Why It's Still Worth Knowing NSStream

In this post, we'll look at a piece of API that many people rarely touch, if ever: Stream. It’s neither new nor shiny, but it's a powerful tool when you know how to use it.

Blog Image
DEVELOPMENT  |  Development • C++

String Literals, Character Encodings, and Multiplatform C++

How string literals are encoded by Clang and MSVC.

Blog Image
DEVELOPMENT  |  Web • Performance • Development • JavaScript

Frontend Performance Enhancements at PSPDFKit

A short article about the principles of performance improvements at PSPDFKit.

Blog Image
DEVELOPMENT  |  iOS • macOS • Development

Advances in XCFrameworks

With Xcode 12, Apple improved the XCFramework format, which unlocks great new capabilities.

Blog Image
DEVELOPMENT  |  iOS • Development • Testing

Deflaking CI Tests with xcresults

We’re sharing some techniques for tracking down and fixing flaky Xcode tests on CI.

Blog Image
DEVELOPMENT  |  iOS • Testing

Continuous Integration: From Jenkins to Buildkite

Learn why we moved from Jenkins to Buildkite, what the current most promising services are, and how we evaluated them.

Blog Image
DEVELOPMENT  |  PDF • Development • How To • .NET • Java

Stop Wasting Bandwidth with PDFs — Transfer Changes with Instant JSON

PDFs can be large, and sending only the changes can dramatically reduce the amount of bandwidth used.

Blog Image
DEVELOPMENT  |  iOS • Testing

Automating macOS Provisioning with Chef

Learn how to use Chef to automatically provision macOS machines for CI: infrastructure as code

Blog Image
DEVELOPMENT  |  Processor • Web • Server

A Primer on JSON Web Tokens

What JWTs are, how they work, and how we use them at PSPDFKit.

Blog Image
DEVELOPMENT  |  Development • C++

Time Travel Debugging for C/C++

A quick look at reverse debugging/time travel debugging for C/C++.

Blog Image
DEVELOPMENT  |  iOS • Development • How To • Swift

How to Unlock PDF Functionality with OCR in iOS

This blog post covers how to integrate OCR functionality in iOS, perform OCR, and leverage functionality such as extraction, selection, highlight, and search.

Blog Image
DEVELOPMENT  |  Web • Development • JavaScript

Keeping Up with JavaScript Pointer Events

Events on the web have changed a great deal since the days of the cursor and the mouse. We examine some differences that you should be aware of.

Blog Image
DEVELOPMENT  |  Android • Development • Kotlin

How Updating to Kotlin 1.4 Broke Our Linter Rules

How the update to Android Gradle plugin 4.1 and Kotlin 1.4 can break custom linter rules, and how to fix it.

Blog Image
DEVELOPMENT  |  iOS • Testing

Managing macOS Hardware: Virtualization or Bare Metal?

We explore the different ways to run macOS in the cloud, comparing virtualization via VMware, Anka, and Orka with running a fleet of bare metal machines on Amazon or MacStadium.

Blog Image
DEVELOPMENT  |  iOS • Testing

Continuous Integration for Small iOS/macOS Teams

In this new series, we're sharing our approach to macOS continuous integration for smaller teams that can't dedicate an entire team to CI management or aren't willing to invest five-figure sums per year for their setup.

Blog Image
DEVELOPMENT  |  Development • Documentation

Executable API Documentation with the LLVM Integration Tester and FileCheck

This post covers what executable documentation is and how you can use the LLVM Integration Tester to create it.

Blog Image
DEVELOPMENT  |  Development

Updating Complex Forked Projects

This blog post explains all the steps we take to stay up to date with PDFium at all times.

Blog Image
DEVELOPMENT  |  iOS • Development

Faster Compilation with Ccache 4.0

Ccache is a build cache to achieve faster compilation. With the 4.0 release, it now supports Modules, which makes it possible to accelerate projects that mix Objective-C and Swift.

Blog Image
DEVELOPMENT  |  Development • Web • WebAssembly

Migrating to the New Emscripten LLVM Backend

We share the experience of migrating from the old Fastcomp backend to the new LLVM backend in Emscripten.

Blog Image
DEVELOPMENT  |  Web • Products • Accessibility

How We're Improving Accessibility on PSPDFKit for Web

Better keyboard navigation and assistive technology support on the latest versions of our Web SDK.

Blog Image
DEVELOPMENT  |  Web • Development • JavaScript

The Generalized CRUD API of PSPDFKit for Web

An introduction to why and how we designed the brand-new unified CRUD API in PSPDFKit for Web.

Blog Image
DEVELOPMENT  |  Development • LLDB

An Introduction to LLDB Reproducers

An introduction to an experimental feature in LLDB, Reproducers, that helps reproduce bugs in the debugger itself.

Blog Image
DEVELOPMENT  |  Development • Web • WebAssembly

The State of Debugging in WebAssembly

We share our tips and tricks for debugging issues in WebAssembly and look to the future to see what's coming.

Blog Image
DEVELOPMENT  |  Server • DevOps • Observability

Monitoring PSPDFKit Server with Metrics

Using data to draw insightful conclusions.

Blog Image
DEVELOPMENT  |  iOS • Development

Binary Frameworks as Swift Packages

What we learned from experimenting with binary frameworks as Swift packages in Xcode 12.

Blog Image
DEVELOPMENT  |  PDF • Development

Evaluating the Render Fidelity of PDF.js

We explore various issues with the render fidelity of PDF.js.

Blog Image
DEVELOPMENT  |  Development • Visual Studio Code • C++

Visual Studio Code, C++, and a Docker Container

Our journey of using Visual Studio Code to develop C++ in a remote container.

Blog Image
DEVELOPMENT  |  iOS • Development • Swift

Using Metal to Apply Image Filters

An overview of how to use Metal to apply filters to images to perform a simple color inversion on the input image.

Blog Image
DEVELOPMENT  |  Development • C++

C++20 in 2020: Modules

An introduction to the C++20 modules feature: what they are, their potential advantages and disadvantages, and how they are used.

Blog Image
DEVELOPMENT  |  Libraries • Java • .NET • iOS • Android • Web • Development • Products

Optical Character Recognition in Scanned PDFs

An overview of how OCR can enhance scanned documents to speed up common operations. We explain what OCR is, why it's useful, and how it works.

Blog Image
DEVELOPMENT  |  iOS • Development • PDF

Why Is the PDF Format So Well Supported on Apple Platforms?

Apple has a rich history of supporting the PDF file format, but when and how did its relationship with the PDF format begin?

Blog Image
DEVELOPMENT  |  Development • git

A Better Way to Git Log to Understand Changes in a Big Codebase

How git log information may not be enough when developers need to understand changes in a codebase that has evolved over several years.

Blog Image
DEVELOPMENT  |  iOS • Development • Swift

The Case for Lists in UICollectionView

Exploring the power and flexibility offered by creating lists using UICollectionView.

Blog Image
DEVELOPMENT  |  iOS • Development • Swift

The Hidden Trap in Selective Table View and Collection View Reloads

Learn how to properly update cells in a table view or collection view without crashing.

Blog Image
DEVELOPMENT  |  Development

Transparent PNG Support

Images with transparency (PNG alpha support) offer new possibilities for annotating documents across all platforms.

Blog Image
DEVELOPMENT  |  Web • PDF • Products

How We Created a Real-Time Collaboration Tool Inside a PDF

This blog post takes a peek under the proverbial PDF hood to find out how we developed Instant Comments.

Blog Image
DEVELOPMENT  |  Development • iOS

Direct Calls with Objective-C

Apple introduced the objc_direct attribute in Xcode 12. Learn what it does and how you can use it to your advantage.

Blog Image
DEVELOPMENT  |  WebAssembly • Web • Development • How To • JavaScript

How to Use WebAssembly Modules in a Web Worker

A short tutorial showing the use of WebAssembly in a web worker.

Blog Image
DEVELOPMENT  |  iOS • macOS • Development

Supporting XCFrameworks

What we learned about XCFrameworks while migrating PSPDFKit to this new format.

Blog Image
DEVELOPMENT  |  iOS • Development

NULL-Characters in Strings and Tales of Apple Radar

In iOS 11, Smart Punctuation caused data loss. Learn how we fixed the issue and how we are now cleaning up the OS-level workaround.

Blog Image
DEVELOPMENT  |  Web • Development

Text Selection Regression in Chrome 83

How we noticed a Chrome regression and shipped a workaround in a timely fashion.

Blog Image
DEVELOPMENT  |  Android • Development

Think First, Code Later

A case study on how we design features and APIs for PSPDFKit for Android.

Blog Image
DEVELOPMENT  |  Development • C++

IDEs and Text Editors for Writing C++ Code on a Large Scale

This blog post compares different IDEs and text editors that can be used to write C++ in a big codebase.

Blog Image
DEVELOPMENT  |  iOS • Development

Automated Profiling Runs in Instruments

Learn how to automate measurement runs with Instruments.

Blog Image
DEVELOPMENT  |  Development • C++

How to Effectively Measure the Performance of Your Code

This blog post explains why software that performs well is important and how we measure code performance at PSPDFKit.

Blog Image
DEVELOPMENT  |  Development • Android • How To

How to Reduce Flakiness in Automated UI Testing on Android

This blog post discusses tips and best practices on how to reduce flakiness in automated UI testing on Android.

Blog Image
DEVELOPMENT  |  Development • iOS

Preventing Surprisingly Large Objective-C Type Encodings

Objective-C stores type encoding in the binary. These encodings can become surprisingly large.

Blog Image
DEVELOPMENT  |  Development • iOS

Supporting Pointer Interactions

Apple introduced new pointer events in iOS 13.4 to better support trackpad and mouse devices.

Blog Image
DEVELOPMENT  |  Development • C++

Effective Header Management in C++

How we can reduce build times and clean up our header dependencies with effective header management.

Blog Image
DEVELOPMENT  |  Development • PDF • Testing • C++

Our Approach to Testing a Large-Scale C++ Codebase

This blog post outlines the frameworks and techniques PSPDFKit uses to test its large-scale C++ codebase.

Blog Image
DEVELOPMENT  |  Development • C++

Investigating the Performance Overhead of C++ Exceptions

C++ exceptions have their place, but using an alternative is recommended for general program flow control.

Blog Image
DEVELOPMENT  |  Development • C++

Compiler-Based Lock Checking in C++

A short introduction to compiler-based lock checking in C++ with Clang using Thread Safety Analysis

Blog Image
DEVELOPMENT  |  Web • Development • PWA

The State of Progressive Web Apps in 2020

Examining new developments in the PWA landscape that affect mobile and desktop browsers.

Blog Image
DEVELOPMENT  |  Development • C++

The C++ Lifetime Profile: How It Plans to Make C++ Code Safer

This blog post explains what the C++ Lifetime Profile is and how it intends to make the language safer and help avoid memory management problems.

Blog Image
DEVELOPMENT  |  iOS • Development • How To

Moving a Git Repository into Its Submodule

How we improved our Git repository setup by moving our PDF Viewer for iOS repository into our PSPDFKit repository.

Blog Image
DEVELOPMENT  |  Android • Development • Gradle

Filtering Tests in Android

A look at the android.support.test.filters library and what it provides you with.