📄 pdfsignatureappearance.java
字号:
loc.add(new PdfNumber(0));
loc.add(new PdfNumber(0));
reference.put(new PdfName("DigestLocation"), loc);
reference.put(new PdfName("DigestMethod"), new PdfName("MD5"));
reference.put(PdfName.DATA, writer.reader.getTrailer().get(PdfName.ROOT));
PdfArray types = new PdfArray();
types.add(reference);
crypto.put(PdfName.REFERENCE, types);
}
/**
* Gets the document bytes that are hashable when using external signatures. The general sequence is:
* preClose(), getRangeStream() and close().
* <p>
* @return the document bytes that are hashable
*/
public InputStream getRangeStream() {
return new PdfSignatureAppearance.RangeStream(raf, bout, range);
}
/**
* Gets the user made signature dictionary. This is the dictionary at the /V key.
* @return the user made signature dictionary
*/
public com.lowagie.text.pdf.PdfDictionary getCryptoDictionary() {
return cryptoDictionary;
}
/**
* Sets a user made signature dictionary. This is the dictionary at the /V key.
* @param cryptoDictionary a user made signature dictionary
*/
public void setCryptoDictionary(com.lowagie.text.pdf.PdfDictionary cryptoDictionary) {
this.cryptoDictionary = cryptoDictionary;
}
/**
* Gets the <CODE>PdfStamper</CODE> associated with this instance.
* @return the <CODE>PdfStamper</CODE> associated with this instance
*/
public com.lowagie.text.pdf.PdfStamper getStamper() {
return stamper;
}
void setStamper(com.lowagie.text.pdf.PdfStamper stamper) {
this.stamper = stamper;
}
/**
* Checks if the document is in the process of closing.
* @return <CODE>true</CODE> if the document is in the process of closing,
* <CODE>false</CODE> otherwise
*/
public boolean isPreClosed() {
return preClosed;
}
/**
* Gets the instance of the standard signature dictionary. This instance
* is only available after pre close.
* <p>
* The main use is to insert external signatures.
* @return the instance of the standard signature dictionary
*/
public com.lowagie.text.pdf.PdfSigGenericPKCS getSigStandard() {
return sigStandard;
}
/**
* Gets the signing contact.
* @return the signing contact
*/
public String getContact() {
return this.contact;
}
/**
* Sets the signing contact.
* @param contact the signing contact
*/
public void setContact(String contact) {
this.contact = contact;
}
/**
* Gets the n2 and n4 layer font.
* @return the n2 and n4 layer font
*/
public Font getLayer2Font() {
return this.layer2Font;
}
/**
* Sets the n2 and n4 layer font. If the font size is zero, auto-fit will be used.
* @param layer2Font the n2 and n4 font
*/
public void setLayer2Font(Font layer2Font) {
this.layer2Font = layer2Font;
}
/**
* Gets the Acrobat 6.0 layer mode.
* @return the Acrobat 6.0 layer mode
*/
public boolean isAcro6Layers() {
return this.acro6Layers;
}
/**
* Acrobat 6.0 and higher recomends that only layer n2 and n4 be present. This method sets that mode.
* @param acro6Layers if <code>true</code> only the layers n2 and n4 will be present
*/
public void setAcro6Layers(boolean acro6Layers) {
this.acro6Layers = acro6Layers;
}
/** Sets the run direction in the n2 and n4 layer.
* @param runDirection the run direction
*/
public void setRunDirection(int runDirection) {
if (runDirection < PdfWriter.RUN_DIRECTION_DEFAULT || runDirection > PdfWriter.RUN_DIRECTION_RTL)
throw new RuntimeException("Invalid run direction: " + runDirection);
this.runDirection = runDirection;
}
/** Gets the run direction.
* @return the run direction
*/
public int getRunDirection() {
return runDirection;
}
/**
* Getter for property signatureEvent.
* @return Value of property signatureEvent.
*/
public SignatureEvent getSignatureEvent() {
return this.signatureEvent;
}
/**
* Sets the signature event to allow modification of the signature dictionary.
* @param signatureEvent the signature event
*/
public void setSignatureEvent(SignatureEvent signatureEvent) {
this.signatureEvent = signatureEvent;
}
/**
* Gets the background image for the layer 2.
* @return the background image for the layer 2
*/
public Image getImage() {
return this.image;
}
/**
* Sets the background image for the layer 2.
* @param image the background image for the layer 2
*/
public void setImage(Image image) {
this.image = image;
}
/**
* Gets the scaling to be applied to the background image.
* @return the scaling to be applied to the background image
*/
public float getImageScale() {
return this.imageScale;
}
/**
* Sets the scaling to be applied to the background image. If it's zero the image
* will fully fill the rectangle. If it's less than zero the image will fill the rectangle but
* will keep the proportions. If it's greater than zero that scaling will be applied.
* In any of the cases the image will always be centered. It's zero by default.
* @param imageScale the scaling to be applied to the background image
*/
public void setImageScale(float imageScale) {
this.imageScale = imageScale;
}
/**
* Commands to draw a yellow question mark in a stream content
*/
public static final String questionMark =
"% DSUnknown\n" +
"q\n" +
"1 G\n" +
"1 g\n" +
"0.1 0 0 0.1 9 0 cm\n" +
"0 J 0 j 4 M []0 d\n" +
"1 i \n" +
"0 g\n" +
"313 292 m\n" +
"313 404 325 453 432 529 c\n" +
"478 561 504 597 504 645 c\n" +
"504 736 440 760 391 760 c\n" +
"286 760 271 681 265 626 c\n" +
"265 625 l\n" +
"100 625 l\n" +
"100 828 253 898 381 898 c\n" +
"451 898 679 878 679 650 c\n" +
"679 555 628 499 538 435 c\n" +
"488 399 467 376 467 292 c\n" +
"313 292 l\n" +
"h\n" +
"308 214 170 -164 re\n" +
"f\n" +
"0.44 G\n" +
"1.2 w\n" +
"1 1 0.4 rg\n" +
"287 318 m\n" +
"287 430 299 479 406 555 c\n" +
"451 587 478 623 478 671 c\n" +
"478 762 414 786 365 786 c\n" +
"260 786 245 707 239 652 c\n" +
"239 651 l\n" +
"74 651 l\n" +
"74 854 227 924 355 924 c\n" +
"425 924 653 904 653 676 c\n" +
"653 581 602 525 512 461 c\n" +
"462 425 441 402 441 318 c\n" +
"287 318 l\n" +
"h\n" +
"282 240 170 -164 re\n" +
"B\n" +
"Q\n";
/**
* Holds value of property contact.
*/
private String contact;
/**
* Holds value of property layer2Font.
*/
private Font layer2Font;
/**
* Holds value of property layer4Text.
*/
private String layer4Text;
/**
* Holds value of property acro6Layers.
*/
private boolean acro6Layers;
/**
* Holds value of property runDirection.
*/
private int runDirection = PdfWriter.RUN_DIRECTION_NO_BIDI;
/**
* Holds value of property signatureEvent.
*/
private SignatureEvent signatureEvent;
/**
* Holds value of property image.
*/
private Image image;
/**
* Holds value of property imageScale.
*/
private float imageScale;
/**
*
*/
private static class RangeStream extends InputStream {
private byte b[] = new byte[1];
private RandomAccessFile raf;
private byte bout[];
private int range[];
private int rangePosition = 0;
private RangeStream(RandomAccessFile raf, byte bout[], int range[]) {
this.raf = raf;
this.bout = bout;
this.range = range;
}
/**
* @see java.io.InputStream#read()
*/
public int read() throws IOException {
int n = read(b);
if (n != 1)
return -1;
return b[0] & 0xff;
}
/**
* @see java.io.InputStream#read(byte[], int, int)
*/
public int read(byte[] b, int off, int len) throws IOException {
if (b == null) {
throw new NullPointerException();
} else if ((off < 0) || (off > b.length) || (len < 0) ||
((off + len) > b.length) || ((off + len) < 0)) {
throw new IndexOutOfBoundsException();
} else if (len == 0) {
return 0;
}
if (rangePosition >= range[range.length - 2] + range[range.length - 1]) {
return -1;
}
for (int k = 0; k < range.length; k += 2) {
int start = range[k];
int end = start + range[k + 1];
if (rangePosition < start)
rangePosition = start;
if (rangePosition >= start && rangePosition < end) {
int lenf = Math.min(len, end - rangePosition);
if (raf == null)
System.arraycopy(bout, rangePosition, b, off, lenf);
else {
raf.seek(rangePosition);
raf.readFully(b, off, lenf);
}
rangePosition += lenf;
return lenf;
}
}
return -1;
}
}
/**
* An interface to retrieve the signature dictionary for modification.
*/
public interface SignatureEvent {
/**
* Allows modification of the signature dictionary.
* @param sig the signature dictionary
*/
public void getSignatureDictionary(PdfDictionary sig);
}
private int certificationLevel = NOT_CERTIFIED;
/**
* Gets the certified status of this document.
* @return the certified status
*/
public int getCertificationLevel() {
return this.certificationLevel;
}
/**
* Sets the document type to certified instead of simply signed.
* @param certificationLevel the values can be: <code>NOT_CERTIFIED</code>, <code>CERTIFIED_NO_CHANGES_ALLOWED</code>,
* <code>CERTIFIED_FORM_FILLING</code> and <code>CERTIFIED_FORM_FILLING_AND_ANNOTATIONS</code>
*/
public void setCertificationLevel(int certificationLevel) {
this.certificationLevel = certificationLevel;
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -