SignatureOptions.java
/*
* 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.
*/
package org.apache.pdfbox.pdmodel.interactive.digitalsignature;
import java.io.Closeable;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import org.apache.pdfbox.cos.COSDocument;
import org.apache.pdfbox.io.RandomAccessReadBuffer;
import org.apache.pdfbox.io.RandomAccessReadBufferedFile;
import org.apache.pdfbox.io.RandomAccessRead;
import org.apache.pdfbox.pdfparser.PDFParser;
import org.apache.pdfbox.pdmodel.interactive.digitalsignature.visible.PDVisibleSigProperties;
/**
* This contains the visual signature as a COSDocument, its preferred size and the page.
*/
public class SignatureOptions implements Closeable
{
private COSDocument visualSignature;
private int preferredSignatureSize;
private int pageNo;
// the pdf to be read
// this is done analog to PDDocument
private RandomAccessRead pdfSource = null;
public static final int DEFAULT_SIGNATURE_SIZE = 0x2500;
/**
* Creates the default signature options.
*/
public SignatureOptions()
{
pageNo = 0;
}
/**
* Set the 0-based page number.
*
* @param pageNo the page number
*/
public void setPage(int pageNo)
{
this.pageNo = pageNo;
}
/**
* Get the 0-based page number.
*
* @return the page number
*/
public int getPage()
{
return pageNo;
}
/**
* Reads the visual signature from the given file.
*
* @param file the file containing the visual signature
* @throws IOException when something went wrong during parsing
*/
public void setVisualSignature(File file) throws IOException
{
initFromRandomAccessRead(new RandomAccessReadBufferedFile(file));
}
/**
* Reads the visual signature from the given input stream.
*
* @param is the input stream containing the visual signature
* @throws IOException when something went wrong during parsing
*/
public void setVisualSignature(InputStream is) throws IOException
{
initFromRandomAccessRead(new RandomAccessReadBuffer(is));
}
private void initFromRandomAccessRead(RandomAccessRead rar) throws IOException
{
pdfSource = rar;
PDFParser parser = new PDFParser(pdfSource);
visualSignature = parser.parse().getDocument();
}
/**
* Reads the visual signature from the given visual signature properties
*
* @param visSignatureProperties the <code>PDVisibleSigProperties</code> object containing the
* visual signature
*
* @throws IOException when something went wrong during parsing
*/
public void setVisualSignature(PDVisibleSigProperties visSignatureProperties) throws IOException
{
setVisualSignature(visSignatureProperties.getVisibleSignature());
}
/**
* Get the visual signature.
*
* @return the visual signature
*/
public COSDocument getVisualSignature()
{
return visualSignature;
}
/**
* Get the preferred size of the signature.
*
* @return the preferred size of the signature in bytes.
*/
public int getPreferredSignatureSize()
{
return preferredSignatureSize;
}
/**
* Set the preferred size of the signature.
*
* @param size the size of the signature in bytes. Only values above 0 will be considered.
*/
public void setPreferredSignatureSize(int size)
{
if (size > 0)
{
preferredSignatureSize = size;
}
}
/**
* Closes the visual signature COSDocument, if any. Do not call this before you're saved your
* signed PDF document, or saving will fail because COSStream objects held both by the
* COSDocument and by the signed document would no longer be available.
*
* @throws IOException if the document could not be closed
*/
@Override
public void close() throws IOException
{
try
{
if (visualSignature != null)
{
visualSignature.close();
}
}
finally
{
if (pdfSource != null)
{
pdfSource.close();
}
}
}
}