1 31 32 package org.pdfbox.pdmodel.encryption; 33 34 63 64 public class AccessPermission 65 { 66 67 private static final int DEFAULT_PERMISSIONS = 0xFFFFFFFF ^ 3; private static final int PRINT_BIT = 3; 69 private static final int MODIFICATION_BIT = 4; 70 private static final int EXTRACT_BIT = 5; 71 private static final int MODIFY_ANNOTATIONS_BIT = 6; 72 private static final int FILL_IN_FORM_BIT = 9; 73 private static final int EXTRACT_FOR_ACCESSIBILITY_BIT = 10; 74 private static final int ASSEMBLE_DOCUMENT_BIT = 11; 75 private static final int DEGRADED_PRINT_BIT = 12; 76 77 private int bytes = DEFAULT_PERMISSIONS; 78 79 private boolean readOnly = false; 80 81 private boolean isPermissionBitOn( int bit ) 82 { 83 return (bytes & (1 << (bit-1))) != 0; 84 } 85 86 private boolean setPermissionBit( int bit, boolean value ) 87 { 88 int permissions = bytes; 89 if( value ) 90 { 91 permissions = permissions | (1 << (bit-1)); 92 } 93 else 94 { 95 permissions = permissions & (0xFFFFFFFF ^ (1 << (bit-1))); 96 } 97 bytes = permissions; 98 99 return (bytes & (1 << (bit-1))) != 0; 100 } 101 102 103 109 110 public AccessPermission(byte[] b) 111 { 112 bytes = 0; 113 bytes |= b[0] & 0xFF; 114 bytes <<= 8; 115 bytes |= b[1] & 0xFF; 116 bytes <<= 8; 117 bytes |= b[2] & 0xFF; 118 bytes <<= 8; 119 bytes |= b[3] & 0xFF; 120 } 121 122 128 public boolean isOwnerPermission() 129 { 130 return (this.canAssembleDocument() 131 && this.canExtractContent() 132 && this.canExtractForAccessibility() 133 && this.canFillInForm() 134 && this.canModify() 135 && this.canModifyAnnotations() 136 && this.canPrint() 137 && this.canPrintDegraded() 138 ); 139 } 140 141 145 public AccessPermission() 146 { 147 bytes = DEFAULT_PERMISSIONS; 148 } 149 150 155 156 public static AccessPermission getOwnerAccessPermission() 157 { 158 AccessPermission ret = new AccessPermission(); 159 ret.setCanAssembleDocument(true); 160 ret.setCanExtractContent(true); 161 ret.setCanExtractForAccessibility(true); 162 ret.setCanFillInForm(true); 163 ret.setCanModify(true); 164 ret.setCanModifyAnnotations(true); 165 ret.setCanPrint(true); 166 ret.setCanPrintDegraded(true); 167 return ret; 168 } 169 170 178 179 public int getPermissionBytesForPublicKey() 180 { 181 setPermissionBit(1, true); 182 setPermissionBit(7, false); 183 setPermissionBit(8, false); 184 for(int i=13; i<=32; i++) 185 { 186 setPermissionBit(i, false); 187 } 188 return bytes; 189 } 190 191 198 public int getPermissionBytes() 199 { 200 return bytes; 201 } 202 203 208 public boolean canPrint() 209 { 210 return isPermissionBitOn( PRINT_BIT ); 211 } 212 213 219 public void setCanPrint( boolean allowPrinting ) 220 { 221 if(!readOnly) 222 { 223 setPermissionBit( PRINT_BIT, allowPrinting ); 224 } 225 } 226 227 232 public boolean canModify() 233 { 234 return isPermissionBitOn( MODIFICATION_BIT ); 235 } 236 237 243 public void setCanModify( boolean allowModifications ) 244 { 245 if(!readOnly) 246 { 247 setPermissionBit( MODIFICATION_BIT, allowModifications ); 248 } 249 } 250 251 257 public boolean canExtractContent() 258 { 259 return isPermissionBitOn( EXTRACT_BIT ); 260 } 261 262 269 public void setCanExtractContent( boolean allowExtraction ) 270 { 271 if(!readOnly) 272 { 273 setPermissionBit( EXTRACT_BIT, allowExtraction ); 274 } 275 } 276 277 282 public boolean canModifyAnnotations() 283 { 284 return isPermissionBitOn( MODIFY_ANNOTATIONS_BIT ); 285 } 286 287 293 public void setCanModifyAnnotations( boolean allowAnnotationModification ) 294 { 295 if(!readOnly) 296 { 297 setPermissionBit( MODIFY_ANNOTATIONS_BIT, allowAnnotationModification ); 298 } 299 } 300 301 306 public boolean canFillInForm() 307 { 308 return isPermissionBitOn( FILL_IN_FORM_BIT ); 309 } 310 311 317 public void setCanFillInForm( boolean allowFillingInForm ) 318 { 319 if(!readOnly) 320 { 321 setPermissionBit( FILL_IN_FORM_BIT, allowFillingInForm ); 322 } 323 } 324 325 332 public boolean canExtractForAccessibility() 333 { 334 return isPermissionBitOn( EXTRACT_FOR_ACCESSIBILITY_BIT ); 335 } 336 337 344 public void setCanExtractForAccessibility( boolean allowExtraction ) 345 { 346 if(!readOnly) 347 { 348 setPermissionBit( EXTRACT_FOR_ACCESSIBILITY_BIT, allowExtraction ); 349 } 350 } 351 352 358 public boolean canAssembleDocument() 359 { 360 return isPermissionBitOn( ASSEMBLE_DOCUMENT_BIT ); 361 } 362 363 369 public void setCanAssembleDocument( boolean allowAssembly ) 370 { 371 if(!readOnly) 372 { 373 setPermissionBit( ASSEMBLE_DOCUMENT_BIT, allowAssembly ); 374 } 375 } 376 377 383 public boolean canPrintDegraded() 384 { 385 return isPermissionBitOn( DEGRADED_PRINT_BIT ); 386 } 387 388 395 public void setCanPrintDegraded( boolean allowAssembly ) 396 { 397 if(!readOnly) 398 { 399 setPermissionBit( DEGRADED_PRINT_BIT, allowAssembly ); 400 } 401 } 402 403 409 public void setReadOnly() 410 { 411 readOnly = true; 412 } 413 414 419 420 public boolean isReadOnly() 421 { 422 return readOnly; 423 } 424 } 425 | Popular Tags |