在某些情况下从PDF提交“无效的服务器响应”

时间:2018-02-15 09:14:28

标签: itext7

我用表单创建了一个PDF。对于某些默认值(到目前为止,我只遇到了希伯来语和俄语中某些值的问题 - 从不使用英语),如果提交了默认值,我会立即收到无效服务器响应错误。从服务器端日志中我看到请求永远不会到达服务器。使用其他默认值(即使在希伯来语中),或者如果手动输入相同的默认值,则提交成功。 以下是设置默认值的代码:

    textfield.setValue(JavaItext.reverseString(params.defval));
    textfield.setDefaultValue(new PdfString(JavaItext.reverseString(params.defval)));
当然,

textfield是一个PdfTextFormField对象。方法reverseString()反转希伯来字符串中字符的顺序。

非常感谢任何帮助。

configure script

1 个答案:

答案 0 :(得分:0)

提交按钮操作JacaScript命令出错,使用了无效的编码名称。

PDF中的JavaScript操作是:

this.submitForm({cURL: "http://asb.aman.co.il:8080/formit/ActiveDocument/FormMonitor", cSubmitAs: "HTML", cCharset: "UTF-8"});

根据Acrobat API Reference的JavaScript,

  

cCharset(可选,Acrobat 6.0)提交值的编码。字符串值   是utf-8utf-16Shift-JISBigFiveGBKUHC

     

如果未通过,则应用当前的Acrobat行为。对于基于XML的格式,   使用utf-8。对于其他格式,Acrobat会尝试查找最佳主机   编码提交的值。

因此,"UTF-8"不是有效值,因此默认行为启动,Adobe Reader确定“最佳主机编码”。在这种情况下,这是一些其他编码,在我的测试中有一些单字节编码。

服务器尝试现在尝试将数据解析为失败的UTF-8编码数据:

  

Apache Tomcat / 6.0.35 - 错误报告

HTTP状态500 -

类型异常报告

消息

描述服务器遇到内部错误(),导致服务器无法完成此请求。

异常

java.lang.StringIndexOutOfBoundsException: String index out of range: -1
    java.lang.String.substring(String.java:1875)
    il.co.aman.apps.Utf8.getUnicode(Utf8.java:113)
    il.co.aman.apps.WebParams._getEntity(WebParams.java:71)
    il.co.aman.apps.WebParams.getEntityParams(WebParams.java:163)
    il.co.aman.formit.FormMonitor.doGet(FormMonitor.java:65)
    il.co.aman.formit.FormMonitor.doPost(FormMonitor.java:370)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
    javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
    filters.SetCharacterEncodingFilter.doFilter(SetCharacterEncodingFilter.java:122)

注意 Apache Tomcat / 6.0.35日志中提供了根本原因的完整堆栈跟踪。

Apache Tomcat / 6.0.35

用有效"UTF-8"替换无效"utf-8"会导致数据按需编码。因此,Web服务现在可以正确解码数据并对其进行处理。

除了在PDF中修复JavaScript之外,您还应该强化您的服务,例如:由

  • 使il.co.aman.apps.Utf8.getUnicode更优雅地失败(在il.co.aman.apps.WebParams.getEntityParams中捕获了一些标记的异常,并在那里用于将检索到的参数标记为由于编码问题而不完整)和
  • 在这种情况下改善il.co.aman.formit.FormMonitor.doGet以做出明智的反应。

此外,你说

  

从服务器端日志中我看到请求从未到达服务器。

要么在请求到达服务器之前有一些代理中断,或者Locale中的Adobe Reader确定不同的“最佳主机编码”,这会导致完全不同的故障,或者您的日志记录开始记录太晚。我也建议对此进行调查,并相应地改进您的日志记录架构。