1 java pdf security itext digest
我搜索一种使用 iText 库(Java)将摘要(字节数组或字符串)插入 PDF 文件的方法。我使用以下方法从字符串创建摘要:
private String crypt(double x, ByteArrayOutputStream baos) throws UnsupportedEncodingException, NoSuchAlgorithmException{
MessageDigest md = MessageDigest.getInstance("SHA-256");
md.update(String.valueOf(x).getBytes("UTF-8"));
md.update(String.valueOf(baos).getBytes("UTF-8"));
byte[] digest = md.digest();
StringBuffer sb = new StringBuffer();
for(byte d:digest){
sb.append(Integer.toHexString(0xFF & d));
}
return sb.toString();
}
Run Code Online (Sandbox Code Playgroud)
摘要不应在 PDF 中看到,但必须将其提取出来进行比较。
此类私有数据可以存储在PieceInfo字典中:
页片词典 (PDF 1.3) 可用于保存私有合格产品数据。数据可以通过页面对象(参见表 30)或表单字典(参见表 95)中的可选PieceInfo条目与页面或表单 XObject 相关联。从 PDF 1.4 开始,私有数据也可以通过文档目录中的PieceInfo条目与 PDF 文档关联(参见表 28)。
(ISO 32000-1第 14.5 节)
在您的情况下,文档目录中的PieceInfo似乎最合适。
使用 iText,您可以在那里存储数据并使用下面的帮助器类再次检索它们DocumentPieceInfo:
PdfName appName = new PdfName("MYAPP");
PdfName dataName = new PdfName("Hash");
DocumentPieceInfo dpi = new DocumentPieceInfo();
PdfReader reader = new PdfReader(...);
dpi.addPieceInfo(reader, appName, dataName, new PdfString(data));
PdfStamper stamper = new PdfStamper(reader, ...);
stamper.close();
Run Code Online (Sandbox Code Playgroud)
PdfName appName = new PdfName("MYAPP");
PdfName dataName = new PdfName("Hash");
DocumentPieceInfo dpi = new DocumentPieceInfo();
PdfReader reader = new PdfReader("target/test-outputs/test-with-piece-info.pdf");
PdfObject myData = dpi.getPieceInfo(reader, appName, dataName);
Run Code Online (Sandbox Code Playgroud)
DocumentPieceInfo类public class DocumentPieceInfo
{
static PdfName PIECE_INFO = new PdfName("PieceInfo");
static PdfName LAST_MODIFIED = new PdfName("LastModified");
static PdfName PRIVATE = new PdfName("Private");
void addPieceInfo(PdfReader reader, PdfName app, PdfName name, PdfObject value)
{
PdfDictionary catalog = reader.getCatalog();
PdfDictionary pieceInfo = catalog.getAsDict(PIECE_INFO);
if (pieceInfo == null)
{
pieceInfo = new PdfDictionary();
catalog.put(PIECE_INFO, pieceInfo);
}
PdfDictionary appData = pieceInfo.getAsDict(app);
if (appData == null)
{
appData = new PdfDictionary();
pieceInfo.put(app, appData);
}
PdfDictionary privateData = appData.getAsDict(PRIVATE);
if (privateData == null)
{
privateData = new PdfDictionary();
appData.put(PRIVATE, privateData);
}
appData.put(LAST_MODIFIED, new PdfDate());
privateData.put(name, value);
}
PdfObject getPieceInfo(PdfReader reader, PdfName app, PdfName name)
{
PdfDictionary catalog = reader.getCatalog();
PdfDictionary pieceInfo = catalog.getAsDict(PIECE_INFO);
if (pieceInfo == null)
return null;
PdfDictionary appData = pieceInfo.getAsDict(app);
if (appData == null)
return null;
PdfDictionary privateData = appData.getAsDict(PRIVATE);
if (privateData == null)
return null;
return privateData.get(name);
}
}
Run Code Online (Sandbox Code Playgroud)
此类假定Private值是一个字典,其中存储了私有数据。不过,它可能是任何东西。要处理其他程序生成的私有数据,您可能需要一些变化。
| 归档时间: |
|
| 查看次数: |
1862 次 |
| 最近记录: |