У меня есть код на C#, который извлекает все вложения из PDF-файлов. Он отлично работает, даже если он прикреплен к уровню документа или в виде аннотации файла.Как извлечь приложение из PDF с цифровой подписью?
Однако, если я в цифровом виде подпишу (и временную метку) этих файлов PDF, тип вложения изменяется от аннотации (или прикрепления файла) до «виджета» или чего-то еще. Я не эксперт по pdf, и я не смог найти какой-либо метод для извлечения вложений, если PDF подписан.
Любая помощь оценена!
[EDIT]
образца без подписи: samplepdf_notsigned.pdf
образца с подписью (подписанного с SetaPDF-синьора API): samplepdf_signed.pdf
Вложенные блоки являются следующие:
/*
* annotations
*/
iTextSharp.text.pdf.PdfReader reader = new iTextSharp.text.pdf.PdfReader("samplepdf_annotations.pdf");
for (int i = 1; i <= reader.NumberOfPages; i++)
{
iTextSharp.text.pdf.PdfArray array = reader.GetPageN(i).GetAsArray(iTextSharp.text.pdf.PdfName.ANNOTS);
if (array == null) continue;
for (int j = 0; j < array.Size; j++)
{
iTextSharp.text.pdf.PdfDictionary annot = array.GetAsDict(j);
if (iTextSharp.text.pdf.PdfName.FILEATTACHMENT.Equals(annot.GetAsName(iTextSharp.text.pdf.PdfName.SUBTYPE)))
{
iTextSharp.text.pdf.PdfDictionary fs = annot.GetAsDict(iTextSharp.text.pdf.PdfName.FS);
iTextSharp.text.pdf.PdfDictionary refs = fs.GetAsDict(iTextSharp.text.pdf.PdfName.EF);
foreach (iTextSharp.text.pdf.PdfName name in refs.Keys)
{
// I CAN GET THE ATTACHMENT HERE
string filename = fs.GetAsString(name).ToString();
byte[] binary = iTextSharp.text.pdf.PdfReader.GetStreamBytes((iTextSharp.text.pdf.PRStream)refs.GetAsStream(name));
}
}
else
{
iTextSharp.text.pdf.PdfDictionary fs = annot.GetAsDict(iTextSharp.text.pdf.PdfName.FS);
iTextSharp.text.pdf.PdfDictionary refs = fs.GetAsDict(iTextSharp.text.pdf.PdfName.EF);
foreach (iTextSharp.text.pdf.PdfName name in refs.Keys)
{
// I CAN GET THE ATTACHMENT HERE
string filename = fs.GetAsString(name).ToString();
byte[] binary = iTextSharp.text.pdf.PdfReader.GetStreamBytes((iTextSharp.text.pdf.PRStream)refs.GetAsStream(name));
}
}
}
}
/*
* embedded level
*/
iTextSharp.text.pdf.PdfReader reader = new iTextSharp.text.pdf.PdfReader("samplepdf_embedded.pdf");
iTextSharp.text.pdf.PdfDictionary root = reader.Catalog;
iTextSharp.text.pdf.PdfDictionary documentnames = root.GetAsDict(iTextSharp.text.pdf.PdfName.NAMES);
iTextSharp.text.pdf.PdfDictionary embeddedfiles = documentnames.GetAsDict(iTextSharp.text.pdf.PdfName.EMBEDDEDFILES);
iTextSharp.text.pdf.PdfArray filespecs = embeddedfiles.GetAsArray(iTextSharp.text.pdf.PdfName.NAMES);
for (int i = 0; i < filespecs.Size;) {
filespecs.GetAsString(i++);
iTextSharp.text.pdf.PdfDictionary filespec = filespecs.GetAsDict(i++);
iTextSharp.text.pdf.PdfDictionary refs = filespec.GetAsDict(iTextSharp.text.pdf.PdfName.EF);
foreach (iTextSharp.text.pdf.PdfName key in refs.Keys)
{
iTextSharp.text.pdf.PRStream stream = (iTextSharp.text.pdf.PRStream)iTextSharp.text.pdf.PdfReader.GetPdfObject(refs.GetAsIndirectObject(key));
// I CAN GET THE ATTACHMENT HERE
string filename = filespec.GetAsString(key).ToString();
byte[] binary = iTextSharp.text.pdf.PdfReader.GetStreamBytes(stream);
}
}
Вы должны предоставить дополнительную информацию. Например. как ваш текущий код извлекает вложения? Как вы подписываете и помечены в формате PDF? Кроме того, могут помочь образцы документов (как без знака, так и подписи). – mkl
Сообщение отредактировано, я добавил свой код и некоторые примеры файлов PDF. Благодаря! – aboy
А что именно происходит? Я предполагаю нулевой доступ? – mkl