尝试合并多个pdf文件时cfpdf合并错误

时间:2015-09-16 18:26:48

标签: pdf coldfusion adobe coldfusion-9 wkhtmltopdf

我正在使用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) 

4 个答案:

答案 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>