Exit
  • Global community
    • Language:
      • Deutsch
      • English
      • Español
      • Français
      • Português
  • 日本語コミュニティ
  • 한국 커뮤니티
0

csharp and Indesign CS5

New Here ,
Dec 01, 2010 Dec 01, 2010

Hello


I am using visual studio 2008 (c sharp) under windows 7 to createe a indesign document (CS5).

i basically created a Interop.Indesign.dll via command prompt  using Resources for Visual Basic.tlb ie


TlbImp.exe "C:\ProgramData\Adobe\InDesign\Version 7.0\en_GB\Scripting Support

\7.0\Resources for Visual Basic.tlb" /out:Interop.InDesign.dll

I imported the resulting dll into my csharp project and tried to uee the code but get an error message ...

Unable to cast COM object of type 'System.__ComObject' to interface type

'InDesign.Application'. This operation failed because the QueryInterface call on the COM

component for the interface with IID '{ABD4CBB2-0CFE-11D1-801D-0060B03C02E4}' failed

due to the following error: No such interface supported (Exception from HRESULT:

0x80004002 (E_NOINTERFACE)).

I am creafing an instance of application obj in the following mann


    Type t = Type.GetTypeFromProgID("InDesign.Application");
    InDesign.Application application = (InDesign.Application)Activator.CreateInstance(t);


I have refefrence the indesign dll in the project.Basically I want to use csharp to create a

indesign document with images and text,

Any suggestions why this doesn;t work?

thanks

TOPICS
Scripting
7.7K
Translate
Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines

correct answers 1 Correct answer

Community Beginner , Dec 04, 2010 Dec 04, 2010

Close down visual studio, close down indesign. 

Open InDesign by right clicking and select run as administrator.  You just have to do this once, all subsequent loads can be under normal permission set.  This lets InDesign create the applicable type libraries.

Now load your project, then select Add Reference, under the COM tab, there should now be a working Adobe InDesign CS5 type library.

Then it's as simple as:

InDesign.ApplicationClass App = new InDesign.ApplicationClass();

App.DoScript(_ScriptToP

...
Translate
Community Beginner ,
Dec 04, 2010 Dec 04, 2010

Close down visual studio, close down indesign. 

Open InDesign by right clicking and select run as administrator.  You just have to do this once, all subsequent loads can be under normal permission set.  This lets InDesign create the applicable type libraries.

Now load your project, then select Add Reference, under the COM tab, there should now be a working Adobe InDesign CS5 type library.

Then it's as simple as:

InDesign.ApplicationClass App = new InDesign.ApplicationClass();

App.DoScript(_ScriptToProcess.ToString(), InDesign.idScriptLanguage.idJavascript, new object[] { "" }); //sends script to indesign for processing (not assyncronous)

Hope this helps.

Translate
Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
New Here ,
Dec 06, 2010 Dec 06, 2010

Hello

Great thanks very much. That sorted that issue. Not managed to successfully create a document under windows Indesign cs5 yet.

I'm using the code below ...... bascially I'm getting a run-time error below. Any suggestions ? In the meantime will try and look into fixing this issue.

Thanks in advance.

A

{


Unable to cast COM object of type  'InDesign.ApplicationClass' to interface type 'InDesign._Application'.  This operation failed because the QueryInterface call on the COM  component for the interface with IID  '{ABD4CBB2-0CFE-11D1-801D-0060B03C02E4}' failed due to the following  error: No such interface supported (Exception from HRESULT: 0x80004002  (E_NOINTERFACE)).

}

              InDesign.ApplicationClass application = new InDesign.ApplicationClass();

            // Set unit type
            application.ViewPreferences.HorizontalMeasurementUnits = InDesign.idMeasurementUnits.idMillimeters;
             application.ViewPreferences.VerticalMeasurementUnits = InDesign.idMeasurementUnits.idMillimeters;

            // Create new document
            application.Documents.Add(true,null);

            // Get active document and change some settings
            InDesign.Document document =  application.ActiveDocument;
            document.DocumentPreferences.FacingPages = false;
            document.DocumentPreferences.PageWidth = 210;
            document.DocumentPreferences.PageHeight = 297;

            // Get first page (already created) and set margins
            InDesign.Page page = (InDesign.Page)document.Pages[1];

            page.MarginPreferences.Top = 10;
            page.MarginPreferences.Bottom = 10;
            page.MarginPreferences.Left = 20;
            page.MarginPreferences.Right = 10;

Translate
Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Community Beginner ,
Dec 06, 2010 Dec 06, 2010

C# is strongly typed, Adobe is not, this causes a lot of issues when programming with C#.  It can be done, I have a distributed network of 20 machines all churning out InDesign documents.  Does about 10,000 documents an hour.

You basically have 2 choices, use the var declaration to allow the compiler to worry about all the typing. (var application = new InDesign.Application();)

or build all your instructions as javascript into a stringbuilder, then send it using the application.DoScript() function.

I do the latter (and recommend it) and it works out very nicely because all typing considerations can be ignored.  I send 400-500 line scripts this way.

If you go the the latter, the very first line of your javascript should always be:

app.scriptPreferences.userInteractionLevel = 1699640946;

This disables all modal dialog boxes that will cause you issues.

edit:

your first line should also be

InDesign.Application App = new InDesign.Application();

instead of ApplicationClass

Message was edited by: menzel7281

Translate
Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
New Here ,
Dec 07, 2010 Dec 07, 2010

Hello

Thanks will do some research using javascript.

Thanks very for your suggestions.

A

Translate
Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
New Here ,
Nov 01, 2011 Nov 01, 2011

Hello Menzel,

I know this is a very old thread, but I am hoping you or someone else can help me solve my problems scripting InDesgin from Visual Studio 2010 and C#.

I was able to view the InDesign Type Library by running InDesign as Administrator and adding the reference in Visual Studio but I get the following results:

// Add Referecne to following COM Type Library (Adobe InDesign CS5 Type Library 1.0)

// C:\ProgramData\Adobe\InDesign\Version 7.0\en_US\Scripting Support\7.0\Resources for Visual Basic.tlb

// Attempt to create an InDesign instance

InDesign.Application app1 = (InDesign.Application)COMCreateObject("InDesign.Application");

// Results: Starts InDesign Application and then trhows following error.

// Error: Unable to cast COM object of type 'System.__ComObject' to interface type 'InDesign.Application'.

// This operation failed because the QueryInterface call on the COM component for the interface with IID '{ABD4CBB2-0CFE-11D1-801D-0060B03C02E4}'

// failed due to the following error: No such interface supported (Exception from HRESULT: 0x80004002 (E_NOINTERFACE)).

InDesign.Application app2 = new InDesign.Application();

// Resutls: Throws error.

// Error: Retrieving the COM class factory for component with CLSID {296CAEB5-C99C-4B3E-9359-6E7D6EAE71FC} failed due to

// the following error: 80040154 Class not registered (Exception from HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG)).

Type t = Type.GetTypeFromProgID("InDesign.Application");

InDesign.Application application = (InDesign.Application)Activator.CreateInstance(t);

// Resutls: Starts InDesign Application and then trhows following error.

// Error: Unable to cast COM object of type 'System.__ComObject' to interface type 'InDesign.Application'.

// This operation failed because the QueryInterface call on the COM component for the interface with IID '{ABD4CBB2-0CFE-11D1-801D-0060B03C02E4}'

// failed due to the following error: No such interface supported (Exception from HRESULT: 0x80004002 (E_NOINTERFACE)).

var app3 = new InDesign.Application();

// Starts InDesign Application and then trhows following error:

// Retrieving the COM class factory for component with CLSID {296CAEB5-C99C-4B3E-9359-6E7D6EAE71FC}

// failed due to the following error: 80040154 Class not registered (Exception from HRESULT: 0x80040154 (REGDB_E_CLASSNOTREG)).

 

Yet, I was able to get the folowing code to work:

Type type = Type.GetTypeFromProgID("InDesign.Application.CS5", true);

dynamic app = System.Activator.CreateInstance(type, true);

var doc = app.Documents.Add();

This started the InDesign application and added a document to the window.

 

Translate
Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
Community Beginner ,
Nov 03, 2011 Nov 03, 2011

Should be as simple as:

InDesign.Application App = new InDesign.Application();

App.DoScript(_ScriptToProcess.ToString(), idScriptLanguage.idJavascript, new object[] { "" });

App = null;

(copied directly from my working code)

If you're getting class not registered errors, make sure you open InDesign with administrator rights at least once. Refer to the corrected answer part of this thread.

Translate
Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
New Here ,
Nov 06, 2011 Nov 06, 2011

Hi Menzel,

Thanks for replying. I am a real newbie to trying to automate InDesign from C#, but I have benefited from your notes above and now have access to the InDesign type library from my VS 2010 C# project. I am trying to hack my way through converting all the Javascript in "InDesign CS5 Automation Using XML & JavaScript" to try and learn how to automate InDesign from C#.

I could really use some help with a couple tasks that would get me onto the right path. I have been able to start InDesign and add docment and set its preferences, etc. But no luck opening an existing document or using the App.DoScript functionality.

 

object file = @"F:\CSharpScriptingInDesign\Files\000.paper.en.indd";

 

dynamic app = System.Activator.CreateInstance(type, true);

 

string _ScriptToProcess = "var doc = app.documents.Add()";

app.DoScript(_ScriptToProcess, InDesign. idScriptLanguage.idJavascript, new object[] { ""});

I know I probably doing something really stupid, but if you could point me in the right direction I would be very appreciative.

Rob

Translate
Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines
New Here ,
Nov 07, 2011 Nov 07, 2011
LATEST

Are there any recources where those who are trying to manipulate InDesign through scripting and IDML can share examples code and help each other learn.  That would be very nice.

Translate
Report
Community guidelines
Be kind and respectful, give credit to the original source of content, and search for duplicates before posting. Learn more
community guidelines