pdf.js in nashorn engine benutzen

Der_AltMann

Aktives Mitglied
ich würde gerne ein Script schreiben, dass Text aus einer pdf liest. Da Java keine pdfs ohne externe Library lesen kann(ich weiß zumindest nicht wie) muss ich die pdf mithilfe von JavaScript lesen. Ich hatte vor pdf.js zu nutzen. Leider bekomme ich immer den Fehler: Warning: Setting up fake worker.
Java:
var JavaPackages = new JavaImporter(java.io,
    java.lang,
    java.io,
    java.util,
    java.nio.file,
    java.nio.charset.StandardCharsets,
);

with(JavaPackages) {
logger.info("start");
    try {

        load('C:/Users/AltmannT/Downloads/pdfjs-2.5.207-es5-dist/build/pdf.js');
        logger.info("loaded");
        
         var url = 'C:/Users/AltmannT/Documents/file.pdf';

         pdfjsLib.GlobalWorkerOptions.workerSrc = 'C:/Users/AltmannT/Downloads/pdfjs-2.5.207-es5-dist/build/pdf.worker.js';
           logger.info("set worker");
        
         var loadingTask = pdfjsLib.getDocument(url);
 logger.info(loadingTask.docId);
   loadingTask.promise.then(function (PDFDocumentInstance) {
     logger.info("bin in der function");
     var totalPages = PDFDocumentInstance.numPages;
     var pageNumber = 1;

     // Extract the text
     getPageText(pageNumber , PDFDocumentInstance).then(function(textPage){
         // Show the text of the page in the console
         logger.info(textPage);
     });

 }, function (reason) {
     // PDF loading error
    logger.info("error loading pdf"+reason);
 });


 function getPageText(pageNum, PDFDocumentInstance) {
     // Return a Promise that is solved once the text of the page is retrieven
     return new Promise(function (resolve, reject) {
         PDFDocumentInstance.getPage(pageNum).then(function (pdfPage) {
             // The main trick to obtain the text of the PDF page, use the getTextContent method
             pdfPage.getTextContent().then(function (textContent) {
                 var textItems = textContent.items;
                 var finalString = "";

                 // Concatenate the string of the item to the final string
                 for (var i = 0; i < textItems.length; i++) {
                     var item = textItems[i];

                     finalString += item.str + " ";
                 }

                 // Solve promise with the text retrieven from the page
                 resolve(finalString);
             });
         });
     });
 }
 
    } catch (e) {
    var sw = new StringWriter();
    var pw = new PrintWriter(sw);
    e.printStackTrace(pw)
        logger.info("Fehler: " + e+sw.toString());
    }
logger.info("end");
}
der Konsolenoutput:
Java:
INFO  root  - start
INFO  root  - geloaded
INFO  root  - set worker
INFO root  - Warning: Setting up fake worker.
INFO  root  - d0
INFO  root  - end
Der Code funktioniert normal in html/js(natürlich ohne load Befehl).
Geht das überhaupt in Nashorn?
 

mihe7

Top Contributor
Also, ich verstehe den Zusammenhang irgendwie nicht. Wenn Du Nashorn laufen lassen kannst, dann kannst Du doch auch ein Java-Programm laufen lassen, oder?
 

Der_AltMann

Aktives Mitglied
Also, ich verstehe den Zusammenhang irgendwie nicht. Wenn Du Nashorn laufen lassen kannst, dann kannst Du doch auch ein Java-Programm laufen lassen, oder?
Ne ich möchte ein Nashorn Script für "Polarion" entwickeln. Das ist ein Java basiertes Programm, das eine API zur Verfügung stellt, mit der man Zugriff auf verschiedene Methoden hat. Man kann aber natürlich nicht den eigentlichen Programmcode ändern, sondern eben nur sein eigenes Script einbinden.
 

mrBrown

Super-Moderator
Mitarbeiter
Hat das eine Java-API oder nur die Möglichkeit JavaScript einzubinden (und gar keine Möglichkeit, überhaupt Java-Code auszuführen, egal ob mit externen Libs oder ohne)?
 

mrBrown

Super-Moderator
Mitarbeiter
Wenn du eigene Klassen ausführen kannst, kannst du auch irgendeine Lib einbinden, die PDFs auslesen kann.

Wie das geht hängt dann nur davon ab, wie man gewöhnliche Java-Klassen aufrufen kann :) Muss man Jars irgendwo hochladen oder über ne Oberfläche öffnen?
 

Der_AltMann

Aktives Mitglied
Wenn du eigene Klassen ausführen kannst, kannst du auch irgendeine Lib einbinden, die PDFs auslesen kann.

Wie das geht hängt dann nur davon ab, wie man gewöhnliche Java-Klassen aufrufen kann :) Muss man Jars irgendwo hochladen oder über ne Oberfläche öffnen?
Naja es sind ja keine "eigenen" Klassen von mir sondern von den Entwicklern des Programmes, das mein Script einbindet. Eine eigene Jar kann ich nicht einbinden.
Eine gewöhnliche Java Klasse rufe ich so auf :
Javascript:
var JavaPackages = new JavaImporter(
java.io,java.lang,Java.util,...);
with(JavaPackages){
var outFile = new FileWriter("");
var out = new BufferedWriter(outFile);
}
 

Der_AltMann

Aktives Mitglied
Geht es um dieses Polarion? https://extensions.polarion.com/pages/authoring_extension

Sieht so aus, als kann man dafür auch Extensions direkt in Java-Code schreiben?
Ja genau darum geht es :)

Tatsächlich habe ich das auch ausprobiert. Allerdings haben diese Extensions andere Zugriffsrechte als die Scripts. Die Extensions sind meist so Widgets, die irgendwelche Daten anzeigen, deshalb haben sie nur lese Zugriff auf die Datenbank. In meinem Anwendungsfall möchte ich aus den PDF Daten Items in der DB erzeugen. Ich bin immer an dem Erzeugen gescheitert...die Library pdf Box konnte ich aber einbinden und benutzen xD
 
K

kneitzel

Gast
Also https://almdemo.polarion.com/polarion/sdk/index.html zeigt diverse APIs. Hast du die Open API genutzt? Damit solltest Du Daten auch ändern können. Rendering API hört sich nicht so sehr danach an...

Mund je nachdem, was man genau machen will, ist die REST API evtl. auch interessant.

Was hast du genau versucht? Da kann man ggf helfen. Der Ansatz, da so über JavaScript zu gehen erscheint mir aber eher als dubios ...
 

Der_AltMann

Aktives Mitglied
Also https://almdemo.polarion.com/polarion/sdk/index.html zeigt diverse APIs. Hast du die Open API genutzt? Damit solltest Du Daten auch ändern können. Rendering API hört sich nicht so sehr danach an...

Mund je nachdem, was man genau machen will, ist die REST API evtl. auch interessant.

Was hast du genau versucht? Da kann man ggf helfen. Der Ansatz, da so über JavaScript zu gehen erscheint mir aber eher als dubios ...
ja ich habe die open API benutzt. Ich habe mich etwas mehr mit den Widgets auseinander gesetzt und herausgefunden, dass es verschiedene Kontexte gibt, in der sich das Widget befinden kann. Ich konnte keine Transaktionen ausführen, da ich einfach im falschen Kontext war.
Mit der executeAction() konnte ich nun auch schreiben :)
Vielen Dank für eure Tipps !
Jetzt muss ich mir nur noch überlegen, wie ich am besten Inhalte aus der pdf extrahieren kann. Am liebsten wäre mir, wenn ich über die pdf iterieren würde und die Library mir dann sagen würde: Hier ist eine Tabelle, hier ist ein Bild,Überschift, usw.
Hat hier jemand Erfahrung?
 
Ähnliche Java Themen

Ähnliche Java Themen

Neue Themen


Oben