[Gelöst] Control Add-in von AL zu C/AL

25. Februar 2025 11:56

Hallo zusammen,

wir verwenden BC 14, und ich wollte einen PDF-Viewer per Control Add-in implementieren. Ich habe hierzu das folgende Repository gefunden:
https://github.com/Drakonian/bc-pdf-viewer
und versuche, es bei uns zum Laufen zu bekommen.

Da ich mit Control Add-ins vorher noch nichts zu tun hatte, habe ich den folgenden Leitfaden durchgearbeitet:
https://learn.microsoft.com/en-us/previous-versions/dynamicsnav-2018-developer/Walkthrough--Creating-and-Using-a-Client-Control-Add-in
Das funktioniert reibungslos.

Ich habe diese Vorgehensweise beim PDF-Viewer umgesetzt und leider funktioniert es nicht. Ich weiß nicht woran es liegt.

Ich habe das Gefühl, dass der C#-Code nicht richtig ist. (Ich poste die Änderungen, die ich gemacht habe, die Script.js und stylesheet.css habe ich nicht geändert)

Code:
using Microsoft.Dynamics.Framework.UI.Extensibility;

namespace PDFViewer
{
  [ControlAddInExport("PDFViewerControl")]
  public interface IPDFViewerControlAddIn
  {
    [ApplicationVisible]
    event ApplicationEventHandler ControlAddinReady;

    [ApplicationVisible]
    event ApplicationEventHandler onView;

    [ApplicationVisible]
    void LoadPDF(string PDFDocument, bool IsFactbox);

    [ApplicationVisible]
    void SetVisible(bool IsVisible);
  }
}


die mainfest Datei:

Code:
<?xml version="1.0" encoding="utf-8"?>
<Manifest>
    <Resources>
        <Script>Script.js</Script>
        <StyleSheet>StyleSheet.css</StyleSheet>
    </Resources>

    <ScriptUrls>
        <ScriptUrl>https://ajax.aspnetcdn.com/ajax/jQuery/jquery-3.3.1.min.js</ScriptUrl>
      <ScriptUrl>https://cdnjs.cloudflare.com/ajax/libs/pdf.js/2.8.335/pdf.min.js</ScriptUrl>
    </ScriptUrls>

    <Script>
      <![CDATA[
         InitializeControl('controlAddIn');
         Microsoft.Dynamics.NAV.InvokeExtensibilityMethod('ControlAddInReady', null);
      ]]>
    </Script>

    <MinimumHeight>1</MinimumHeight>
    <MinimumWidth>1</MinimumWidth>
    <MaximumHeight>2000</MaximumHeight>   
    <VerticalStretch>true</VerticalStretch>
   <VerticalShrink>true</VerticalShrink>
    <HorizontalStretch>true</HorizontalStretch>
   <HorizontalShrink>true</HorizontalShrink>
</Manifest>


Danke im Voraus.
Zuletzt geändert von Klaus90 am 26. Februar 2025 17:16, insgesamt 3-mal geändert.

Re: Control Add-in von AL zu C/AL

25. Februar 2025 12:28

Hallo,

geht es dir nur um den Viewer oder benötigst du PDFlib.js vom Mozilla, damit du auch den PDF- Anhänge (ZUGFeRD-Rechnungen) im Edge/Chrome sehen kannst?

um einen Viewer für PDF bzw. XML zu implementieren benötigst du nur relativ simples JavaScript:
Script.Js
Code:
function InitializeControl(MimeData,MimeType) {
    try {

          const container = document.getElementById("controlAddIn");
 
          const iframe = document.createElement('iframe');
          iframe.setAttribute('style','width:100%; height:100%');
          iframe.setAttribute('src',`data:${MimeType};base64,${MimeData}`);
          container.appendChild(iframe);

      } catch (err) {
          RaiseALEvent('OnError', ['Javascript Error :' + err]);
      }
  }
function onMessage(event) {
  if (event.origin !== container) {
      console.log('Blocked invalid cross-domain call');
      return;
  }

  var data = event.data;

  if (typeof(window[data.func]) == "function") {
      window[data.func].call(null, data.message);
  }
}

function RaiseALEvent(eventName, args) {
    Microsoft.Dynamics.NAV.InvokeExtensibilityMethod(eventName, args);
}

 window.__controlAddInError__NAV = window.__controlAddInError;
 window.__controlAddInError = function (e) {
     console.log("Unhandled error has occurred: '" + e.message + "' - Stack: " + e.stack);
    window.__controlAddInError__NAV(e);
 };


Gruß Fiddi

Re: Control Add-in von AL zu C/AL

25. Februar 2025 12:48

Also das Thema Control Add-in ist je nach Version von Nav oder BC unterschiedlich und ich blicke da nicht so richtig durch. Es schein das er
Code:
InitializeControl('controlAddIn');
nicht auszuführen und ich weiß nicht warum. Soll hier in der manifest das hier gar nicht stehen?

Code:
         InitializeControl('controlAddIn');
         Microsoft.Dynamics.NAV.InvokeExtensibilityMethod('ControlAddInReady', null);


und ist das überhaupt richtig mit

Code:
    [ApplicationVisible]
    event ApplicationEventHandler onView;


Ich finde im Netz kein richtige Erklärung dazu, wann man was verwendet und wie.
gibt es irgendwo die Möglichkeit solche control-Add-ins für BC14 zu downloaden, weil da kann ich mir anschauen, wie andere das gemacht habe.

Re: Control Add-in von AL zu C/AL

25. Februar 2025 14:05

fiddi hat geschrieben:Hallo,

geht es dir nur um den Viewer oder benötigst du PDFlib.js vom Mozilla, damit du auch den PDF- Anhänge (ZUGFeRD-Rechnungen) im Edge/Chrome sehen kannst?

um einen Viewer für PDF bzw. XML zu implementieren benötigst du nur relativ simples JavaScript:
Script.Js
Code:
function InitializeControl(MimeData,MimeType) {
    try {

          const container = document.getElementById("controlAddIn");
 
          const iframe = document.createElement('iframe');
          iframe.setAttribute('style','width:100%; height:100%');
          iframe.setAttribute('src',`data:${MimeType};base64,${MimeData}`);
          container.appendChild(iframe);

      } catch (err) {
          RaiseALEvent('OnError', ['Javascript Error :' + err]);
      }
  }
function onMessage(event) {
  if (event.origin !== container) {
      console.log('Blocked invalid cross-domain call');
      return;
  }

  var data = event.data;

  if (typeof(window[data.func]) == "function") {
      window[data.func].call(null, data.message);
  }
}

function RaiseALEvent(eventName, args) {
    Microsoft.Dynamics.NAV.InvokeExtensibilityMethod(eventName, args);
}

 window.__controlAddInError__NAV = window.__controlAddInError;
 window.__controlAddInError = function (e) {
     console.log("Unhandled error has occurred: '" + e.message + "' - Stack: " + e.stack);
    window.__controlAddInError__NAV(e);
 };


Gruß Fiddi


kannst du bitte den Rest dazu posten? Ich würde das verwenden.

Re: Control Add-in von AL zu C/AL

25. Februar 2025 14:31

Hallo,

es könnte sein, das ich dich da falsch verstanden habe (oder mal wieder nicht richtig gelesen :roll: :oops: )

Mein Beispiel habe ich für AL und Web- Browser entwickelt. Es könnte sein, das das mit BC14 in C/AL nicht funktioniert. Das dürfte davon abhängen, welchen Browser Windows-Client intern verwendet.

Es gibt in BC in den "Steuerelement- Addins". Dort kannst du dir das Javascript als ZIP herunterladen, und danach auspacken und anschauen. Du solltest dann auch die passenden Pages in BC finden, und dann das ganze zusammenführen.

Gruß Fiddi

Re: Control Add-in von AL zu C/AL

25. Februar 2025 16:07

Ich habe die PDF in einer MediaSet Datentyp gespeichert, wie kann ich es mit einem PDF Reader öffnen? Der User soll die pdf sehen können. Ich brauche nur etwas. um die pdf öffnen zu können, so etwas in der Richtung:
2.png
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

Re: Control Add-in von AL zu C/AL

25. Februar 2025 16:27

Hallo,

Wenn ich nicht irgendwas verpasst habe, sind MediaSets und Media leider nicht wirklich zu gebrauchen, weil man die Elemente eines MediaSets nicht gezielt ansprechen kann, und Media nicht als Funktionsparameter zu gebrauchen ist.

Der gute alte Blob ist hier flexibler. den kann man man mit Tabelle/Codeunit "Temp Blob" munter durch die Gegend schieben, und auch mit der Codeunit 419 File Management auf den Client herunter laden. den erhaltenen Dateinamen kannst du dann mit Hyperlink() öffnen.

Gruß Fiddi

Re: Control Add-in von AL zu C/AL

25. Februar 2025 16:41

danke für die Info. Ich arbeite mit MediaSet, um dynamsich images hinzuzufügen (TempBlob benutze ich auch für MediaSet (Base64) (convert dotnet ehe nicht)). Das funktioniert bei mir reibungslos.
2025-02.png


Weil es vom Typ Media ist, kann man beim draufklicken auf das image "windows-fotoanzeige" öffnen. Das wollte ich unbedingt haben, weil wenn es nur ein blob ist, dann kann man es nicht öffnen.
2025.png


Leider kann ich damit keine pdfs öffnen oder anzeigen, weil "windows-fotoanzeige" nur Bilder kann.
Du hast keine ausreichende Berechtigung, um die Dateianhänge dieses Beitrags anzusehen.

Re: Control Add-in von AL zu C/AL

25. Februar 2025 16:43

fiddi hat geschrieben:Hallo,

Wenn ich nicht irgendwas verpasst habe, sind MediaSets und Media leider nicht wirklich zu gebrauchen, weil man die Elemente eines MediaSets nicht gezielt ansprechen kann, und Media nicht als Funktionsparameter zu gebrauchen ist.

Der gute alte Blob ist hier flexibler. den kann man man mit Tabelle/Codeunit "Temp Blob" munter durch die Gegend schieben, und auch mit der Codeunit 419 File Management auf den Client herunter laden. den erhaltenen Dateinamen kannst du dann mit Hyperlink() öffnen.

Gruß Fiddi


danke sehr das würde funktionieren :)

Re: [Gelöst] Control Add-in von AL zu C/AL

25. Februar 2025 17:06

Hallo,

Leider kann ich damit keine pdfs öffnen oder anzeigen, weil "windows-fotoanzeige" nur Bilder kann.


wichtig ist die Dateinamensendung, unter der du die exportiert Datei abspeicherst. Wenn du das bei der PDF- Datei als .PDF machst, sollte dein lokaler PDF-Viewer die Datei öffnen.
Wenn man das beim Mediset nicht funktioniert (weil für Bilder gedacht). dann landest du für die PDF doch wieder beim Blob.

Gruß Fiddi

Re: [Gelöst] Control Add-in von AL zu C/AL

25. Februar 2025 17:20

Also er soll die pdf im temp Ordner (client) haben.

Re: Control Add-in von AL zu C/AL

25. Februar 2025 18:02

Hallo,

als Hinweis schau male Hier

Gruß Fiddi

Re: Control Add-in von AL zu C/AL

26. Februar 2025 13:22

Wo soll ich die pdf datei speichern? ich möchte sie nur wegen dem pdf reader haben. Eigentlich kann danach das file gelöscht werden.

Re: Control Add-in von AL zu C/AL

26. Februar 2025 13:56

Hallo,

du kannst versuchen unter FileMgt.Magicpath() zu speichern. Evtl. räumt der Client die Dateien, beim Schließen dort wieder weg.

Gruß Fiddi

Re: Control Add-in von AL zu C/AL

26. Februar 2025 15:05

Es hat mit `FileManagement.BLOBExport()` funktioniert. Wenn ich den Client schließe und wieder öffne, ist der Ordner `C:\Users\<username>\AppData\Local\Temp\Microsoft Dynamics NAV/<unbekannte Nummer>`, in dem die PDF-Datei gespeichert war, verschwunden. So soll das auch sein. Danke für die Hilfe :-D