我在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#代码。
答案 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();
}
}