ColdFusion CFPDFFORM не заполняет поля формы PDF
Я создал быстрый PDF-файл с двумя полями формы, именем и фамилией (или FirstName и LastName), с помощью кнопки "Отправить" и использовал следующий код, чтобы попытаться заполнить эти поля в новом 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]
Я попытался выполнить поиск в документации Adobe и вокруг некоторых других сайтов, но не могу найти решение этой ошибки. Я также попытался добавить параметр "destination" в тег cfpdfform, если это было необходимо, но получил тот же результат. Файл 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 ответа
Я считаю, что это проблема шрифта с конкретным используемым сервером. Вот почему один и тот же код будет работать на рабочем сервере, а не на тестовом сервере. Я испытываю ту же проблему, и хотя у меня нет отличного решения, вот что я узнал.
- Трассировка стека показывает, что при получении getPlatformFontDescription шрифта OpenType произошла ошибка.
- Наш сервер Windows перечисляет некоторые шрифты TrueType как OpenType. Твой?
Использование следующего кода исправило проблему, но это только обходной путь.
<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" />
Дополнительная диагностика: просто перечислить все шрифты, доступные серверу с помощью подсистемы 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 --->
На данный момент мы "исправили" нашу проблему, удалив все шрифты из папки Windows\Fonts и изолировав поврежденные. Это кропотливо, но, кажется, работает.
Удачи!
Я только что написал скрипт для решения этой проблемы здесь: /questions/12929356/oshibka-zapolneniya-cfpdfform-javalangnullpointerexception-platforma-yazyikovoj-standart-i-imya-platformyi-ne-dolzhnyi-byit-nulevyimi/12929357#12929357
Это проблема с файлом шрифта, в котором не задан языковой стандарт или название платформы. функции PDF в Coldfusion называют это
<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
Вы не упомянули, как вы создали свой файл PDF. В зависимости от того, как вы создали файл PDF, поля формы могут содержаться в подчиненной форме. PDF-файлы, созданные из шаблонов в LiveCycle, сделают это. По умолчанию 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-файла, должен показать вам, включены ли поля в подчиненную форму. Дамп покажет ваши поля формы, содержащиеся в другой структуре. Это будет имя, которое вы используете в атрибуте name тега cfpdfsubform.
НТН.
После того, как я перечитал ваш вопрос, я понял, что иду по неверному пути. Я думал, что у вас возникла проблема с заполнением полей в PDF. Но ваша настоящая проблема - нулевой указатель. Doh! Извините за путаницу.
Обычно эта ошибка говорит о том, что используемая вами переменная не определена. Единственная переменная, которую я вижу в вашем примере, это # variables.AbsPath #. Вы указываете область видимости переменных. Это верно? Область действия переменных доступна только на той странице, на которой она была создана (и для включенных страниц).
Вы не указали, как вы определяете эту переменную. Вы можете поделиться этим?
Ошибка происходит случайно или постоянно?
Вы уверены, что ошибка происходит в этой строке cfpdfform, а не где-то еще? Я бы поместил блок cftry / cfcatch вокруг вашего кода и вывел структуру cfcatch, чтобы получить более конкретную ошибку. Можете ли вы попробовать это и отправить обратно?