从Adobe Acrobat Professional XI / DC SDK将Pdf转换为Pdf / A.

时间:2017-08-24 14:21:00

标签: c# pdf adobe pdf-conversion acrobat-sdk

我在C#中创建了一个小应用程序,它使用Adobe Acrobat SDK将PDF文件转换为PDF / A.

我已经以这种方式使用了SDK中包含的SaveAs JavaScript函数:

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 Professional XI / DC。 我已经升级了SDK的DLL但它不起作用。

有一个"进展"消息闪烁,好像有大量文件要转换,过程永远不会结束。

但是,当我转换为JPG文件时,此代码工作正常(相同的代码只是更改convId)。

你知道我能从那里做些什么吗?...

如果" SaveAs"方法是NoGo,我听说过预检,但我不知道如何使用C#代码。

1 个答案:

答案 0 :(得分: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();
        }
 }