AzureAppService PDF Export

Hallo,

wir verwenden ListLabel29 in einer asp.net core Anwendung welche in Azure AppService (Windows) gehostet wird.
Wie können wir nun einen PDF Export in einen MemoryStream erstellen und welche Optionen müssen dazu konfiguriert sein?

Folgende Fehlermeldung erhalten wir:

Fehler:
List & Label has no valid output medium at the print start. The selected export format may be deactivated or not available. Possibly the selected export format is disabled or not available. Also note the hints on redistribution of List & Label, in particular you need the module ‘c?ll??ex.llx’ and possibly others.

Vielen dank!!

Da bräuchte es mal ein bisschen Code und ein Debuglog zur Analyse. Spontan würde ich darauf tippen, dass Module fehlen (konkret entweder die c?ll29ex.llx und/oder die combit.ListLabel29.ConversionTools.*).

Hallo,

ich habe folgendes überprüft.
Die benötigten DLLs sollten vorhanden sein (ich verwende das Nuget Package meiner Enterprise Lizenz).

Quellcode gekürzt:
using (combit.Reporting.ListLabel ll = new combit.Reporting.ListLabel())
{
try
{
ll.Core.LlSetOption(333, 1);
ll.Core.LlSetOption(331, 2);
ll.LicensingInfo = LLLicensingInfo;
ll.Debug = LlDebug.Enabled;
if (!string.IsNullOrEmpty(reportDefinition))
{
byte reportBytes = Convert.FromBase64String(reportDefinition);
MemoryStream ms = new MemoryStream(reportBytes, 0, reportBytes.Length, true);

            // HIER WERDEN DIE DATENQUELLEN GESETZT
            //...
            ll.Variables.Add("Version_Program", programVersion);
            ll.Variables.Add("Version_Report", reportVersion);
            // Exportdateinamen setzen
            ll.Core.LlXSetParameter(LlExtensionType.Export, "PDF", "Export.File", filename);
            ll.AutoProjectStream = ms;
        }
        ll.Debug = LlDebug.LogToFile;
        using (MemoryStream stream = new MemoryStream())
        {
            ExportConfiguration conf = new ExportConfiguration(LlExportTarget.Pdf, stream, ll.AutoProjectStream);
            ll.Export(conf);
            return new ReportGeneratorResult() { FileName = filename, Result = stream.ToArray() };
        }
    }
    catch (Exception ex)
    {
        throw;
    }
    finally
    {
        // Cleanup tmp files
    }
}

Ich schau mal um ein Logfile - gibt es dazu eine Vorgehensweise bei Azure App Services?

Hallo @Matthias_Kammerlohr Du kannst dir sonst auch mal den Thread hier anschauen: List and Label in Azure app service verwenden. Da wird auf einen fehlenden Druckertreiber/Device hingewiesen, was aber zwischenzeitlich über Printerless gelöst werden kann - vielleicht kannst du das einmal noch setzen?

Hallo @Oliver_Hambrecht

habe ich gerade versucht aber führt leider zum selben Ergebnis.

Schade, dann würde ich es mal so machen wie schon von @jbartlau vorgeschlagen: Versuche im Log etwas zu finden. Allgemeine Infos zum Logging kannst du hier bereits finden: Hilfe bei der Fehleranalyse für List & Label

Hi Matthias, wo setzt du das Printerless?

        using (combit.Reporting.ListLabel ll = new combit.Reporting.ListLabel())
        {
            string filename = string.Empty;
            List<string> tmpFileNames = new List<string>();
            try
            {
                ll.Core.LlSetOption(333, 1);
                ll.Core.LlSetOption(331, 2);
                ll.LicensingInfo = LLLicensingInfo;
                **ll.Printerless = true;**
                ll.Debug = LlDebug.LogToFile;

Ziemlich am Anfang :slight_smile:

Ich weiß leider auch nicht, wo ListLabel die COMBIT.LOG im Falle eines Azure App Services ablegt

Ich weiß leider auch nicht, wo ListLabel die COMBIT.LOG im Falle eines Azure App Services ablegt

Da hatten wir letztens diese Diskussion zu :slight_smile::

Hallo,

kann ich das Logfile per PN schicken oder soll ich ein Ticket aufmachen?
(Möchte nicht alle Informationen öffentlich machen)

Die Lösung des Problems würde ich dann auf jeden Fall hier posten - hilft ja bestimmt auch Anderen :slight_smile:

EDIT: Ich habs mal eingekürzt

CMLL29  : 07:50:58.423 00001878/00 2 [L01 GEN]:   load config 'C:\local\Temp\combit\_29_llstream1b360749e986d.lst'
CMLL29  : 07:50:58.653 00001878/00 3 [L01 LIC]:   clsLicenseInfo::IsAllowed(0,state=00000004)
CMLL29  : 07:50:58.703 00001878/00 4 [L01 LIC]:    LIC: _nLicState=4
CMLL29  : 07:50:58.763 00001878/00 5 [L02 GEN]:   >clsApplication::hLibrary(1,1,0,1)
CMLL29  : 07:50:58.793 00001878/00 6 [L02 GEN]:    >clsApplication::GetLibrary(1,1,0,0)
CMLL29  : 07:50:58.824 00001878/00 7 [L02 GEN]:    <clsApplication::GetLibrary() -> 5B4D0000
CMLL29  : 07:50:58.893 00001878/00 8 [L02 GEN]:   <clsApplication::hLibrary() -> 5B4D0000
CMLL29  : 07:50:58.923 00001878/00 9 [L01 GEN]:   SetUserAborted(reset (print project ct): 0)
CMLL29  : 07:50:58.933 00001878/00 0 [L01 LIC]:   clsLicenseInfo::IsAllowed(11,state=00000004)
CMLL29  : 07:50:58.953 00001878/00 1 [L01 LIC]:    LIC: _nLicState=4
CMLL29  : 07:50:58.996 00001878/00 2 [L01 GEN]:   load config 'C:\local\Temp\combit\_29_llstream1b360749e986d.lst'

CMLL29  : 07:50:59.168 00001878/00 2 [L01 DAT]:   >DataProvider()::Skip()
CMLL29  : 07:50:59.168 00001878/00 3 [L01 DAT]:   <DataProvider()::Skip() -> OK
CMLL29  : 07:50:59.183 00001878/00 4 [L01 DAT]:   >DataProvider()::DefineRow() [master=0]
CMLL29  : 07:50:59.263 00001878/00 5 [L01 DAT]:   <DataProvider()::DefineRow() [master=0]
CMLL29  : 07:50:59.263 00001878/00 6 [L01 GEN]:   ** pass 0: branch='software\combit\cmbtll\W3WP' not found
CMLL29  : 07:50:59.277 00001878/00 7 [L01 GEN]:   ** pass 1: branch='software\combit\cmbtll\W3WP' not found
CMLL29  : 07:50:59.277 00001878/00 8 [L01 GEN]:   ** pass 2: branch='software\combit\cmbtll\*' not found
CMLL29  : 07:50:59.277 00001878/00 9 [L01 GEN]:   ** pass 3: branch='software\combit\cmbtll\*' not found
CMLL29  : 07:50:59.277 00001878/00 0 [L01 GEN]:   ** pass 4: branch='software\combit\cmbtll' not found
CMLL29  : 07:50:59.293 00001878/00 1 [L01 GEN]:   ** pass 5: branch='software\combit\cmbtll' not found

CMLL29  : 07:50:59.863 00001878/00 5 [L01 GEN]:   clsOutputPart::PrinterGetFrom('Virtual Device')
CMLL29  : 07:50:59.893 00001878/00 6 [L01 GEN]:   >ProjectSatelliteFileItem('C:\local\Temp\combit\_29_llstream1b360749e986d.lst', type 1, prj=-1)
CMLL29  : 07:50:59.893 00001878/00 7 [L01 GEN]:    >SubItem('C:\local\Temp\combit\_29_llstream1b360749e986d.lst', OS=1, query 'll/printerconfig')
CMLL29  : 07:50:59.908 00001878/00 8 [L01 GEN]:     filename='C:\local\Temp\combit\_29_llstream1b360749e986d.lst'
CMLL29  : 07:50:59.908 00001878/00 9 [L01 GEN]:    <SubItem-> 'C:\local\Temp\combit\_29_llstream1b360749e986d.lsp'
CMLL29  : 07:50:59.908 00001878/00 0 [L01 GEN]:   <ProjectSatelliteFileItem() -> 'C:\local\Temp\combit\_29_llstream1b360749e986d.lsp'
CMLL29  : 07:50:59.986 00001878/00 1 [L04 EXT]:   Caught LL_NoDestination_Exception (List & Label has no valid output medium at the print start. The selected export format may be deactivated or not available. Possibly the selected export format is disabled or not available. Also note the hints on redistribution of List & Label, in particular you need the module 'c?ll??ex.llx' and possibly others.). 
CMLL29  : 07:50:59.986 00001878/00 2 [L04 EXT]:    Inner Exception:  () 
CMLL29  : 07:50:59.986 00001878/00 3 [L04 EXT]:    Stack Trace: 
CMLL29  : 07:50:59.986 00001878/00 4 [L04 EXT]:       at combit.Reporting.LLException.CheckReturn(Int32 returnValue)

CMLL29  : 07:50:59.986 00001878/00 5 [L04 EXT]:      at combit.Reporting.LlCore.LlPrintSetOptionString(LlPrintOptionString option, String value)

CMLL29  : 07:50:59.986 00001878/00 6 [L04 EXT]:      at combit.Reporting.ListLabel.SetExportOptions(LlPrintMode printMode)

CMLL29  : 07:50:59.986 00001878/00 7 [L04 EXT]:      at combit.Reporting.ListLabel.PrintReportFromRelationalDataSourceNewMode(IDataProvider dataSource, String projectFile, Boolean showFileSelect, LlPrintMode printMode, LlBoxType boxType, String dialogTitle, Boolean showPrintOptions, String tempPath)

CMLL29  : 07:50:59.986 00001878/00 8 [L04 EXT]:      at combit.Reporting.ListLabel.AutoPrint(LlProject projectType, String projectFile, Boolean showFileSelect, LlPrintMode printMode, LlBoxType boxType, String dialogTitle, Boolean showPrintOptions, String tempPath)
CMLL29  : 07:51:00.033 00001878/00 9 [L01 GEN]:   SetUserAborted(reset (print project dt): 0)
CMLL29  : 07:51:00.085 00001878/00 0 [L02 EXT]:   ListLabel.Dispose() Job 1
CMLL29  : 07:51:00.085 00001878/00 1 [L01 EXT]:   ListLabel.Dispose(): Disposing managed resources
CMLL29  : 07:51:00.096 00001878/00 2 [L01 EXT]:   ListLabel.Dispose(): Disposing core object and closing job

Schick mir gerne erstmal eine PN mit dem ganzen Logfile. Wenn das nicht ausreicht können wir immer noch einen Case aufmachen.

Ich ziehe die Diskussion mal wieder in den öffentlichen Bereich hier um :slight_smile: - die Analyse hat gezeigt, dass das Problem darin besteht, dass kein Docker-Container verwendet wird. Da hat Microsoft beim Azure AppService leider diverse Sicherheitsmaßnahmen aktiv (u. a. kein Zugriff auf GDI-Funktionen) die die direkte Verwendung unmöglich machen. Mit einem Dockercontainer als Zwischenschicht sollte es aber klappen - das wird @Matthias_Kammerlohr jetzt prüfen. Interessante Threads, die wir in dem Zuge diskutiert haben: