PSPDFKit
Products
Solutions
Aviation
Streamline Your Flight Releases
Construction
Digitize PDF Forms and Drawings
Education
Move Your App to the Head of the Class
Legal
Handle and Review Documents in Real Time
Government
Serve Public Records Securely and Intuitively
Financial
Accelerate Your Digital Transformation
Documentation
Blog
Explore the Blog
Blog Overview
Development
Products
Tutorials
Customer Stories
Solutions
Company
Explore by Topic
Resources
Webinars
Live Demo
Technical Support
Pricing
Free Trial
Contact Sales
Contact Sales
Contact Sales
T
Archive
All
Android
Company
Customers
Design
Development
Instant
iOS
macOS
Products
Web
Windows
2022
DEVELOPMENT | Android • Tips
How to Load OBJ Files with MTL in Android
Loading .obj files with .mtl using Three.js in Android.
DESIGN | Web • Processor • API • PDF Generation • Tips
Adding Custom Fonts to HTML Documents
How to add custom fonts to HTML and use PDF Generation to create documents.
COMPANY | Tips • Productivity
Productivity Tips When Switching from a PC to a Mac
Improving productivity when switching from a PC to a Mac.
TUTORIALS | Annotations • JavaScript • Tips
PDF Annotations with JavaScript — A Complete Overview
A comprehensive tutorial for managing JavaScript PDF annotations with PSPDFKit.
DESIGN | Web • Processor • API • PDF Generation • Tips
HTML-to-PDF Invoice Generation with Headers and Footers
How we enhanced our PDF Generation component by adding the option of headers and footers.
TUTORIALS | API • Java • Tips
How to Delete PDF Pages Using Java
Learn how to delete PDF pages with PSPDFKit API using Java.
TUTORIALS | API • Python • Tips
How to Merge PDFs Using Python
Learn how to merge PDFs with PSPDFKit API using Python.
TUTORIALS | API • Python • Tips
How to Delete PDF Pages Using Python
Learn how to delete PDF pages with PSPDFKit API using Python.
TUTORIALS | API • JavaScript • Tips
How to Delete PDF Pages Using JavaScript
Learn how to delete PDF pages with PSPDFKit API using JavaScript.
DEVELOPMENT | API • PDF Generation • Tips
The Six Best PDF Generator APIs
Learn how to evaluate and select the best PDF generator API for your use case.
TUTORIALS | API • PHP • Tips
How to Delete PDF Pages Using PHP
Learn how to delete PDF pages with PSPDFKit API using PHP.
TUTORIALS | API • Python • Tips
How to Split PDFs Using Python
Learn how to split PDFs with PSPDFKit API using Python.
TUTORIALS | API • JavaScript • Tips
How to Split PDFs Using JavaScript
Learn how to split PDFs with PSPDFKit API using JavaScript.
TUTORIALS | API • Java • Tips
How to Split PDFs Using Java
Learn how to split PDFs with PSPDFKit API using Java.
TUTORIALS | API • PHP • Tips
How to Split PDFs Using PHP
Learn how to split PDFs with PSPDFKit API using PHP.
DEVELOPMENT | iOS • SwiftUI • Tips
Presenting Popovers on iPhone with SwiftUI
How to present the UI as popovers on iPhone when using SwiftUI.
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.
2021
BLOG | iOS • Tips
Loading Images on iOS 15
We discuss the new iOS 15 APIs provided by UIKit for loading and displaying images and the SwiftUI APIs for loading an image from a remote URL.
DEVELOPMENT | Android • Kotlin • Tips
Autosizing Fonts for Android EditTexts
Transfer Android's TextView autosizing capability to EditTexts
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 | Web • JavaScript • Tips
Practical Uses of Object URLs
Showcasing different applications of JavaScript object URLs in the browser.
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 • 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 | 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 • Tips • Debugging • Insights
How to Identify Browser Bugs
Strategies to adopt for identifying browser bugs, and what to do after spotting one.
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 | 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.
SOLUTIONS | iOS • macOS • Tips
PSPDFKit for Magazines
How to configure PSPDFKit for a magazine.
SOLUTIONS | iOS • macOS • Tips
PSPDFKit for Construction
How to configure PSPDFKit to display a building floorplan.
SOLUTIONS | iOS • macOS • Tips
PSPDFKit for E-Readers
How to configure PSPDFKit for an e-reader app.
SOLUTIONS | iOS • macOS • Tips
PSPDFKit for E-Learning
How PSPDFKit can be configured for taking and grading an e-learning exam.
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.
SOLUTIONS | iOS • macOS • Tips
PSPDFKit for Board Meetings
How PSPDFKit can be used to create or join a collaborative editing session for a board meeting.
SOLUTIONS | iOS • macOS • Tips
PSPDFKit for Aviation
How to configure PSPDFKit to display a flight manual and passenger list documents.
DEVELOPMENT | C++ • Tips • Debugging
Time Travel Debugging for C/C++
A quick look at reverse debugging/time travel debugging for C/C++.
2020
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 | 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 | 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 | 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 | 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
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.
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.
COMPANY | Remote Work • Productivity • Tips
9 Tips to Help You Work Effectively from Home
This article describes some strategies first-time remote workers should follow to get the most out of working from home. This is part two of four of our remote work series.
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.
COMPANY | Culture • Remote Work • Productivity • Tips
Remote Work: How to Overcome Common Struggles of Working from Home
This article describes some struggles first-time remote workers may face and provides some strategies to help overcome them. This is part one of four of our remote work series.
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 | 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.
2019
COMPANY | Culture • Insights • Tips
From Zero to Hero: How I Got a Full-Time Job in Tech
A political scientist turned web engineer describes her journey of transformation. She also reveals a few aspects that can make or break an internship in tech (and in general).
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 • 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 • Tips
Docker import/export vs. load/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 • Tips
Dealing with Large Memory Requirements on Android
This article provides tips for optimizing memory usage of your apps.
DEVELOPMENT | Android • Kotlin • Tips
How Do I Fix NetworkOnMainThreadException?
A post detailing what NetworkOnMainThreadException is and how to prevent it.
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 | 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
Move semantics in C++ 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 | 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 | 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 | 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 • Java • Tips
Handling Nullability in Your Code
A brief excursion into the Java type system, nullability, and remedies for the billion-dollar mistake.
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 • 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?
An overview of configuration changes on Android.
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 • 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 | 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.
2018
DEVELOPMENT | Android • Tips
How to Increase the Logcat Buffer Size
Don't lose your logs. Increase your logcat buffer!
PRODUCTS | Cordova • Electron • Flutter • React Native • Xamarin • Tips
Supporting Hybrid Technologies
We support all major hybrid technologies, including Cordova, Electron, Flutter, Ionic, React Native, and Xamarin.
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 • Tips
Creating an Efficient App Store Screenshot Workflow
A look at how we generate our screenshots for the iOS App Store.
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 | 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 | 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.
PRODUCTS | iOS • Android • Web • Tips
Examples for Using Our Frameworks
Here at PSPDFKit, we believe doing practical work is the best way to learn things, so we decided to create a few example apps to help customers explore our framework.
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 | 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 | 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 | 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.
COMPANY | Culture • Remote Work • Tips
How to Use Slack and Not Go Bananas
Slack is both amazing and awful. At a time when many companies quit Slack, we refined our processes to make it work well for us.
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 | Android • Java • Kotlin • Tips
Async Stacktraces in Android Studio
How to create asynchronous stacktraces in Android Studio and IntelliJ.
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 • Tips
Hints for Beginners Navigating Around New Code
We share some tips on how to navigate a new codebase.
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.
TUTORIALS | Web • WebAssembly • Tips • PDF Viewer
Deploy a WebAssembly-Based PDF Viewer to the Cloud with One Command
In this blog post, we show how easy it is to deploy our standalone, WebAssembly-powered version of PSPDFKit for Web to ZEIT’s now.sh, a cloud provider.
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.
2017
DEVELOPMENT | iOS • Swift • Instant • Tips
How to Use iOS Data Protection
How apps can use iOS Data Protection to secure their files.
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 | 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 | 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
We implement a simple vector-based freehand drawing with React using SVG.
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.
COMPANY | Culture • Remote Work • Tips
Making the Most of Remote Work
At PSPDFKit, we strive to hire the best people for the job, regardless of where they are in the world. Here, I want to share how I’ve been making the most of remote work.
DEVELOPMENT | iOS • Objective-C • Tips
The Struggle with Action Extensions
Pitfalls when developing a Share or an Action Extension
2016
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 • 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 | 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.
COMPANY | Culture • Remote Work • Tips
Hiring a distributed team
Who you hire can have a dramatic effect on your team’s culture, company’s productivity and, overall, is the most influential factor in determining the success or failure of a company. Over the past six years at PSPDFKit, we’ve slowly learned what’s important, what works, and what doesn’t work, at least for us.
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 | 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 | iOS • Tips
Preventing Popovers on Popovers
DEVELOPMENT | iOS • Tips
Efficient iOS Version Checking
DEVELOPMENT | Testing • Tips
Selective Pull Request Testing
DEVELOPMENT | Android • Java • UI/UX • Tips
Keyboard Handling on Android
DEVELOPMENT | iOS • Tips
Adding live search to Jazzy docs
DEVELOPMENT | iOS • Tips • Debugging
Debugging Rotation Issues