Как вставить гиперссылку в документ OO Writer, используя ОО CLI Libraries

Автор Борис_С, 2 декабря 2021, 18:07

0 Пользователи и 1 гость просматривают эту тему.

Борис_С

На странице https://api.libreoffice.org/examples/examples.html#OLE_examples есть 2 примера работы с библиотеками OpenOffice CLI. Эти примеры показывают, как вставить гиперссылку в документ OO Calc. Но не совсем ясно, как вставить гиперссылку в документ OO Writer. Вот код, который я написал:

       static void Main(string[] args)
       {
           try
           {
               unoidl.com.sun.star.uno.XComponentContext localContext =
                   uno.util.Bootstrap.bootstrap();
               unoidl.com.sun.star.lang.XMultiServiceFactory multiServiceFactory =                                                      
                   (unoidl.com.sun.star.lang.XMultiServiceFactory)localContext.getServiceManager();
               XComponentLoader componentLoader = (XComponentLoader)
                   multiServiceFactory.createInstance("com.sun.star.frame.Desktop");
               string fileName = "c:\\Users\\sbe.CSOFT-SPB\\Documents\\OO\\1.odt";
               //string fileName = "c:\\Users\\sbe.CSOFT-SPB\\Documents\\OO\\t1.ods";
               fileName = @"file:///" + fileName.Replace('\\', '/');
               XComponent xComponent = componentLoader.loadComponentFromURL(
                   fileName, "_blank",
                   0, new unoidl.com.sun.star.beans.PropertyValue[0]);
               if (fileName.ToLower().EndsWith(".odt")) // документ OO Writer
               {
                   unoidl.com.sun.star.text.XTextDocument xTextDocument =
                       (unoidl.com.sun.star.text.XTextDocument)xComponent;
                   unoidl.com.sun.star.text.XText xText = xTextDocument.getText();
                   unoidl.com.sun.star.text.XSimpleText xSimpleText =
                       (unoidl.com.sun.star.text.XSimpleText)xText;
                   unoidl.com.sun.star.text.XTextCursor xCursor = xSimpleText.createTextCursor();

                   unoidl.com.sun.star.lang.XMultiServiceFactory xServiceMan =
                       (unoidl.com.sun.star.lang.XMultiServiceFactory)xTextDocument;

                   // create a TextFrame (
                   Object objTextFrame = xServiceMan.createInstance("com.sun.star.text.TextFrame");
                   unoidl.com.sun.star.text.XTextFrame xTextFrame =
                       (unoidl.com.sun.star.text.XTextFrame)objTextFrame;
                   unoidl.com.sun.star.awt.Size aSize = new unoidl.com.sun.star.awt.Size(15000, 400);
                   ((unoidl.com.sun.star.drawing.XShape)xTextFrame).setSize(aSize);

   // insert the frame  
                   xText.insertTextContent(xCursor, xTextFrame, false);  // это работает

                   // create a hyperlink
                   Object aHyperlinkObj = xServiceMan.createInstance("com.sun.star.text.TextField.URL");
                   xServiceMan.createInstance("com.sun.star.text.TextField.URL");
                   unoidl.com.sun.star.beans.XPropertySet xPropSet =
                       (unoidl.com.sun.star.beans.XPropertySet)aHyperlinkObj;
                   xPropSet.setPropertyValue(
                       "URL", new uno.Any("http://www.example.org"));
                   xPropSet.setPropertyValue(
                       "Representation", new uno.Any("hyperlink"));

                   // and insert
                   unoidl.com.sun.star.text.XTextContent xContent =
                       (unoidl.com.sun.star.text.XTextContent)aHyperlinkObj;
                   xText.insertTextContent(xCursor, xContent, false);  // здесь возникает исключение
               }
               else  // документ OO Calc
               {
                   unoidl.com.sun.star.sheet.XSpreadsheetDocument mxDocument =
                       (unoidl.com.sun.star.sheet.XSpreadsheetDocument)xComponent;
                   unoidl.com.sun.star.sheet.XSpreadsheets xSheets =  mxDocument.getSheets();
                   unoidl.com.sun.star.container.XIndexAccess xSheetsIA =
                       (unoidl.com.sun.star.container.XIndexAccess)xSheets;
                   unoidl.com.sun.star.sheet.XSpreadsheet xSheet =
                       (unoidl.com.sun.star.sheet.XSpreadsheet)
                       xSheetsIA.getByIndex(0).Value;

                   // create a hyperlink
                   unoidl.com.sun.star.lang.XMultiServiceFactory xServiceMan =
                       (unoidl.com.sun.star.lang.XMultiServiceFactory)mxDocument;
                   Object aHyperlinkObj =
                       xServiceMan.createInstance("com.sun.star.text.TextField.URL");
                   unoidl.com.sun.star.beans.XPropertySet xPropSet =
                       (unoidl.com.sun.star.beans.XPropertySet)aHyperlinkObj;
                   xPropSet.setPropertyValue(
                       "URL", new uno.Any("http://www.example.org"));
                   xPropSet.setPropertyValue(
                       "Representation", new uno.Any("hyperlink"));

                   // and insert
                   unoidl.com.sun.star.text.XTextContent xContent =
                       (unoidl.com.sun.star.text.XTextContent)aHyperlinkObj;
                   unoidl.com.sun.star.table.XCell хCell = xSheet.getCellByPosition(0, 0);
                   unoidl.com.sun.star.text.XText xText =
                       (unoidl.com.sun.star.text.XText)xCell;
                   unoidl.com.sun.star.text.XTextCursor xTextCursor =
                       xText.createTextCursor();
                   xText.insertTextContent(xTextCursor, xContent, false); // это работает                    
               }
               xComponent.dispose();
           }
           catch (System.Exception e)
           {
               string message = String.Format("Error.\n{0}\n{1}",
                   e.Message, e.StackTrace.TrimStart());
               Debug.WriteLine(message);
           }
       }


Вставка гиперссылки в документ OO Calc в этом коде работает, но на операторе вставки гиперссылки в документ OO Writer возникает исключение.
Буду признателен за любую помощь.

mikekaganski

Дело в том, что в Writer гиперссылки - это не поля, а просто свойство символов.
Код Basic:

  xCursor.setString("hyperlink")
  xCursor.goLeft(9, False)
  xCursor.goRight(9, True)
  xCursor.HyperLinkURL = "http://www.example.org"
С уважением,
Михаил Каганский

Борис_С

Спасибо. Действительно все работает. Есть только одно уточнение.
Последний оператор в С# CLI пишется так:
unoidl.com.sun.star.beans.XPropertySet xPropSet =
                        (unoidl.com.sun.star.beans.XPropertySet)xCursor;
xPropSet.setPropertyValue("HyperLinkURL", new uno.Any("http://www.example.org"));