PDF Tools

Overview

Contains multiple Smart Services and Functions for interacting with PDF Documents.

Key Features & Functionality

Smart Services:

  • Merge PDF - Merges multiple PDF documents into a single document.
  • Extract PDF Pages - Extracts a range of pages from an existing PDF into a new PDF.
  • Fill PDF - Populates the fields of a PDF Form and optionally flattens it disallow further changes.
  • Create PDF Content - Allows text to be added to a PDF with control over the style, position, and angle. An existing PDF can be updated or a new one created from scratch.
  • Convert PDF to Image - Creates an array of images or a multi-page tiff from a PDF.
  • Compress PDF - Compresses the images in the PDF to make it smaller.
  • Un-protect and Copy PDF - Using the document password, create an un-protected copy of a protected PDF.
  • Convert Image to PDF - Creates a PDF starting from one or many images. It also supports multi-page tiff images.
  • Encrypt PDF - Encrypts an existing PDF with a password.

Functions:

  • Get PDF Metadata - Retrieves metadata on the PDF: page count, title, author, security, encryption, etc.
  • Get PDF Text - Retrieves the text content from a PDF.
  • Get PDF Form Fields - Retrieves the populated form field values of an unflattened PDF.
  • Get PDF Signature Fields - Retrieves the populated signature field values of an unflattened PDF.
  • Get PDF Bookmarks - Retrieves the raw list of bookmarks in the PDF.

Anonymous
  • to me more dangerous than helpful. I my personal opinion an alert should be created in a prod environment if a node fails and this is done the best way with an error message and a failed node in a process model instance. If it runs to smooth there is a high chance you miss this behavior, that something was not like it supposed to be. So its in general not the worst way to do it, but i get where are you coming from, I see here rather an issue why there are many cvorrupted PDF files ;) 

  • Hi,

    Sometimes a tif image to pdf conversion fails to produce a pdf. Instead a blank pdf is produced or even more rarely a pdf is produced containing only part of the tif image.

    The smart service does not produce any error output and shows as a success status of True.

    Using v2.5.0 PDF Tools  smart service Convert Image to PDF (pdftools.ConvertImageToPDFWithDpiInput) on Appian 23.4

    The images can be opened in paint (for example) and successfully and completely printed using the Microsoft print to pdf printer.

    Is there anyway to diagnose the issue further (logs, etc)? 

    Regards

  • To clarify, Allen and I are experiencing this issue in the "Fill PDF" process node.

  • I have a similar issue, but it appears to me that the plugin is no longer allowing PNG files.  Error I received was Not a JPEG file.  It was working great up until the Appian upgrade to 24.1

  • We have been using the 'Convert PDF to Image' smart service for a while to convert a PDF into a PNG with a transparent background. After we updated to the most recent version of this plugin, the PNG appears as a solid black image; it appears that the background is rendering as black instead of transparent. Is this a known issue?

  • I am getting below error with this version of the plugin. I have tried removing and re-installing the plugin. I am on Appian 23.4.

    Unable to load class 'javax.imageio.ImageReadParam' because the bundle wiring for pdftools is no longer valid.
    at org.apache.felix.framework.BundleWiringImpl.findClassOrResourceByDelegation(BundleWiringImpl.java:1548)
    at org.apache.felix.framework.BundleWiringImpl.access$300(BundleWiringImpl.java:79)
    at org.apache.felix.framework.BundleWiringImpl$BundleClassLoader.loadClass(BundleWiringImpl.java:1986)

  • I am getting this error on above plugin version, Appian version is 23.4, Cloud.

    Exception in thread "ThreadPoolTaskExecutor-62870" java.lang.NoClassDefFoundError: javax/imageio/ImageReadParam
    at com.github.jaiimageio.impl.plugins.tiff.TIFFImageReaderSpi.createReaderInstance(TIFFImageReaderSpi.java:118)
    at javax.imageio.spi.ImageReaderSpi.createReaderInstance(ImageReaderSpi.java:320)
    at javax.imageio.ImageIO$ImageReaderIterator.next(ImageIO.java:529)
    at javax.imageio.ImageIO$ImageReaderIterator.next(ImageIO.java:513)
    at com.appiancorp.ps.pdftools.ConvertImageToPDF.run(ConvertImageToPDF.java:77)
    at com.appiancorp.process.runtime.framework.DefaultActivityExecutor$1.lambda$call$0(DefaultActivityExecutor.java:136)
    at com.appiancorp.plugins.PluginUsageLogger.runWithPluginInformation(PluginUsageLogger.java:54)
    at com.appiancorp.process.runtime.framework.DefaultActivityExecutor$1.call(DefaultActivityExecutor.java:136)
    at com.appiancorp.process.runtime.framework.DefaultActivityExecutor$1.call(DefaultActivityExecutor.java:130)
    at com.appiancorp.common.ContextClassLoaderSwitcher.runInContext(ContextClassLoaderSwitcher.java:28)
    at com.appiancorp.process.runtime.framework.DefaultActivityExecutor.execute(DefaultActivityExecutor.java:130)
    at com.appiancorp.process.engine.UnattendedJavaActivityRequest.execute(UnattendedJavaActivityRequest.java:88)
    at com.appiancorp.process.engine.UnattendedJavaActivityRequestResponseCreator.getJavaActivityResultResponse(UnattendedJavaActivityRequestResponseCreator.java:22)
    at com.appiancorp.process.engine.UnattendedJavaActivityRequest.getJavaActivityResultResponse(UnattendedJavaActivityRequest.java:67)
    at com.appiancorp.process.engine.UnattendedJavaActivityRequest.execute0(UnattendedJavaActivityRequest.java:55)
    at com.appiancorp.common.persistence.data.AppianDataUserContextProvider.executeWithConsistentDataReads(AppianDataUserContextProvider.java:143)
    at com.appiancorp.process.engine.ProcessContinuationRequest.executeOuter(ProcessContinuationRequest.java:68)
    at com.appiancorp.process.engine.ContinuationRequest.execute(ContinuationRequest.java:129)
    at com.appiancorp.process.workpoller.UnattendedRequestHandlerBean.onMessage(UnattendedRequestHandlerBean.java:36)
    at com.appiancorp.process.workpoller.WorkItem.run(WorkItem.java:110)
    at org.springframework.jca.work.SimpleTaskWorkManager$DelegatingWorkAdapter.run(SimpleTaskWorkManager.java:241)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:750)
    Caused by: java.lang.ClassNotFoundException: Unable to load class 'javax.imageio.ImageReadParam' because the bundle wiring for pdftools is no longer valid.
    at org.apache.felix.framework.BundleWiringImpl.findClassOrResourceByDelegation(BundleWiringImpl.java:1548)
    at org.apache.felix.framework.BundleWiringImpl.access$300(BundleWiringImpl.java:79)
    at org.apache.felix.framework.BundleWiringImpl$BundleClassLoader.loadClass(BundleWiringImpl.java:1986)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:351)

  • v2.5.0 Release Notes
    • Updated deprecated APIs, added license file and updated min version to 23.2
  • Hi,

    I am getting below error when I use the getpdftext function.

    An error occurred while evaluating expression: pdfText:getpdftext(pv!rulesforInclusionpdf) (Expression evaluation error at function 'getpdftext': Error: Header doesn't contain versioninfo) (Data Outputs)

    PDF document referenced in the function is generated from docx using pdf from docx

    Any help is much appreciated. Thanks!

  • Hi, thanks for the reply! Unless there is another way to check in Appian, if there is the PDF is formed correclty, exactly that could be a good behavior.... A null might be fine. A null should mean that the function could not get any fields from the PDF. If the function response is null, it means there is no metadata and should mean that something is going on with that PDF and it is invalid.