blob: afab7bdffc9c60323680c5c925efa74021362f2c [file] [log] [blame]
<?xml version="1.0" encoding="UTF-8"?>
<!--
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
-->
<!DOCTYPE document PUBLIC "-//APACHE//DTD Documentation V2.0//EN" "http://forrest.apache.org/dtd/document-v20.dtd">
<document>
<header>
<title>Tools for Adobe PostScript</title>
</header>
<body>
<section id="overview">
<title>Overview</title>
<p>
Apache XML Graphics Commons contains various tools for writing and processing Adobe
PostScript files. This includes:
</p>
<ul>
<li>A PostScript generator class which helps writing PostScript files from scratch.</li>
<li>Two Graphics2D implementations, one for plain PostScript and one for writing
Encapsulated PostScript (EPS).</li>
<li>A DSC-parser/processor: Parse, post-process and change DSC-compliant PostScript files.</li>
</ul>
<note>
We don't currently include a PostScript interpreter though we would love to have one. A
Java-based PostScript interpreter to keep an eye on is the one from the
<a href="http://foray.sourceforge.net">FOray project</a>.
</note>
</section>
<section id="generator">
<title>The PostScript generator</title>
<p>
The "PSGenerator" class can help writing PostScript files. It deals with things like
escaping, saving/tracking/restoring graphics state, writing DSC comments and tracking of
DSC resources.
</p>
<p>
You will rarely interact with the PS generator itself, as it is probably more interesting
to generate a PostScript file using Java2D which is described in the following section.
</p>
</section>
<section id="java2d">
<title>Java2D: Graphics2D implementation for generating PostScript and EPS</title>
<p>
We provide two classes (PSDocumentGraphics2D and EPSDocumentGraphics2D) which you can use
to generated complete PostScript files using normal Java2D means. The difference between
the two classes is that the EPS variant creates a fully compliant Encapsulated
PostScript file while the PS variant simply creates a normal DSC-compliant level 2
PostScript file. It depends on your requirement which variant you choose. The PS variant
is mostly for printing purposes while the EPS variant is better suited for inclusion in
other documents.
</p>
<section id="creating-eps">
<title>Creating an EPS file</title>
<p>
Creating an EPS file using the Graphics2D implementation is easy. Instantiate
EPSDocumentGraphics2D, set a GraphicContext and set up the output document. Here's an
example:
</p>
<source><![CDATA[
import org.apache.xmlgraphics.java2d.ps.EPSDocumentGraphics2D;
[..]
EPSDocumentGraphics2D g2d = new EPSDocumentGraphics2D(false);
g2d.setGraphicContext(new org.apache.xmlgraphics.java2d.GraphicContext());
//Set up the document size
g2d.setupDocument(out, 400, 200); //400pt x 200pt
//out is the OutputStream to write the EPS to
g2d.drawRect(10, 10, 50, 50); //paint a rectangle using normal Java2D calls
g2d.finish(); //Wrap up and finalize the EPS file
]]></source>
<p>
A complete example for generating an EPS files can be found in the
<a href="http://svn.apache.org/viewvc/xmlgraphics/commons/trunk/examples/java/java2d/ps/">"examples" directory</a>
in the distribution.
</p>
</section>
</section>
<section id="dsc">
<title>DSC parser/processor</title>
<p>
Many PostScript files use special comments to structure a document. This allows manipulation
of PostScript files without interpreting them. These special comments are defined in the
<a href="http://partners.adobe.com/public/developer/en/ps/5001.DSC_Spec.pdf">Document Structuring Conventions</a>.
The code in Commons is designed to work with DSC 3.0. For details on how DSC is used,
please take a look at the DSC specification.
</p>
<p>
The DSC support in Commons was primarily developed to implement resource optimization
features in <a href="ext:fop">Apache FOP</a>'s PostScript output support. Resources like
images which are used repeatedly in a document should not be written to the PostScript
file each time it is used. Instead it is written once at the beginning of the file as a
PostScript form. The form is then called whenever the image needs painting.
</p>
<p>
But the DSC parser could potentially be used for other purposes. The most obvious is
extracting a subset of pages from a DSC-compliant file. Assume you want to print only
page 45 to 57 of a particular document. There's an example that demonstrates exactly this.
Check out the "examples" directory in the distribution. Other potential use cases for the
DSC parser are:
</p>
<ul>
<li>Patching PostScript files, for example, adding OMR marks for automatic packaging</li>
<li><a href="http://en.wikipedia.org/wiki/Imposition">Imposition</a> (2-up, n-up, rotation, etc.)</li>
<li>EPS graphic extraction</li>
<li>Inspecting the page count</li>
<li>etc. etc.</li>
</ul>
<p>
The DSC parser (DSCParser) was designed as a pull parser, i.e. you fetch new events from
the parser inspecting them and acting on them as they are found. If you prefer to work
with a push parser, you can pass the DSCParser a DSCHandler implementation and the parser
will send you all the events.
</p>
<p>
The best example to understand how to use the DSC parser is the PageExtractor class
that implements the page extraction functionality mentioned above.
</p>
<note>
The DSC parser is not considered feature-complete. The basic infrastructure is there but,
for example, not all DSC comments are available as concrete Java classes. If you need
to extend the DSC parser for your own use cases, please send us your patches.
</note>
</section>
</body>
</document>