1.解决pdf含javasprct脚本动作,这里是验证pdf内部事件。相关pdf文件下载:
测试pdf文件
相关包 iTextSharp 5.5.13.4
iTextSharp
csharp
using iTextSharp.text.pdf;
using iTextSharp.text.pdf.parser;
private Boolean IsPdfSafe(Stream stream)
{
// PdfReader reader = new PdfReader(stream);
using (PdfReader reader = new PdfReader(stream))
{
for (int i = 1; i <= reader.NumberOfPages; i++)
{
PdfDictionary pageDic = reader.GetPageN(i);
PdfObject obj = PdfReader.GetPdfObject(pageDic.Get(PdfName.ANNOTS));
if (obj == null || !obj.IsArray())
continue;
PdfArray annots = (PdfArray)obj;
for (int j = 0; j < annots.Size; j++)
{
PdfDictionary annot = annots.GetAsDict(j);
PdfName subtype = annot.GetAsName(PdfName.SUBTYPE);
if (PdfName.LINK.Equals(subtype))
{
PdfDictionary actionDict = annot.GetAsDict(PdfName.A);
if (actionDict != null)
{
PdfObject action = actionDict.Get(PdfName.S);
if (action != null)
{
//可以判断具体哪些事件被拦截,目前已知事件GOTO,URI(连接跳转)
Console.WriteLine("Action found: " + action.ToString());
return false;
}
}
}
}
}
}
return true;
}
//应用的地方 写入缓存比较好,因为是非报错判断成功后可进行保存
csharp
using (MemoryStream memoryStream = new MemoryStream(buffer))
{
if (!IsPdfSafe(memoryStream))
{
//TODO 返回错误信息
}
}
以上就是判断脚本的相关代码。
2.下面介绍一下读取pdf内容的脚本内容,仅做参考。
csharp
for (int i = 1; i <= reader.NumberOfPages; i++)
{
PdfDictionary pageDict = reader.GetPageN(i);
PdfDictionary resourcesDict = pageDict.GetAsDict(PdfName.RESOURCES);
// PdfDictionary ACTION = resourcesDict.GetAsDict(PdfName.ACTION);
// PdfDictionary actionDict = javascriptDict.GetAsDict(PdfName.JAVASCRIPT);
if (resourcesDict != null)
{
PdfDictionary javascriptDict = resourcesDict.GetAsDict(PdfName.JS);
if (javascriptDict != null)
{
PdfDictionary actionDict = javascriptDict.GetAsDict(PdfName.JAVASCRIPT);
if (actionDict != null)
{
return false;
}
}
}
}
除了上面的iTextSharp ,还有itext7也是做pdf相关处理的。iTextSharp 已经停止更新两年了,如果要开发建议用itext7,上述代码进攻参考,因为版本不一样,调用接口也会不一样,开发时候请查相关api具体内容。
代码地址:https://github.com/itext/itextsharp