3

我创建了一个包含两个表单字段的快速 PDF 文件,名字和姓氏(或名字和姓氏),带有提交按钮,并使用以下代码尝试在新的 PDF 文件中填充这些字段:

<cfpdfform action="populate" source="#variables.AbsPath#\test.pdf">
    <cfpdfformparam name="FirstName" value="foo" />
    <cfpdfformparam name="LastName" value="bar" />
</cfpdfform>

但是,我收到此错误:

The system has attempted to use an undefined value, which usually indicates a programming error, either in your code or some system code.
Null Pointers are another name for undefined values.
Platform, Locale, and Platform Name must not be null

我尝试阅读 PDF 文件以确保使用此表单字段是正确的,它们是:

<cfpdfform action="read" source="#variables.AbsPath#\test.pdf" result="fields" />

<cfdump var="#fields#">

结构转储:

FirstName:  [empty string]
LastName:   [empty string]
Submit:     [empty string]

我尝试搜索 Adob​​e 文档和其他一些站点,但找不到此错误的解决方案。我还尝试在 cfpdfform 标记中添加一个“destination”参数以防万一,但得到了相同的结果。PDF 文件确实存在。有任何想法吗?提前致谢。

更新:这是堆栈跟踪:

java.lang.NullPointerException: Platform, Locale, and Platform Name must not be null
at com.adobe.fontengine.fontmanagement.platform.PlatformFontDescription.<init>(Unknown Source)
at com.adobe.fontengine.font.opentype.OpenTypeFont.getPlatformFontDescription(Unknown Source)
at com.adobe.fontengine.font.FontImpl.getPlatformFontDescription(Unknown Source)
at com.adobe.fontengine.font.FontImpl.getPlatformFontDescription(Unknown Source)
at com.adobe.fontengine.fontmanagement.platform.PlatformFontResolverImpl.addFont(Unknown Source)
at com.adobe.internal.pdftoolkit.core.fontset.impl.PDFFontSetImpl.addFont(Unknown Source)
at com.adobe.internal.pdfm.util.FontSetBuilder.loadFontsPath(FontSetBuilder.java:418)
at com.adobe.internal.pdfm.util.FontSetBuilder.loadSystemFonts(FontSetBuilder.java:346)
at com.adobe.internal.pdfm.util.FontSetBuilder.makePDFFontSet(FontSetBuilder.java:239)
at com.adobe.internal.pdfm.util.FontSetBuilder.getPdfFontSet(FontSetBuilder.java:93)
at com.adobe.internal.pdfm.PDFM7Factory.getPdfFontSet(PDFM7Factory.java:97)
at coldfusion.document.DocumentServiceImpl.getAssemblerFontSet(DocumentServiceImpl.java:512)
at coldfusion.pdf.PDFForm.populateFields(PDFForm.java:292)
at coldfusion.tagext.lang.PDFFormTag.doEndTag(PDFFormTag.java:347)
at cfsubmit2ecfm1224790315.runPage(C:\ColdFusion\wwwroot\nVision\projects\test\pdfform\submit.cfm:9)
at coldfusion.runtime.CfJspPage.invoke(CfJspPage.java:231)
at coldfusion.tagext.lang.IncludeTag.doStartTag(IncludeTag.java:416)
at coldfusion.filter.CfincludeFilter.invoke(CfincludeFilter.java:65)
at coldfusion.filter.ApplicationFilter.invoke(ApplicationFilter.java:381)
at coldfusion.filter.RequestMonitorFilter.invoke(RequestMonitorFilter.java:48)
at coldfusion.filter.MonitoringFilter.invoke(MonitoringFilter.java:40)
at coldfusion.filter.PathFilter.invoke(PathFilter.java:94)
at coldfusion.filter.LicenseFilter.invoke(LicenseFilter.java:27)
at coldfusion.filter.ExceptionFilter.invoke(ExceptionFilter.java:70)
at coldfusion.filter.ClientScopePersistenceFilter.invoke(ClientScopePersistenceFilter.java:28)
at coldfusion.filter.BrowserFilter.invoke(BrowserFilter.java:38)
at coldfusion.filter.NoCacheFilter.invoke(NoCacheFilter.java:46)
at coldfusion.filter.GlobalsFilter.invoke(GlobalsFilter.java:38)
at coldfusion.filter.DatasourceFilter.invoke(DatasourceFilter.java:22)
at coldfusion.filter.CachingFilter.invoke(CachingFilter.java:62)
at coldfusion.filter.RequestThrottleFilter.invoke(RequestThrottleFilter.java:126)
at coldfusion.CfmServlet.service(CfmServlet.java:200)
at coldfusion.bootstrap.BootstrapServlet.service(BootstrapServlet.java:89)
at jrun.servlet.FilterChain.doFilter(FilterChain.java:86)
at coldfusion.monitor.event.MonitoringServletFilter.doFilter(MonitoringServletFilter.java:42)
at coldfusion.bootstrap.BootstrapFilter.doFilter(BootstrapFilter.java:46)
at jrun.servlet.FilterChain.doFilter(FilterChain.java:94)
at jrun.servlet.FilterChain.service(FilterChain.java:101)
at jrun.servlet.ServletInvoker.invoke(ServletInvoker.java:106)
at jrun.servlet.JRunInvokerChain.invokeNext(JRunInvokerChain.java:42)
at jrun.servlet.JRunRequestDispatcher.invoke(JRunRequestDispatcher.java:286)
at jrun.servlet.ServletEngineService.dispatch(ServletEngineService.java:543)
at jrun.servlet.jrpp.JRunProxyService.invokeRunnable(JRunProxyService.java:203)
at jrunx.scheduler.ThreadPool$ThreadThrottle.invokeRunnable(ThreadPool.java:428)
at jrunx.scheduler.WorkerThread.run(WorkerThread.java:66)
4

4 回答 4

6

我相信这是正在使用的特定服务器的字体问题。这就是为什么相同的代码将在生产服务器而不是测试服务器上工作的原因。我遇到了同样的问题,虽然我没有很好的解决方案,但这是我学到的。

  1. 堆栈跟踪显示获取OpenType字体的getPlatformFontDescription时出错。
  2. 我们的 Windows 服务器将一些TrueType字体列为OpenType。是你的?
  3. 使用以下代码更正了该问题,但这只是一种解决方法。

    <cfpdf name="local.pdffile" action="read" source="some path" >
    <cfscript>
    local.pdfReader = createObject("java", "com.lowagie.text.pdf.PdfReader").init(tobinary(local.pdffile));
    local.outputStream = createObject("java", "java.io.ByteArrayOutputStream").init();
    local.pdfStamper = createObject("java", "com.lowagie.text.pdf.PdfStamper").init(local.pdfReader,local.outputStream);
    local.Acroform = local.pdfStamper.getAcroFields();
    //Populating Form Fields     
     local.Acroform.setField("Field1",Arguments.Value1);
     local.Acroform.setField("Field2",Arguments.Value2);
     // etc.
     local.pdfStamper.setFormFlattening(true); //optional
      local.pdfStamper.close();
      local.pdfReader.close();
      local.pdffile = local.outputStream.toByteArray();
     </cfscript>
     <!--- flatten="no" must be set or you will get the error again  --->
     <cfpdf action="write" source="local.pdffile" destination="#variables.OutputPath##local.UUID#.pdf" overwrite="yes" flatten="no"  />
    
  4. 更多诊断:使用 Java 子系统简单地列出服务器可用的所有字体也会失败。尝试这个。

     <cfset list=createobject("java","com.adobe.internal.pdfm.util.FontSetBuilder")>
     <cfdump var="#list#">
     <cfset dummy = list.getPdfFontSet()>
     <cfdump var="#dummy.toString()#">
     <!--- this should fail --->
    
  5. 目前,我们已经通过从 Windows\Fonts 文件夹中删除所有字体并隔离损坏的字体来“修复”我们的问题。这很辛苦,但似乎有效。

祝你好运!

于 2012-11-15T21:07:03.057 回答
2

您没有提及您是如何创建 PDF 文件的。根据您创建 PDF 文件的方式,表单域可能包含在子表单中。从 LiveCycle 中的模板生成的 PDF 将执行此操作。默认情况下,LiveCycle 会将子表单命名为“form1”。为了填充这些表单字段,您需要包含 cfpdfsubform 标记。请参阅此处的文档: cfpdfsubform 文档

所以你的代码看起来像这样:

<cfpdfform action="populate" source="#variables.AbsPath#\test.pdf">
    <cfpdfsubform name="form1">
        <cfpdfformparam name="FirstName" value="foo" />
        <cfpdfformparam name="LastName" value="bar" />
    </cfpdfsubform>
</cfpdfform>

您包含的用于阅读 PDF 文件的代码应该会显示这些字段是否包含在子表单中。转储将显示您的表单字段包含在另一个结构中。这将是您在 cfpdfsubform 标记的 name 属性中使用的名称。

HTH。

于 2012-09-04T19:36:01.203 回答
2

我刚刚写了一个脚本来解决这个问题:https ://stackoverflow.com/a/20408559/1223555

这是字体文件没有设置语言环境或平台名称的问题。Coldfusion 中的 PDF 函数称之为

<cfset list=createobject("java","com.adobe.internal.pdfm.util.FontSetBuilder")>
<cfset dummy = list.getPdfFontSet()>

这会枚举每种字体,如果一种字体不好,它会引发异常并终止您的进程。

我的代码列举了 c:\windows\fonts 中的所有字体,然后告诉你那些不好的字体。

以下是我们遇到的问题:

AdobeNaskh-Medium.otf
Mechanical.TTF
msgothic.ttf
MyriadArabic-Bold.otf
MyriadArabic-BoldIt.otf
MyriadArabic-It.otf
MyriadArabic-Regular.otf
于 2013-12-05T19:22:11.420 回答
1

在重新阅读您的问题后,我才意识到我走错了路。我在想您在填充 pdf 中的字段时遇到问题。但你真正的问题是空指针。嗬!很抱歉造成混乱。

通常,该错误告诉您未定义您正在使用的变量。我在您的示例中看到的唯一变量是#variables.AbsPath#。您正在指定变量范围。那是对的吗?变量范围仅在创建它的页面(以及包含的页面)上可用。

您没有包括如何定义该变量。你能分享一下吗?

错误是随机发生还是一直发生?

您确定错误发生在 cfpdfform 行而不是其他地方吗?我会在您的代码周围放置一个 cftry/cfcatch 块并转储 cfcatch 结构以获得更具体的错误。你可以试试然后回帖吗?

于 2012-09-05T14:45:38.160 回答