iTextsharp PDF 文档属性
iTextsharp PDF Document Properties
我需要在上传 PDF 过程开始之前检查 PDF 是否具有以下属性,
1) PDF 不应受密码保护
2) PDF 不应具有文档属性 - 页面提取和内容复制以及辅助功能的内容复制不允许。
我可以使用 PdfReader IsEncrypted 属性 检查 PDF 是否受密码保护。但是当 PDF 没有设置安全方法时,我该如何检查上述文档属性。权限仅在文档被加密时才有用。 (使用 iTextsharp dll)
PDF 可以用不同的方式加密。最常见的方法是添加一个或两个密码:
- 所有者密码:每个人都可以打开 PDF,但可能有适当的权限。
- 用户密码:只有知道用户密码或所有者密码的人才能打开文档。
如果有用户密码,iText 无法打开文档,并会抛出 BadPasswordException
:
public static boolean isPasswordProtected(string file) {
try {
PdfReader pdfReader = new PdfReader(file);
return false;
} catch (BadPasswordException bpe) {
return true;
}
}
如果只有一个所有者密码,那么您可以通过设置一个特殊参数来忽略该密码。参见 Can I use iText to merge PDF's with Permissions
PdfReader.unethicalreading = true;
注意PdfReader
也有一个isEncrypted()
方法,参见"iText in Action - Second Edition."
第6章的PageInformation例子
这回答了您问题的第一部分:如何检查 PDF 是否加密?
关于权限:打开受密码保护的 PDF 后,您可以使用 getPermissions()
方法了解哪些权限已到位:
PdfReader pdfReader = new PdfReader(file);
int permissions = pdfReader.getPermissions();
这个int
实际上是一个bitset。 PdfEncryptor
class 有一个方法 getPermissionsVerbose()
解释每一位的含义:
public static String More ...getPermissionsVerbose(int permissions) {
StringBuffer buf = new StringBuffer("Allowed:");
if ((PdfWriter.ALLOW_PRINTING & permissions) == PdfWriter.ALLOW_PRINTING) buf.append(" Printing");
if ((PdfWriter.ALLOW_MODIFY_CONTENTS & permissions) == PdfWriter.ALLOW_MODIFY_CONTENTS) buf.append(" Modify contents");
if ((PdfWriter.ALLOW_COPY & permissions) == PdfWriter.ALLOW_COPY) buf.append(" Copy");
if ((PdfWriter.ALLOW_MODIFY_ANNOTATIONS & permissions) == PdfWriter.ALLOW_MODIFY_ANNOTATIONS) buf.append(" Modify annotations");
if ((PdfWriter.ALLOW_FILL_IN & permissions) == PdfWriter.ALLOW_FILL_IN) buf.append(" Fill in");
if ((PdfWriter.ALLOW_SCREENREADERS & permissions) == PdfWriter.ALLOW_SCREENREADERS) buf.append(" Screen readers");
if ((PdfWriter.ALLOW_ASSEMBLY & permissions) == PdfWriter.ALLOW_ASSEMBLY) buf.append(" Assembly");
if ((PdfWriter.ALLOW_DEGRADED_PRINTING & permissions) == PdfWriter.ALLOW_DEGRADED_PRINTING) buf.append(" Degraded printing");
return buf.toString();
}
例如,如果你想知道是否允许组装,你需要检查PdfWriter.ALLOW_ASSEMBLY & permissions
的值。
我需要在上传 PDF 过程开始之前检查 PDF 是否具有以下属性,
1) PDF 不应受密码保护 2) PDF 不应具有文档属性 - 页面提取和内容复制以及辅助功能的内容复制不允许。
我可以使用 PdfReader IsEncrypted 属性 检查 PDF 是否受密码保护。但是当 PDF 没有设置安全方法时,我该如何检查上述文档属性。权限仅在文档被加密时才有用。 (使用 iTextsharp dll)
PDF 可以用不同的方式加密。最常见的方法是添加一个或两个密码:
- 所有者密码:每个人都可以打开 PDF,但可能有适当的权限。
- 用户密码:只有知道用户密码或所有者密码的人才能打开文档。
如果有用户密码,iText 无法打开文档,并会抛出 BadPasswordException
:
public static boolean isPasswordProtected(string file) {
try {
PdfReader pdfReader = new PdfReader(file);
return false;
} catch (BadPasswordException bpe) {
return true;
}
}
如果只有一个所有者密码,那么您可以通过设置一个特殊参数来忽略该密码。参见 Can I use iText to merge PDF's with Permissions
PdfReader.unethicalreading = true;
注意PdfReader
也有一个isEncrypted()
方法,参见"iText in Action - Second Edition."
这回答了您问题的第一部分:如何检查 PDF 是否加密?
关于权限:打开受密码保护的 PDF 后,您可以使用 getPermissions()
方法了解哪些权限已到位:
PdfReader pdfReader = new PdfReader(file);
int permissions = pdfReader.getPermissions();
这个int
实际上是一个bitset。 PdfEncryptor
class 有一个方法 getPermissionsVerbose()
解释每一位的含义:
public static String More ...getPermissionsVerbose(int permissions) {
StringBuffer buf = new StringBuffer("Allowed:");
if ((PdfWriter.ALLOW_PRINTING & permissions) == PdfWriter.ALLOW_PRINTING) buf.append(" Printing");
if ((PdfWriter.ALLOW_MODIFY_CONTENTS & permissions) == PdfWriter.ALLOW_MODIFY_CONTENTS) buf.append(" Modify contents");
if ((PdfWriter.ALLOW_COPY & permissions) == PdfWriter.ALLOW_COPY) buf.append(" Copy");
if ((PdfWriter.ALLOW_MODIFY_ANNOTATIONS & permissions) == PdfWriter.ALLOW_MODIFY_ANNOTATIONS) buf.append(" Modify annotations");
if ((PdfWriter.ALLOW_FILL_IN & permissions) == PdfWriter.ALLOW_FILL_IN) buf.append(" Fill in");
if ((PdfWriter.ALLOW_SCREENREADERS & permissions) == PdfWriter.ALLOW_SCREENREADERS) buf.append(" Screen readers");
if ((PdfWriter.ALLOW_ASSEMBLY & permissions) == PdfWriter.ALLOW_ASSEMBLY) buf.append(" Assembly");
if ((PdfWriter.ALLOW_DEGRADED_PRINTING & permissions) == PdfWriter.ALLOW_DEGRADED_PRINTING) buf.append(" Degraded printing");
return buf.toString();
}
例如,如果你想知道是否允许组装,你需要检查PdfWriter.ALLOW_ASSEMBLY & permissions
的值。