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

尝试合并多个pdf文件时出现cfpdf合并错误,pdf,coldfusion,adobe,coldfusion-9,wkhtmltopdf,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)#">

我正在使用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>
堆栈跟踪:

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) 

我在使用CF10时遇到了同样的问题。(未在CF11或2016中测试。)即使isPDFFile()=true和CFPDF“优化”有效,再多的调整ColdFusion/Java设置也无法使CF合并使用生成的非常简单的小PDF

我恢复使用CFExecute(GNU通用公共许可证(GPL)版本2)。除了使用更多种类的PDF外,它还可以更快地合并,具有类似的功能(压缩、水印、旋转、加密)和高级功能(度量、文件附件、生成FDF数据模板、修复损坏的PDF等)

下面是将各种PDF合并到单个文件中的命令行语法

请注意:文件路径和名称不能包含空格。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>

PDF=[
“c:\CFDocument.pdf”,
“c:\WKHTMLTOPDF.pdf”,
“c:\MSWord.pdf”,
“c:\PDFForge.pdf”,
“c:\ActivePDF.pdf”
];
MergedPDF=“c:\PDFtk\u merged.pdf”;
Args=“#阵列列表(PDF)”)#cat输出#合并DPDF#不问”;

在尝试合并Windows Server 2012 R2上使用wkhtmltopdf 0.12.2创建的两个PDF(一个纵向和一个横向)时,我在ColdFusion版本9和10中遇到了相同的问题

我能够修补生成这些PDF的标记,每当我的第二个PDF有任何标题标记(h1-6)时,合并似乎就会爆炸。这似乎与wkhtmltopdf创建的标题外标记“书签”有关

合并时接受可选的布尔属性keepBookmark。Adobe文档声称:

指定合并文档中是否保留源PDF文档中的书签

相反,我发现它保留了第一个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>

...

这对我来说是一个解决办法,不是真正的解决方案。

我在adobe PDF中遇到了这个问题。问题是表单字段设置为
format=numeric
,但我传递的是字符串。删除格式设置修复了它

另一种解决方法是使用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>


这两个文档与工作文档有何不同?这两个文档之间似乎没有明显区别,无法打印。所有文档都包含文本和图像。不一起打印的两个将与其他打印。我很困惑,所以只合并这两个文档(没有任何进一步的文档)就会出错?你能重新创建有疑问的文档以确保它们没有损坏吗?我只是想说这个修复程序对我也有效,ACF 10。同样的问题,使用wkhtmltopdf生成多个文件。
<cfpdf action="merge" destination="#outputFile#" overwrite="yes" keeyBookmark="no">
...
</cfpdf>
<?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>