Preload PDF with URL parameters

WebViewer Server: 2.2.1

Do you have an issue with a specific file(s)? No
Can you reproduce using one of our samples or online demos? No
Are you using the WebViewer server? Yes
Does the issue only happen on certain browsers? No
Is your issue related to a front-end framework? No
Is your issue related to annotations? No

Please give a brief summary of your issue:

Cannot preload PDFs if the PDF files required URL parameters, e.g. access tokens

Please describe your issue and provide steps to reproduce it:

I have a PDF hosted on Firebase Storage. It requires an auth token in the URL parameters, e.g. http://server/myfile.pdf?alt=media&token={uuid}.

The Webviewer Server says this file is not formatted, because it assumes the file extension is “.pdf?alt=media&token={uuid}”.

Is there a way for the Webviewer Server to ignore the URL parameters?

Thank you for posting your question to our forum. We will provide you with an update as soon as possible.

Hello Zack,

Thank you for contacting us.

Please provide the following information:

  1. The exact error message you are receiving from the WebViewer Server when it fails to load the PDF.
  2. Does this occur issue occur without WebViewer Server?
    3 . Any relevant logs from the WebViewer Server that might indicate where the issue is occurring.
  3. A code snippet showing how you are initializing WebViewer and attempting to load the document.

In the meantime, as a potential workaround, you could using a server-side proxy that can handle the URL parameters and then serve the PDF.

  1. Full stacktrace below:
java.lang.Exception: File format pdf?alt=media&token=dc3e9ef0-b009-44d5-921e-e26dbeb44004 is not supported. Refer to http://r.pdftron.com/fileformats for a full list of supported formats.
	at com.pdftron.server.DocReference.<init>(DocReference.java:70)
	at com.pdftron.blackboxservlet.PreloadURL.doGet(PreloadURL.java:34)
	at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:564)
	at jakarta.servlet.http.HttpServlet.service(HttpServlet.java:658)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:205)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:149)
	at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:174)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:149)
	at com.pdftron.server.CorsFilter.handleSimpleCORS(CorsFilter.java:263)
	at com.pdftron.server.CorsFilter.doFilter(CorsFilter.java:167)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:174)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:149)
	at com.pdftron.server.DocModModifier.doFilter(DocModModifier.java:101)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:174)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:149)
	at com.pdftron.server.BlackBoxAuthenticator.doFilter(BlackBoxAuthenticator.java:84)
	at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:174)
	at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:149)
	at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:167)
	at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:90)
	at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:482)
	at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:115)
	at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:673)
	at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:93)
	at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:74)
	at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:344)
	at org.apache.coyote.http11.Http11Processor.service(Http11Processor.java:391)
	at org.apache.coyote.AbstractProcessorLight.process(AbstractProcessorLight.java:63)
	at org.apache.coyote.AbstractProtocol$ConnectionHandler.process(AbstractProtocol.java:896)
	at org.apache.tomcat.util.net.Nio2Endpoint$SocketProcessor.doRun(Nio2Endpoint.java:1683)
	at org.apache.tomcat.util.net.SocketProcessorBase.run(SocketProcessorBase.java:52)
	at org.apache.tomcat.util.net.AbstractEndpoint.processSocket(AbstractEndpoint.java:1244)
	at org.apache.tomcat.util.net.Nio2Endpoint.setSocketOptions(Nio2Endpoint.java:328)
	at org.apache.tomcat.util.net.Nio2Endpoint$Nio2Acceptor.completed(Nio2Endpoint.java:468)
	at org.apache.tomcat.util.net.Nio2Endpoint$Nio2Acceptor.completed(Nio2Endpoint.java:404)
	at java.base/sun.nio.ch.Invoker.invokeUnchecked(Invoker.java:129)
	at java.base/sun.nio.ch.Invoker$2.run(Invoker.java:221)
	at java.base/sun.nio.ch.AsynchronousChannelGroupImpl$1.run(AsynchronousChannelGroupImpl.java:113)
	at org.apache.tomcat.util.threads.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1191)
	at org.apache.tomcat.util.threads.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:659)
	at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:63)
	at java.base/java.lang.Thread.run(Thread.java:840) 
  1. No, it does not. the Webviewer UI handles it just fine.

  2. Here’s how we’d initializing things on the frontend:

return WebViewer(
      {
        path: "[redacted]",
        licenseKey:  "[redacted]",
        // Only use the server for mobile devices
        webviewerServerURL: isSmallDevice ? WEBVIEWER_SERVER : "",
        fullAPI: true,
        disabledElements: DISABLED_ELEMENTS,
        preloadWorker: `${WebViewer.WorkerTypes.PDF}`,
        disableLogs: IS_PROD,
      } as WebViewerOptions,
      container
)

And then eventually loading the document like this:

instance.UI.loadDocument(url, {
      extension: "pdf",
      onLoadingProgress: (percent: number) => {
        setCurrentDocumentLoadingProgress(percent * 100);
      },
      onError: (error: any) => {
        logger.error(error);
        setErrorMessage("Error loading document. Please try again.");
        return promiseReject(error);
      },
    });

Hello Zack,

You should be able to overwrite this behavior by providing a &ext=“pdf” to the URL.

Thank you. This seems to work.

I couldn’t see this urlParam in the documentation. I wish it were easier to search for that.

1 Like