Development

DEVELOPMENT JavaScript PDF Generation Tips PDF.js PDF-lib PDFKit jsPDF pdfmake Puppeteer

Top JavaScript PDF libraries for PDF generation and manipulation

The post compares leading JavaScript PDF libraries, such as PDF.js, PDF-lib, PDFKit, and Nutrient, highlighting their key features, use cases, and differences to help developers choose the best option for their projects.

DEVELOPMENT Agile Python Jira Markdown Productivity

Automating Agile Stand-Up Ceremonies with Python Scripts

A blog post detailing how to automate Agile stand-up ceremonies with Python scripts.

DEVELOPMENT iOS Insights Xcode

Dark and Tinted Alternative App Icons

Updating how we implemented alternative app icons to support iOS 18’s new dark and tinted app icons.

DEVELOPMENT C++

Structure Padding in C++

A look at padding in C++ structs and classes and how data is laid out in memory can help you write more efficient code and optimize the performance of your programs.

DEVELOPMENT Python PDF Generation Tips

Top 10 Ways to Generate PDFs in Python

Explore 10 powerful methods for generating PDFs in Python, from open source libraries to premium solutions, to meet all your document creation needs.

DEVELOPMENT Insights

The Impact of Rapid Technological Advancements on Sustainable Software Product Development

Discover how tech giants like Apple and Microsoft shape software development, the challenges developers face, and strategies for balancing innovation with sustainability.

DEVELOPMENT WebAssembly JavaScript Web Document Processing

Leveraging WebAssembly in JavaScript for High-Performance Document Processing

Learn how to use WebAssembly with PSPDFKit to boost the performance of document processing tasks like PDF manipulation directly in your JavaScript applications.

DEVELOPMENT Android Jetpack Compose

How to Implement Drag-to-Reorder List Functionality with Jetpack Compose

This post will look at how to add custom functionality in Jetpack Compose to allow dragging items in a list. This is achieved using a custom modifier that is generic and can be reused easily.

DEVELOPMENT HTML JavaScript Node Tips

Top 10 Ways to Convert HTML to PDF

Explore 10 effective methods for converting HTML to PDF, including open source options, as well as a premium choice.

DEVELOPMENT iOS Xcode Insights

Investigating a Dynamic Linking Crash with Xcode 16

Debugging and fixing a crash we noticed after updating to Xcode 16.

DEVELOPMENT iOS Android Room Kotlin Multiplatform Tips

Seamless Room database integration for Kotlin Multiplatform projects

This blog post explores the process of integrating the Room database library into Kotlin Multiplatform projects with ease and efficiency.

DEVELOPMENT iOS Insights Xcode

NSCopying in a Swift World

An exploration into how a modern Swift programming mindset clashes with Objective-C’s NSCopying protocol.

DEVELOPMENT iOS Swift Insights

Generating API documentation for multiple targets with DocC

Follow our process of utilizing DocC to create combined API documentation for multiple frameworks.

DEVELOPMENT iOS Swift Tips

Privacy Manifests and Required Reason APIs on iOS

What privacy manifests and required reason APIs are, and the approach taken by PSPDFKit for adding support for these requirements.

DEVELOPMENT visionOS iOS

Apple’s Vision of Our Digital Future

Bridging reality and imagination in the digital age through spatial computing and innovative software.

DEVELOPMENT iOS Insights Debugging Tips

Debugging in iOS: Resolving UITextView Flickering Issues

A debugging story that includes some tips and tricks

DEVELOPMENT iOS Swift Tips

Using Asset Catalogs for Images

We discuss the various features of asset catalogs relating to images.

DEVELOPMENT Web Annotations

Supported Annotation Flags in the PDF Spec and PSPDFKit

Learn the basics of annotation flags and discover which annotation flags are supported in the PDF specification and PSPDFKit.

DEVELOPMENT .NET

Extracting Key-Value Pairs Using GdPicture.NET SDK

A comprehensive introduction to extracting key-value pairs with GdPicture.NET SDK.

DEVELOPMENT Kotlin Android Development

Kotlin Non-Nullable Pitfall

Under what circumstances a non-nullable value might be null.

DEVELOPMENT iOS Swift Insights

Adopting UITextInteraction

Learn how to add UITextInteraction to a custom text input element on iOS, iPadOS, and macOS.

DEVELOPMENT WinUI 3 Windows Application SDK WebView2 Interop How To

How to Access Native Code from WebView2 with WinAppSDK/WinUI 3

A step-by-step guide on how to access native code in JavaScript within a WinUI 3 application.

DEVELOPMENT SwiftUI iOS Swift Development Debugging

A Tryst with SwiftUI, Or: How I Learned to Stop Worrying and Enjoy Building UIs

A blog post about one of our engineers and his experience using SwiftUI.

DEVELOPMENT iOS Insights

Vision Is an Exciting Addition to Apple’s Lineup

Considering how Apple’s newly announced Vision platform could fit in with its existing platforms.

DEVELOPMENT .NET MAUI

Choosing Your .NET MAUI Document Strategy

Exploring options for leveraging PSPDFKit in your .NET MAUI applications.

DEVELOPMENT iOS

Customizable UI Components on iOS Using UIKit

Providing UI components in UIKit that allow user customization while also providing a default style that works in most cases.

DEVELOPMENT iOS Insights Xcode

Conditional Compilation for Apple’s Yearly Updates

How to smoothly transition an iOS and Mac Catalyst app for Apple’s yearly updates between June and October.

DEVELOPMENT JavaScript Deno How To

Why I Chose Deno to Automate My Summary of the Day

A brief description of my usage of Deno to automate my summary messages.

DEVELOPMENT iOS Swift Objective-C Tips

Developing Mixed-Source Swift Packages

Tips for publishing Swift packages that include both Swift and Objective-C source files.

DEVELOPMENT Web TypeScript

Understanding Generics in TypeScript: Part 1

Learn the basics of generics in TypeScript.

DEVELOPMENT JavaScript Elixir

Elixir Idioms for JavaScript Developers

A comparison of the features of JavaScript and Elixir.

DEVELOPMENT PDF Text Internationalization Layout

The Challenges of PDF Text Layout

The process and difficulties involved in laying out text in PDF documents.

DEVELOPMENT Culture Insights

My Engineering Transition from Mobile to Backend

A peek into the process of an engineer switching teams at PSPDFKit.

DEVELOPMENT iOS How To PDF Viewer

Swift's approach to SPI

A closer look at how to design a System Programming Interface (SPI) in Swift.

DEVELOPMENT React Native Expo How To

How to Use PSPDFKit for React Native with Expo

How to use PSPDFKit for React Native with Expo.

DEVELOPMENT iOS Swift Tips

Optimizing Annotation Drawing Performance

How we optimized ink annotations and improved performance of several SDK components.

DEVELOPMENT Android Flutter How To

Run a Flutter App on an Emulator inside Docker

How to run a Flutter application on a dockerized Android emulator.

DEVELOPMENT Web C++

My Experience with Web Development from a Systems Programming Perspective

The personal view of web development from a person with experience in systems programming.

DEVELOPMENT Web Testing

Migrating from Puppeteer to Playwright

How we migrated from Puppeteer to Playwright in our test suite.

DEVELOPMENT iOS Swift Objective-C Insights

Uncovering SourceKit Limitations While Updating Our API Documentation

A post that goes into detail on how moving to Swift-first API documentation uncovered issues in SourceKit.

DEVELOPMENT Culture Productivity

A Perfect Gift

Learn how to modify a mechanical keyboard

DEVELOPMENT Android Kotlin

Pairs and Triples in Kotlin (And Why You Shouldn't Use Them)

An under the hood overview of pairs and triples in Kotlin.

DEVELOPMENT Flutter How To

Setting Up Your Flutter Environment, the Right Way — Part 1

A simpler, more convenient way to set up your development environment with support for multiple versions of Flutter.

DEVELOPMENT Android Web Development Culture

Road to Polyglot Development

A blog post outlining my transition to polyglot development for the web.

DEVELOPMENT Android Support NDK

How to Handle NDK Crashes

Handling NDK crashes when using PSPDFKit for Android.

DEVELOPMENT Web .NET JavaScript

Calling .NET Code from Your JavaScript Project

Ever wanted to run .NET code on the web without running a backend? Now it's possible!

DEVELOPMENT Kotlin Android How To

Kotlin Context Receivers — A Preview

A short summary about the upcoming Kotlin feature, context receivers.

DEVELOPMENT Elixir Deployment

Using the JSON Configuration Format with a Schema Definition in an Elixir Release

This blog explains an alternative approach for providing a configuration in JSON for Elixir releases.

DEVELOPMENT Machine Learning

Edit Documents in Plain English Using PSPDFKit API and Machine Learning Language Models

How to use machine learning language models like GPT-3 or Jurassic-1 and natural language to use PSPDFKit API.

DEVELOPMENT iOS Swift Tips

Adding a Document Viewer to a Mac Catalyst App

We discuss how a PDF document viewer can be added to a Mac Catalyst app using the PSPDFKit SDK.

DEVELOPMENT Testing Productivity Insights

How We Make Our CI Fast

Principles we apply to improve our CI efficiency.

DEVELOPMENT iOS Insights Xcode

Download Failures with Swift Package Manager Binary Targets

A tale of how reading an error message more carefully allowed us to work around an issue with our tooling.

DEVELOPMENT CSS Insights

Margin Collapsing in CSS

An overview of a particular margin collapsing scenario I discovered while working on headers and footers support for PDF Generation.

DEVELOPMENT iOS Swift UI/UX Insights

Replicating the iOS Text Magnifying Glass

A dive into details of how we replicated the system magnifying glass on iOS.

DEVELOPMENT C++ Office Tips

Testing Subjective Office Conversion Results

How to test an Office to PDF conversion result that one would deem great and others would deem poor.

DEVELOPMENT API Elixir Insights

Rate Limiting Server Requests in Elixir

A blog post explaining how we built rate limiting for test requests in PSPDFKit API.

DEVELOPMENT iOS Swift SwiftUI Insights

Our Attempt at Rewriting PSPDFKit Catalog in SwiftUI

We tried rewriting a part of our PSPDFKit Catalog example project in SwiftUI. Here's what we learned.

DEVELOPMENT Machine Learning NLP PDF Tips

Summarize a PDF Document Using Machine Learning and Natural Language Processing

In this blog post, I'll show the quickest possible way to summarize a PDF document using machine learning and a natural language processing model called BART.

DEVELOPMENT Web Elixir Testing Insights

How We Use Property Testing

Some real-life examples of how we use property testing in PSPDFKit Server testing.

DEVELOPMENT Android iOS Cordova Flutter Ionic React Native Xamarin

Cross-Platform Mobile Frameworks — An iOS Engineer's Perspective

What I learned while working on cross-platform mobile frameworks.

DEVELOPMENT Insights

Best Practices When Doing Code Reviews — Part 2

The second part of a series of posts about doing good code reviews, with tips from the code writer's side.

DEVELOPMENT Android Tips

How to Load OBJ Files with MTL in Android

Loading .obj files with .mtl using Three.js in Android.

DEVELOPMENT Web Products Support

Scaling Sync Performance: A Customer Story

A short story about scaling performance based on a support ticket.

DEVELOPMENT API PDF Generation Tips

Top 6 Best PDF Generator APIs in 2024: A Complete Guide to Choosing the Best PDF API

Discover the best PDF generator APIs in 2024. Compare features, pricing, and use cases to find the best PDF generator API for your document creation needs.

DEVELOPMENT API Insights

A Peek at Our CD Pipeline

A short peek at the CD pipeline powering our PSPDFKit API product.

DEVELOPMENT C++ PDF

PDF vs. DOCX: How Textual Contents Can Be So Different

A dive into the PDF and DOCX formats to understand the advantages of each.

DEVELOPMENT iOS SwiftUI Tips

Presenting Popovers on iPhone with SwiftUI

How to present the UI as popovers on iPhone when using SwiftUI.

DEVELOPMENT Insights

Best Practices When Doing Code Reviews — Part 1

An article with tips about how to do effective code reviews that have an impact on the quality of a codebase.

DEVELOPMENT Android Kotlin Jetpack Compose Insights

How We Expose Jetpack Compose APIs

A few lessons we learned about API design for modern Android.

DEVELOPMENT Web JavaScript Tips

How to download multiple files with JavaScript

A step-by-step tutorial explaining how to download multiple files from a server with a single request.

DEVELOPMENT Web Server Elixir Tips

Using SSL for PostgreSQL Connections on Elixir

How to successfully establish and verify SSL connections against a PostgreSQL server from an Elixir application.

DEVELOPMENT Android Kotlin Tips

Autosizing Fonts for Android EditTexts

Transfer Android's TextView autosizing capability to EditTexts

DEVELOPMENT iOS Insights

Understanding Fast-Math

What does the -ffast-math optimization really do, and when is it safe to use it?

DEVELOPMENT Testing Productivity Insights

A Case for Fast CI

How slow build times lower your team’s productivity, and how to change this.

DEVELOPMENT Web TypeScript Insights

Migrating Our Web Codebase from Flow to TypeScript

How we migrated our web codebase from Flow to TypeScript.

DEVELOPMENT iOS Swift Tips

Fitting Text into a Bounding Frame on iOS

How to use a binary search algorithm to precisely fit multiline text into a bounding frame on iOS.

DEVELOPMENT Productivity Tips git

How to Handle Stacked Pull Requests on GitHub

This blog post describes how to deal with dependent pull requests on GitHub, as well as the git concepts you need to master to understand them.

DEVELOPMENT iOS Insights Xcode

What Is a Deprecated API on iOS?

A look at Apple's API evolution strategy and the effect of the deployment target and base SDK Xcode project settings.

DEVELOPMENT Android Kotlin Jetpack Compose UI/UX

Introducing Jetpack Compose Support

The Android PDF SDK you know and love now supports Jetpack Compose!

DEVELOPMENT Web JavaScript Tips

Practical Uses of Object URLs

Showcasing different applications of JavaScript object URLs in the browser.

DEVELOPMENT Web JavaScript Insights

HTTP Caching 101

...Or, how the cache works on your browser.

DEVELOPMENT Android Productivity git

Refactoring Git Branches with Interactive Rebase and Autosquash in Android Studio

A primer on using Git's interactive rebase feature, and how to use it within Android Studio to housekeep commits.

DEVELOPMENT PDF C++

How to Save Custom Data in Image Files

Image files hold more than just images, and in this post, you'll learn how to save custom data in them.

DEVELOPMENT PDF UI/UX Insights

What Is Text Shaping and Why Do We Do It?

Some text in some languages requires text shaping to render correctly. This will explain a little about what exactly that is.

DEVELOPMENT Productivity Testing Insights

Managing CI Pipelines with Terraform

Learn about Terraform and how we use it to manage our Buildkite pipelines.

DEVELOPMENT iOS Swift Testing Tips

Swift Render Tests in Practice — Part III

How to automate regenerating and updating reference images for render tests.

DEVELOPMENT iOS Swift Testing Tips

Swift Render Tests in Practice - Part II

How to improve test failures with attachments and grouping related test output.

DEVELOPMENT iOS Swift Testing Tips

Swift Render Tests in Practice - Part I

How to pragmatically approach render testing for custom drawing code.

DEVELOPMENT iOS Objective-C Debugging Insights

Reverse Engineering UIKit to Fix Our Top Crash

This blog post describes the process of reverse engineering UIKit to identify and fix our top crash in PSPDFKit for iOS.

DEVELOPMENT iOS Testing Xcode

Automating Test Retries

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

DEVELOPMENT iOS Swift Tips Debugging

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.

DEVELOPMENT Signing 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.

DEVELOPMENT Server JavaScript Testing

Load Testing PSPDFKit Server

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

DEVELOPMENT Flutter Productivity git Insights

How We Maintain Our Public Flutter Project Using a Private Monorepo

We describe the process taken to speed up the maintenance, development, and release cycle of our public Flutter project.

DEVELOPMENT Android Kotlin

Avoiding Primitive Type Saturation in Kotlin

Enough of fun getString(string: String): String – let's make greater use of Kotlin's powerful type system.

DEVELOPMENT C++ Insights

CMake Presets in Practice

What CMake presets are and why PSPDFKit hopes to use them more.

DEVELOPMENT iOS Productivity 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.

DEVELOPMENT PDF Insights

Optimizing PDFs for Printers

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

DEVELOPMENT Android Web Testing UI/UX Insights

Why Should You Care about Manual Testing?

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

DEVELOPMENT PDF Tips Performance Insights

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.

DEVELOPMENT Web Processor Insights

A brief tour of multipart requests

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

DEVELOPMENT PDF Components Insights

Why PDF Uses Floats and Word Uses EMUs

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

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.

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.

DEVELOPMENT Web Docker Insights

Server Development on Apple Silicon

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

DEVELOPMENT Web Docker Server Insights

Our Journey to ARM

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

DEVELOPMENT Web Tips Debugging Insights

How to Identify Browser Bugs

Strategies to adopt for identifying browser bugs, and what to do after spotting one.

DEVELOPMENT PDF C++ PDFium

Tackling PDF Performance Issues

Digging into the internals of PSPDFKit to improve PDF performance.

DEVELOPMENT Web Server Elixir Tips

The Perils of Large Files in Elixir

A post about dealing with large files in Elixir applications.

DEVELOPMENT iOS Swift Tips

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.

DEVELOPMENT C++ Tips Insights

String Literals, Character Encodings, and Multiplatform C++

How string literals are encoded by Clang and MSVC.

DEVELOPMENT Web JavaScript Performance

Frontend Performance Enhancements at PSPDFKit

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

DEVELOPMENT iOS macOS Insights

Advances in XCFrameworks

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

DEVELOPMENT iOS Swift Objective-C Xcode Testing

Deflaking CI Tests with xcresults

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

DEVELOPMENT iOS Swift Tips SwiftUI UI/UX Accessibility

Keyboard Navigation in SwiftUI

SwiftUI wasn’t built with keyboard support in mind, and it shows. Learn how you can rewrite keyboardShortcut to work with iOS 13 and access the underlying navigation controller to pop views on ⌘-Left Arrow.

DEVELOPMENT iOS Swift SwiftUI Tips

Using the SwiftUI ColorPicker on iOS and macOS

While macOS has offered a system-provided color picker since OS X 10.0 Cheetah, iOS developers had to wait a bit longer. Let's take a closer look at the new ColorPicker (SwiftUI) and UIColorPickerViewController (UIKit) controls.

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.

DEVELOPMENT iOS Testing

Automating macOS Provisioning with Chef

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

DEVELOPMENT Processor Web Server

A Primer on JSON Web Tokens

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

DEVELOPMENT C++ Tips Debugging

Time Travel Debugging for C/C++

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

DEVELOPMENT Web JavaScript Insights

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.

DEVELOPMENT Android Kotlin Insights

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.

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.

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.

DEVELOPMENT Python Testing

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.

DEVELOPMENT git PDFium Insights Open Source

Updating Complex Forked Projects

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

DEVELOPMENT iOS Swift Tips

Caching File Downloads with URLCache in Swift

Apple has a sophisticated caching system in iOS, which is enabled by default. However, documentation around URLCache is quite sparse. Today, we'll look at the behavior of caching when dealing with large files.

DEVELOPMENT Tips Productivity

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.

DEVELOPMENT iOS Swift Tips SwiftUI UI/UX

Presenting Popovers from SwiftUI

Is there a way to present UIKit popovers from toolbar buttons managed by SwiftUI?

DEVELOPMENT Web WebAssembly Tips Performance

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.

DEVELOPMENT Web 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.

DEVELOPMENT Web JavaScript Performance Insights

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.

DEVELOPMENT Swift Tips Debugging

An Introduction to LLDB Reproducers

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

DEVELOPMENT Web JavaScript WebAssembly Debugging Insights

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.

DEVELOPMENT Server Insights

Monitoring PSPDFKit Server with Metrics

Using data to draw insightful conclusions.

DEVELOPMENT iOS Swift Insights

Binary Frameworks as Swift Packages

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

DEVELOPMENT PDF.js PDF Insights

Evaluating the Render Fidelity of PDF.js

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

DEVELOPMENT Docker C++

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

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

DEVELOPMENT iOS Swift Performance

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.

DEVELOPMENT C++ Insights

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.

DEVELOPMENT iOS macOS PDF Insights

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?

DEVELOPMENT Tips Productivity 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.

DEVELOPMENT iOS Swift UI/UX Insights

The Case for Lists in UICollectionView

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

DEVELOPMENT iOS Swift Debugging Insights

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.

DEVELOPMENT Web PDF

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.

DEVELOPMENT iOS macOS Objective-C Performance Insights

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.

DEVELOPMENT Web JavaScript C++ WebAssembly How To Performance

How to Use WebAssembly Modules in a Web Worker

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

DEVELOPMENT iOS macOS Insights Xcode

Supporting XCFrameworks

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

DEVELOPMENT iOS Swift Objective-C Insights

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.

DEVELOPMENT Web JavaScript TypeScript Tips

Generate TypeScript Declarations from a Flow Codebase

A short guide on how to generate TypeScript declarations from a Flow codebase.

DEVELOPMENT iOS Swift Tips UI/UX

Level Up Your Trackpad Support Using UIInteraction

How to make your iOS app work well with scrolling, secondary clicking and dragging on a trackpad or mouse.

DEVELOPMENT Web Debugging Insights

Text Selection Regression in Chrome 83

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

DEVELOPMENT Android Kotlin Tips Productivity

Think First, Code Later

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

DEVELOPMENT C++ Tips Productivity

Best C++ IDEs of 2024

Discover the best C++ IDEs and text editors of 2024. Learn the pros and cons of each tool, from Visual Studio to Vim, and find the right fit for your development needs.

DEVELOPMENT iOS macOS Tips Performance Xcode

Automated Profiling Runs in Instruments

Learn how to automate measurement runs with Instruments.

DEVELOPMENT C++ Tips Performance

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.

DEVELOPMENT Android Kotlin Tips Productivity Testing

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.

DEVELOPMENT iOS Objective-C Tips

Preventing Surprisingly Large Objective-C Type Encodings

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

DEVELOPMENT iOS Swift Tips UI/UX Insights

Supporting Pointer Interactions

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

DEVELOPMENT C++ Tips Productivity

Effective Header Management in C++

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

DEVELOPMENT Android Kotlin Tips UI/UX

Change Android Themes Instantly Using the Circular Reveal Animation

This blog post investigates how to achieve nice animations when changing themes.

DEVELOPMENT PDF Tips Insights

Optimizing PDF File Size

When editing PDFs, they often grow in size, but that doesn't have to be the case. Here's how we optionally optimize for size.

DEVELOPMENT C++ Tips Testing

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.

DEVELOPMENT C++ Tips Performance

Investigating the performance overhead of C++ exceptions

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

DEVELOPMENT C++ Tips Performance

Compiler-Based Lock Checking in C++

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

DEVELOPMENT Web PWA Insights

The State of Progressive Web Apps in 2020

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

DEVELOPMENT C++ Security Insights

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.

DEVELOPMENT Tips Productivity git

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.

DEVELOPMENT iOS Swift Objective-C Tips UI/UX

Adopting UIAppearance in Custom Views

Learn how to support styling your own custom views using UIAppearance.

DEVELOPMENT Android Java Testing Gradle

Filtering Tests in Android

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

DEVELOPMENT C++ Insights

The Functional Side of std::optional with C++20

std::optional is already really useful, and it's about to get better with C++20.

DEVELOPMENT iOS Tips UI/UX

Open Links in Safari, Not Safari View Controller

Why we changed our default for opening web links from SFSafariViewController to the Safari app.

DEVELOPMENT Android Insights

Our Journey from Genymotion to the Android Emulator

How we migrated our Genymotion-based CI to an AVD.

DEVELOPMENT Web WebAssembly

WebAssembly and Emscripten Chat with Alon Zakai

A chat with Alon Zakai, co-creator of WebAssembly and creator of Emscripten.

DEVELOPMENT Swift C++ Insights

Introduction to C++ for Swift Developers

An introduction to the C++ language for Swift developers, with an overview of reasons to use C++ and a look at differences and similarities between the languages.

DEVELOPMENT iOS Swift Objective-C UI/UX

Adopting Dark Mode on iOS and Ensuring Backward Compatibility

A comprehensive overview of adopting Dark Mode in an iOS app, along with a few tips to make the process of development easier.

DEVELOPMENT Android Kotlin Tips Accessibility Insights

How We Improved Keyboard Navigation Accessibility in Our Android SDK

A look at the steps we took to start improving the accessibility of our Android SDK.

DEVELOPMENT C++ Python Tips

Making C++ Talk to Other Languages with SWIG

Using SWIG to generate interfaces to talk to a C++ backend.

DEVELOPMENT Web Docker Containers Tips

Docker Image Import and Export vs. Docker Container Load and Save

A blog post that explains the difference between the Docker import/export and load/save commands.

DEVELOPMENT Android Tips

The Android Drag-and-Drop Framework in Practice

Using the Android drag-and-drop framework — from theory to implementation.

DEVELOPMENT Android Java Gradle Insights

Understanding the Gradle Build System

In this article, we'll explore the Gradle build system, how it works, and why it is the new standard for building Android projects.

DEVELOPMENT Android iOS macOS Windows C++ Insights

Challenges of Using Emojis with C++

In this article, we discuss the challenges of implementing your own custom emoji support in a cross-platform way.

DEVELOPMENT Android Kotlin Java Insights

What Is an Intent?

An overview of intents, their uses, and pitfalls to consider.

DEVELOPMENT Android Tips

Dealing with Large Memory Requirements on Android

This article provides tips for optimizing memory usage of your apps.

DEVELOPMENT Android Debugging

NDK Debugging

A set of tips for debugging native NDK code in Android apps.

DEVELOPMENT Android Kotlin Tips

How Do I Fix NetworkOnMainThreadException?

A post detailing what NetworkOnMainThreadException is and how to prevent it.

DEVELOPMENT Android iOS Web PDF

The Role of PSPDFKit as a PDF Processor

How we fit into the PDF landscape.

DEVELOPMENT Android Java Tips

Performance Evaluation of Linked Lists

Today we'll delve into the performance evaluation of linked lists, a controversial topic among many experienced developers, and try to understand why they trigger a warning in the Error Prone report.

DEVELOPMENT Web React JavaScript Insights

React Redux's New Features

An overview of React Redux's seven new features in action.

DEVELOPMENT Windows Tips

How to Await an Async Event Handler Delegate in UWP

Asynchronous programming is hard, and the WinRT interface poses further issues. Learn how to implement a deferral to wait on a user action before completing additional work.

DEVELOPMENT Web JavaScript Tips

Smoother Interactions on the Web: getCoalescedEvents()

How to use the getCoalescedEvents() method of the PointerEvent API to improve the precision of drawing apps or of any web application.

DEVELOPMENT iOS Swift Tips

Making a Resource Thread-Safe with Locks

We discuss how to ensure thread safety and synchronization via locking.

DEVELOPMENT C++ Tips Debugging

When C++ Doesn't Move

C++ move semantics make your code more efficient, but sometimes a move is not performed. In this blog post, we explore why.

DEVELOPMENT Android Tips

The Soft Keyboard on Android

Tips for working with the soft keyboard on Android.

DEVELOPMENT iOS Swift Tips

Swizzling in Swift

A quick crash course on how to swizzle correctly, and how to do it in Swift 5.1

DEVELOPMENT iOS Swift PDF Tips

Working with PDF Metadata in Swift

How and what metadata can be stored in a PDF, and how to programmatically work with this information.

DEVELOPMENT Android Kotlin Tips

Retaining Objects Using a Fragment

An overview of how to use a fragment to retain objects during a configuration change.

DEVELOPMENT Android Java Tips Insights

Problems with Nullability Annotations

A look at some issues with Android's nullability annotations and how to fix them.

DEVELOPMENT Culture Productivity Insights

WWDC for First-Timers, 2019 Edition

Here's how to get the most out of Apple's Worldwide Developer Conference.

DEVELOPMENT macOS Tips Insights

How Xcode Indexing Works and How You Can Fix IDE Problems with Your Projects

This post provides an overview of how the code assistance feature in Xcode works and how you can debug code assistance problems in your projects.

DEVELOPMENT Android Tips

Understanding Android Dimensions

A post about existing Android dimensions, their purpose, and common conversion rules.

DEVELOPMENT Android Gradle

Gradle Task Configuration Avoidance in Android Builds

An overview of Gradle's task configuration avoidance APIs and how they are used by the Android build system.

DEVELOPMENT Windows UWP C# C++ Tips

How to Use Native C++ in UWP

How to include native C++ in your UWP app and call into it from C#.

DEVELOPMENT Android Tips

How to Use Android App Bundles

This blog post explains what Android App Bundles are and how to upload them to Google Play.

DEVELOPMENT PDF Insights

Understanding the Difference between Bookmarks and the Outline in a PDF

Bookmarks vs. outline elements: Not everything is what it seems.

DEVELOPMENT Tips

The Many Benefits of Using a Monorepo

A monorepo? Isn't that just a weird Facebook and Google thing? Why is PSPDFKit using a monorepo?

DEVELOPMENT Android Kotlin Insights

Kotlin Coroutines

A look at Kotlin coroutines and how they compare to other solutions for concurrency.

DEVELOPMENT iOS Insights

The Bittersweet iOS Document Browser

A quick look at both the benefits and downsides of using the iOS system document browser in your applications.

DEVELOPMENT Web Debugging

Debug Emscripten with the Tracing API

How to debug memory usage in an Emscripten app.

DEVELOPMENT Web Docker PDF

Preparing My Tax Return with Apache PDFBox, Docker, and Make

How I combined Apache PDFBox, Docker, and Make to streamline my tax return workflow.

DEVELOPMENT Android Java

Java 8 in Android Apps

This article explains how to enable Java 8 features in an Android app and gives an overview of the available Java 8 features.

DEVELOPMENT Android Java Tips

Handling Nullability in Your Code

A brief excursion into the Java type system, nullability, and remedies for the billion-dollar mistake.

DEVELOPMENT iOS Objective-C Insights

Embracing the Limits of UIActivityViewController

We talk about our experience in implementing the new sharing flow.

DEVELOPMENT Android Kotlin Tips Jetpack Compose

Using ViewModels to Retain State on Android

How to use Android's ViewModel class to retain complex objects across configuration changes.

DEVELOPMENT iOS Swift Insights

PSPDFKit and Swift

Will PSPDFKit for iOS move to Swift? In this post, we weigh the pros and cons.

DEVELOPMENT iOS Swift Tips Debugging

Adding Logging to Crash Reports

Understanding crash reports is often difficult without extra context. Learn how we attach application logs to crash reports via Google's Firebase Crashlytics in the free PDF Viewer for iOS app.

DEVELOPMENT Android Tips

What are configuration changes in Android?

An overview of configuration changes on Android, including best practices for modern development.

DEVELOPMENT Productivity Tips

How Spaced Repetition Helps You Learn New Things

We present spaced repetition as a learning technique that can help you be more efficient at work.

DEVELOPMENT Android iOS Windows PDF Tips Insights

Incremental and Full Save in PDFs

This article goes into what's involved when incrementally or fully saving a PDF, and why it matters.

DEVELOPMENT Android Kotlin JavaScript React Native

Sharing Business Logic Using React Native

Not only can React Native be used to provide the UI for your application, but it is also a convenient way to share business logic.

DEVELOPMENT Android Debugging

Android Debug Bridge Tricks and Tips

An introduction to Android Debug Bridge (adb) and an overview of some tricks.

DEVELOPMENT Android Kotlin Tips Instant

How to Test REST API Clients in Android Apps

This article shows how we built simple and flexible integration tests for PSPDFKit Instant that are using a custom abstraction layer on top of an OkHttp mocked web server.

DEVELOPMENT Tips

What Is Ninja Refactoring, and When Should You Consider Doing It?

Tips and best practices for code refactoring.

DEVELOPMENT Android Java Tips

Saving the Activity State

An overview of how to make sure your activity state is saved.

DEVELOPMENT iOS macOS Swift Objective-C Tips

Writing and Maintaining Good Code Documentation

Tips, tricks, and techniques for documenting your code the correct way.

DEVELOPMENT iOS Windows UWP C# Insights

UWP for iOS Developers

A brief introduction to Universal Windows development for iOS developers.

DEVELOPMENT Android Kotlin Tips

Using the Bottom Navigation View in Android

An introduction to implementing bottom navigation in your app with a simple example that incorporates synced page switching as well.

DEVELOPMENT C++ Tips Insights

Visual Studio Code for C++

How to use Visual Studio Code for C++ development.

DEVELOPMENT Android Tips Debugging

Inspecting APK Files

This article discusses the basics of Android reverse engineering using the Apktool, smali, and Java decompilers.

DEVELOPMENT iOS Swift Objective-C Insights

Self-Sizing Table View Cells in Practice

A look at self-sizing table view cells for apps supporting iOS 10, 11, and 12, covering three implementation approaches and some pitfalls I encountered supporting these across our UI in PSPDFKit.

DEVELOPMENT Web Ruby PDF

Generating PDFs with Ruby: 2018 Edition

This post surveys the Ruby landscape in 2018 to evaluate the current state-of-the-art of generating PDFs with Ruby.

DEVELOPMENT Android

External Storage Permissions on Android

An exploration of how permissions work, starting from a high level and working down to the lower lever managed by FUSE, the native Android module that interacts with the file system.

DEVELOPMENT Android Tips

How to Increase the Logcat Buffer Size

Don't lose your logs. Increase your logcat buffer!

DEVELOPMENT PDF

Understanding Images in PDF

We take a look at how images are stored in a PDF and discuss some important things to know about them.

DEVELOPMENT Elixir How To PDF

How to generate PDFs with Elixir

In this blog post, we'll look at an example of how to generate PDFs with Elixir.

DEVELOPMENT iOS Swift C++ Open Source Tips

Tips and Tricks for Contributing to the Swift Language

This post describes the process for contributing code to the Swift programming language, including how to propose changes to the language, write a pull request, address feedback, and make your code part of the next version of the language.

DEVELOPMENT iOS Swift Objective-C Performance

Using Signposts for Performance Tuning on iOS

A look at the different ways that we measure and try to improve performance at PSPDFKit.

DEVELOPMENT iOS Tips

Creating an Efficient App Store Screenshot Workflow

A look at how we generate our screenshots for the iOS App Store.

DEVELOPMENT Productivity

Time Management

A discussion of how managing time by incorporating productivity techniques, making lists, planning your days, and finding ways to utilize downtime can help with your workflow.

DEVELOPMENT iOS Insights

iOS HEIC Performance

We evaluate the encoding and decoding performance of HEIC.

DEVELOPMENT Android Testing

Rendering Tests Using Robolectric

Rendering tests using Robolectric with a custom bitmap shadow.

DEVELOPMENT PDF

PDF syntax 101

An overview of the internal structure of a PDF.

DEVELOPMENT iOS Objective-C Insights

Challenges of Adopting Drag and Drop

A recap of how we integrated drag-and-drop support into our Document Editor in iOS.

DEVELOPMENT Android Kotlin Insights

What are Kotlin contracts and how are they useful?

An overview of the experimental Kotlin Contracts API.

DEVELOPMENT PDF Insights

What’s Hiding in Your PDF?

PDFs hold information you may not know about. Discover different forms of metadata and where to look for them.

DEVELOPMENT Android Tips

Using Paths to Draw Shapes with Borders

How to use a flexible path API to draw complex shapes with borders.

DEVELOPMENT Tips

How to Use Docker Compose to Run Multiple Instances of a Service in Development

In this blog post, we’ll look at an example of how we can run multiple instances of a service with Docker Compose.

DEVELOPMENT Productivity

Using Clang-Tidy and Integrating It in Jenkins

The benefits of using clang-tidy and how to get started setting it up in Jenkins.

DEVELOPMENT iOS Tips

Refactoring Large Codebases: Tips and Tricks

If you're going to fall down a rabbit hole anyway, you might as well enjoy it!

DEVELOPMENT iOS Tips

Improving Dynamic Type Support

How to improve Dynamic Type support in your app and bring it to the next level.

DEVELOPMENT Web React Accessibility

Building Accessible Modals with React

In this blog post, we will look at some simple solutions that we use at PSPDFKit to make our modals more inclusive and accessible.

DEVELOPMENT iOS Debugging Tips

How to Extend LLDB to Provide a Better Debugging Experience

Explore the extensibility capabilities of LLDB, a debugger for Swift, C, C++, and Objective-C code.

DEVELOPMENT Web PWA Performance Open Source

PWA — Progressive Web Applications

PSPDFKit for Web and Progressive Web Applications: an open source example and guide.

DEVELOPMENT iOS macOS Insights

Marzipan: Porting iOS Apps to the Mac

With macOS Mojave, Apple is adding support to bring apps written in UIKit to macOS without the requirement of having to rewrite the UI in AppKit. This is not yet officially supported — this post will explore what we can expect in 2019 and how you can use Marzipan today.

DEVELOPMENT iOS Insights

The Challenges of Changelogs

How we handle changelogs at PSPDFKit and the tools we built to help us with this.

DEVELOPMENT Tips

Naming Is Hard — Difficulties of Naming Variables

Is naming a variable so hard? According to Martin Fowler, it is. In this blog post, I'll try to shed some light on what naming entails and why it's a challenge.

DEVELOPMENT Tips

Naming Classes — Why It Matters, and How to Do It Well

Tips for choosing good class names.

DEVELOPMENT Elixir Tips

How to Parse XML Documents in Elixir

A tutorial on how to parse XML documents in Elixir.

DEVELOPMENT PDF Signing Security

Protecting PDF Documents

Password-based security for PDF documents.

DEVELOPMENT UWP Windows Tips

Debugging WebView in UWP Apps with Edge DevTools

We show how a developer can use Edge DevTools to debug a WebView in a UWP app.

DEVELOPMENT Android RxJava Kotlin Tips

RxJava for Multi-Level Data Retrieval

RxJava can be useful for many things, and in this post, we’ll have a look at how to use it to add offline support to your app.

DEVELOPMENT Productivity

Switching to a Standing Desk

We discuss some of the benefits of switching to a standing desk.

DEVELOPMENT Elixir Tips

Database Transactions with Ecto

How to use database transactions and Ecto.Multi in Elixir

DEVELOPMENT Web Tips

Immutable.js and Lazy Evaluation

A short introduction to Immutable.js and how lazy operations improve performance and readability of your code.

DEVELOPMENT Tips

Modern CMake Tips

There are better ways to write CMake scripts.

DEVELOPMENT Ruby Testing

Adding Spellchecking to Your Tests

How we added simple spelling and grammar checks to our website build process to catch some common mistakes.

DEVELOPMENT Flutter Android iOS Insights

How I Got Started with Flutter

A short review of Flutter from a mobile developer’s standpoint.

DEVELOPMENT Elixir Tips

How to Build a Back-Pressure Queuing System in Elixir with sbroker

Tutorial on how to set up a back-pressure queuing system in Elixir with sbroker.

DEVELOPMENT Web JavaScript Tips

An Introduction to Stimulus.js

In this article, we'll look at the Stimulus JavaScript framework and how it can help bring some order to a website's frontend codebase.

DEVELOPMENT Android Kotlin Tips

Moving Your Gradle Build Scripts to Kotlin

Another take on writing your project's Gradle build files in pure Kotlin code.

DEVELOPMENT Web WebAssembly Performance

A Real-World WebAssembly Benchmark

A WebAssembly Benchmark for browser vendors to test a real-world production application.

DEVELOPMENT iOS Swift Insights

Smart Grid Sizing

How PSPDFKit is smart about choosing thumbnail sizes.

DEVELOPMENT Android Tips

Tips for Designing an Android Library

We take a look at some of the things you should keep in mind when designing an Android library.

DEVELOPMENT Open Source

Reviewbot

Reviewbot posts GitHub pull requests that are ready to be reviewed into Slack. How does it know when a pull request is ready? We have a special label in our repositories, named `READY TO REVIEW`.

DEVELOPMENT PDF Annotations

Line Annotations in PDF

Line annotations are one of the most frequently used annotation types, and they are ideal for things like drawing attention to important areas of your document, diagramming the process flow, and decoration.

DEVELOPMENT Android Insights

Rendering PDF Previews

An overview of how to render PDF previews.

DEVELOPMENT iOS Insights

Advances in Auto Layout

An overview of how Auto Layout has changed in recent years and how to best use it.

DEVELOPMENT Android Java Kotlin Tips

Async Stacktraces in Android Studio

How to create asynchronous stacktraces in Android Studio and IntelliJ.

DEVELOPMENT iOS Insights

Smart Punctuation on iOS 11

We explain iOS 11's Smart Punctuation and discuss how it affects string handling in your app.

DEVELOPMENT PDF Insights

What Are Appearance Streams?

An explanation of what appearance streams actually are, along with their gotchas.

DEVELOPMENT Android RxJava Kotlin Insights

RxJava Is Async yet Blocking

An explanation of why RxJava is both asynchronous and blocking.

DEVELOPMENT Tips

How to Manage Multiple System Configurations Using Docker Compose

This blog post is a short introduction to Docker Compose and will explain how we use it to manage different system configurations that are built off the same base configuration.

DEVELOPMENT Android Debugging Productivity

The Subtle Art of Real-Time Debugging With Android Studio

Debugging in real time with Android Studio.

DEVELOPMENT Android Tips

Hints for Beginners Navigating Around New Code

We share some tips on how to navigate a new codebase.

DEVELOPMENT iOS Android C++ Objective-C

Failable Methods with Djinni

In this article, we have look at using result types to model failable computations in the Djinni IDL.

DEVELOPMENT Tips

Using webpack with Middleman

We explain how to integrate Middleman and webpack to boost your frontend productivity.

DEVELOPMENT iOS Tips

Leveraging SQLite Full-Text Search on iOS

We look at SQLite’s FTS extension and how you can use it to add high performance search to your app.

DEVELOPMENT PDF Tips Forms

Forms in PDF

Forms provide a simple yet flexible way to gather data from users.

DEVELOPMENT iOS Insights

UICollectionView All the Things!

`UICollectionView` is now at the heart of every document. This blog post talks about why and how we rewrote our view hierarchy.

DEVELOPMENT Android Kotlin Insights

Using Kotlin to Make the PSPDFKit API Even Better

Kotlin provides the ability to extend any class with new functionality, and we can use this to expand the PSPDFKit API.

DEVELOPMENT Android Performance UI/UX

Rendering PDFs on Android

How to handle rendering large amounts of bitmaps and maintain a slick UX while doing it.

DEVELOPMENT Web WebAssembly

Optimizing WebAssembly Startup Time

Four simple yet effective solutions we currently employ in PSPDFKit for Web to reduce WebAssembly startup time.

DEVELOPMENT Elixir Tips

How to Run Your Phoenix Application with Docker

We’re taking a look at how to run Elixir applications within a Docker container, and how that can simplify the setup of development and deployment environments.

DEVELOPMENT Android Productivity Tips

Android Studio Shortcuts: How to Boost Your Productivity

The best shortcuts for Android Studio. The most famous and the most underrated.

DEVELOPMENT iOS Swift Insights

Binary Frameworks in Swift

ABI? Module stability? What does binary stability mean, and how will it affect you?

DEVELOPMENT Android Kotlin Insights

Simple Kotlin Tips for Beginners

Useful tricks for beginners to start writing better code with Kotlin.

DEVELOPMENT PDF Insights Annotations

What Are PDF Annotations? Understanding Their Types and Uses

Discover everything you need to know about PDF annotations, their types, and how they function in PDFs. Learn how PSPDFKit makes managing these annotations simple with its robust annotation model.

DEVELOPMENT PDF

How to Extract Text from a PDF

Discover effective methods for extracting text from a PDF and learn how PSPDFKit simplifies this process.

DEVELOPMENT iOS UI/UX Insights

Adopting Drag and Drop on iOS

Utilizing the new Drag and Drop feature in iOS 11, and how we integrated it to enhance the user experience.

DEVELOPMENT Android RxJava Open Source

Make Android Animations Reactive with VanGogh

Android view animations powered by RxJava 2.

DEVELOPMENT iOS Insights

Challenges of Supporting iPhone X

Tips and tricks for adding support for the iPhone X in PSPDFKit.

DEVELOPMENT iOS Swift Instant Tips

How to use iOS Data Protection (updated for iOS 17)

How apps can use iOS Data Protection to secure their files.

DEVELOPMENT iOS React Native Swift JavaScript

Native View Controllers and React Native - It Just Works™

DEVELOPMENT Web JavaScript WebAssembly

WebAssembly: A New Hope

What is WebAssembly, and what does it mean for the web?

DEVELOPMENT Android Kotlin Java Security

Secure Media Playback on Android

Picking smart defaults with security in mind when playing videos on Android.

DEVELOPMENT iOS Debugging Xcode

User Breakpoints in Xcode

User breakpoints are a not very well known feature in Xcode but they are very powerful and can improve your debugging experience and show issues more prominent.

DEVELOPMENT iOS Swift Objective-C

Even Swiftier Objective-C

DEVELOPMENT C++ Objective-C Java JavaScript Tips

Linting and Code Formatting at PSPDFKit

How we do code formatting in C++/Objective-C/Java/JavaScript

DEVELOPMENT Android Java UI/UX

50 Shaders of Android: Drawing on Canvas

Low-level drawing and animation on Android using Canvas and powerful Shader classes.

DEVELOPMENT iOS Android Tips UI/UX

Creating Better User Experiences with Animations and Lottie

Improving an app’s User Experience made easy by adding animations powered by Lottie.

DEVELOPMENT Web Elixir Testing

How We Test and Generate Interactive CSS Documentation

Automating CSS testing and documentation with Hound and Webdriver

DEVELOPMENT iOS Objective-C Xcode

Internationalization - Right to Left Support for Mobile Apps

What Right to Left Support Actually Means and How We Implemented It

DEVELOPMENT Android Kotlin RxJava Tips

Writing Concise Code with Kotlin and RxJava

Tips and tricks how to write readable, concise, and beautiful code using the Kotlin language and RxJava.

DEVELOPMENT Web React Tips

How to build a freehand drawing using React

Learn how to build a freehand drawing app with React and SVG. Follow our step-by-step guide for a seamless development experience.

DEVELOPMENT Culture UI/UX

Everybody Designs: An Agile Approach to Design

How PSPDFKit uses an agile approach for design work

DEVELOPMENT Android Tips Debugging

How to Fix a Bug, Blindfolded.

This is a story about fixing a bug, even when all the tools go kaput.

DEVELOPMENT iOS Objective-C Tips

The Struggle with Action Extensions

Pitfalls when developing a Share or an Action Extension

DEVELOPMENT iOS Swift Objective-C Insights

The Case for Deprecating UITableView

DEVELOPMENT iOS Insights

Creating a Compelling Today Widget

Best Practices on Developing a Today Widget

DEVELOPMENT Android iOS Objective-C C++

Super Fast Builds Using distcc

How to dramatically shorten your build times with distcc.

DEVELOPMENT macOS Insights

Chef on macOS

DEVELOPMENT iOS Tips

Hiding Your Action and Share Extensions In Your Own Apps

DEVELOPMENT Android Kotlin Java Tips

A clean status bar with Android System UI and QuickDemo

How to enable Android's demo mode using a quick setting tile

DEVELOPMENT Android Java Kotlin

Restoring State in Android MVP Architecture

State restoration is an important part of the Android framework, but we might encounter problems with it when implementing MVP architecture.

DEVELOPMENT iOS Android Testing

Running Tests with Clang's AddressSanitizer

Clang has powerful sanitizers that are incredibly useful, so we collected our experiences using them between iOS, Android, and our C++ core to help you through some gotchas.

DEVELOPMENT Android Kotlin RxJava Tips

Android animations powered by RxJava

The purpose of this post is to show you how to combine RxJava features with animations on Android to create a great user interface without a lot of nested code.

DEVELOPMENT React Native JavaScript

PSPDFKit 💖 React Native

DEVELOPMENT iOS Debugging Tips

Debugging a specific instance with scripted breakpoints

When debugging an issue that is somewhere deep inside your code, you easily end up debugging a class that has lots of living instances. Sometimes, you are only interested in a very particular one. This can become very tedious work.

DEVELOPMENT iOS Debugging Tips

Writing Good Bug Reports

At PSPDFKit, we work every day to read through developers' bug reports. In fact, we forward many of them to the engineers at Apple. While this post is Apple-centric, many details can be applied to any sort of bug reporting.

DEVELOPMENT Insights

Real-time collaboration, Apple, and you

Apple recognizes that real-time collaboration is necessary and so do we. Here's how PSPDFKit is upgrading your ability to work with teams.

DEVELOPMENT iOS Objective-C Tips UI/UX

Spicing up status messages

At PSPDFKit, we likely spend just as much time polishing the UI as we do implementing PDF features or tweaking the performance. Here's a look at how one of our developers explored improving our status messages.

DEVELOPMENT PDF Debugging Insights

Just a simple bookmark

When books became digital, bookmarks became more complicated. Instead of stuffing a piece of paper in a book, you now had to store a digital marker, which is not always as simple as it looks.

DEVELOPMENT iOS Testing

Converting Xcode Test Runs to JUnit, the Fast Way

DEVELOPMENT iOS Tips

Preventing Popovers on Popovers

DEVELOPMENT iOS Tips

Efficient iOS Version Checking

DEVELOPMENT iOS Debugging

Investigating Thread Safety of UIImage

DEVELOPMENT Instant Testing

End–to–End Testing: What, Why, and How?

DEVELOPMENT Web Instant Elixir Testing

Testing HTTP APIs in Elixir

DEVELOPMENT iOS Swift Objective-C Insights

Swifty Objective-C

DEVELOPMENT Testing Tips

Selective Pull Request Testing

DEVELOPMENT iOS Testing

Continuous iOS Code Coverage With Jenkins and Slather

DEVELOPMENT Android Java UI/UX Tips

Keyboard Handling on Android

DEVELOPMENT iOS Performance Testing UI/UX

Running UI Tests on iOS With Ludicrous Speed

DEVELOPMENT iOS Tips

Adding live search to Jazzy docs

DEVELOPMENT Android Kotlin

Kotlin-Ready Online Guides

Our Guides received a large update – now with Kotlin usage examples.

DEVELOPMENT Insights

A pragmatic cross-platform approach

DEVELOPMENT iOS Tips Debugging

Debugging Rotation Issues

Discover how we resolved a freezing issue in our Document Editor app after rotation, ensuring smooth user interaction and event handling.

DEVELOPMENT iOS Swift Objective-C Insights

Surprises with Swift Extensions

DEVELOPMENT Android Insights

The curious case of Android premultiplied alpha

DEVELOPMENT iOS Insights

Presentation Controllers and Adaptive Presentations

DEVELOPMENT iOS Productivity Insights

Using Ccache for Fun and Profit