Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/435.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
itext7-itext7中pdfReader类中getJavascript的等效方法_Javascript_Itext_Itext7 - Fatal编程技术网

itext7-itext7中pdfReader类中getJavascript的等效方法

itext7-itext7中pdfReader类中getJavascript的等效方法,javascript,itext,itext7,Javascript,Itext,Itext7,在itext7的pdf阅读器中是否有任何等效的getJavascript方法?我们正在寻找使用itext7清理pdf文档中的恶意内容。据我所知,在iText 7中没有专门的方法 但是,从本质上讲,旧的PdfReader.getJavaScript方法只是查找JavaScript名称树并将所有值放入字符串缓冲区 您可以在iText 7中这样输出这些值: PdfNameTree javascript = pdfDocument.getCatalog().getNameTree(PdfName.Jav

在itext7的pdf阅读器中是否有任何等效的getJavascript方法?我们正在寻找使用itext7清理pdf文档中的恶意内容。

据我所知,在iText 7中没有专门的方法

但是,从本质上讲,旧的PdfReader.getJavaScript方法只是查找JavaScript名称树并将所有值放入字符串缓冲区

您可以在iText 7中这样输出这些值:

PdfNameTree javascript = pdfDocument.getCatalog().getNameTree(PdfName.JavaScript);
Map<String, PdfObject> objs2 = javascript.getNames();
for (Map.Entry<String, PdfObject> entry : objs2.entrySet())
{
    System.out.println();
    System.out.println(entry.getKey());
    System.out.println();

    PdfObject object = entry.getValue();
    if (object.isDictionary()) {
        object = ((PdfDictionary)object).get(PdfName.JS);
        if (object.isString()) {
            System.out.println(((PdfString)object).getValue());
        } else if (object.isStream()) {
            System.out.println(new String(((PdfStream)object).getBytes()));
        }
    }

    System.out.println();
}

JavaScript弹出窗口在这里可以清楚地视为app.alert调用。因此,我无法重现这个问题。

据我所知,iText 7中没有专门的方法

但是,从本质上讲,旧的PdfReader.getJavaScript方法只是查找JavaScript名称树并将所有值放入字符串缓冲区

您可以在iText 7中这样输出这些值:

PdfNameTree javascript = pdfDocument.getCatalog().getNameTree(PdfName.JavaScript);
Map<String, PdfObject> objs2 = javascript.getNames();
for (Map.Entry<String, PdfObject> entry : objs2.entrySet())
{
    System.out.println();
    System.out.println(entry.getKey());
    System.out.println();

    PdfObject object = entry.getValue();
    if (object.isDictionary()) {
        object = ((PdfDictionary)object).get(PdfName.JS);
        if (object.isString()) {
            System.out.println(((PdfString)object).getValue());
        } else if (object.isStream()) {
            System.out.println(new String(((PdfStream)object).getBytes()));
        }
    }

    System.out.println();
}

JavaScript弹出窗口在这里可以清楚地视为app.alert调用。因此,我无法重现这个问题。

对于任何能够使用iText 7.1.1或更新版本的人,我希望mkl的解决方案会更好。如果您被迫像我一样使用iText 7.0.5,以下内容适用于我的参考PDF:

    private static boolean hasJavascript(PdfDocument pdfDoc, String theFile) {
      int n = pdfDoc.getNumberOfPages();
      for (int i = 1; i <= n; i++) {
        PdfPage pdfPage = pdfDoc.getPage(i);
        List<PdfAnnotation> annotList = pdfPage.getAnnotations();
        if (ListUtility.hasData(annotList)) {
          for (PdfAnnotation annot : annotList) {
            if (annot.getSubtype().equals(PdfName.Link)) {
              continue;
            }
            PdfDictionary annotationAction = annot.getPdfObject().getAsDictionary(PdfName.A);
            if (annotationAction != null && PdfName.JavaScript.equals(annotationAction.get(PdfName.S))) {
              PdfString javascript = annotationAction.getAsString(PdfName.JS);
              if (StringUtility.hasData(javascript.getValue())) {
                log.debug("JavaScript found in PDF on page " + i);
                log.trace(javascript.getValue());
                return true;
              }
            }
          }
        }
      }
      String javaScriptInPdf = getJavaScriptFromPdfDocument(pdfDoc);
      if (StringUtility.hasData(javaScriptInPdf)) {
        log.debug("JavaScript found using iText 7");
        log.trace(javaScriptInPdf);
        return true;
      }
      log.debug("JavaScript not found in PDF");
      return false;
    }
    //
    private static String getJavaScriptFromPdfDocument(PdfDocument pdfDoc) {
      StringBuilder strBuf = new StringBuilder();
      try {
        PdfDictionary pdfDictionaryCatalog = pdfDoc.getCatalog().getPdfObject();
        if (pdfDictionaryCatalog == null) {
          log.trace("getJavaScriptFromPdfDocument(): pdfDictionaryCatalog null; return null");
          return null;
        }
        PdfDictionary pdfDictionaryNames = pdfDictionaryCatalog.getAsDictionary(PdfName.Names);
        if (pdfDictionaryNames == null) {
          log.trace("getJavaScriptFromPdfDocument(): PdfDictionary for PdfName.Names null; return null");
          return null;
        }
        PdfDictionary pdfDictionaryJavaScript = pdfDictionaryNames.getAsDictionary(PdfName.JavaScript);
        if (pdfDictionaryJavaScript == null) {
          log.trace("getJavaScriptFromPdfDocument(): PdfDictionary for PdfName.JavaScript null; return null");
          return null;
        }
        Set<Entry<PdfName, PdfObject>> set = pdfDictionaryJavaScript.entrySet();
        for (Entry<PdfName, PdfObject> pdfObjectEntry : set) {
          PdfObject pdfObj = pdfObjectEntry.getValue();
          if (pdfObj.isDictionary()) {
            getJavaScriptFromPdfDictionary((PdfDictionary)pdfObj, strBuf);
          } else if (pdfObj.isArray()) {
            getJavaScriptFromPdfArray((PdfArray)pdfObj, strBuf);
          } else if (pdfObj.isString() && pdfObjectEntry.getKey().getValue().equals(PdfName.JS.getValue())) {
            strBuf.append(((PdfString) pdfObj).getValue());
          }
        }
      }
      catch (Exception e) {
        log.debug(e,e);
      }
      return strBuf.toString();
    }
    //
    private static void getJavaScriptFromPdfArray(PdfArray pdfArray, StringBuilder strBuf) {
      if (pdfArray == null) {
        return;
      }
      for (PdfObject pdfObj : pdfArray) {
        // To get same output as getJavaScriptUsingiText559(), not appending String values found in array to strBuf
        if (pdfObj == null) {
          continue;
        }
        else if (pdfObj.isDictionary()) {
          getJavaScriptFromPdfDictionary((PdfDictionary)pdfObj, strBuf);
        }
        else if (pdfObj.isArray()) {
          getJavaScriptFromPdfArray((PdfArray)pdfObj, strBuf);
        }
      }
    }
    //
    private static void getJavaScriptFromPdfDictionary(PdfDictionary pdfDict, StringBuilder strBuf) {
      if (pdfDict == null) {
        return;
      }
      PdfObject pdfObj = pdfDict.get(PdfName.JS);
      if (pdfObj == null) {
        return;
      }
      if (pdfObj.isString()) {
        strBuf.append(((PdfString) pdfObj).getValue());
      }
      else if (pdfObj.isStream()) {
        strBuf.append(getStringFromPdfStream((PdfStream) pdfObj, TRUNCATE_PDF_STREAM_AT));
      }
      else if (pdfObj.isDictionary()) {
        getJavaScriptFromPdfDictionary((PdfDictionary) pdfObj, strBuf);
      }
      else if (pdfObj.isArray()) {
       getJavaScriptFromPdfArray((PdfArray)pdfObj, strBuf);
      }
    }

对于任何能够使用iText 7.1.1或更新版本的人,我希望mkl的解决方案会更好。如果您被迫像我一样使用iText 7.0.5,以下内容适用于我的参考PDF:

    private static boolean hasJavascript(PdfDocument pdfDoc, String theFile) {
      int n = pdfDoc.getNumberOfPages();
      for (int i = 1; i <= n; i++) {
        PdfPage pdfPage = pdfDoc.getPage(i);
        List<PdfAnnotation> annotList = pdfPage.getAnnotations();
        if (ListUtility.hasData(annotList)) {
          for (PdfAnnotation annot : annotList) {
            if (annot.getSubtype().equals(PdfName.Link)) {
              continue;
            }
            PdfDictionary annotationAction = annot.getPdfObject().getAsDictionary(PdfName.A);
            if (annotationAction != null && PdfName.JavaScript.equals(annotationAction.get(PdfName.S))) {
              PdfString javascript = annotationAction.getAsString(PdfName.JS);
              if (StringUtility.hasData(javascript.getValue())) {
                log.debug("JavaScript found in PDF on page " + i);
                log.trace(javascript.getValue());
                return true;
              }
            }
          }
        }
      }
      String javaScriptInPdf = getJavaScriptFromPdfDocument(pdfDoc);
      if (StringUtility.hasData(javaScriptInPdf)) {
        log.debug("JavaScript found using iText 7");
        log.trace(javaScriptInPdf);
        return true;
      }
      log.debug("JavaScript not found in PDF");
      return false;
    }
    //
    private static String getJavaScriptFromPdfDocument(PdfDocument pdfDoc) {
      StringBuilder strBuf = new StringBuilder();
      try {
        PdfDictionary pdfDictionaryCatalog = pdfDoc.getCatalog().getPdfObject();
        if (pdfDictionaryCatalog == null) {
          log.trace("getJavaScriptFromPdfDocument(): pdfDictionaryCatalog null; return null");
          return null;
        }
        PdfDictionary pdfDictionaryNames = pdfDictionaryCatalog.getAsDictionary(PdfName.Names);
        if (pdfDictionaryNames == null) {
          log.trace("getJavaScriptFromPdfDocument(): PdfDictionary for PdfName.Names null; return null");
          return null;
        }
        PdfDictionary pdfDictionaryJavaScript = pdfDictionaryNames.getAsDictionary(PdfName.JavaScript);
        if (pdfDictionaryJavaScript == null) {
          log.trace("getJavaScriptFromPdfDocument(): PdfDictionary for PdfName.JavaScript null; return null");
          return null;
        }
        Set<Entry<PdfName, PdfObject>> set = pdfDictionaryJavaScript.entrySet();
        for (Entry<PdfName, PdfObject> pdfObjectEntry : set) {
          PdfObject pdfObj = pdfObjectEntry.getValue();
          if (pdfObj.isDictionary()) {
            getJavaScriptFromPdfDictionary((PdfDictionary)pdfObj, strBuf);
          } else if (pdfObj.isArray()) {
            getJavaScriptFromPdfArray((PdfArray)pdfObj, strBuf);
          } else if (pdfObj.isString() && pdfObjectEntry.getKey().getValue().equals(PdfName.JS.getValue())) {
            strBuf.append(((PdfString) pdfObj).getValue());
          }
        }
      }
      catch (Exception e) {
        log.debug(e,e);
      }
      return strBuf.toString();
    }
    //
    private static void getJavaScriptFromPdfArray(PdfArray pdfArray, StringBuilder strBuf) {
      if (pdfArray == null) {
        return;
      }
      for (PdfObject pdfObj : pdfArray) {
        // To get same output as getJavaScriptUsingiText559(), not appending String values found in array to strBuf
        if (pdfObj == null) {
          continue;
        }
        else if (pdfObj.isDictionary()) {
          getJavaScriptFromPdfDictionary((PdfDictionary)pdfObj, strBuf);
        }
        else if (pdfObj.isArray()) {
          getJavaScriptFromPdfArray((PdfArray)pdfObj, strBuf);
        }
      }
    }
    //
    private static void getJavaScriptFromPdfDictionary(PdfDictionary pdfDict, StringBuilder strBuf) {
      if (pdfDict == null) {
        return;
      }
      PdfObject pdfObj = pdfDict.get(PdfName.JS);
      if (pdfObj == null) {
        return;
      }
      if (pdfObj.isString()) {
        strBuf.append(((PdfString) pdfObj).getValue());
      }
      else if (pdfObj.isStream()) {
        strBuf.append(getStringFromPdfStream((PdfStream) pdfObj, TRUNCATE_PDF_STREAM_AT));
      }
      else if (pdfObj.isDictionary()) {
        getJavaScriptFromPdfDictionary((PdfDictionary) pdfObj, strBuf);
      }
      else if (pdfObj.isArray()) {
       getJavaScriptFromPdfArray((PdfArray)pdfObj, strBuf);
      }
    }

我知道这是一个非常古老的线程,仍然共享我的代码来添加一些东西,在mkl和James编写的内容之上

// iText V 7.0.2
//To get javascript that is added through OpenAction
PdfDocument srcPdf = new PdfDocument(new PdfReader(srcFilePath));
        PdfDictionary pdfDictionaryCatalog = srcPdf.getCatalog().getPdfObject();
        PdfDictionary namesDictionary = pdfDictionaryCatalog.getAsDictionary(PdfName.OpenAction);
        if(namesDictionary != null) {
            PdfObject pdfObj = namesDictionary.get(PdfName.JS);
            if(pdfObj != null) {
                StringBuilder strBuf = new StringBuilder();
                if (pdfObj.isDictionary()) {
                    getJavaScriptFromPdfDictionary((PdfDictionary)pdfObj, strBuf);
                }else if (pdfObj.isArray()) {
                    getJavaScriptFromPdfArray((PdfArray)pdfObj, strBuf);
                } else if (pdfObj.isString()) {
                    strBuf.append(((PdfString) pdfObj).getValue());
                }
                System.out.println("*****OPENACTION****** "+strBuf.toString());
            }
        }
// To get java script available from NAMES dictionary 

namesDictionary = pdfDictionaryCatalog.getAsDictionary(PdfName.Names);
        if(namesDictionary != null) {
            PdfDictionary javascriptDictionary = namesDictionary.getAsDictionary(PdfName.JavaScript);
            if(javascriptDictionary != null) {
                StringBuilder strBuf = new StringBuilder();
                Set<Entry<PdfName, PdfObject>> set = javascriptDictionary.entrySet();
                for (Entry<PdfName, PdfObject> entry : set) {
                    PdfObject pdfObj = entry.getValue();
                    if (pdfObj.isDictionary()) {
                        getJavaScriptFromPdfDictionary((PdfDictionary)pdfObj, strBuf);
                    }else if (pdfObj.isArray()) {
                        getJavaScriptFromPdfArray((PdfArray)pdfObj, strBuf);
                    } else if (pdfObj.isString() && entry.getKey().getValue().equals(PdfName.JS.getValue())) {
                        strBuf.append(((PdfString) pdfObj).getValue());
                    }
                }
                System.out.println("*****JAVASCRIPT****** "+strBuf.toString());
            }
        }
// To get java script from name tree JAVASCRIPT
PdfNameTree nameTree = srcPdf.getCatalog().getNameTree(PdfName.JavaScript);
        if(nameTree != null) {
            Map<String, PdfObject> objs = nameTree.getNames();
            if(objs != null) {
                StringBuilder strBuf = new StringBuilder();
                for (Entry<String, PdfObject> entry : objs.entrySet()) {
                    PdfObject pdfObj = entry.getValue();
                    if (pdfObj.isDictionary()) {
                        getJavaScriptFromPdfDictionary((PdfDictionary)pdfObj, strBuf);
                    }else if (pdfObj.isArray()) {
                        getJavaScriptFromPdfArray((PdfArray)pdfObj, strBuf);
                    } else if (pdfObj.isString() && entry.getKey().equals(PdfName.JS.getValue())) {
                        strBuf.append(((PdfString) pdfObj).getValue());
                    }
                }
                System.out.println("*****JAVASCRIPT NAMED TREE****** "+strBuf.toString());
            }
        }
// To get java script at the annotation action level
for (int i = 1; i <= srcPdf.getNumberOfPages(); i++) {
            PdfPage page = srcPdf.getPage(i);
            List<PdfAnnotation> annotList = page.getAnnotations();
            if(annotList != null) {
                for (PdfAnnotation pdfAnnotation : annotList) {
                    if(pdfAnnotation.getPdfObject() != null) {
                        PdfDictionary annotationAction = pdfAnnotation.getPdfObject().getAsDictionary(PdfName.A);
                        if (annotationAction != null && PdfName.JavaScript.equals(annotationAction.get(PdfName.S))) {
                            PdfString javascript = annotationAction.getAsString(PdfName.JS);
                            if(javascript != null) {
                                System.out.println("ANNOTATION "+javascript); 
                            }
                        }
                    }
                }
            }
        }
/*getJavaScriptFromPdfDictionary() and getJavaScriptFromPdfArray() methods are the same from James answer. */

我知道这是一个非常古老的线程,仍然共享我的代码来添加一些东西,在mkl和James编写的内容之上

// iText V 7.0.2
//To get javascript that is added through OpenAction
PdfDocument srcPdf = new PdfDocument(new PdfReader(srcFilePath));
        PdfDictionary pdfDictionaryCatalog = srcPdf.getCatalog().getPdfObject();
        PdfDictionary namesDictionary = pdfDictionaryCatalog.getAsDictionary(PdfName.OpenAction);
        if(namesDictionary != null) {
            PdfObject pdfObj = namesDictionary.get(PdfName.JS);
            if(pdfObj != null) {
                StringBuilder strBuf = new StringBuilder();
                if (pdfObj.isDictionary()) {
                    getJavaScriptFromPdfDictionary((PdfDictionary)pdfObj, strBuf);
                }else if (pdfObj.isArray()) {
                    getJavaScriptFromPdfArray((PdfArray)pdfObj, strBuf);
                } else if (pdfObj.isString()) {
                    strBuf.append(((PdfString) pdfObj).getValue());
                }
                System.out.println("*****OPENACTION****** "+strBuf.toString());
            }
        }
// To get java script available from NAMES dictionary 

namesDictionary = pdfDictionaryCatalog.getAsDictionary(PdfName.Names);
        if(namesDictionary != null) {
            PdfDictionary javascriptDictionary = namesDictionary.getAsDictionary(PdfName.JavaScript);
            if(javascriptDictionary != null) {
                StringBuilder strBuf = new StringBuilder();
                Set<Entry<PdfName, PdfObject>> set = javascriptDictionary.entrySet();
                for (Entry<PdfName, PdfObject> entry : set) {
                    PdfObject pdfObj = entry.getValue();
                    if (pdfObj.isDictionary()) {
                        getJavaScriptFromPdfDictionary((PdfDictionary)pdfObj, strBuf);
                    }else if (pdfObj.isArray()) {
                        getJavaScriptFromPdfArray((PdfArray)pdfObj, strBuf);
                    } else if (pdfObj.isString() && entry.getKey().getValue().equals(PdfName.JS.getValue())) {
                        strBuf.append(((PdfString) pdfObj).getValue());
                    }
                }
                System.out.println("*****JAVASCRIPT****** "+strBuf.toString());
            }
        }
// To get java script from name tree JAVASCRIPT
PdfNameTree nameTree = srcPdf.getCatalog().getNameTree(PdfName.JavaScript);
        if(nameTree != null) {
            Map<String, PdfObject> objs = nameTree.getNames();
            if(objs != null) {
                StringBuilder strBuf = new StringBuilder();
                for (Entry<String, PdfObject> entry : objs.entrySet()) {
                    PdfObject pdfObj = entry.getValue();
                    if (pdfObj.isDictionary()) {
                        getJavaScriptFromPdfDictionary((PdfDictionary)pdfObj, strBuf);
                    }else if (pdfObj.isArray()) {
                        getJavaScriptFromPdfArray((PdfArray)pdfObj, strBuf);
                    } else if (pdfObj.isString() && entry.getKey().equals(PdfName.JS.getValue())) {
                        strBuf.append(((PdfString) pdfObj).getValue());
                    }
                }
                System.out.println("*****JAVASCRIPT NAMED TREE****** "+strBuf.toString());
            }
        }
// To get java script at the annotation action level
for (int i = 1; i <= srcPdf.getNumberOfPages(); i++) {
            PdfPage page = srcPdf.getPage(i);
            List<PdfAnnotation> annotList = page.getAnnotations();
            if(annotList != null) {
                for (PdfAnnotation pdfAnnotation : annotList) {
                    if(pdfAnnotation.getPdfObject() != null) {
                        PdfDictionary annotationAction = pdfAnnotation.getPdfObject().getAsDictionary(PdfName.A);
                        if (annotationAction != null && PdfName.JavaScript.equals(annotationAction.get(PdfName.S))) {
                            PdfString javascript = annotationAction.getAsString(PdfName.JS);
                            if(javascript != null) {
                                System.out.println("ANNOTATION "+javascript); 
                            }
                        }
                    }
                }
            }
        }
/*getJavaScriptFromPdfDictionary() and getJavaScriptFromPdfArray() methods are the same from James answer. */

我和苏希玛有同样的问题。下面来自mkl的回答没有在我想要拒绝的样本PDF中找到JavaScript,该样本在打开PDF时有JavaScript弹出窗口。无可否认,PDF在Adobe PreFlight中运行时确实有一些警告。然而,我正试图挫败那些积极试图绕过我支票的人!mkl的解决方案使用iText 7.1.1工作。我无法使用7.0.6让它为我的测试PDF工作。我有与Sushma相同的问题。下面来自mkl的回答没有在我想要拒绝的样本PDF中找到JavaScript,该样本在打开PDF时有JavaScript弹出窗口。无可否认,PDF在Adobe PreFlight中运行时确实有一些警告。然而,我正试图挫败那些积极试图绕过我支票的人!mkl的解决方案使用iText 7.1.1工作。我无法使用7.0.6.mkl将其用于我的测试PDF,我尝试使用并扩展了您的答案,但无法检测到当我打开一个示例PDF时触发的JavaScript弹出窗口,该示例PDF由于所述JavaScript而想要拒绝。这是PDF中的嵌入对象。有什么建议吗?19 0 obj>endobj 20 0 objFYI,同样的PDF在iText5中使用getJavaScript被拒绝。感谢您能抽出时间提供帮助。@James您在同一个PDF中被拒绝是什么意思?在iText5中使用getJavaScript被拒绝了?也就是说,上面的代码返回与iText 5方法相同的数据:JavaScript名称树中的所有内容。这并不是pdf包含的全部JavaScript。如果你认为你找到了一个结果不同的文件,请共享该文件-我需要它进行分析。谢谢你的时间。我的意思是JavaScript在getJavaScript中被识别,所以我可以拒绝PDF。我没有访问公共服务器来发布链接,也不知道如何在这里上传。你愿意给我一个电子邮件地址吗?请发送至tmp_2018-stackoverflow@yahoo.com@James你会在my.mkl中找到一个地址,我尝试使用并扩展了你的答案,但无法检测到当我打开一个示例PDF时触发的JavaScript弹出窗口,该示例PDF由于所述JavaScript而想要拒绝。这是PDF中的嵌入对象。有什么建议吗?19 0 obj>endobj 20 0 objFYI,同样的PDF在iText5中使用getJavaScript被拒绝。感谢您能抽出时间提供帮助。@James您在同一个PDF中被拒绝是什么意思?在iText5中使用getJavaScript被拒绝了?也就是说,上面的代码返回与iText 5方法相同的数据:JavaScript名称树中的所有内容。这并不是pdf包含的全部JavaScript。如果你认为你找到了一个结果不同的文件,请共享该文件-我需要它进行分析。谢谢你的时间。我的意思是JavaScript在getJavaScript中被识别,所以我可以拒绝PDF。我没有访问公共服务器来发布链接,也不知道如何在这里上传。你愿意给我一个电子邮件地址吗?请发送至tmp_2018-stackoverflow@yahoo.com@詹姆斯,你可以在我的邮箱里找到地址。