【问题标题】:cfpdf merge error when trying to merge multiple pdf files尝试合并多个 pdf 文件时出现 cfpdf 合并错误
【发布时间】:2015-12-13 11:28:30
【问题描述】:

我正在使用 CFPDF 将多个 PDF 合并在一起。 PDF 是使用 wkhtmltopdf 0.12.1 创建的。在大多数情况下,代码工作正常,但我的 2 个文档在合并时出错。我的在线搜索是空的,我真的很茫然。非常感谢任何帮助。

<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) 

【问题讨论】:

  • 这两个文件与工作文件有何不同?
  • 不会打印的 2 之间似乎没有明显的区别。所有文档都包含文本和图像。不会一起打印的2会和其他人一起打印。我很困惑。
  • 所以只合并这两个文档(没有任何其他文档)会引发错误?您能否重新创建有疑问的文档以确保它们没有损坏?

标签: pdf coldfusion adobe coldfusion-9 wkhtmltopdf


【解决方案1】:

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

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

cfpdf 在合并时接受可选的布尔属性 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>

对我来说是一种解决方法,而不是真正的解决方案。

【讨论】:

  • 只是想说这个修复也适用于我,ACF 10。同样的问题,使用 wkhtmltopdf 生成了多个文件。
【解决方案2】:

我在使用 CF10 时遇到了同样的问题。 (未在 CF11 或 2016 中测试。)即使 isPDFFile() = true 并且 CFPDF“优化”有效,CF 也无法合并使用 WKHTMLTOPDF 生成的非常简单的小型 PDF。

我恢复使用 CFExecute 和 PDFtk(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>

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2010-11-19
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-02-16
        • 1970-01-01
        • 2019-02-08
        相关资源
        最近更新 更多