LiveCycle service operations typically consume
or produce PDF documents. When you invoke a service, sometimes it
is necessary to pass a PDF document (or other document types such
as XML data) to the service. Likewise sometimes it is necessary
to handle a PDF document that is returned from the service. The
Java class that enables you to pass data to and from LiveCycle services
is
com.adobe.idp.Document
.
LiveCycle services do not accept a PDF document as other data
types, such as a
java.io.InputStream
object or
a byte array. A
com.adobe.idp.Document
object can
also be used to pass other types of data, such as XML data, to services.
A
com.adobe.idp.Document
object is a Java serializable
type, so it can be passed over an RMI call. The receiving side can
be collocated (same host, same class loader), local (same host,
different class loader), or remote (different host). Passing of
document content is optimized for each case. For example, if the sender
and receiver are located on the same host, the content is passed
over a local file system. (In some cases, documents can be passed
in memory.)
Depending on the
com.adobe.idp.Document
object
size, the data is carried within the
com.adobe.idp.Document
object
or stored on the server's file system. Any temporary storage resources
occupied by the
com.adobe.idp.Document
object are
removed automatically upon the
com.adobe.idp.Document
disposal.
(See
Disposing Document objects
.)
Sometimes it is necessary to know the content type of a
com.adobe.idp.Document
object
before you can pass it to a service. For example, if an operation
requires a specific content type, such as
application/pdf
,
it is recommended that you determine the content type. (See
Determining the content type of a document
.)
The
com.adobe.idp.Document
object attempts to
determine the content type using the supplied data. If the content
type cannot be retrieved from the data supplied (for example, when
the data was supplied as a byte array), set the content type. To
set the content type, invoke the
com.adobe.idp.Document
object’s
setContentType
method.
(See
Determining the content type of a document
)
If collateral files reside on the same file system, creating
a
com.adobe.idp.Document
object is faster. If collateral
files reside on remote file systems, a copy operation must be done,
which affects performance.
An application can contain both
com.adobe.idp.Document
and
org.w3c.dom.Document
data
types. However, ensure that you fully qualify the
org.w3c.dom.Document
data
type. For information about converting a
org.w3c.dom.Document
object
to a
com.adobe.idp.Document
object, see
Quick Start (EJB mode): Prepopulating Forms with Flowable Layouts using the Java API
.
Note:
To prevent a memory leak in WebLogic while using
a
com.adobe.idp.Document
object, read the document
information in chunks of 2048 bytes or less. For example, the following
code reads the document information in chunks of 2048 bytes:
// Set up the chunk size to prevent a potential memory leak
int buffSize = 2048;
// Determine the total number of bytes to read
int docLength = (int) inDoc.length();
byte [] byteDoc = new byte[docLength];
// Set up the reading position
int pos = 0;
// Loop through the document information, 2048 bytes at a time
while (docLength > 0) {
// Read the next chunk of information
int toRead = Math.min(buffSize, docLength);
int bytesRead = inDoc.read(pos, byteDoc, pos, toRead);
// Handle the exception in case data retrieval failed
if (bytesRead == -1) {
inDoc.doneReading();
inDoc.dispose();
throw new RuntimeException("Data retrieval failed!");
}
// Update the reading position and number of bytes remaining
pos += bytesRead;
docLength -= bytesRead;
}
// The document information has been successfully read
inDoc.doneReading();
inDoc.dispose();