Hallo,
ich habe gerade ein größeres Problem.
Ich erstelle mittels der API von "Open Html2pdf" ein PDF. Heißt ich rufe eine HTML Seite auf, und dann wird der Content dieser HTML Seite in ein PDF verpackt.
Das funktioniert auch ganz gut.
Mein Problem ist nun aber, dass beim Generieren des PDF eine neue HTTP Session erzeugt wird. Ich verwende Apache Shiro für die Authentifizierung.
Liegt meine XHTML Datei (File, welches dann den HTML Content beinhaltetet) in einem geschützten Bereich, dann wird das PDF erst gar nicht generiert bzw. die "No Access" Seite wird angezeigt im PDF, weil davor umgeleitet wird auf diese Seite.
Was ich nun also benötige ist, dass ich die bestehende Session (HTTP Session, Shiro Objekt) nutze und nicht für die Generierung eine neue HTTP Session erzeugt wird. Ich vermute das Problem ist in der html5ParseDocument - Methode. Wie kann ich hier die bestehende Session nutzen?
Hier der Code:
Vielen Dank
ich habe gerade ein größeres Problem.
Ich erstelle mittels der API von "Open Html2pdf" ein PDF. Heißt ich rufe eine HTML Seite auf, und dann wird der Content dieser HTML Seite in ein PDF verpackt.
Das funktioniert auch ganz gut.
Mein Problem ist nun aber, dass beim Generieren des PDF eine neue HTTP Session erzeugt wird. Ich verwende Apache Shiro für die Authentifizierung.
Liegt meine XHTML Datei (File, welches dann den HTML Content beinhaltetet) in einem geschützten Bereich, dann wird das PDF erst gar nicht generiert bzw. die "No Access" Seite wird angezeigt im PDF, weil davor umgeleitet wird auf diese Seite.
Was ich nun also benötige ist, dass ich die bestehende Session (HTTP Session, Shiro Objekt) nutze und nicht für die Generierung eine neue HTTP Session erzeugt wird. Ich vermute das Problem ist in der html5ParseDocument - Methode. Wie kann ich hier die bestehende Session nutzen?
Hier der Code:
Java:
public void createPDFDialog(DocumentDesigner documentDesigner) {
try {
String url = createUrl(documentDesigner);
pdfFile = null;
PipedOutputStream os = new PipedOutputStream();
PipedInputStream is = new PipedInputStream(os);
managedExecutorService.submit(() -> {
try {
PdfRendererBuilder builder = new PdfRendererBuilder();
XRLog.setLevel(XRLog.CSS_PARSE, Level.SEVERE);
XRLog.setLoggingEnabled(false);
Document doc = html5ParseDocument(url, 0);
builder.withW3cDocument(doc, url);
builder.toStream(os);
builder.run();
os.close();
} catch (IOException e) {
LOGGER.error(ExceptionUtils.getFullStackTrace(e));
}
});
pdfFile = new DefaultStreamedContent(is, "application/pdf");
}
catch (XRRuntimeException e) {
LOGGER.error(ExceptionUtils.getFullStackTrace(e));
FacesContext.getCurrentInstance().addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR,
"Etwas stimmt mit der Designspezifikation nicht!", ""));
} catch (Exception e) {
LOGGER.error(ExceptionUtils.getFullStackTrace(e));
ErrorMessage.showErrorMessage();
}
LOGGER.info("END createPDFDialog");
return;
}
/**
* Parsen um valides XML zu bekommen
*
* @param urlStr
* @param timeoutMs
* @return
* @throws IOException
*/
public Document html5ParseDocument(String urlStr, int timeoutMs) throws IOException {
URL url = new URL(urlStr);
org.jsoup.nodes.Document doc;
doc = Jsoup.parse(url, timeoutMs);
// Should reuse W3CDom instance if converting multiple documents.
return new W3CDom().fromJsoup(doc);
}
Vielen Dank