OOO: UNO (Java) TrackEdChanges: Comment accepter (ou masquer) les modifications de suivi lorsque le document est caché?

StackOverflow https://stackoverflow.com/questions/9486752

Question

Mon problème: j'écris un système automatisé qui doit lire .doc et .oDT, effectue un peu de fonctionnement dessus et l'exporte à nouveau vers PDF.

Actuellement, cela fonctionne bien pour tout ce dont j'ai besoin, je pourrais résoudre tous les problèmes jusqu'à celle-ci:

Si un utilisateur fournit un document qui avait enregistré des modifications (lignes rouges), je dois accepter automatiquement toutes ces modifications ou les masquer.

Je pourrais résoudre celui-ci avec le code ci-dessous tant que l'OOO s'affiche à l'écran. Lorsque je le lance caché, mes appels ne font rien du tout.

Alors, voici ce que je fais actuellement:

    // DO NOT try to cast this to Desktop as com.sun.star.frame.Desktop is NOT a valid class!
    // keep it as Object and cast it to XDesktop later (via queryInterface)
    Object desktop = xMCF.createInstanceWithContext("com.sun.star.frame.Desktop", xContext);
    XMultiServiceFactory xFactory = (XMultiServiceFactory) UnoRuntime.queryInterface(
        XMultiServiceFactory.class, xMCF);
    // what goes for desktop above is valid for DispatchHelper as well.
    Object dispatchHelper = xFactory.createInstance("com.sun.star.frame.DispatchHelper");

    // the DispatchHelper is the class that handles the interaction with dialogs.
    XDispatchHelper helper = (XDispatchHelper) UnoRuntime.queryInterface(
        XDispatchHelper.class, dispatchHelper);
    XDesktop xDesktop = (XDesktop) UnoRuntime.queryInterface(com.sun.star.frame.XDesktop.class, desktop);
    XFrame xFrame = xDesktop.getCurrentFrame();
    XDispatchProvider xDispatchProvider = (XDispatchProvider) UnoRuntime.queryInterface(XDispatchProvider.class, xFrame);

    // We issute the Track Changes Dialog (Bearbeiten - Änderungen // Edit - Changes) and tell it
    // to ACCEPT all changes.
    PropertyValue[] acceptChanges = new PropertyValue[1];
    acceptChanges[0] = new PropertyValue();
    acceptChanges[0].Name = "AcceptTrackedChanges";
    acceptChanges[0].Value = Boolean.TRUE;
    helper.executeDispatch(xDispatchProvider, ".uno:AcceptTrackedChanges", "", 0, acceptChanges);

    // We issue it again to tell it to stop showing changes.
    PropertyValue[] showChanges = new PropertyValue[1];
    showChanges[0] = new PropertyValue();
    showChanges[0].Name = "ShowTrackedChanges";
    showChanges[0].Value = Boolean.FALSE;
    helper.executeDispatch(xDispatchProvider, ".uno:ShowTrackedChanges", "", 0, showChanges);

Ma supposition actuelle est que je ne peux pas appeler cela parce qu'étant caché, je n'ai pas de cadre pour appeler un répartiteur. Mais je n'ai pas pu trouver de moyen d'obtenir le répartiteur du composant.

J'ai déjà essayé d'envoyer TrackChanges aussi (à FALSE) Mais cela ne l'a pas fait non plus.

Était-ce utile?

La solution

Après avoir passé deux jours à comprendre l'API OOO, j'ai réalisé que le document n'était pas chargé dans le frontend, c'est pourquoi cette approche échoue. Cependant, vous pouvez modifier directement la propriété du document:

XPropertySet docProperties = UnoRuntime.queryInterface(XPropertySet.class, document);
docProperties.setPropertyValue("RedlineDisplayType", RedlineDisplayType.NONE);

Le nom de la propriété "RedlineDisplayType" peut être trouvé dans le Documentation Redlineportion

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top