1. Home
  2. Foxit PDF SDK for Windows
  3. Developer Guide for Foxit PDF SDK (Java API)
  1. Home
  2. Foxit PDF SDK for Linux
  3. Developer Guide for Foxit PDF SDK (Java API)

Developer Guide for Foxit PDF SDK (Java API)

Introduction to Foxit PDF SDK

Have you ever thought about building your own application that can do everything you want with PDF files? If your answer is “Yes”, congratulations! You just found the best solution in the industry that allows you to build stable, secure, efficient and full-featured PDF applications.

Foxit PDF SDK provides high-performance libraries to help any software developer add robust PDF functionality to their enterprise, mobile and cloud applications across all platforms (includes Windows, Mac, Linux, Web, Android, iOS, and UWP), using the most popular development languages and environments.

Why Foxit PDF SDK is your choice

Foxit is an Amazon-invested leading software provider of solutions for reading, editing, creating, organizing, and securing PDF documents. Foxit PDF SDK libraries have been used in many of today’s leading apps, and they are proven, robust, and battle-tested to provide the quality, performance, and features that the industry’s largest apps demand. Customers choose Foxit PDF SDK product for the following reasons:

  • Easy to integrate – Developers can seamlessly integrate Foxit PDF SDK into their own applications.
  • Lightweight footprint – Do not exhaust system resource and deploys quickly.
  • Cross-platform support – Support Windows, Linux, Mac, iOS and Android
  • Powered by Foxit’s high fidelity rendering PDF engine – The core technology of the SDK is based on Foxit’s PDF engine, which is trusted by a large number of the world’s largest and well-known companies. Foxit’s powerful engine makes the app fast on parsing, rendering, and makes document viewing consistent on a variety of devices.
  • Premium World-side Support – Foxit offers premium support for its developer products because when you are developing mission critical products you need the best support. Foxit has one of the PDF industry’s largest team of support engineers. Updates are released on a regular basis to improve user experience by adding new features and enhancements.

Foxit PDF SDK for Java

Application developers who use Foxit PDF SDK can leverage Foxit’s powerful, standard compliant PDF technology to securely display, create, edit, annotate, format, organize, print, share, secure, search documents as well as to fill PDF forms. Additionally, Foxit PDF SDK includes a built-in, embeddable PDF Viewer, making the development process easier and faster. For more detailed information, please visit the website https://developers.foxitsoftware.com/pdf-sdk/. In this guide, we focus on the introduction of Foxit PDF SDK for Java API on Windows and Linux platforms.

Foxit PDF SDK for Java API ships with simple-to-use APIs that can help Java developers seamlessly integrate powerful PDF technology into their own projects on Windows and Linux platforms. It offers the most common features in PDF SDK, such as PDF viewing, bookmark navigating, text selecting/copying/searching, annotations, and signature.

Evaluation

Foxit PDF SDK allows users to download trial version to evaluate SDK. The trial version has no difference from a standard version except for the 30-day limitation trial period and the trail watermarks that will be generated on the PDF pages. After the evaluation period expires, customers should contact Foxit sales team and purchase licenses to continue using Foxit PDF SDK.

License

Developers should purchase licenses to use Foxit PDF SDK in their solutions. Licenses grant users permissions to release their applications based on PDF SDK libraries. However, users are prohibited to distribute any documents, sample codes, or source codes in the SDK released package to any third party without the permission from Foxit Software Incorporated.

About this guide

This guide is intended for developers who need to integrate Foxit PDF SDK for Java into their own applications. It aims at introducing installation package structure on desktop platform with Java, and the usage of SDK.

Getting Started

It’s very easy to setup Foxit PDF SDK and see it in action! This guide will provide you with a brief introduction about our SDK package. As a cross-platform product, Foxit PDF SDK supports the identical interfaces for desktop system of Windows, Linux, and Mac. The following sections introduce the contents of the installation package as well as how to run a demo, and create your own project.

System Requirements

Platform System Requirement JDK version Memo
Windows Windows XP, Vista, 7, 8 and 10 (32-bit and 64-bit)

Windows Server 2003, 2008 and 2012 (32-bit and 64-bit)

At least 1.8 It only supports for Windows 8/10 classic style, but not for Store App or Universal App.
Linux 32-bit and 64-bit OS At least 1.8

What is in the package

Package for Windows Java is named “foxitpdfsdk_6_3_win_java.zip” and package for Linux Java is named “foxitpdfsdk_6_3_linux_java.zip”. They have the same structure, so in this guide mainly introduce “foxitpdfsdk_6_3_win_java.zip” as an example.

Download the package for Windows Java and extract it to a new directory like “foxitpdfsdk_6_3_win_java”. The structure of the release package is shown in Figure 2-1.

NOTE: the highlighted rectangle in the figure is just the version of Foxit PDF SDK. Here the SDK version is 6.1, so it shows 6_1 in the package name. Other highlighted rectangles in other figures have the same meaning in this guide.

This package contains the following folders:

docs: API references, quick start guide
lib: libraries and license files
samples: sample projects and demos

Figure 2-1

Foxit PDF SDK provides “fsdk.jar” file in directory “\lib”. It contains 14 packages that are shown in Figure 2 2. Please refer to API Reference in directory “\doc” for more details about classes and APIs.

Figure 2-2

How to initialize Foxit PDF SDK

It is necessary for applications to initialize Foxit PDF SDK with license before calling any APIs. The static function Library.initialize(sn, key) is provided in com.foxit.sdk.common.Library. The trial license files can be found in the “lib” folder.
Following is an example:

// The value of "sn" can be got from "gsdk_sn.txt" (the string after "SN=").
// The value of "key" can be got from "gsdk_key.txt" (the string after "Sign=").
int error_code = Library.initialize("sn", "key");
if (error_code != e_ErrSuccess) {
  return;
}

How to run a demo

Foxit PDF SDK provides several simple demos in directory “\examples”. All these demos can be run directly with the “.bat” files or “.sh” files in directory “\examples\simple_demo”:

    • Go to directory “\examples\simple_demo”, and run all demos by “RunAllDemo.bat” for Windows or by “RunAllDemo.sh” for Linux.
    • If you want to run a specific single demo, please locate to the directory of the demo, for example locate to “\examples\simple_demo\annotation”, and run this demo by “RunDemo.bat” for Windows or by “RunDemo.sh” for Linux.

“\examples\simple_demo\input_files” contains all the input files used among these demos. Some demos will generate output files (pdf, text or image files) to a folder named by the demo name under “example\simple_demo\output_files\”.

How to create a simple project

In this section, we will show you how to use Foxit PDF SDK for Windows Java (Linux Java is similar to Windows Java) to create a simple project that renders the first page of a PDF to a bitmap and saves it as a JPG image. For better writing code, we use Eclipse IDE to create a Java project called “test”. Then follow the steps below:

      1. 1) Copy “lib” folder from the download package to the project folder, and then refresh the project. The structure of the test project is shown in Figure 2 3.

Figure 2-3
      1. Add “fsdk.jar” to the project. Right click the test project, select “Build Path > Configure Build Path > Libraries > Add JARs”, and choose the “fsdk.jar” in “test/lib” as shown in Figure 2 4.

Figure 2-4
      1. Configure build path for .dll (for Windows) and .so (for Linux). Right click the test project, select “Build Path > Configure Build Path > Source > Native library location: (None) > Edit”, and locate to the “test/lib” folder as shown in Figure 2 5.

Figure 2-5
      1. Create a new class file called test.java under “test/src/test” directory.
      2. Open the “test.java” file, import the classes that you need to use in “fsdk.jar”. Here, we just import the classes as follows:
import com.foxit.sdk.PDFException;
import com.foxit.sdk.common.Bitmap;
import com.foxit.sdk.common.Image;
import com.foxit.sdk.common.Library;
import com.foxit.sdk.common.Renderer;
import com.foxit.sdk.common.fxcrt.Matrix2D;
import com.foxit.sdk.pdf.PDFDoc;
import com.foxit.sdk.pdf.PDFPage;
      1. Initialize Foxit PDF SDK. This should be done before calling any other APIs in Foxit PDF SDK. The trial license files can be found in the “lib” folder.
// The value of "sn" can be got from "gsdk_sn.txt" (the string after "SN=").
// The value of "key" can be got from "gsdk_key.txt" (the string after "Sign=").
String sn = "";
String key = "";		
int error_code = Library.initialize(sn, key);
if (error_code != e_ErrSuccess) {
return;
}
      1. Load a PDF document, and parse the first page of the document. Assume that you have already put a “Sample.pdf” to the “test” folder.
// load a "Sample.pdf" document.
PDFDoc doc = new PDFDoc("Sample.pdf");
error_code = doc.load(null);
if (error_code != e_ErrSuccess) {
	return;
}
 
// Get the first page of the document.
PDFPage page = doc.getPage(0);
 
// Parse page.
page.startParse(e_ParsePageNormal, null, false);
      1. Render a Page to a bitmap and save it as a JPG file.
int width = (int) page.getWidth();
int height = (int) page.getHeight();
Matrix2D matrix = page.getDisplayMatrix(0, 0, width, height, page.getRotation());
 
// Prepare a bitmap for rendering.
Bitmap bitmap = new Bitmap(width, height, e_DIBArgb, null, 0);
bitmap.fillRect(0xFFFFFFFF, null);
 
// Render page
Renderer render = new Renderer(bitmap, false);
render.startRender(page, matrix, null);
 
// Add the bitmap to image and save the image.
Image image = new Image();
image.addFrame(bitmap);
image.saveAs("testpage.jpg");

Note: The value of “sn” can be got from “gsdk_sn.txt” (the string after “SN=”) and the value of “key” can be got from “gsdk_key.txt” (the string after “Sign=”).

      1. Load a PDF document, and parse the first page of the document. Let us assume that you have already put a “Sample.pdf” to the “test_win\test_win” folder.
PDFDoc doc("Sample.pdf");
ErrorCode error_code = doc.Load();
if (error_code!= foxit::e_ErrSuccess) return 0;
PDFPage page = doc.GetPage(0);
page.StartParse(foxit::pdf::PDFPage::e_ParsePageNormal, NULL, false);
      1. Render a Page to a bitmap and save it as a JPG file.
int width = static_cast(page.GetWidth());
int height = static_cast(page.GetHeight());
Matrix matrix = page.GetDisplayMatrix(0, 0, width, height, page.GetRotation());
 
// Prepare a bitmap for rendering.
Bitmap bitmap(width, height, Bitmap::e_DIBArgb, NULL, 0);
bitmap.FillRect(0xFFFFFFFF, NULL);
// Render page.
Renderer render(bitmap, false);
render.StartRender(page, matrix, NULL);
 
// Add the bitmap to image and save the image.
Image img;
img.AddFrame(bitmap);
img.SaveAs("testpage.jpg");
      1. Build and Run the project. Right-click the test project in package explorer, and then choose “Run as > Java Application” to run it. The “testpage.jpg” will be generated in the “test” folder (See Figure 2 6).

Figure 2-6
package test;
 
import com.foxit.sdk.PDFException;
import com.foxit.sdk.common.Bitmap;
import com.foxit.sdk.common.Image;
import com.foxit.sdk.common.Library;
import com.foxit.sdk.common.Renderer;
import com.foxit.sdk.common.fxcrt.Matrix2D;
import com.foxit.sdk.pdf.PDFDoc;
import com.foxit.sdk.pdf.PDFPage;
 
import static com.foxit.sdk.common.Bitmap.e_DIBArgb;
import static com.foxit.sdk.common.Constants.e_ErrSuccess;
import static com.foxit.sdk.pdf.PDFPage.e_ParsePageNormal;
 
public class test {
 
	public static void main(String[] args) throws PDFException {
 
		// The value of "sn" can be got from "gsdk_sn.txt" (the string after "SN=").
		// The value of "key" can be got from "gsdk_key.txt" (the string after "Sign=").
		String sn = "";
		String key = "";
		int error_code = Library.initialize(sn, key);
		if (error_code != e_ErrSuccess) {
			return;
		}
 
		// load a "Sample.pdf" document.
		PDFDoc doc = new PDFDoc("Sample.pdf");
		error_code = doc.load(null);
		if (error_code != e_ErrSuccess) {
			return;
		}
 
		// Get the first page of the document.
		PDFPage page = doc.getPage(0);
 
		// Parse page.
		page.startParse(e_ParsePageNormal, null, false);
 
		int width = (int) page.getWidth();
		int height = (int) page.getHeight();
		Matrix2D matrix = page.getDisplayMatrix(0, 0, width, height, page.getRotation());
 
		// Prepare a bitmap for rendering.
		Bitmap bitmap = new Bitmap(width, height, e_DIBArgb, null, 0);
		bitmap.fillRect(0xFFFFFFFF, null);
 
		// Render page.
		Renderer render = new Renderer(bitmap, false);
		render.startRender(page, matrix, null);
 
		// Add the bitmap to image and save the image.
		Image image = new Image();
		image.addFrame(bitmap);
		image.saveAs("testpage.jpg");
	}
}

Note:If you have not installed Eclipse IDE in your machine, you can create a Java file, and then use command line to build and run it. For example, we use the test.java file created in the previous Eclipse IDE, and then follow the steps below:

 

  • Create a folder named “test_cm”. Put the test.java into this folder. (Please note that you need to delete the first line “package test;” in the “test.java”).
  • Copy “lib” folder to the same folder (test_cm) with “test.java”.
  • Put a PDF document named “Sample.pdf” into “test_cm” folder.
  • Open command line window and navigate to “test_cm” folder, and then use the following commands to build and run the Java file.

 

 

For Windows,

javac -cp .;./lib/fsdk.jar *.java
java -Djava.library.path=lib -classpath .;lib/fsdk.jar test

For Linux,

javac -cp .:./lib/fsdk.jar *.java
java -Djava.library.path=lib -classpath .:lib/fsdk.jar test

Working with SDK API

In this section, we will introduce a set of major features and list some examples for each feature to show you how to integrate powerful PDF capabilities with your applications using Foxit PDF SDK Java API. You can refer to the API reference [2] to get more details about the APIs used in all of the examples.

Initialize Library

It is necessary for applications to initialize and unlock Foxit PDF SDK license before calling any APIs. The function Library.initialize is provided to initialize Foxit PDF SDK. A license should be purchased for the application and pass unlock key and code to get proper supports. When there is no need to use Foxit PDF SDK any more, please call function Library.release to release it.

Note The parameter “sn” can be found in the “gsdk_sn.txt” (the string after “SN=”) and the “key” can be found in the “gsdk_key.txt” (the string after “Sign=”).

Example:

How to initialize Foxit PDF SDK

import com.foxit.sdk.common.*;
 
import static com.foxit.sdk.common.Constants.e_ErrSuccess;
 
String sn = " ";
 
String key = " ";
 
int error_code = Library.initialize(<em>sn</em>, <em>key</em>);
 
if (error_code != e_ErrSuccess)
 
return;
 
...

Document

A PDF document object can be constructed with an existing PDF file from file path, memory buffer, a custom implemented ReaderCallback object and an input file stream. Then call function PDFDoc.load or PDFDoc.startLoad to load document content. A PDF document object is used for document level operation, such as opening and closing files, getting page, metadata and etc.

Example:

How to create a PDF document from scratch

import static com.foxit.sdk.pdf.PDFDoc.*;
...
PDFDoc doc = new PDFDoc();

Note: It creates a new PDF document without any pages.

How to load an existing PDF document from file path

import static com.foxit.sdk.pdf.PDFDoc.*;
 
import static com.foxit.sdk.common.Constants.e_ErrSuccess;
 
...
 
PDFDoc doc = new PDFDoc("sample.pdf");
 
int error_code = doc.load(null);
 
if (error_code != e_ErrSuccess)
 
return;

How to load an existing PDF document from a memory buffer

import static com.foxit.sdk.pdf.PDFDoc.*;
 
import static com.foxit.sdk.common.Constants.e_ErrSuccess;
 
import java.io.FileInputStream;
 
import java.io.BufferedInputStream;
 
...
 
BufferedInputStream bis = new BufferedInputStream(new FileInputStream("sample.pdf"));
 
byte[] b = new byte[bis.available()];
 
bis.read(b);
 
PDFDoc doc = new PDFDoc(b);
 
error_code = doc.load(null);
 
if (error_code != e_ErrSuccess)
 
return;

How to load an existing PDF document from a file read callback object

import static com.foxit.sdk.pdf.PDFDoc.*;
 
import static com.foxit.sdk.common.Constants.e_ErrSuccess;
 
import java.io.IOException;
 
import com.foxit.sdk.common.fxcrt.FileReaderCallback;
 
import java.io.RandomAccessFile;
 
...
 
 
 
 
class FileReader extends FileReaderCallback {
 
private RandomAccessFile file_ = null;
 
FileReader() {
 
}
 
 
 
 
boolean LoadFile(String file_path) throws FileNotFoundException {
 
file_ = new RandomAccessFile(file_path, "r");
 
return true;
 
}
 
 
 
 
@Override
 
public long getSize() {
 
try {
 
return this.file_.length();
 
} catch (IOException e) {
 
e.printStackTrace();
 
}
 
return 0;
 
}
 
 
 
 
@Override
 
public boolean readBlock(byte[] buffer, long offset, long size) {
 
 
 
 
try {
 
file_.seek(offset);
 
int read = file_.read(buffer, 0, (int) size);
 
return read == size ? true : false;
 
} catch (IOException e) {
 
e.printStackTrace();
 
}
 
return false;
 
}
 
 
 
 
public void release() {
 
try {
 
this.file_.close();
 
} catch (IOException e) {
 
e.printStackTrace();
 
}
 
}
 
}
 
 
FileReader callback = new FileReader();
 
callback.LoadFile("sample.pdf");
 
PDFDoc doc = new PDFDoc(callback, false);
 
int error_code = doc.load(null);
 
if (error_code != <em>e_ErrSuccess</em>)
 
return;

How to load PDF document and get the first page of the PDF document

import static com.foxit.sdk.pdf.PDFDoc.*;
 
import static com.foxit.sdk.pdf.PDFPage.*;
 
import static com.foxit.sdk.common.Constants.e_ErrSuccess;
 
import static com.foxit.sdk.pdf.PDFPage.e_ParsePageNormal;
 
...
 
 
PDFDoc doc = new PDFDoc("sample.pdf");
 
int error_code = doc.load(null);
 
if (error_code != e_ErrSuccess)
 
return;
 
 
// Get the first page of the document.
 
PDFPage page = doc.getPage(0);
 
// Parse page.
 
page.startParse(e_ParsePageNormal, null, false);

How to save a PDF to a file

import static com.foxit.sdk.pdf.PDFDoc.*;
 
import static com.foxit.sdk.pdf.PDFPage.*;
 
import static com.foxit.sdk.common.Constants.e_ErrSuccess;
 
import static com.foxit.sdk.pdf.PDFPage.e_ParsePageNormal;
 
...
 
 
 
 
PDFDoc doc = new PDFDoc("sample.pdf");
 
int error_code = doc.load(null);
 
if (error_code != e_ErrSuccess)
 
return;
 
 
 
 
// Get the first page of the document.
 
PDFPage page = doc.getPage(0);
 
// Parse page.
 
page.startParse(e_ParsePageNormal, null, false);

How to save a PDF to a file

import static com.foxit.sdk.pdf.PDFDoc.*;
 
import static com.foxit.sdk.pdf.PDFPage.*;
 
import static com.foxit.sdk.common.Constants.e_ErrSuccess;
 
import static com.foxit.sdk.pdf.PDFDoc.e_SaveFlagNoOriginal;
 
...
 
PDFDoc doc = new PDFDoc("sample.pdf");
 
int error_code = doc.load(null);
 
if (error_code != e_ErrSuccess)
 
return;
 
doc.saveAs("new_Sample.pdf", e_SaveFlagNoOriginal);

 

Page

PDF Page is the basic and important component of PDF Document. A PDFPage object is retrieved from a PDF document by function PDFDoc.getPage. Page level APIs provide functions to parse, render, edit (includes creating, deleting and flattening) a page, retrieve PDF annotations, read and set the properties of a page, and etc. For most cases, A PDF page needs to be parsed before it is rendered or processed.

Example:

How to get page size

import static com.foxit.sdk.pdf.PDFPage.*;
 
...
 
// Assuming PDFPage page has been loaded and parsed.
 
...
 
int width = (int) page.getWidth();
 
int height = (int) page.getHeight();
 
...

How to calculate bounding box of page contents

import static com.foxit.sdk.pdf.PDFPage.*;
 
...
 
// Assuming PDFPage page has been loaded and parsed.
 
...
 
RectF calcRc = page.calcContentBBox(<em>e_CalcContentsBox</em>);
 
float fcalcRc = calcRc.width();
 
float fcalcRcHeight = calcRc.height();

How to create a PDF page and set the size

import static com.foxit.sdk.pdf.PDFPage.*;
 
...
 
// Assuming PDFDoc doc has been loaded.
 
// Insert a new blank PDF page to document, which will be inserted to the first page.
 
PDFPage newBlankPage = doc.insertPage(-1, 500, 800);
 
 
// Insert a new blank PDF page to document, which will be inserted at index 1.
 
PDFPage newBlankPage = doc.insertPage(1, 500, 800);
 
// Insert a new blank PDF page to document, which will be inserted to the end.
 
PDFPage newBlankPage = doc.insertPage(doc.getPageCount(), <em>e_SizeLetter</em>);

How to delete a PDF page

import static com.foxit.sdk.pdf.PDFDoc.*;

 

// Assuming PDFDoc doc has been loaded.

 

// Remove a PDF page by page index.

doc.removePage(index);

 

// Remove a specified PDF page.

doc.removePage(page);

How to flatten a PDF page

import static com.foxit.sdk.pdf.PDFPage.*;
 
...
 
 
 
 
// Assuming PDFPage page has been loaded and parsed.
 
 
 
 
// Flatten all contents of a PDF page.
 
page.flatten(true, e_FlattenAll);
 
 
 
 
// Flatten a PDF page without annotations.
 
page.flatten(true, e_FlattenNoAnnot);
 
 
 
 
// Flatten a PDF page without form controls.
 
page.flatten(true, e_FlattenNoFormControl);
 
 
 
 
// Flatten a PDF page without annotations and form controls (Equals to nothing to be flattened).
 
page.flatten(true, e_FlattenNoAnnot | e_FlattenNoFormControl);
 
...

How to get and set page thumbnails in a PDF document

import static com.foxit.sdk.pdf.PDFPage.*;
 
...
 
 
 
 
// Assuming PDFPage page has been loaded and parsed.
 
 
 
 
...
 
// Load the thumbnail bitmap. If the return value of function db.isEmpty() is true means no thumbnail can be found.
 
Bitmap db = page.loadThumbnail();
 
if (!db.isEmpty())
 
{
 
    int dbWidth = db.getWidth();
 
int dbHeight = db.getHeight();
 
}
 
 
 
 
// Set page thumbnail, db should be a valid bitmap.
 
page.setThumbnail(db);
 
...

How to get and set page thumbnails in a PDF document

<strong>import</strong> <strong>static</strong> com.foxit.sdk.pdf.PDFPage.*;
 
...
 
 
 
 
// Assuming PDFPage page has been loaded and parsed.
 
 
 
 
...
 
// Load the thumbnail bitmap. If the return value of function db.isEmpty() is true means no thumbnail can be found.
 
Bitmap db = page.loadThumbnail();
 
<strong>if</strong> (!db.isEmpty())
 
{
 
<strong>    int</strong> dbWidth = db.getWidth();
 
<strong>int</strong> dbHeight = db.getHeight();
 
}
 
 
 
 
// Set page thumbnail, db should be a valid bitmap.
 
page.setThumbnail(db);
 
...

Render

PDF rendering is realized through the Foxit renderer, a graphic engine that is used to render page to a bitmap or platform graphics device. Foxit PDF SDK provides APIs to set rendering options/flags, for example set flag to decide whether to render form fields and signature, whether to draw image anti-aliasing and path anti-aliasing. To do rendering, you can use the following APIs:

  • To render page and annotations, first use function setRenderContentFlags to decide whether to render page and annotation both or not, and then use function Renderer.startRender to do the rendering. Function Renderer.startQuickRender can also be used to render page but only for thumbnail purpose.
  • To render a single annotation, use function renderAnnot.
  • To render on a bitmap, use function startRenderBitmap.
  • To render a reflowed page, use function startRenderReflowPage.

Widget annotation is always associated with form field and form control in Foxit PDF SDK. For how to render widget annotations, here is a recommended flow:

  • After loading a PDF page, first render the page and all annotations in this page (including widget annotations).
  • Then, if use foxit.sdk.pdf.interform.Filler object to fill the form, the function pdf.interform.Filler.render should be used to render the focused form control instead of the function Renderer.renderAnnot.

Example:

How to render a page to a bitmap

import com.foxit.sdk.pdf.PDFDoc;
 
import com.foxit.sdk.pdf.PDFPage;
 
import com.foxit.sdk.common.Bitmap;
 
import com.foxit.sdk.common.Renderer;
 
import com.foxit.sdk.common.fxcrt.Matrix2D;
 
 
 
 
import static com.foxit.sdk.common.Bitmap.<em>e_DIBArgb</em>;
 
 
 
 
// Assuming PDFPage page has been loaded and parsed.
 
 
 
 
int width = (int) page.getWidth();
 
int height = (int) page.getHeight();
 
Matrix2D matrix = page.getDisplayMatrix(0, 0, width, height, page.getRotation());
 
 
 
 
// Prepare a bitmap for rendering.
 
Bitmap bitmap = new Bitmap(width, height, <em>e_DIBArgb</em>, null, 0);
 
bitmap.fillRect(0xFFFFFFFF, null);
 
 
 
 
// Render page.
 
Renderer render = new Renderer(bitmap, false);
 
render.startRender(page, matrix, null);
 
...

How to render page and annotation

import com.foxit.sdk.pdf.PDFDoc;
 
import com.foxit.sdk.pdf.PDFPage;
 
import com.foxit.sdk.common.Bitmap;
 
import com.foxit.sdk.common.Renderer;
 
import com.foxit.sdk.common.fxcrt.Matrix2D;
 
 
 
 
import static com.foxit.sdk.common.Bitmap.<em>e_DIBArgb</em>;
 
 
 
 
// Assuming PDFPage page has been loaded and parsed.
 
 
 
 
int width = (int) page.getWidth();
 
int height = (int) page.getHeight();
 
Matrix2D matrix = page.getDisplayMatrix(0, 0, width, height, page.getRotation());
 
 
 
 
// Prepare a bitmap for rendering.
 
Bitmap bitmap = new Bitmap(width, height, <em>e_DIBArgb</em>, null, 0);
 
bitmap.fillRect(0xFFFFFFFF, null);
 
 
 
 
Renderer render(bitmap, false);
 
render.setRenderContentFlags(<em>e_RenderAnnot</em> | <em>e_RenderPage</em>);
 
render.startRender(page, matrix, null);
 
...

Attachment

In Foxit PDF SDK, attachments are only referred to attachments of documents rather than file attachment annotation, which allows whole files to be encapsulated in a document, much like email attachments. PDF SDK provides applications APIs to access attachments such as loading attachments, getting attachments, inserting/removing attachments, and accessing properties of attachments.

Example:

How to export the embedded attachment file from a PDF and save it as a single file

import com.foxit.sdk.PDFException;
 
import com.foxit.sdk.common.Library;
 
import com.foxit.sdk.pdf.Attachments;
 
import com.foxit.sdk.pdf.FileSpec;
 
import com.foxit.sdk.pdf.PDFDoc;
 
import com.foxit.sdk.pdf.objects.PDFNameTree;
 
...
 
 
 
 
PDFNameTree empty_nametree = new PDFNameTree();
 
{
 
// Get information of attachments.
 
Attachments attachments = new Attachments(doc, empty_nametree);
 
int count = attachments.getCount();
 
for (int i = 0; i < count; i++) {
 
String key = attachments.getKey(i);
 
 
 
 
FileSpec file_spec = attachments.getEmbeddedFile(key);
 
if (!file_spec.isEmpty()) {
 
String name = file_spec.getFileName();
 
 
 
 
if (file_spec.isEmbedded()) {
 
String export_file_path = <em>output_path + name;
 
file_spec.exportToFile(export_file_path);
 
}
 
}
 
}
 
}

How to remove all the attachments of a PDF

import com.foxit.sdk.PDFException;
 
import com.foxit.sdk.common.Library;
 
import com.foxit.sdk.pdf.Attachments;
 
 
 
 
import com.foxit.sdk.pdf.PDFDoc;
 
import com.foxit.sdk.pdf.objects.PDFNameTree;
 
...
 
 
 
 
// Assuming PDFDoc doc has been loaded.
 
 
 
 
PDFNameTree empty_nametree = new PDFNameTree();
 
{
 
 
 
 
// Get information of attachments.
 
Attachments attachments = new Attachments(doc, empty_nametree);
 
attachments.removeAllEmbeddedFiles();
 
}
 
...

Text Page

Foxit PDF SDK provides APIs to extract, select, search and retrieve text in PDF documents. PDF text contents are stored in TextPage objects which are related to a specific page. TextPage class can be used to retrieve information about text in a PDF page, such as single character, single word, text content within specified character range or rectangle and so on. It also can be used to construct objects of other text related classes to do more operations for text contents or access specified information from text contents:

  • To search text in text contents of a PDF page, construct a TextSearch object with TextPage
  • To access text such like hypertext link, construct a PageTextLinks object with TextPage

Example:

How to extract text from a PDF page

import com.foxit.sdk.pdf.PDFDoc;
 
import com.foxit.sdk.pdf.TextPage;
 
...
 
// Assuming PDFPage page has been loaded and parsed.
 
 
 
 
// Get the text page object.
 
TextPage textpage = new TextPage(page, <em>e_ParseTextNormal</em>);
 
int nCharCount = textpage.getCharCount();
 
String texts = textpage.getChars(0, nCharCount);
 
...

How to select the text of a rectangle area in a PDF

import com.foxit.sdk.pdf.PDFDoc;
 
import com.foxit.sdk.pdf.TextPage;
 
import com.foxit.sdk.common.fxcrt.RectF;
 
import com.foxit.sdk.common.fxcrt.RectFArray;
 
...
 
// Assuming PDFPage page has been loaded and parsed.
 
...
 
 
 
 
TextPage textpage = new TextPage(page, <em>e_ParseTextNormal</em>);
 
RectF selRc = new RectF(100,100,250,250);
 
String selText = textpage.getTextInRect(selRc);
 
RectFArray rcArr = textpage.getTextRectArrayByRect(selRc);
 
...

Foxit PDF SDK provides APIs to search text in a PDF document, a XFA document, a text page or in a PDF annotation’s appearance. It offers functions to do a text search and get the searching result:

  • To specify the searching pattern and options, use functions setPattern, TextSearch.setStartPage (only useful for a text search in PDF document), TextSearch.setEndPage (only useful for a text search in PDF document) and TextSearch.setSearchFlags.
  • To do the searching, use function findNext or TextSearch.findPrev.
  • To get the searching result, use functiongetMatchXXX().

Example:

How to search a text pattern in a PDF

import com.foxit.sdk.common.fxcrt.RectF;
 
import com.foxit.sdk.common.fxcrt.RectFArray;
 
import com.foxit.sdk.pdf.PDFDoc;
 
import com.foxit.sdk.pdf.TextSearch;
 
...
 
TextSearch search = new TextSearch(doc, null);
 
int start_index = 0, end_index = doc.getPageCount() - 1;
 
search.setStartPage(0);
 
search.setEndPage(doc.getPageCount() - 1);
 
 
 
 
String pattern = "Foxit";
 
search.setPattern(pattern);
 
 
 
 
int flags = e_SearchNormal;
 
// if want to specify flags, you can do it like this:
 
// flags |= TextSearch::e_SearchMatchCase;
 
// flags |= TextSearch::e_SearchMatchWholeWord;
 
// flags |= TextSearch::e_SearchConsecutive;
 
search.setSearchFlags(flags);
 
int match_count = 0;
 
while (search.findNext()) {
 
RectFArray rect_array = search.getMatchRects();
 
match_count++;
 
}
 
...

In a PDF page, some text contents that represent a hypertext link to a website or a resource on the intent, or an email address are the same with common texts. Prior to text link processing, user should first call PageTextLinks.getTextLink to get a textlink object.

Example:

import com.foxit.sdk.pdf.PDFPage;
 
import com.foxit.sdk.pdf.annots.*;
 
...
 
 
 
 
// Assuming PDFPage page has been loaded and parsed.
 
...
 
 
 
 
TextPage text_page = new TextPage(page, TextPage.<em>e_ParseTextNormal</em>);
 
PageTextLinks page_textlinks = new PageTextLinks(text_page);
 
TextLink text_link = page_textlinks.getTextLink(index); // specify an index.
 
String str_uri = text_link.getURI();
 
...

Bookmarks

Foxit PDF SDK provides navigational tools called Bookmarks to allow users to quickly locate and link their point of interest within a PDF document. PDF bookmark is also called outline, and each bookmark contains a destination or actions to describe where it links to. It is a tree-structured hierarchy, so function pdf.PDFDoc.getRootBookmark must be called first to get the root of the whole bookmark tree before accessing to the bookmark tree. Here, “root bookmark” is an abstract object which can only have some child bookmarks without next sibling bookmarks and any data (includes bookmark data, destination data, and action data). It cannot be shown on the application UI since it has no data. Therefore, a root bookmark can only call function Bookmark.getFirstChild.

After the root bookmark is retrieved, the following functions can be called to access other bookmarks:

Example:

How to find and list all bookmarks of a PDF

import com.foxit.sdk.pdf.Bookmark;
 
import com.foxit.sdk.pdf.PDFDoc;
 
...
 
 
 
 
// Assuming PDFDoc doc has been loaded.
 
...
 
 
 
 
Bookmark root = doc.getRootBookmark();
 
if (root.isEmpty()) {
 
root = doc.createRootBookmark();
 
}
 
 
 
 
String titleStr = "";
 
Bookmark iterBookmark = root.getFirstChild ();
 
if (iterBookmark.isEmpty())
 
return;
 
while (!iterBookmark.isEmpty())
 
{
 
titleStr = iterBookmark.getTitle();
 
if (iterBookmark.hasChild())
 
{
 
Bookmark childBookmark = iterBookmark.getFirstChild();
 
titleStr = childBookmark.getTitle();
 
}
 
 
 
 
iterBookmark = iterBookmark.getNextSibling();
 
}
 
...

Form (AcroForm)

PDF currently supports two different forms for gathering information interactively from the user – AcroForms and XFA forms. Acroforms are the original PDF-based fillable forms, based on the PDF architecture. Foxit PDF SDK provides APIs to view and edit form field programmatically. Form fields are commonly used in PDF documents to gather data. The Form class offers functions to retrieve form fields or form controls, import/export form data and other features, for example:

  • To retrieve form fields, please use functions getFieldCount and Form.getField.
  • To retrieve form controls from a PDF page, please use functionsgetControlCount and Form.getControl.
  • To import form data from an XML file, please use function importFromXML; to export form data to an XML file, please use function Form.exportToXML.
  • To retrieve form filler object, please use function getFormFiller.

To import form data from a FDF/XFDF file or export such data to a FDF/XFDF file, please refer to functions pdf.PDFDoc.importFromFDF and pdf.PDFDoc.exportToFDF.

Example:

How to load the forms in a PDF

import com.foxit.sdk.pdf.interform.Form;
 
...
 
 
 
 
// Assuming PDFDoc doc has been loaded.
 
...
 
 
 
 
Boolean hasForm = doc.hasForm();
 
if(hasForm)
 
Form form = new Form(doc);
 
...

How to count form fields and get the properties

import com.foxit.sdk.pdf.interform.Form;
 
import com.foxit.sdk.pdf.interform.Control;
 
import com.foxit.sdk.pdf.interform.Field;
 
...
 
 
 
 
// Assuming PDFDoc doc has been loaded.
 
...
 
 
 
 
Form form = new Form(doc);
 
String filter = "";
 
 
 
 
int nControlCount = form.getFieldCount(filter);
 
for (int i=0; i<ncontrolcount ; i++)
 
{
 
Field field = form.getField(i, filter);
 
String fdName = field.getName();
 
String fdValue = field.getValue();
 
String DefaultValue = field.getDefaultValue();
 
}
 
...

How to export the form data in a PDF to a XML file

import com.foxit.sdk.pdf.interform.Form;
 
...
 
 
 
 
// Assuming PDFDoc doc has been loaded.
 
...
 
 
 
 
Form form = new Form(doc);
 
form.exportToXML("form.xml");
 
...

How to import form data from an XML file

import com.foxit.sdk.pdf.interform.Form;
 
...
 
Form form = new Form(doc);
 
form.importFromXML("form.xml");
 
...

XFA Form

XFA (XML Forms Architecture) forms are XML-based forms, wrapped inside a PDF. The XML Forms Architecture provides a template-based grammar and a set of processing rules that allow uses to build interactive forms. At its simplest, a template-based grammar defines fields in which a user provides data.

Foxit PDF SDK provides APIs to render the XFA form, fill the form, export or import form’s data.

Note: Foxit PDF SDK provides two callback classes com.foxit.sdk.addon.xfa.AppProviderCallback and com.foxit.sdk.addon.xfa.DocProviderCallback to represent the callback objects as an XFA document provider and an XFA application provider respectively. All the functions in those classes are used as callback functions. Pure virtual functions should be implemented by users.

Example:

How to load XFA Doc and represent an Interactive XFA form

import com.foxit.sdk.pdf.PDFDoc;
 
import com.foxit.sdk.pdf.PDFPage;
 
import com.foxit.sdk.PDFException;
 
import com.foxit.sdk.common.Library;
 
import com.foxit.sdk.common.WStringArray;
 
import com.foxit.sdk.common.Constants;
 
import com.foxit.sdk.addon.xfa.*;
 
import com.foxit.sdk.addon.xfa.XFADoc.*;
 
import com.foxit.sdk.common.fxcrt.*;
 
import com.foxit.sdk.common.WStringArray;
 
...
 
 
 
 
try {
 
// Create com.foxit.sdk.addon.xfa.AppProviderCallback handler.
 
XFAAppHandler xfa_app = new XFAAppHandler();
 
// Register it in application.
 
Library.<em>registerXFAAppProviderCallback</em>(xfa_app);
 
 
 
 
String input_file = <em>input_path</em> + "xfa_dynamic.pdf";
 
PDFDoc doc = new PDFDoc(input_file);
 
int error_code = doc.load(null);
 
if (error_code != <em>e_ErrSuccess</em>)
 
    return;
 
 
 
 
// Create com.foxit.sdk.addon.xfa.DocProviderCallback handler.
 
XFADocHandler xfa_dochandler = new XFADocHandler();
 
// Load xfa document from pdf document.
 
XFADoc xfa_doc = new XFADoc(doc, xfa_dochandler);
 
xfa_doc.startLoad(null);
 
 
 
 
} catch (PDFException e) {
 
System.<em>out</em>.println(e.getMessage());
 
return;
 
}
 
...

How to export and import XFA form data

import com.foxit.sdk.pdf.PDFDoc;
 
import com.foxit.sdk.pdf.PDFPage;
 
import com.foxit.sdk.PDFException;
 
import com.foxit.sdk.common.Library;
 
import com.foxit.sdk.common.WStringArray;
 
import com.foxit.sdk.common.Constants;
 
import com.foxit.sdk.addon.xfa.*;
 
import com.foxit.sdk.addon.xfa.XFADoc.*;
 
import com.foxit.sdk.common.fxcrt.*;
 
import com.foxit.sdk.common.WStringArray;
 
...
 
 
 
 
// Assuming XFADoc xfa_doc has been loaded.
 
 
 
 
String output_xml = "xfa_form.xml";
 
xfa_doc.exportData(output_xml, XFADoc.e_ExportDataTypeXML);
 
 
 
 
xfa_doc.resetForm();
 
doc.saveAs("xfa_dynamic_resetform.pdf", PDFDoc.<em>e_SaveFlagNormal</em>);
 
 
 
 
xfa_doc.importData(output_xml);
 
doc.saveAs("xfa_dynamic_importdata.pdf", PDFDoc.<em>e_SaveFlagNormal</em>);
 
 
 
 
...

Form Design

Fillable PDF forms (AcroForm) are especially convenient for preparation of various applications, such as taxes and other government forms. Form design provides APIs to add or remove form fields (Acroform) to or from a PDF file. Designing a form from scratch allows developers to create the exact content and layout of the form they want.

Example:

How to add a text form field to a PDF

import com.foxit.sdk.pdf.interform.Form;
 
import com.foxit.sdk.pdf.interform.Control;
 
import com.foxit.sdk.pdf.PDFPage;
 
import com.foxit.sdk.common.fxcrt.RectF;
 
...
 
 
 
 
// Assuming PDFDoc doc has been loaded.
 
...
 
 
 
 
Form form = new Form(doc);
 
Control control = form.addControl(page, "Text Field0", Field.e_TypeTextField, new RectF(50, 600, 90, 640));
 
control.getField().setValue("3");
 
 
 
 
// Update text field's appearance.
 
control.getWidget().resetAppearanceStream();
 
...

How to remove a text form field from a PDF

import com.foxit.sdk.pdf.interform.Form;
 
import com.foxit.sdk.pdf.interform.Control;
 
import com.foxit.sdk.pdf.interform.Field;
 
...
 
 
 
 
// Assuming PDFDoc doc has been loaded.
 
...
 
 
 
 
Form form = new Form(doc);
 
 
 
 
int nControlCount = form.getFieldCount("Text Field0");
 
if (nControlCount > 0)
 
{
 
Field field = form.getField(0, "Text Field0");
 
form.removeField(field);
 
}
 
...

Annotations

General

An annotation associates an object such as a note, line, and highlight with a location on a page of a PDF document. It provides a way to interact with users by means of the mouse and keyboard. PDF includes a wide variety of standard an­notation types as listed in Table 3‑1. Among these annotation types, many of them are defined as markup annotations for they are used primarily to mark up PDF documents. These annotations have text that appears as part of the annotation and may be displayed in other ways by a conforming reader, such as in a Comments pane. The ‘Markup’ column in Table 3‑1 shows whether an annotation is a markup annotation.

Foxit PDF SDK supports most annotation types defined in PDF reference [1]. PDF SDK provides APIs of annotation creation, properties access and modification, appearance setting, and drawing.

Table 3‑1

Annotation type Description Markup Supported by SDK
Text(Note) Text annotation Yes Yes
Link Link Annotation No Yes
FreeText

(TypeWriter/TextBox/Callout)

Free text annotation Yes Yes
Line Line annotation Yes Yes
Square Square annotation Yes Yes
Circle Circle annotation Yes Yes
Polygon Polygon annotation Yes Yes
PolyLine PolyLine annotation Yes Yes
Highlight Highlight annotation Yes Yes
Underline Underline annotation Yes Yes
Squiggly Squiggly annotation Yes Yes
StrikeOut StrikeOut annotation Yes Yes
Stamp Stamp annotation Yes Yes
Caret Caret annotation Yes Yes
Ink(pencil) Ink annotation Yes Yes
Popup Popup annotation No Yes
File Attachment FileAttachment annotation Yes Yes
Sound Sound annotation Yes No
Movie Movie annotation No No
Widget* Widget annotation No Yes
Screen Screen annotation No Yes
PrinterMark PrinterMark annotation No No
TrapNet Trap network annotation No No
Watermark* Watermark annotation No Yes
3D 3D annotation No No
Redact Redact annotation Yes Yes

Note:

  1. The annotation types of widget and watermark are special. They aren’t supported in the module of ‘Annotation’. The type of widget is only used in the module of ‘form filler’ and the type of watermark only in the module of ‘watermark’.
  2. Foxit SDK supports a customized annotation type called PSI (pressure sensitive ink) annotation that is not described in PDF reference [1]. Usually, PSI is for handwriting features and Foxit SDK treats it as PSI annotation so that it can be handled by other PDF products.

Example:

import com.foxit.sdk.pdf.PDFPage;
 
import com.foxit.sdk.pdf.annots.Link;
 
...
 
 
 
 
// Assuming PDFPage page has been loaded and parsed.
 
 
 
 
// Add link annotation
 
Link link = new Link(page.addAnnot(Annot.<em>e_Link</em>, new RectF(350, 350, 380, 400)));
 
link.setHighlightingMode(Annot.<em>e_HighlightingToggle</em>);
 
 
 
 
// Appearance should be reset.
 
link.resetAppearanceStream();
 
...
import com.foxit.sdk.pdf.PDFPage;
 
import com.foxit.sdk.pdf.annots.Highlight;
 
import com.foxit.sdk.common.fxcrt.PointF;
 
import com.foxit.sdk.common.fxcrt.PointFArray;
 
import com.foxit.sdk.common.fxcrt.RectF;
 
import com.foxit.sdk.pdf.annots.QuadPoints;
 
import com.foxit.sdk.pdf.annots.QuadPointsArray;
 
...
 
 
 
 
// Assuming PDFPage page has been loaded and parsed.
 
 
 
 
// Add highlight annotation
 
Highlight highlight = new Highlight(page.addAnnot(Annot.<em>e_Highlight</em>, new RectF(10, 450, 100, 550)));
 
highlight.setContent("Highlight");
 
QuadPoints quad_points = new QuadPoints();
 
quad_points.setFirst(new PointF(10, 500));
 
quad_points.setSecond(new PointF(90, 500));
 
quad_points.setThird(new PointF(10, 480));
 
quad_points.setFourth(new PointF(90, 480));
 
QuadPointsArray quad_points_array = new QuadPointsArray();
 
quad_points_array.add(quad_points);
 
highlight.setQuadPoints(quad_points_array);
 
highlight.setSubject("Highlight");
 
highlight.setTitle("Foxit SDK");
 
highlight.setCreationDateTime(<em>GetLocalDateTime</em>());
 
highlight.setModifiedDateTime(<em>GetLocalDateTime</em>());
 
highlight.setUniqueID(<em>RandomUID</em>());
 
 
 
 
// Appearance should be reset.
 
highlight.resetAppearanceStream();
 
...
How to set the popup information when creating markup annotations
import com.foxit.sdk.pdf.PDFPage;
 
import com.foxit.sdk.pdf.annots.Note;
 
import com.foxit.sdk.pdf.annots.Popup;
 
import com.foxit.sdk.common.fxcrt.RectF;
 
...
 
 
 
 
// Assuming PDFPage page has been loaded and parsed.
 
 
 
 
// Add note annotation
 
Note note = new Note(page.addAnnot(Annot.<em>e_Note</em>, new RectF(10, 350, 50, 400)));
 
note.setIconName("Comment");
 
note.setSubject("Note");
 
note.setTitle("Foxit SDK");
 
note.setContent("Note annotation.");
 
note.setCreationDateTime(<em>GetLocalDateTime</em>());
 
note.setModifiedDateTime(<em>GetLocalDateTime</em>());
 
note.setUniqueID(<em>RandomUID</em>());
 
 
 
 
// Add popup to note annotation
 
Popup popup = new Popup(page.addAnnot(Annot.<em>e_Popup</em>, new RectF(300, 450, 500, 550)));
 
popup.setBorderColor(0x00FF00);
 
popup.setOpenStatus(false);
 
popup.setModifiedDateTime(<em>GetLocalDateTime</em>());
 
note.setPopup(popup);
 
 
 
 
// Appearance should be reset.
 
note.resetAppearanceStream();
 
...
How to get page transformation matrix between PDF page coordinates and rendering device coordinates
import com.foxit.sdk.pdf.PDFPage;
 
import com.foxit.sdk.common.fxcrt.RectF;
 
import com.foxit.sdk.common.fxcrt.Matrix2D;
 
 
 
 
// Assuming PDFDoc doc has been loaded.
 
// Assuming PDFPage page has been loaded and parsed.
 
...
 
 
 
 
Matrix2D mtx = page.getDisplayMatrix(0, 0, width, height, page.getRotation());
 
 
 
 
RectF srcRc = new RectF(100, 200, 200, 100);
 
RectF pageRc = new RectF(100, 200, 200, 100);
 
mtx.transformRect(pageRc);
 
 
 
 
RectF devRc = new RectF(pageRc.getLeft(), pageRc.getBottom(), pageRc.getRight(), pageRc.getTop());
 
Matrix2D reverse_mtx = new Matrix2D();
 
reverse_mtx.setReverse(mtx);
 
 
 
 
reverse_mtx.transformRect(devRc);
 
...

Import annotations from or export annotations to an FDF file

In Foxit PDF SDK, annotations can be created with data not only from applications but also from FDF files. At the same time, PDF SDK supports to export annotations to FDF files.

Example:

How to load annotations from a FDF file and add them into the first page of a given PDF
import com.foxit.sdk.common.Range;
 
import com.foxit.sdk.fdf.FDFDoc;
 
import com.foxit.sdk.pdf.PDFDoc;
 
import static com.foxit.sdk.pdf.PDFDoc.e_Annots;
 
 
 
 
// Assuming PDFDoc doc has been loaded.
 
...
 
 
 
 
Range empty_range = new Range();
 
{
 
String input_file = input_path + "AboutFoxit.pdf";
 
String fdf_file = input_path + "AnnotationData.fdf";
 
PDFDoc pdf_doc = new PDFDoc(input_file);
 
error_code = pdf_doc.load(null);
 
if (error_code != e_ErrSuccess) {
 
System.out.println("The Doc " + input_file + " Error: " + error_code);
 
return;
 
}
 
FDFDoc fdf_doc = new FDFDoc(fdf_file);
 
pdf_doc.importFromFDF(fdf_doc, e_Annots, empty_range);
 
}
 
...

Image Conversion

Foxit PDF SDK provides APIs for conversion between PDF files and images. Applications could easily fulfill functionalities like image creation and image conversion which supports the following image formats: BMP, TIFF, PNG, JPX, JPEG, and GIF. Foxit PDF SDK can make the conversion between PDF files and the supported image formats except for GIF. It only supports converting GIF images to PDF files.

Example:

How to convert PDF pages to bitmap files.

import com.foxit.sdk.common.Bitmap;
 
import com.foxit.sdk.common.Image;
 
import com.foxit.sdk.common.Renderer;
 
import com.foxit.sdk.common.fxcrt.Matrix2D;
 
import com.foxit.sdk.pdf.PDFDoc;
 
import com.foxit.sdk.pdf.PDFPage;
 
import static com.foxit.sdk.common.Bitmap.<em>e_DIBArgb</em>;
 
import static com.foxit.sdk.pdf.PDFPage.<em>e_ParsePageNormal</em>;
 
 
 
 
// Assuming PDFDoc doc has been loaded.
 
...
 
 
 
 
Image image = new Image();
 
 
 
 
// Get page count
 
int nPageCount = doc.getPageCount();
 
for (int i = 0; i < nPageCount; i++) {
 
PDFPage page = doc.getPage(i);
 
// Parse page.
 
page.startParse(<em>e_ParsePageNormal, null, false);
 
 
 
 
int width = (int) page.getWidth();
 
int height = (int) page.getHeight();
 
Matrix2D matrix = page.getDisplayMatrix(0, 0, width, height, page.getRotation());
 
 
 
 
// Prepare a bitmap for rendering.
 
Bitmap bitmap = new Bitmap(width, height, <em>e_DIBArgb</em>, null, 0);
 
bitmap.fillRect(0xFFFFFFFF, null);
 
 
 
 
// Render page.
 
Renderer render = new Renderer(bitmap, false);
 
render.startRender(page, matrix, null);
 
image.addFrame(bitmap);
 
}
 
...

How to convert a image file to PDF file

import com.foxit.sdk.common.Image;
 
import com.foxit.sdk.common.fxcrt.PointF;
 
import com.foxit.sdk.pdf.PDFDoc;
 
import com.foxit.sdk.pdf.PDFPage;
 
import static com.foxit.sdk.pdf.PDFPage.<em>e_ParsePageNormal</em>;
 
import static com.foxit.sdk.pdf.PDFPage.<em>e_SaveFlagNoOriginal</em>;
 
 
 
 
Image image = new Image(input_file);
 
int count = image.getFrameCount();
 
 
 
 
PDFDoc doc = new PDFDoc();
 
for (int i = 0; i < count; i++) {
 
PDFPage page = doc.insertPage(i, PDFPage.<em>e_SizeLetter);
 
page.startParse(<em>e_ParsePageNormal</em>, null, false);
 
// Add image to page.
 
page.addImage(image, i, new PointF(0, 0), page.getWidth(), page.getHeight(), true);
 
}
 
 
 
 
doc.saveAs("convertedPDF.pdf", <em>e_SaveFlagNoOriginal</em>);
 
...

Watermark

Watermark is a type of PDF annotation and is widely used in PDF document. Watermark is a visible embedded overlay on a document consisting of text, a logo, or a copyright notice. The purpose of a watermark is to identify the work and discourage its unauthorized use. Foxit PDF SDK provides APIs to work with watermark, allowing applications to create, insert, release and remove watermarks.

Example:

How to create a text watermark and insert it into the first page

import com.foxit.sdk.common.Font;
 
import com.foxit.sdk.pdf.*;
 
import com.foxit.sdk.pdf.Watermark;
 
import com.foxit.sdk.pdf.WatermarkSettings;
 
import com.foxit.sdk.pdf.WatermarkTextProperties;
 
 
 
 
import com.foxit.sdk.common.Constants;
 
 
 
 
import static com.foxit.sdk.common.Constants.<em>e_AlignmentCenter</em>;
 
import static com.foxit.sdk.common.Font.<em>e_StdIDTimesB</em>;
 
import static com.foxit.sdk.pdf.WatermarkSettings.*;
 
import static com.foxit.sdk.pdf.WatermarkTextProperties.<em>e_FontStyleNormal</em>;
 
...
 
 
 
 
// Assuming PDFDoc doc has been loaded.
 
 
 
 
WatermarkSettings settings = new WatermarkSettings();
 
settings.setFlags(<em>e_FlagASPageContents</em> | <em>e_FlagOnTop</em>);
 
settings.setOffset_x(0);
 
settings.setOffset_y(0);
 
settings.setOpacity(90);
 
settings.setPosition(Constants.<em>e_PosTopRight</em>);
 
settings.setRotation(-45.f);
 
settings.setScale_x(1.f);
 
settings.setScale_y(1.f);
 
 
 
 
WatermarkTextProperties text_properties = new WatermarkTextProperties();
 
text_properties.setAlignment(<em>e_AlignmentCenter</em>);
 
text_properties.setColor(0xF68C21);
 
text_properties.setFont_size(<em>e_FontStyleNormal</em>);
 
text_properties.setLine_space(1);
 
text_properties.setFont_size(12.f);
 
text_properties.setFont(new Font(<em>e_StdIDTimesB</em>));
 
 
 
 
Watermark watermark = new Watermark(doc, "Foxit PDF SDK\nwww.foxitsoftware.com", text_properties, settings);
 
watermark.insertToPage(page);
 
 
 
 
// Save document to file
 
...

How to create an image watermark and insert it into the first page

import com.foxit.sdk.common.Bitmap;
 
import com.foxit.sdk.common.Image;
 
import com.foxit.sdk.pdf.*;
 
import com.foxit.sdk.pdf.Watermark;
 
import com.foxit.sdk.pdf.WatermarkSettings;
 
 
 
 
import com.foxit.sdk.common.Constants;
 
 
 
 
import static com.foxit.sdk.common.Constants.<em>e_AlignmentCenter</em>;
 
import static com.foxit.sdk.common.Font.<em>e_StdIDTimesB</em>;
 
import static com.foxit.sdk.pdf.WatermarkSettings.*;
 
import static com.foxit.sdk.pdf.WatermarkTextProperties.<em>e_FontStyleNormal</em>;
 
...
 
 
 
 
// Assuming PDFDoc doc has been loaded.
 
 
 
 
WatermarkSettings settings = new WatermarkSettings();
 
settings.setFlags(<em>e_FlagASPageContents</em> | <em>e_FlagOnTop</em>);
 
settings.setOffset_x(0.f);
 
settings.setOffset_y(0.f);
 
settings.setOpacity(20);
 
settings.setPosition(Constants.<em>e_PosCenter</em>);
 
settings.setRotation(0.0f);
 
 
 
 
Image image = new Image(image_file);
 
Bitmap bitmap = image.getFrameBitmap(0);
 
settings.setScale_x(page.getWidth() * 0.618f / bitmap.getWidth());
 
settings.setScale_y(settings.getScale_x());
 
 
 
 
Watermark watermark = new Watermark(doc, image, 0, settings);
 
watermark.insertToPage(page);
 
 
 
 
// Save document to file.
 
...

How to remove all watermarks from a page

import com.foxit.sdk.pdf.PDFPage;
 
...
 
// Assuming PDFPage page has been loaded and parsed.
 
...
 
page.removeAllWatermarks();
 
...
 
// Save document to file
 
...

Barcode

A barcode is an optical machine-readable representation of data relating to the object to which it is attached. Originally barcodes systematically represented data by varying the widths and spacing of parallel lines, and may be referred to as linear or one-dimensional (1D). Later they evolved into rectangles, dots, hexagons and other geometric patterns in two dimensions (2D). Although 2D systems use a variety of symbols, they are generally referred to as barcodes as well. Barcodes originally were scanned by special optical scanners called barcode readers. Later, scanners and interpretive software became available on devices including desktop printers and smartphones. Foxit SDK provides applications to generate a barcode bitmap from a given string. The barcode types that Foxit SDK supports are listed in Table 3‑2.

Table 3‑2

Barcode Type Code39 Code128 EAN8 UPCA EAN13 ITF PDF417 QR
Dimension 1D 1D 1D 1D 1D 1D 2D 2D

Example:

How to generate a barcode bitmap from a string

import com.foxit.sdk.common.Barcode;
 
...
 
 
 
 
// Strings used as barcode content.
 
String codeStr = "TEST-SHEET"
 
 
 
 
// Barcode format types.
 
int codeFormat = Barcode.<em>e_FormatCode39</em>;
 
 
 
 
// Format error correction level of QR code.
 
int qrLevel = Barcode.<em>e_QRCorrectionLevelLow</em>;
 
 
 
 
// Image names for the saved image files for QR code.
 
String bmpQrName = "/QR_CODE_TestForBarcodeQrCode_L.bmp";
 
 
 
 
// Unit width for barcode in pixels, preferred value is 1-5 pixels.
 
int unitWidth = 2;
 
 
 
 
// Unit height for barcode in pixels, preferred value is >= 20 pixels.
 
int unitHeight = 120;
 
 
 
 
Barcode barcode = new Barcode();
 
Bitmap bitmap = barcode.generateBitmap(codeStr, codeFormat, unitWidth, unitHeight, qrLevel);
 
...

Security

Foxit PDF SDK provides a range of encryption and decryption functions to meet different levels of document security protection. Users can use regular password encryption and certificate-driven encryption or using their own security handler for custom security implementation. It also provides APIs to integrate with the third-party security mechanism (Microsoft RMS). These APIs allow developers to work with the Microsoft RMS SDK to both encrypt (protect) and decrypt (unprotect) PDF documents.

Note: For more detailed information about the RMS encryption and decryption, please refer to the simple demo “security” in the “examples\simple_demo” folder of the download package.

Example:

How to encrypt a PDF file with Certificate

import com.foxit.sdk.pdf.CertificateEncryptData;
 
import com.foxit.sdk.pdf.CertificateSecurityCallback;
 
import com.foxit.sdk.pdf.CertificateSecurityHandler;
 
import java.io.File;
 
import java.io.UnsupportedEncodingException;
 
import java.security.MessageDigest;
 
import java.util.ArrayList;
 
import java.util.Random;
 
import java.io.ByteArrayOutputStream;
 
import java.io.FileInputStream;
 
import java.util.Enumeration;
 
import java.security.Key;
 
import java.security.KeyStore;
 
import java.security.cert.CertificateFactory;
 
import javax.crypto.Cipher;
 
...
 
// Assuming PDFDoc doc has been loaded.
 
...
 
 
 
 
public static Key getPublicKey(String cerPath) {
 
try {
 
CertificateFactory certificateFactory = CertificateFactory.getInstance("X.509");
 
FileInputStream stream = new FileInputStream(cerPath);
 
java.security.cert.Certificate certificate = certificateFactory.generateCertificate(stream);
 
stream.close();
 
return certificate.getPublicKey();
 
} catch (Exception e) {
 
e.printStackTrace();
 
}
 
return null;
 
}
 
 
 
 
private static byte[] cryptByKey(byte[] inputData, Key key, int opmode) {
 
if (inputData == null) return null;
 
// The max length of decrypted byte array: 128
 
final int max_crypt_block = 128;
 
try {
 
Cipher cipher = Cipher.getInstance(key.getAlgorithm());
 
cipher.init(opmode, key);
 
int len = inputData.length;
 
ByteArrayOutputStream stream = new ByteArrayOutputStream();
 
int offSet = 0;
 
byte[] data;
 
// Decrypt data segment by segment
 
while (len > offSet) {
 
data = cipher.doFinal(inputData, offSet,
 
(len - offSet > max_crypt_block) ? max_crypt_block : (len - offSet));
 
stream.write(data, 0, data.length);
 
offSet += max_crypt_block;
 
}
 
byte[] outputData = stream.toByteArray();
 
stream.close();
 
return outputData;
 
} catch (Exception e) {
 
e.printStackTrace();
 
}
 
return null;
 
}
 
 
 
 
public static byte[] encryptByKey(byte[] plainData, Key key) {
 
return cryptByKey(plainData, key, Cipher.ENCRYPT_MODE);
 
}
 
 
 
 
public class CertificateSecurityEvent extends CertificateSecurityCallback {
 
private String filePath;
 
private String password;
 
 
 
 
public CertificateSecurityEvent(String filePath, String password) {
 
this.filePath = filePath;
 
this.password = password;
 
}
 
 
 
 
@Override
 
public void release() {}
 
 
 
 
@Override
 
public byte[] getDecryptionKey(byte[] arg0) {
 
return CryptUtil.decryptByKey(arg0, CryptUtil.getPrivateKey(filePath, password));
 
}
 
}
 
 
 
 
Random rand = new Random(23);
 
byte[] seed = new byte[24];
 
rand.nextBytes(seed);
 
for (int i = 20; i < 24; i++) {
 
seed[i] = (byte) 0xFF;
 
}
 
 
 
 
PDFDoc doc = new PDFDoc(input_file);
 
int error_code = doc.load(null);
 
if (error_code != e_ErrSuccess) {
 
System.out.println("The Doc " + input_file + " Error: " + error_code);
 
return;
 
}
 
 
 
 
// Do encryption.
 
String cert_file_path = input_path + "foxit.cer";
 
ArrayList< byte[]> envelopes = new ArrayList< byte[]>();
 
byte[] bytes=null;
 
try {
 
bytes = CryptUtil.encryptByKey(seed, CryptUtil.getPublicKey(cert_file_path));
 
envelopes.add(bytes);
 
} catch (Exception e) {
 
System.out.println("[Failed] Cannot get certificate information from " + cert_file_path);
 
return;
 
}
 
byte[] data=new byte[20+bytes.length];
 
System.arraycopy(seed, 0, data, 0, 20);
 
System.arraycopy(bytes, 0, data, 20, bytes.length);
 
MessageDigest messageDigest = MessageDigest.getInstance("SHA1");
 
messageDigest.update(data);
 
byte[] initial_key = new byte[16];
 
System.arraycopy(messageDigest.digest(),0,initial_key,0,16);
 
CertificateSecurityHandler handler = new CertificateSecurityHandler();
 
CertificateEncryptData encrypt_data = new CertificateEncryptData(true, SecurityHandler.e_CipherAES, envelopes);
 
handler.initialize(encrypt_data, initial_key);
 
 
 
 
doc.setSecurityHandler(handler);
 
String output_file = output_directory + "certificate_encrypt.pdf";
 
doc.saveAs(output_file, PDFDoc.e_SaveFlagNoOriginal);
 
...

How to encrypt a PDF file with Foxit DRM

import com.foxit.sdk.pdf.DRMSecurityCallback;
 
import com.foxit.sdk.pdf.PDFDoc;
 
import com.foxit.sdk.pdf.SecurityHandler;
 
...
 
 
 
 
public class DRMSecurityEvent extends DRMSecurityCallback {
 
private String fileID;
 
private byte[] initialKey;
 
 
 
 
public DRMSecurityEvent(String fileID, byte[] initialKey) {
 
this.fileID = fileID;
 
this.initialKey = initialKey;
 
}
 
 
 
 
@Override
 
public void release() {}
 
 
 
 
@Override
 
public int getCipherType(PDFDoc arg0, String arg1) {
 
return SecurityHandler.e_CipherAES;
 
}
 
 
 
 
@Override
 
public String getFileID(PDFDoc arg0, String arg1) {
 
return fileID;
 
}
 
 
 
 
@Override
 
public byte[] getInitialKey(PDFDoc arg0, String arg1) {
 
return initialKey;
 
}
 
 
 
 
@Override
 
public int getKeyLength(PDFDoc arg0, String arg1) {
 
return 16;
 
}
 
 
 
 
@Override
 
public int getUserPermissions(PDFDoc arg0, String arg1) {
 
return 0xFFFFFFFC;
 
}
 
 
 
 
@Override
 
public boolean isOwner(PDFDoc arg0, String arg1) {
 
return true;
 
}
 
 
 
 
}
 
 
 
 
PDFDoc doc = new PDFDoc(input_file);
 
int error_code = doc.load(null);
 
if (error_code != e_ErrSuccess) {
 
return;
 
}
 
 
 
 
// Do encryption.
 
DRMSecurityHandler handler = new DRMSecurityHandler();
 
String file_id = "Simple-DRM-file-ID";
 
String initialize_key = "Simple-DRM-initialize-key";
 
DRMEncryptData encrypt_data = new DRMEncryptData(true, "Simple-DRM-filter", SecurityHandler.e_CipherAES, 16, true, 0xfffffffc);
 
handler.initialize(encrypt_data, file_id, initialize_key);
 
doc.setSecurityHandler(handler);
 
 
 
 
String output_file = output_directory + "foxit_drm_encrypt.pdf";
 
doc.saveAs(output_file, PDFDoc.e_SaveFlagNoOriginal);
 
...

Reflow

Reflow is a function that rearranges page content when the page size changes. It is useful for applications that have output devices with different sizes. Reflow frees the applications from considering layout for different devices. This function provides APIs to create, render, release and access properties of ‘reflow’ pages.

Example:

How to create a reflow page and render it to a bmp file.

import com.foxit.sdk.common.Bitmap;
 
import com.foxit.sdk.common.Image;
 
import com.foxit.sdk.common.Renderer;
 
import com.foxit.sdk.common.fxcrt.Matrix2D;
 
import com.foxit.sdk.common.fxcrt.PointF;
 
import com.foxit.sdk.common.fxcrt.RectF;
 
import com.foxit.sdk.common.fxcrt.RectI;
 
import com.foxit.sdk.pdf.PDFDoc;
 
import com.foxit.sdk.pdf.PDFPage;
 
import com.foxit.sdk.pdf.ReflowPage;
 
 
 
 
import static com.foxit.sdk.common.Bitmap.e_DIBArgb;
 
import static com.foxit.sdk.common.Constants.e_ErrSuccess;
 
import static com.foxit.sdk.pdf.PDFPage.e_ParsePageNormal;
 
import static com.foxit.sdk.pdf.ReflowPage.e_Normal;
 
import static com.foxit.sdk.pdf.ReflowPage.e_WithImage;
 
...
 
 
 
 
public static void SaveBitmap(Bitmap bitmap, int index, String file_name) throws PDFException {
 
RectF margin = new RectF(50, 30, 30, 30);
 
PointF size = new PointF(480, 800);
 
RectI rect = new RectI(0, 0, (int) size.getX(), (int) margin.getTop());
 
bitmap.fillRect(0xFFFFFFFF, rect);
 
rect = new RectI(0, (int) size.getY() - (int) margin.getBottom(), (int) size.getX(), (int) size.getY());
 
bitmap.fillRect(0xFFFFFFFF, rect);
 
Image image = new Image();
 
<u>image</u>.addFrame(bitmap);
 
 
 
 
String save_path;
 
String sIndex;
 
sIndex = "" + index;
 
save_path = output_path + "reflow" + file_name + sIndex + ".bmp";
 
image.saveAs(save_path);
 
}
 
RectF margin = new RectF(50, 30, 30, 30);
 
PointF size = new PointF(480, 800);
 
int nCount = doc.getPageCount();
 
for (int i = 0; i < nCount; i++) {
 
PDFPage page = doc.getPage(i);
 
// Parse PDF page.
 
page.startParse(e_ParsePageNormal, null, false);
 
 
 
 
ReflowPage reflow_page = new ReflowPage(page);
 
// Set some arguments used for parsing the relfow page.
 
reflow_page.setLineSpace(0);
 
reflow_page.setScreenMargin((int) margin.getLeft(), (int) margin.getTop(), (int) margin.getRight(), (int) margin.getBottom());
 
reflow_page.setScreenSize(size.getX(), size.getY());
 
reflow_page.setZoom(100);
 
reflow_page.setParseFlags(e_Normal);
 
 
 
 
// Parse reflow page.
 
reflow_page.startParse(null);
 
 
 
 
// Get actual size of content of reflow page. The content size does not contain the margin.
 
float content_width = reflow_page.getContentWidth();
 
float content_height = reflow_page.getContentHeight();
 
 
 
 
// Create a bitmap for rendering the reflow page. The bitmap size contains the margin.
 
Bitmap bitmap = new Bitmap((int) (content_width + margin.getLeft() + margin.getRight()),
 
(int) (content_height + margin.getTop() + margin.getBottom()), e_DIBArgb, null, 0);
 
bitmap.fillRect(0xFFFFFFFF, null);
 
 
 
 
// Render reflow page.
 
Renderer renderer = new Renderer(bitmap, false);
 
Matrix2D matrix = reflow_page.getDisplayMatrix(0, 0);
 
renderer.startRenderReflowPage(reflow_page, matrix, null);
 
String file_name = "_single_";
 
SaveBitmap(bitmap, i, file_name);
 
}
 
...

Asynchronous PDF

Asynchronous PDF technique is a way to access PDF pages without loading the whole document when it takes a long time. It’s specially designed for accessing PDF files on the internet. With asynchronous PDF technique, applications do not have to wait for the whole PDF file to be downloaded before accessing it. Applications can open any page when the data of that page is available. It provides a convenient and efficient way for web reading applications. For how to open and parse pages with asynchronous mode, you can refer to the simple demo “async_load” in the “examples\simple_demo” folder of the download package.

Pressure Sensitive Ink

Pressure Sensitive Ink (PSI) is a technique to obtain varying electrical outputs in response to varying pressure or force applied across a layer of pressure sensitive devices. In PDF, PSI is used for hand written signatures. PSI data are collected by touching screens or handwriting on boards. PSI data contains coordinates and canvas of the operating area which can be used to generate the appearance of PSI. Foxit PDF SDK allows applications to create PSI, access properties, operate on ink and canvas, and release PSI.

Example:

import com.foxit.sdk.pdf.PSI;
 
import com.foxit.sdk.common.fxcrt.PointF;
 
...
 
 
 
 
PSI psi = new PSI(480, 180, true);
 
 
 
 
// Set ink diameter.
 
psi.setDiameter(9);
 
 
 
 
// Set ink color.
 
psi.setColor(0x434236);
 
 
 
 
// Set ink opacity.
 
psi.setOpacity(0.8f);
 
 
 
 
// Add points to pressure sensitive ink.
 
float x = 121.3043f;
 
float y = 326.6846f;
 
float pressure = 0.0966f;
 
int type = 1;
 
PointF point = new PointF(x, y);
 
psi.addPoint(point, type, pressure);
 
...

Wrapper

The wrapper provides a way for users to save their own data related to a PDF document. For example, when opening an encrypted unauthorized PDF document, users may get an error message. In this case, users can still access wrapper data even when they do not have permissions to the PDF content. The wrapper data could be used to provide information like where to get a decryption method of this document.

Example:

How to open a document including wrapper data.

import com.foxit.sdk.common.fxcrt.FileReaderCallback;
 
 
 
 
import com.foxit.sdk.pdf.PDFDoc;
 
import com.foxit.sdk.pdf.WrapperData;
 
...
 
 
 
 
PDFDoc doc = new PDFDoc(file_name);
 
int code = doc.load(null);
 
if (code != e_ErrSuccess) {
 
return;
 
}
 
if (!doc.isWrapper()) {
 
return;
 
}
 
int offset = doc.getWrapperOffset();
 
FileReader file_reader = new FileReader(offset);
 
file_reader.LoadFile(file_name);
 
 
 
 
PDFDoc doc_real = new PDFDoc(file_reader, false);
 
code = doc_real.load(null);
 
if (code != e_ErrSuccess) {
 
return;
 
}
 
...

PDF Objects

There are eight types of object in PDF: Boolean object, numerical object, string object, name object, array object, dictionary object, stream object and null object. PDF objects are document level objects that are different from page objects (see 3.25) which are associated with a specific page each. Foxit PDF SDK provides APIs to create, modify, retrieve and delete these objects in a document.

Example:

How to remove some properties from catalog dictionary

import com.foxit.sdk.pdf.PDFDoc;
 
import com.foxit.sdk.pdf.objects.PDFDictionary;
 
...
 
 
 
 
PDFDictionary catalog = document.getCatalog();
 
if (null == catalog) {
 
return;
 
}
 
 
 
 
String[] key_strings = {"Type", "Boolean", "Name", "String", "Array", "Dict"};
 
int count = key_strings.length;
 
for (int i = 0; i < count; i++) {
 
if (catalog.hasKey(key_strings[i])) {
 
catalog.removeAt(key_strings[i]);
 
}
 
}
 
...

Page Object

Page object is a feature that allows novice users having limited knowledge of PDF objects to be able to work with text, path, image, and canvas objects (see 3.24 for details of PDF Objects). Foxit PDF SDK provides APIs to add and delete PDF objects in a page and set specific attributes. Using page object, users can create PDF page from object contents. Other possible usages of page object include adding headers and footers to PDF documents, adding an image logo to each page, or generating a template PDF on demand.

Example:

How to create a text object in a PDF page

import com.foxit.sdk.common.fxcrt.Matrix2D;
 
import com.foxit.sdk.common.fxcrt.PointF;
 
import com.foxit.sdk.common.fxcrt.RectF;
 
import com.foxit.sdk.pdf.PDFDoc;
 
import com.foxit.sdk.pdf.PDFPage;
 
import com.foxit.sdk.pdf.graphics.*;
 
import com.foxit.sdk.common.Font;
 
import static com.foxit.sdk.common.Font.*;
 
...
 
 
 
 
long position = page.getLastGraphicsObjectPosition(e_TypeText);
 
TextObject text_object = TextObject.create();
 
 
 
 
text_object.setFillColor(0xFFFF7F00);
 
 
 
 
// Prepare text state
 
TextState state = new TextState();
 
state.setFont_size(80.0f);
 
state.setFont(new Font("Simsun", e_StylesSmallCap, e_CharsetGB2312, 0));
 
state.setTextmode(e_ModeFill);
 
text_object.setTextState(page, state, false, 750);
 
 
 
 
// Set text.
 
text_object.setText("Foxit Software");
 
long last_position = page.insertGraphicsObject(position, text_object);
 
 
 
 
RectF rect = text_object.getRect();
 
float offset_x = (page.getWidth() - (rect.getRight() - rect.getLeft())) / 2;
 
float offset_y = page.getHeight() * 0.8f - (rect.getTop() - rect.getBottom()) / 2;
 
text_object.transform(new Matrix2D(1, 0, 0, 1, offset_x, offset_y), false);
 
 
 
 
// Generate content
 
page.generateContent();
 
...

How to add an image logo to a PDF page

import com.foxit.sdk.pdf.PDFDoc;
 
import com.foxit.sdk.pdf.PDFPage;
 
import com.foxit.sdk.pdf.graphics.*;
 
import com.foxit.sdk.common.Font;
 
import static com.foxit.sdk.common.Font.*;
 
import com.foxit.sdk.common.Image;
 
...
 
 
 
 
long position = page.getLastGraphicsObjectPosition(e_TypeImage);
 
Image image = new Image(image_file);
 
ImageObject image_object = ImageObject.create(page.getDocument());
 
image_object.setImage(image, 0);
 
 
 
 
float width = image.getWidth();
 
float height = image.getHeight();
 
 
 
 
float page_width = page.getWidth();
 
float page_height = page.getHeight();
 
 
 
 
// Please notice the matrix value.
 
image_object.setMatrix(new Matrix2D(width, 0, 0, height, (page_width - width) / 2.0f, (page_height - height) / 2.0f));
 
 
 
 
page.insertGraphicsObject(position, image_object);
 
page.generateContent();
 
...

Marked content

In PDF document, a portion of content can be marked as a marked content element. Marked content helps to organize the logical structure information in a PDF document and enables stylized tagged PDF. Tagged PDF has standard structure types and attributes that allow page content to be extracted and reused for other purposes. More details about marked content could be found in chapter 10.5 of PDF reference 1.7 [1].

Example:

How to get marked content in a page and get the tag name

import com.foxit.sdk.pdf.graphics.GraphicsObject;
 
import com.foxit.sdk.pdf.graphics.MarkedContent;
 
...
 
 
 
 
long position = page.getFirstGraphicsObjectPosition(e_TypeText);
 
GraphicsObject text_obj = page.getGraphicsObject(position);
 
MarkedContent content = text_obj.getMarkedContent();
 
 
 
 
int nCount = content.getItemCount();
 
// Get marked content property
 
for (int i = 0; i < nCount; i++) {
 
String tag_name = content.getItemTagName(i);
 
int mcid = content.getItemMCID(i);
 
}
 
...

Layer

PDF Layers, in other words, Optional Content Groups (OCG), are supported in Foxit PDF SDK. Users can selectively view or hide the contents in different layers of a multi-layer PDF document. Multi-layers are widely used in many application domains such as CAD drawings, maps, layered artwork and multi-language document, etc.

In Foxit PDF SDK, a PDF layer is associated with a layer node. To retrieve a layer node, the user should construct a PDF LayerTree object first and then call function LayerTree.getRootNode to get the root layer node of the whole layer tree. Furthermore, you can enumerate all the nodes in the layer tree from the root layer node. Foxit PDF SDK provides APIs to get/set layer data, view or hide the contents in different layers, set layers’ name, add or remove layers, and edit layers.

Example:

How to create a PDF layer

import static com.foxit.sdk.pdf.LayerTree;
 
import static com.foxit.sdk.pdf.LayerNode;
 
...
 
 
 
 
LayerTree layertree = new LayerTree(doc);
 
LayerNode root = layertree.getRootNode();

How to set all the layer nodes information

import com.foxit.sdk.pdf.*;
 
...
 
 
 
 
static void setAllLayerNodesInformation(LayerNode layer_node) throws PDFException {
 
if (layer_node.hasLayer()) {
 
layer_node.setDefaultVisible(true);
 
layer_node.setExportUsage(e_StateUndefined);
 
layer_node.setViewUsage(e_StateOFF);
 
LayerPrintData print_data = new LayerPrintData("subtype_print", e_StateON);
 
layer_node.setPrintUsage(print_data);
 
LayerZoomData zoom_data = new LayerZoomData(1, 10);
 
layer_node.setZoomUsage(zoom_data);
 
String new_name = String.format("[View_OFF_Print_ON_Export_Undefined]") +  layer_node.getName();
 
layer_node.setName(new_name);
 
}
 
int count = layer_node.getChildrenCount();
 
for (int i = 0; i < count; i++) {
 
LayerNode child = layer_node.getChild(i);
 
setAllLayerNodesInformation(child);
 
}
 
}
 
...

How to edit layer tree

import com.foxit.sdk.pdf.*;
 
...
 
 
 
 
LayerTree layertree = new LayerTree(doc);
 
LayerNode root = layertree.getRootNode();
 
int children_count = root.getChildrenCount();
 
root.removeChild(children_count -1);
 
LayerNode child = root.getChild(children_count - 2);
 
LayerNode child0 = root.getChild(0);
 
child.moveTo(child0, 0);
 
child.addChild(0, "AddedLayerNode", true);
 
child.addChild(0, "AddedNode", false);
 
...

Signature

PDF Signature module can be used to create and sign digital signatures for PDF documents, which protects the security of documents’ contents and avoids it to be tampered maliciously. It can let the receiver make sure that the document is released by the signer and the contents of the document are complete and unchanged. Foxit PDF SDK provides APIs to create digital signature, verify the validity of signature, delete existing digital signature, get and set properties of digital signature, display signature and customize the appearance of the signature form fields.

Note: Foxit PDF SDK provides default Signature callbacks which supports the following two types of signature filter and subfilter:

(1) filter: Adobe.PPKLite subfilter: adbe.pkcs7.detached

(2) filter: Adobe.PPKLite subfilter: adbe.pkcs7.sha1

If you use one of the above signature filter and subfilter, you can sign a PDF document and verify the validity of signature by default without needing to register a custom callback.

Example:

How to sign the PDF document with a signature

import com.foxit.sdk.pdf.*;
 
...
 
 
 
 
String filter = "Adobe.PPKLite";
 
String sub_filter = "adbe.pkcs7.detached";
 
PDFPage pdf_page = pdf_doc.getPage(0);
 
// Add a new signature to first page.
 
com.foxit.sdk.pdf.Signature new_signature = AddSiganture(pdf_page, sub_filter);
 
// Set filter and subfilter for the new signature.
 
new_signature.setFilter(filter);
 
<u>new_signature</u>.setSubFilter(sub_filter);
 
boolean is_signed = new_signature.isSigned();
 
int sig_state = new_signature.getState();
 
String signed_pdf_path = output_directory + "signed_newsignature.pdf";
 
 
 
 
String cert_file_path = input_path + "foxit_all.pfx";
 
String cert_file_password = "123456";
 
 
 
 
// Cert file path will be passed back to application through callback function SignatureCallback::Sign().
 
// In this demo, the cert file path will be used for signing in callback function SignatureCallback::Sign().
 
new_signature.startSign(cert_file_path, cert_file_password.getBytes(), e_DigestSHA1, signed_pdf_path, null, null);
 
...

How to implement signature callback function of signing

import com.foxit.sdk.pdf.*;
 
...
 
 
 
 
// Implementation of SignatureCallback
 
class SignatureCallbackImpl extends SignatureCallback {
 
private String sub_filter_;
 
private DigestContext digest_context_ = null;
 
byte[] arrall = null;
 
 
 
 
SignatureCallbackImpl(String subfilter) {
 
sub_filter_ = subfilter;
 
}
 
 
 
 
@Override
 
public boolean startCalcDigest(FileReaderCallback var1, int[] var2,
 
com.foxit.sdk.pdf.Signature var3, Object var4) {
 
digest_context_ = new DigestContext(var1, var2, var2.length);
 
return true;
 
}
 
 
 
 
@Override
 
public int continueCalcDigest(Object var1, PauseCallback var2) {
 
return com.foxit.sdk.common.Progressive.e_Finished;
 
}
 
 
 
 
@Override
 
public byte[] getDigest(Object var1) {
 
return arrall;
 
}
 
 
 
 
@Override
 
public byte[] sign(byte[] digest, String cert_path, byte[] cert_password, int digest_algorithm, java.lang.Object client_data){
 
String encryptStr = null;
 
 
 
 
try {
 
try {
 
FileReaderCallback filehandler = digest_context_.file_read_callback_;
 
{
 
long size = filehandler.getSize();
 
byte[] arr1 = new byte[digest_context_.byte_range_array_[1]];
 
filehandler.readBlock(arr1,
 
digest_context_.byte_range_array_[0],
 
digest_context_.byte_range_array_[1]);
 
byte[] arr2 = new byte[digest_context_.byte_range_array_[3]];
 
filehandler.readBlock(arr2,
 
digest_context_.byte_range_array_[2],
 
digest_context_.byte_range_array_[3]);
 
size = 0;
 
arrall = new byte[(int) digest_context_.byte_range_array_[1]
 
+ (int) digest_context_.byte_range_array_[3]];
 
System.arraycopy(arr1, 0, arrall, 0, arr1.length);
 
System.arraycopy(arr2, 0, arrall, arr1.length, arr2.length);
 
}
 
 
 
 
} catch (Exception e) {
 
// TODO Auto-generated catch block
 
e.printStackTrace();
 
}
 
 
 
 
encryptStr = CertUtil.SignMsg(arrall, signature.input_path
 
+ "foxit_all.pfx", "123456");
 
return encryptStr.getBytes();
 
 
 
 
} catch (Exception e) {
 
// TODO Auto-generated catch block
 
e.printStackTrace();
 
}
 
return null;
 
}
 
 
 
 
@Override
 
public int verifySigState(byte[] var1, byte[] var2, Object var3) {
 
byte[] arrall_verify = null;
 
boolean verify_state = false;
 
try {
 
verify_state = CertUtil.VerifyMsg(new String(var2).toLowerCase(), arrall,
 
signature.input_path + "foxit.cer");
 
} catch (Exception e) {
 
// TODO Auto-generated catch block
 
e.printStackTrace();
 
}
 
return verify_state ? com.foxit.sdk.pdf.Signature.e_StateVerifyValid : com.foxit.sdk.pdf.Signature.e_StateVerifyInvalid ;
 
}
 
 
 
 
@Override
 
public boolean isNeedPadData() {return false;}
 
}
 
...

PDF Action

PDF Action is represented as the base PDF action class. Foxit PDF SDK provides APIs to create a series of actions and get the action handlers, such as embedded goto action, JavaScript action, named action and launch action, etc.

Example:

import com.foxit.sdk.pdf.actions.Action;
 
import com.foxit.sdk.pdf.actions.URIAction;
 
import com.foxit.sdk.pdf.annots.Link;
 
...
 
 
 
 
// Assuming PDFPage page has been loaded and parsed.
 
// Assuming the annnots in the page have been loaded.
 
 
 
 
// Add link annotation
 
Link link = new Link(page.addAnnot(Annot.e_Link, new RectF(350, 350, 380, 400)));
 
link.setHighlightingMode(Annot.e_HighlightingToggle);
 
 
 
 
// Add action for link annotation
 
Action action = Action.create(page.getDocument(), Action.e_TypeURI);
 
URIAction uriAction = new URIAction(action);
 
uriAction.setTrackPositionFlag(true);
 
uriAction.setURI("www.foxitsoftware.com");
 
link.setAction(uriAction);
 
// Appearance should be reset.
 
link.resetAppearanceStream();
 
...
import com.foxit.sdk.common.fxcrt.RectF;
 
import com.foxit.sdk.pdf.actions.Action;
 
import <u>com.foxit.sdk.pdf.actions.GotoAction</u>;
 
import com.foxit.sdk.pdf.annots.Link;
 
...
 
 
 
 
// Assuming PDFPage page has been loaded and parsed.
 
// Assuming the annnots in the page have been loaded.
 
 
 
 
Link link = new Link(page.addAnnot(Annot.<em>e_Link</em>, new RectF(350, 350, 380, 400)));
 
link.setHighlightingMode(Annot.<em>e_HighlightingToggle</em>);
 
 
 
 
// Add action for link annotation
 
Action action = Action.<em>create</em>(page.getDocument(), Action.<em>e_TypeGoto</em>);
 
GotoAction gotoAction = new GotoAction(action);
 
Destination dest = Destination.<em>createFitPage</em>(doc, 0);
 
gotoAction.setDestination(dest);
 
...

JavaScript

JavaScript was created to offload Web page processing from a server onto a client in Web-based applications. Foxit PDF SDK JavaScript implements extensions, in the form of new objects and their accompanying methods and properties, to the JavaScript language. It enables a developer to manage document security, communicate with a database, handle file attachments, and manipulate a PDF file so that it behaves as an interactive, web-enabled form, and so on.

JavaScript action is an action that causes a script to be compiled and executed by the JavaScript interpreter. Class com.foxit.sdk.pdf.actions.JavaScriptAction is derived from Action and offers functions to get/set JavaScript action data.

Example:

How to add JavaScript Action to Document

import com.foxit.sdk.pdf.actions.Action;
 
import com.foxit.sdk.pdf.actions.JavaScriptAction;
 
...
 
 
 
 
// Load Document doc
 
...
 
<u>JavaScriptAction</u> javascipt_action = new <u>JavaScriptAction</u>(<u>Action</u>.create(form.<u>getDocument</u>(), <u>Action</u>.e_TypeJavaScript));
 
javascipt_action.setScript("app.alert(\"Hello Foxit \");");
 
<u>AdditionalAction</u> aa = new <u>AdditionalAction</u>(<u>doc</u>);
 
aa.setAction(AdditionalAction.e_TriggerDocWillClose, javascipt_action<u>)</u>;
 
...

How to add JavaScript Action to Annotation

import com.foxit.sdk.pdf.actions.Action;
 
import com.foxit.sdk.pdf.actions.JavaScriptAction;
 
...
 
 
 
 
// Load Document and get a widget annotation.
 
...
 
JavaScriptAction javascipt_action = new JavaScriptAction(Action.create(form.getDocument(), Action.e_TypeJavaScript));
 
javascipt_action.setScript("app.alert(\"Hello Foxit \");");
 
AdditionalAction aa = new AdditionalAction(annot);
 
aa.setAction(AdditionalAction.e_TriggerAnnotMouseButtonPressed, javascipt_action);
 
...

How to add JavaScript Action to FormField

import com.foxit.sdk.pdf.actions.Action;
 
import com.foxit.sdk.pdf.actions.JavaScriptAction;
 
...
 
 
 
 
// Load Document and get a form field
 
...
 
 
 
 
JavaScriptAction javascipt_action = new JavaScriptAction(Action.create(form.getDocument(), Action.e_TypeJavaScript));
 
javascipt_action.setScript("AFSimple_Calculate(\"SUM\", new Array (\"Text Field0\", \"Text Field1\"));");
 
AdditionalAction aa = new AdditionalAction(field);
 
aa.setAction(AdditionalAction.e_TriggerFieldRecalculateValue, javascipt_action);
 
...

Redaction

Redaction is the process of removing sensitive information while keeping the document’s layout. It allows users to permanently remove (redact) visible text and images from PDF documents to protect confidential information, such as social security numbers, credit card information, product release dates, and so on.

Redaction is a type of markup annotation, which is used to mark some contents of a PDF file and then the contents will be removed once the redact annotations are applied.

To do Redaction, you can use the following APIs:

  • Call functionfoxit.sdk.addon.Redaction.Redaction to create a redaction module. If module “Redaction” is not defined in the license information which is used in function common.Library.initialize , that means the user has no right in using redaction related functions and this constructor will throw exception com.foxit.sdk.common.Constants.e_ErrInvalidLicense .
  • Then call functionfoxit.sdk.addon.Redaction.markRedactAnnot to create a redaction object and mark page contents (text object, image object, and path object) which are to be redacted.
  • Finally call functionfoxit.sdk.addon.Redaction.apply to apply redaction in marked areas: remove the text or graphics under marked areas permanently.

Example:

How to redact the text “PDF” on the first page of a PDF

import com.foxit.sdk.common.fxcrt.RectFArray;
 
import com.foxit.sdk.pdf.PDFDoc;
 
import com.foxit.sdk.pdf.PDFPage;
 
import com.foxit.sdk.pdf.TextPage;
 
import com.foxit.sdk.pdf.TextSearch;
 
import com.foxit.sdk.addon.Redaction;
 
import com.foxit.sdk.pdf.annots.Redact;
 
...
 
 
 
 
// Assuming PDFDoc doc has been loaded.
 
...
 
 
 
 
Redaction redaction = new Redaction(doc);
 
PDFPage page = doc.getPage(0);
 
// Parse PDF page.
 
page.startParse(PDFPage.e_ParsePageNormal, null, false);
 
TextPage text_page = new TextPage(page, TextPage.e_ParseTextNormal);
 
TextSearch text_search = new TextSearch(text_page);
 
text_search.setPattern("PDF");
 
RectFArray matched_rect_array = new RectFArray();
 
while (text_search.findNext()) {
 
RectFArray temp_rect_array = text_search.getMatchRects();
 
for (int z=0; z<temp_rect_array .getSize(); z++)
 
matched_rect_array.add(temp_rect_array.getAt(z));
 
}
 
if (matched_rect_array.getSize()>0) {
 
Redact redact = redaction.markRedactAnnot(page, matched_rect_array);
 
redact.resetAppearanceStream();
 
doc.saveAs(output_path + "AboutFoxit_redected_default.pdf", PDFDoc.e_SaveFlagNormal);
 
 
 
 
// set border color to Green
 
redact.setBorderColor((long)0x00FF00);
 
// set fill color to Blue
 
redact.setFillColor((long)0x0000FF);
 
// set rollover fill color to Red
 
redact.setApplyFillColor((long)0xFF0000);
 
redact.resetAppearanceStream();
 
doc.saveAs(output_path + "AboutFoxit_redected_setColor.pdf", PDFDoc.e_SaveFlagNormal);
 
 
 
 
redact.setOpacity((float)0.5);
 
redact.resetAppearanceStream();
 
doc.saveAs(output_path+"AboutFoxit_redected_setOpacity.pdf", PDFDoc.e_SaveFlagNormal);
 
 
 
 
redaction.apply();
 
}
 
...</temp_rect_array>

References

  • PDF reference 1.7

http://www.iso.org/iso/iso_catalogue/catalogue_tc/catalogue_detail.htm?csnumber=51502

  • PDF reference 2.0

https://www.iso.org/standard/63534.html

  • Foxit PDF SDK API reference

sdk_folder/doc/Foxit PDF SDK Java API Reference.html

Note: sdk_folder is the directory of the unzipped package.

Updated on March 21, 2019

Was this article helpful?

Related Articles