?? overlay.java
字號(hào):
/**
* Copyright (c) 2003, www.pdfbox.org
* All rights reserved.
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice,
* this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright notice,
* this list of conditions and the following disclaimer in the documentation
* and/or other materials provided with the distribution.
* 3. Neither the name of pdfbox; nor the names of its
* contributors may be used to endorse or promote products derived from this
* software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
* AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
* DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY
* DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
* (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
* LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
* SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* http://www.pdfbox.org
*
*/
package org.pdfbox;
import org.pdfbox.cos.COSArray;
import org.pdfbox.cos.COSBase;
import org.pdfbox.cos.COSDictionary;
import org.pdfbox.cos.COSName;
import org.pdfbox.cos.COSStream;
import org.pdfbox.cos.COSInteger;
import org.pdfbox.exceptions.COSVisitorException;
import org.pdfbox.pdfparser.PDFParser;
import org.pdfbox.pdfwriter.COSWriter;
import org.pdfbox.pdmodel.PDDocument;
import org.pdfbox.pdmodel.PDDocumentCatalog;
import org.pdfbox.pdmodel.PDPage;
import org.pdfbox.pdmodel.PDResources;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.ByteArrayOutputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.TreeMap;
import java.util.Map;
/**
* Overlay on document with another one.<br>
* e.g. Overlay an invoice with your company layout<br>
* <br>
* How it (should) work:<br>
* If the document has 10 pages, and the layout 2 the following is the result:<br>
* <pre>
* Document: 1234567890
* Layout : 1212121212
* </pre>
* <br>
*
* @author Mario Ivankovits (mario@ops.co.at)
* @author <a href="ben@benlitchfield.com">Ben Litchfield</a>
*
* @version $Revision: 1.6 $
*/
public class Overlay
{
/**
* COSName constant.
*/
public static final COSName XOBJECT = COSName.getPDFName("XObject");
/**
* COSName constant.
*/
public static final COSName PROC_SET = COSName.getPDFName("ProcSet");
/**
* COSName constant.
*/
public static final COSName EXT_G_STATE = COSName.getPDFName("ExtGState" );
private List layoutPages = new ArrayList(10);
private PDDocument pdfOverlay;
private PDDocument pdfDocument;
private int pageCount = 0;
private COSStream saveGraphicsStateStream;
private COSStream restoreGraphicsStateStream;
/**
* This will overlay a document and write out the results.<br/><br/>
*
* usage: java org.pdfbox.Overlay <overlay.pdf> <document.pdf> <result.pdf>
*
* @param args The command line arguments.
*
* @throws IOException If there is an error reading/writing the document.
* @throws COSVisitorException If there is an error writing the document.
*/
public static void main( String[] args ) throws IOException, COSVisitorException
{
if( args.length != 3 )
{
usage();
System.exit(1);
}
else
{
PDDocument overlay = null;
PDDocument pdf = null;
try
{
overlay = getDocument( args[0] );
pdf = getDocument( args[1] );
Overlay overlayer = new Overlay();
overlayer.overlay( overlay, pdf );
writeDocument( pdf, args[2] );
}
finally
{
if( overlay != null )
{
overlay.close();
}
if( pdf != null )
{
pdf.close();
}
}
}
}
private static void writeDocument( PDDocument pdf, String filename ) throws IOException, COSVisitorException
{
FileOutputStream output = null;
COSWriter writer = null;
try
{
output = new FileOutputStream( filename );
writer = new COSWriter( output );
writer.write( pdf );
}
finally
{
if( writer != null )
{
writer.close();
}
if( output != null )
{
output.close();
}
}
}
private static PDDocument getDocument( String filename ) throws IOException
{
FileInputStream input = null;
PDFParser parser = null;
PDDocument result = null;
try
{
input = new FileInputStream( filename );
parser = new PDFParser( input );
parser.parse();
result = parser.getPDDocument();
}
finally
{
if( input != null )
{
input.close();
}
}
return result;
}
private static void usage()
{
System.err.println( "usage: java " + Overlay.class.getName() + "<overlay.pdf> <document.pdf> <result.pdf>" );
}
/**
* Private class.
*/
private static class LayoutPage
{
private final COSBase contents;
private final COSDictionary res;
private final Map objectNameMap;
/**
* Constructor.
*
* @param contentsValue The contents.
* @param resValue The resource dictionary
* @param objectNameMapValue The map
*/
public LayoutPage(COSBase contentsValue, COSDictionary resValue, Map objectNameMapValue)
{
contents = contentsValue;
res = resValue;
objectNameMap = objectNameMapValue;
}
}
/**
* This will overlay two documents onto each other. The overlay document is
* repeatedly overlayed onto the destination document for every page in the
* destination.
*
* @param overlay The document to copy onto the destination
* @param destination The file that the overlay should be placed on.
*
* @return The destination pdf, same as argument passed in.
*
* @throws IOException If there is an error accessing data.
*/
public PDDocument overlay( PDDocument overlay, PDDocument destination ) throws IOException
{
pdfOverlay = overlay;
pdfDocument = destination;
PDDocumentCatalog overlayCatalog = pdfOverlay.getDocumentCatalog();
collectLayoutPages( overlayCatalog.getAllPages() );
COSDictionary saveGraphicsStateDic = new COSDictionary();
saveGraphicsStateStream = new COSStream( saveGraphicsStateDic, pdfDocument.getDocument().getScratchFile() );
OutputStream saveStream = saveGraphicsStateStream.createUnfilteredStream();
saveStream.write( " q\n".getBytes() );
saveStream.flush();
restoreGraphicsStateStream = new COSStream( saveGraphicsStateDic, pdfDocument.getDocument().getScratchFile() );
OutputStream restoreStream = restoreGraphicsStateStream.createUnfilteredStream();
restoreStream.write( " Q\n".getBytes() );
restoreStream.flush();
PDDocumentCatalog pdfCatalog = pdfDocument.getDocumentCatalog();
processPages( pdfCatalog.getAllPages() );
return pdfDocument;
}
private void collectLayoutPages( List pages) throws IOException
{
Iterator pagesIter = pages.iterator();
while( pagesIter.hasNext() )
{
?? 快捷鍵說(shuō)明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -