2017-08-24 243 views
1

我做在C#中的小应用程序,它的PDF文件转换为PDF/A使用的Adobe Acrobat SDK。将PDF转换为PDF/A从Adobe Acrobat Professional中XI/DC SDK

我用SaveAs JavaScript函数,包含在SDK中,这样一来:

var pdfDocument = new AcroPDDoc(); 
pdfDocument.Open(fileInfo.FullName); 
object pdfJavascriptObject = pdfDocument.GetJSObject(); 
Type jsType = pdfJavascriptObject.GetType(); 

// FinalExtension is either jpg or pdf (depends of convId) 
var outputFileName = fileInfo.Name.Replace(fileInfo.Extension, "." + finalExtension); 
var finalFullName = Path.Combine(outputFolderPath, outputFileName); 

// AdobeConvId is either com.callas.preflight.pdfa either com.adobe.acrobat.jpeg 
object[] saveAsParam = { finalFullName, adobeConvId, string.Empty, false, false }; 
// Use Javascript Object SaveAs Method 
jsType.InvokeMember(StringConstants.AcrobatSaveAsMethod 
         , BindingFlags.InvokeMethod | BindingFlags.Public | BindingFlags.Instance 
         , null 
         , pdfJavascriptObject 
         , saveAsParam 
         , CultureInfo.InvariantCulture); 
pdfDocument.Close(); 

它好工作与Adobe Acrobat Professional中X,但现在我不得不使用Adobe Acrobat XI专业/ DC。 我已经升级了SDK的DLL,但它不起作用。

有一个“进展”消息,这会闪烁,如果有大量的文档转换和过程永远不会结束。

然而,当我转换为JPG文件(相同的代码只是改变了convId)此代码工作正常。

你知道我可以从那里做什么?......

如果在“另存为”的方法是NOGO,我听说preflights的,但我不知道如何从C#中使用它们码。

+0

没有人经历过这个问题? – Speuline

回答

0

对于那些有兴趣谁,我试图转换与Adobe的Acrobat Pro DC(应用程序,而不是SDK)的PDF版本,它的工作,但有对文档中的不一致警告消息。

我的理解是,SDK无法处理此消息。 因此,这个过程仍然停滞不前,我们不得不手动杀死它。 Acrobat XI和DC SDK有相同的问题,Acrobat X工作正常。

我做了一个解决方法我在这里(简体版)分享,也许这是一个不好的做法,也许还有其他的,更容易的方式来实现我的目标,但这个工程。

public void ConvertPdfFiles(List<FileInfo> inputFileInfos, string outputFolderPath, string adobeConvId, string finalExtension) 
{ 
     foreach (var fileInfo in inputFileInfos) 
     { 
      var pdfDocument = new AcroPDDoc(); 
      pdfDocument.Open(fileInfo.FullName); 
      object pdfJavascriptObject = pdfDocument.GetJSObject(); 
      Type jsType = pdfJavascriptObject.GetType(); 
      var outputFileName = fileInfo.Name.Replace(fileInfo.Extension, "." + finalExtension); 
      var finalFullName = Path.Combine(outputFolderPath, outputFileName); 

      Task task = Task.Factory.StartNew(() => 
      { 
       try 
       { 
        object[] saveAsParam = { finalFullName, adobeConvId }; 
        jsType.InvokeMember(StringConstants.AcrobatSaveAsMethod 
             , BindingFlags.InvokeMethod | BindingFlags.Public | BindingFlags.Instance 
             , null 
             , pdfJavascriptObject 
             , saveAsParam); 
       } 
       catch (TargetInvocationException) 
       { 
        // This exception is thrown everytime we kill the process 
       } 

      }); 

      var fileOutputInfo = new FileInfo(finalFullName); 
      // we wait for the process to create the file. 
      while (!fileOutputInfo.Exists || fileOutputInfo.Length == 0) 
      { 
       task.Wait(100); 
       fileOutputInfo.Refresh(); 
      } 
      // Once the file is created we kill the process Acrobat 
      pdfDocument.Close(); 
      KillAcrobatProcess(); 
     } 
}