Java 使用iText库在pdf中插入隐藏摘要
我使用iText库(Java)搜索将摘要(字节数组或字符串)插入PDF文件的方法。我使用以下方法从字符串创建摘要:Java 使用iText库在pdf中插入隐藏摘要,java,security,pdf,itext,digest,Java,Security,Pdf,Itext,Digest,我使用iText库(Java)搜索将摘要(字节数组或字符串)插入PDF文件的方法。我使用以下方法从字符串创建摘要: private String crypt(double x, ByteArrayOutputStream baos) throws UnsupportedEncodingException, NoSuchAlgorithmException{ MessageDigest md = MessageDigest.getInstance("SHA-256"); md.up
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();
}
该摘要不应以PDF格式显示,但必须将其摘录以供比较 此类私有数据可存储在PieceInfo字典中: 页面词典(PDF 1.3)可用于保存私人合格产品数据。数据可以通过页面对象(见表30)或表单字典(见表95)中可选的PieceInfo条目与页面或表单XObject相关联。从PDF 1.4开始,私人数据也可以通过文档目录中的PieceInfo条目与PDF文档关联(见表28) (第14.5节) 在您的情况下,文档目录中的片段信息似乎最合适 使用iText,您可以在那里存储数据,然后使用下面的
DocumentPieceInfo
helper类再次检索数据:
存储文档PieceInfo数据
检索文档PieceInfo数据
DocumentPieceInfo
helper类
此类假定Private值是一个字典,而私有数据则存储在该字典中。不过,它可能是任何东西。要处理由其他程序生成的私有数据,您可能需要一些变化。此类私有数据可以存储在PieceInfo字典中: 页面词典(PDF 1.3)可用于保存私人合格产品数据。数据可以通过页面对象(见表30)或表单字典(见表95)中可选的PieceInfo条目与页面或表单XObject相关联。从PDF 1.4开始,私人数据也可以通过文档目录中的PieceInfo条目与PDF文档关联(见表28) (第14.5节) 在您的情况下,文档目录中的片段信息似乎最合适 使用iText,您可以在那里存储数据,然后使用下面的
DocumentPieceInfo
helper类再次检索数据:
存储文档PieceInfo数据
检索文档PieceInfo数据
DocumentPieceInfo
helper类
此类假定Private值是一个字典,而私有数据则存储在该字典中。不过,它可能是任何东西。要处理由其他程序生成的私有数据,您可能需要一些变化。
String.valueOf(baos).getBytes(“UTF-8”)
——您确定不实际需要baos.toByteArray()
?此外,关于原来的问题,他说的摘要不应该以PDF格式显示,你的意思是它不应该作为内容的一部分显示?因此,可以访问PDF处理软件吗?谢谢你的帮助,第一部分你有权我现在改变;对于第二部分,是的,摘要不应显示在内容中,但是,是的,应该可以在软件处理中访问String.valueOf(baos).getBytes(“UTF-8”)
——是否确实不需要baos.toByteArray()
?此外,关于原来的问题,他说的摘要不应该以PDF格式显示,你的意思是它不应该作为内容的一部分显示?因此,可以访问PDF处理软件吗?谢谢你的帮助,第一部分你有权我现在改变;对于第二部分,是的,摘要不应该显示在内容中,但是,是的,应该可以在软件处理中访问谢谢,我很快就会证明:)我证明了它,我证明了我要改变更多的东西,但不是将字典保存到pdf文件中。。。我不知道是哪本词典以pdf格式保存…您是否完成了“存储文档片段信息数据”一节中所述的操作非常感谢,我将很快证明:)我证明了这一点,并且我证明了要更改更多内容,但没有将词典保存到pdf文件中。。。我也不知道这本词典是用哪本pdf保存的……你做了“存储文档片段信息数据”一节中描述的事情了吗
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();
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);
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);
}
}