我正在使用CFPDF将多个PDF合并在一起。 PDF是使用wkhtmltopdf 0.12.1创建的。在大多数情况下,代码工作正常,但只要合并在一起,我的两个文档就会出错。我的在线搜索空了,我真的很茫然。非常感谢任何帮助。
<cfpdf action="merge" destination="#outputFile#" overwrite="yes">
<cfloop index="i" from="1" to="#arrayLen(pdfFiles)#">
<cfpdfparam source="#pdfFiles[i]#">
</cfloop>
</cfpdf>
错误发生在第173行
<cfpdfparam source="#pdfFiles[i]#">
cfcatch.message
com.adobe.internal.pdftoolkit.core.types.ASString cannot be cast to [B
堆栈跟踪:
java.lang.ClassCastException: com.adobe.internal.pdftoolkit.core.types.ASString cannot be cast to [B
at com.adobe.internal.pdftoolkit.services.interchange.structure.StructureUtil.calculateSuffix(Unknown Source)
at com.adobe.internal.pdftoolkit.services.manipulations.impl.PMMNamedDestinations.getNewDestName(Unknown Source)
at com.adobe.internal.pdftoolkit.services.manipulations.impl.PMMNamedDestinations.cloneNamedDestination(Unknown Source)
at com.adobe.internal.pdftoolkit.services.manipulations.impl.PMMNamedDestinations.cloneDestination(Unknown Source)
at com.adobe.internal.pdftoolkit.services.manipulations.PMMBookmark$AppendBookmark.cloneBookmark(Unknown Source)
at com.adobe.internal.pdftoolkit.services.manipulations.PMMBookmark$AppendBookmark.firstAction(Unknown Source)
at com.adobe.internal.pdftoolkit.services.manipulations.PMMBookmark.walkBookmarksTree(Unknown Source)
at com.adobe.internal.pdftoolkit.services.manipulations.PMMBookmark.walkBookmarksTree(Unknown Source)
at com.adobe.internal.pdftoolkit.services.manipulations.PMMBookmark.appendBookmarks(Unknown Source)
at com.adobe.internal.pdftoolkit.services.manipulations.PMMService.insertPagesinRange(Unknown Source)
at com.adobe.internal.pdftoolkit.services.manipulations.PMMService.appendPages(Unknown Source)
at coldfusion.pdf.PDFDocOperation.merge(PDFDocOperation.java:435)
at coldfusion.tagext.lang.PDFParamTag.doStartTag(PDFParamTag.java:196)
at coldfusion.runtime.CfJspPage._emptyTcfTag(CfJspPage.java:2722)
at cfcombineDocs2ecfm834801932.runPage(D:\inetpub\wwwroot\BUSINESS_APPS\rmsouf\docs\combineDocs.cfm:173)
at coldfusion.runtime.CfJspPage.invoke(CfJspPage.java:231)
at coldfusion.tagext.lang.IncludeTag.doStartTag(IncludeTag.java:416)
at coldfusion.runtime.CfJspPage._emptyTcfTag(CfJspPage.java:2722)
at cfapplication2ecfc1314889339$funcONREQUEST.runFunction(D:\inetpub\wwwroot\BUSINESS_APPS\rmsouf\application.cfc:155)
at coldfusion.runtime.UDFMethod.invoke(UDFMethod.java:472)
at coldfusion.runtime.UDFMethod$ReturnTypeFilter.invoke(UDFMethod.java:405)
at coldfusion.runtime.UDFMethod$ArgumentCollectionFilter.invoke(UDFMethod.java:368)
at coldfusion.filter.FunctionAccessFilter.invoke(FunctionAccessFilter.java:55)
at coldfusion.runtime.UDFMethod.runFilterChain(UDFMethod.java:321)
at coldfusion.runtime.UDFMethod.invoke(UDFMethod.java:220)
at coldfusion.runtime.TemplateProxy.invoke(TemplateProxy.java:491)
at coldfusion.runtime.TemplateProxy.invoke(TemplateProxy.java:337)
at coldfusion.runtime.AppEventInvoker.invoke(AppEventInvoker.java:88)
at coldfusion.runtime.AppEventInvoker.onRequest(AppEventInvoker.java:280)
at coldfusion.filter.ApplicationFilter.invoke(ApplicationFilter.java:356)
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.ExceptionFilter.invoke(ExceptionFilter.java:70)
at coldfusion.filter.BrowserDebugFilter.invoke(BrowserDebugFilter.java:79)
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.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)
答案 0 :(得分:2)
当尝试合并在Windows Server 2012 R2上使用wkhtmltopdf 0.12.2创建的两个PDF(一个肖像和一个横向)时,我遇到了与ColdFusion版本9和10相同的事情。
我能够修改生成这些PDF的标记,并且只要我的第二个PDF有任何标题标记(h1-6),合并似乎就会轰炸。这似乎与wkhtmltopdf用标题标签创建的“书签”有关。
合并时,cfpdf接受可选的布尔属性keepBookmark。 Adobe文档声明这个:
指定源PDF文档中的书签是否保留在合并文档中
相反,我发现它保留了第一张PDF中的任何书签并丢弃了第二张中的书签,但我认为足够接近......
我将此参数添加到我的合并调用中,并且它停止抛出该异常:
var pdfMerger = new PDF();
pdfMerger.addParam(source="xyzzy");
var combinedPDF = pdfMerger.merge(name="combinedPDF", keepBookmark=false);
我没有在CFML中测试过这个,但它会是
<cfpdf action="merge" destination="#outputFile#" overwrite="yes" keeyBookmark="no">
...
</cfpdf>
对我来说是一种解决方法,而不是真正的解决方案。
答案 1 :(得分:0)
我在使用CF10时遇到了同样的问题。 (未在CF11或2016中进行测试。)无需调整ColdFusion / Java设置,即使isPDFFile()= true和CFPDF“Optimize”工作,也无法使CF合并使用WKHTMLTOPDF生成的非常简单的小PDF。 / p>
我恢复使用CFExecute和PDFtk(GNU通用公共许可证(GPL)版本2)。除了处理各种各样的PDF之外,它还可以更快地合并,具有类似的功能(压缩,水印,旋转,加密)和高级功能(指标,文件附件,生成FDF数据模板,修复损坏的PDF等)。
以下是将各种PDF合并为单个文件的命令行语法。
请注意:文件路径&amp;名称不能包含空格。 PDF必须是文件名,不能作为命名变量存储在RAM中。
<cfscript>
PDFs = [
"c:\CFDocument.pdf",
"c:\WKHTMLTOPDF.pdf",
"c:\MSWord.pdf",
"c:\PDFForge.pdf",
"c:\ActivePDF.pdf"
];
MergedPDF = "c:\PDFtk_merged.pdf";
Args = "#ArrayToList(PDFS, ' ')# cat output #MergedPDF# dont_ask";
</cfscript>
<cfexecute name="c:\PDFtk\bin\pdftk.exe" arguments="#args#" timeOut="60"></cfexecute>
答案 2 :(得分:0)
我在adobe pdfs上遇到过这个问题。问题是表单字段设置为format = numeric
,但我传入字符串。删除格式修复它。
答案 3 :(得分:0)
另一种解决方法是在 cfpdf 中使用 processDDX 操作和 DDX,看起来像这样:
<?xml version="1.0" encoding="UTF-8"?>
<DDX xmlns="http://ns.adobe.com/DDX/1.0/"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://ns.adobe.com/DDX/1.0/ coldfusion_ddx.xsd">
<PDF result="Out1">
<PDF source="Doc1"/>
<PDF source="Doc2"/>
</PDF>
</DDX>