WaterWoo Documentation

More about WaterWoo PDF Premium

WaterWoo does its magic using the open-source TCPDF and TCPDI libraries (not developed or maintained by WaterWoo dev). TCPDI parses the existing PDF (assuming it is unencrypted and uncorrupted), recreating it in memory, and TCPDF applies your watermark. Regretfully, TCPDI is unable to parse certain PDF elements into memory, such as internal links and forms. However, hopefully this feature will be more stable in a future TCPDI release. Understanding a little about how TCPDI and TCPDF come into play, using PHP memory, might help you to create the most effective and efficient watermarks.

View the WaterWoo changelog here.


With your purchase you will receive a download link for the premium (paid) version of this plugin. The link will be on your order confirmation webpage and in your receipt email. If at any time you need a fresh copy of WaterWoo PDF Premium, you can also log into your account at web.little-package.com/account. Open the .ZIP file package to find the “waterwoo-pdf-premium” plugin folder.

  1. Upload the entire “waterwoo-pdf-premium” folder to the “/wp-content/plugins/” directory. Alternatively you can go to Plugins -> Add New, click “Upload Plugin” and upload the ZIP file.
  2. Activate the plugin through the “Plugins” menu in WordPress. If the free version of the plugin is still active, deactivate the free version.
  3. Visit WooCommerce->Settings->Watermark tab to set your plugin preferences. Settings from the free version (if you have used it) will be imported.
    Additional settings panels are found in each product editor screen.

  4. Please test your watermarking by making mock purchases before going live to make sure it works and looks great!

If you were using the free version of the plugin, please deactivate it. It’s recommended you also delete inactive plugins. Your settings will be saved and applied toward the paid version. The two are entirely different and separate plugins and should not be active on your WP installation at the same time.


Make sure to test your watermarking thoroughly before going live! TCPDF is a fallible third-party library which does its best to parse/understand and re-write your PDF with your desired changes (watermarks/encryption/etc), but it cannot possibly work on all PDFs and on all servers 100% of the time. Stay realistic, think carefully through the process, plan, and do your testing.

PHP Version

WaterWoo PDF recommends you run PHP version 7.0 or higher. WaterWoo PDF is PHP version 7.3 compatible, so don’t hesitate to upgrade after making backups. PHP 7.0 is twice as fast for WordPress as PHP 5.6 and processes WaterWoo demands much more efficiently! This is the first thing you should try if you’re running out of memory while processing PDFs.

Increase Memory

Increase your PHP memory allotment to at least 64MB. We recommend a 128MB, 256MB or maybe even 512MB setting. If your host does not allow more than 16 or 32, it might be a good time to switch hosts or servers. If you expect your PDF to take more than 30 seconds to parse (gasp!), you may also need to increase your PHP max_execution_time.

Large PDFs?

If you are having trouble sharing large PDF files, keep in mind that your hosting plan needs to be robust enough to support the memory and bandwidth necessary to fulfill these requests. Try these suggestions to tune for performanace. (FYI Thai characters are already disabled in Waterwoo.) Keep your watermarks simple (avoid HTML and images if possible, use base fonts, and remember that file protections/passwording also make huge demands on your server).

Maybe it’s time for a server upgrade?


Waterwoo comes with default margins to keep your watermark inside an area on the page. These are 10mm left/right, and 10mm top/bottom.

If you would like to remove this restriction, set the margins to 0. If you would like to move things in on the page, set the margins higher.

The XY fine tuners accomplish the same thing; however, they cannot remove the margins. So a margins setting was added primarily for those people wanting to remove the margins.

Usually, you’d use the Y tuner to move your watermark down from the top of the page, millimeter by millimeter. If you have PDFs with varying heights and want better control of where the watermark sits, you can move the footer watermark UP from the BOTTOM of the page by using a negative integer (e.g. -10, which would be 10mm) in the Y fine tuner setting. Just make sure to keep your watermark within the page boundaries — if it goes off the page, WaterWoo will create a new (unwanted) blank page with the orphaned watermark.

As far as watermark positioning goes, the X-axis and Y-axis tuners work across and down the page in MILLIMETERS. If you’ve moved your watermark too far down the page, it will create a blank page. Reduce your Y-axis number and/or your font size to get the watermark back on the page.

It’s very important to test your watermark settings until you are sure the watermark will fit inside the margins you have set, otherwise you will see problems.

Simple Shortcodes

Simple shortcodes available are [FIRSTNAME] [LASTNAME] [BUSINESSNAME] [EMAIL] [PHONE] [DATE] [ORDERNUMBER] [PRODUCTNAME]. Using one of these in your overlay or footer text will cause the shortcode to be replaced by the customer data during checkout and watermarking.

Keep in mind if you do not solicit the “businessname” field or make it mandatory, and the customer leaves it blank, the [businessname] shortcode will leave an empty spot in the watermark if you use it. The other simple shortcode fields are guaranteed to come through unless you (or your theme) changes that.

Here is more information about how to use your theme’s function.php file to alter WooCommerce core fields

Here is an example of creating your own WaterWoo shortcode for checkout field data.

Future [DATE] Shortcodes

To add a future date marked from the date of purchase, you can use the [DATE-#YRS] [DATE-#MOS] [DATE-#WKS] [DATE-#DAYS] shortcode, where # is replaced with the number of days/months/weeks/years desired. This shortcode is based on 30-day months, and 365-day years, so it might be best to use days if you need precision.


[DATE-365DAYS] would be 365 days from the checkout date.

[DATE-2YRS] would be 730 days from the checkout date, but does not take into account a leap year.

Product quantity shortcode

With version 3.0 of WooCommerce, the # in this shortcode becomes a wildcard. No more need to match it up with the product that might be in the cart at some point. Use [PRODUCT-#] [PRODUCT-##] or [PRODUCT-###] as a shortcode (you get the idea). It will be replaced by the number purchased of the file downloaded.

Number Sold [PRODUCT-#] Shortcodes

To add in the number of a product purchased, you can use the [PRODUCT-###] shortcode, where ### is replaced with the numeral product ID. You can find the product ID listed underneath the product title on your main WooCommerce Products listing page (hover over the desired product title to see the ID), or by hovering over the product title and looking at the browser status bar (lower screen, look for the number after “post=”). This must be an item found in the cart in order to work, otherwise the shortcode comes up blank. This shortcode will not work with the testing feature.

Starting with version 2.0.3, for users of WooCommerce 2.7+, is a [PRODUCT-###] wildcard shortcode… Instead of having to enter a product number, you can just enter exactly, just [PRODUCT-###]!

Opacity Shortcodes

The {OPAC} shortcode — and watermarking with opacity — is totally unique to this plugin is very helpful for people not wanting to obscure their PDF content, since the watermark sits on top. It doesn’t always play nice with HTML in your watermark, so sometimes some rearranging will need to be done. Consider wrapping your HTML inside {OPAC} tags if trying to get opacity, if the inverse isn’t working.


{OPAC-0.5}This is sample text{/OPAC}

This is sample text” will be at 50% transparency. The tag needs a dash, then a number representing the fraction of 100% opacity.

{OPAC-0.1}This is very transparent text{/OPAC}

This is very transparent text” will be at 10% transparency.

Note there is an open tag and a close tag around the text. If text does not wrap when using this tag, you may have to use HTML <br> tags. {OPAC} tag is still beta.

Custom Shortcodes

If you would like to create a custom shortcode to display dynamic output, that can usually be done using filter hooks included in WaterWoo. The filter hooks to use are ‘wwpdf_filter_overlay’ and ‘wwpdf_filter_footer’ and the parameters they pass are $order_id and $product_id. So unless you are adding static content, it’s necessary that you have collected and have reliable access to output from the database. The parameters $order_id and $product_id, related directly to the download being requested, should allow you to fetch all sorts of related data. A simple example looks like:

function fetch_woo_order_data_for_shortcode( $input, $order_id, $product_id ) {
    // first could get the order object from the order id:
    // you can get a lot of info from the order object ($order in this case)
    $order = wc_get_order( $order_id ); 
    if ( ! $order ! is_a( $order, 'WC_Order' ) ) {
         return $input; // make sure to return $input if something goes wrong
    // or maybe you want to get a product object from the product id:
    $product = wc_get_product( $product_id );
    if ( ! $product || ! is_a( $product, 'WC_Product' ) ) {
        return $input; // make sure to return $input if something goes wrong

    // Examples of getting some order data from the order object, lots of data can be accessed
    // More info: https://stackoverflow.com/a/44708344
    $order_data = $order->get_data();
    $order_total = $order_data['total']; // getting the order total data

    // More info on grabbing product data: https://www.businessbloomer.com/woocommerce-easily-get-product-info-title-sku-desc-product-object/
    // ...find and sanitize the data you seek 
    $the_data_you_seek = 'woohoo I found it!'; // replace with actual value

    // if/when we find [YOUR_CUSTOM_WATERWOO_SHORTCODE] in a watermark, replace it with the $the_data_you_seek
    $input = preg_replace( '/\[YOUR_CUSTOM_WATERWOO_SHORTCODE\]/', $the_data_you_seek, $input );
    return $input;
add_filter( 'wwpdf_filter_overlay', 'fetch_woo_order_data_for_shortcode', 10, 3 ); // for filtering the overlay watermark
add_filter( 'wwpdf_filter_footer', 'fetch_woo_order_data_for_shortcode', 10, 3 ); // for filtering the footer watermark

Read more information about custom shortcodes for Waterwoo PDF watermarking, and check out an example of a shortcode for Brazilian CPF checkout fields. This custom code would go in your child theme functions.php file or be built in to your custom plugin.

If this is foreign to you, that’s OK. It should be straightforward and simple to implement to a developer who is familiar with WordPress and PHP. Don’t have a developer? Find one! Developers are like car mechanics or plumbers, specialists who are ready to help you out of a pinch. Can’t find one? Get in touch and we will look at your project and offer a flat-rate quote for your project (usually under $100).

Text alignment

To style a link <a> or tag when using HTML, the following inline CSS options are available: font-style:italic, font-weight:bold, and text-align:center and text-align:right. This feature allows you to center text – yay!

Here’s an example of the code used to center some (bold) text.

<span style="text-align: center; font-weight: bold;">center some bold text</span>

This might also work:

<span style="text-align: center"><strong>center some bold text</strong></span>

Hooks (actions/filters)

Starting in WaterWoo version 2.0, hooks were added to make it possible to adjust WaterWoo to carry out some of your specific needs. The hooks are NOT supported by WaterWoo staff unless you find a bug or need arguments added. We will not be able to write action and filter function code for you. The hooks were placed for your developer’s convenience.

If you are unfamiliar with how to edit your [child] theme functions.php file to add hooked functions to your website, you should check out the Code Snippets plugin.

‘ wwpdf_add_custom_font ‘ and ‘ wwpdf_font_decode ‘ filters, more here

‘ wwpdf_download_file_name ‘ filter, you’ll know it when you need it… more here

‘ wwpdf_add_barcode ‘ filter for maybe adding barcodes

‘ wwpdf_file_cleanup ‘ action to clean up residual files on the server if using Redirect download method. More here.

‘ wwpdf_do_cleanup ‘ filter to maybe prevent cleanup of files served via forced or xsendfile download. Added in version 2.2. More here.

‘ waterwoo_settings_array ‘ filter to allow for manipulation of main watermarking settings (possibly to add settings). Added in version 2.2

‘ waterwoo_overlay_filter ‘ and ‘ waterwoo_footer_filter ‘ filters to allow for manipulation of watermarks. Added in version 2.2

‘ wwpdf_filter_overlay’ and ‘ wwpdf_filter_footer ‘ filters to allow for manipulation of watermarks were added in version 2.5 and fire after the previously mentioned watermark filters. With these hooks you can possibly add in your own shortcodes for custom checkout fields.

‘ wwpdf_set_zoom_mode ‘ and ‘ wwpdf_set_viewer_preferences ‘ filters for setting PDF viewing preferences via TCPDF. Added in version 2.2. Examples of SetDisplayMode() in use. More on TCPDF setViewerPreferences() here.

‘ wwpdf_set_password ‘ filter for creating alternate passwords. Added in version 2.5 More here.

‘ wwpdf_set_permissions ‘ filter hook for adjusting which permissions are set in file encryption, added version 2.11. Learn more below.

Watermarking using a JPG/PNG file

Since WaterWoo allows quite a bit of HTML in your watermark content, you can go ahead and use <img> tags to put an image on your PDF. Transparent images make great watermarks, just make sure to use a small image file (smush those bytes)! Image width and height must be indicated when using an tag in your watermark input. Try something like this:

<img src="/relative/path/to/your/image.png" width="400" height="300"> or

<img src="https://url.to/your/image.gif" width="100" height="250">

These are just examples. Replace with the correct image location and size, and save in your overlay or footer watermark content settings.

Watermark Specific Pages

function watermark_specific_pages( $bool, $pagenum, $pagecount, $pdf ) {

    // Tell it which pages NOT to watermark
    // Here I'm saying don't watermark pages 2, 3, 4, 6, 7, 8, 10, or 20
    if ( in_array( $pagenum, array( 2,3,4,6,7,8,10,20 ) ) {
        return true;
    return false;

add_filter( 'wwpdf_dont_watermark_this_page', 'watermark_specific_pages', 10, 4 );

If you want this to apply to a specific PDF, you can use $pdf checks (version 3.5 of WaterWoo or newer). This is up to your developer to code. Don’t worry too much – this is going to all become much easier in a future iteration of WaterWoo!

Fonts (maybe adding)

As of version 2.10 of WaterWoo PDF Premium, you can add fonts to the plugin with the click of your mouse. All you need is a TTF (TrueType Font) file of your desired font. Learn more about adding your font to WaterWoo.

(The Old Way)

To run watermarking with your custom font, you can run the filter “wwpdf_add_custom_font”. Font must be added to TCPDF first using addTTFfont(). Please read TCPDF docs. Fonts which come with TCPDF can also be added back in to the fonts folder; they were removed to keep this plugin as lightweight as possible. This is in development and not a supported feature.

add_filter( 'wwpdf_add_custom_font', ‘my_custom_font_name’, 10, 1 );
function my_custom_font_name() {
    $font = TCPDF_FONTS::addTTFfont( $font_file, $font_type, $enc, $flags, $outpath, $platid, $encid, $addcbbox, $linkbox );
    return $font;

Keep in mind the $font value you return will be run in SetFont() while WaterWoo does its magic.

addTTFfont() parameters:

$fontfile (string) Font file (full path).
$fonttype (string) Font type. Leave empty for autodetect mode. Valid values are: TrueTypeUnicode, TrueType, Type1, CID0JP = CID-0 Japanese, CID0KR = CID-0 Korean, CID0CS = CID-0 Chinese Simplified, CID0CT = CID-0 Chinese Traditional.
$enc (string) Name of the encoding table to use. Leave empty for default mode. Omit this parameter for TrueType Unicode and symbolic fonts like Symbol or ZapfDingBats.
$flags (int) Unsigned 32-bit integer containing flags specifying various characteristics of the font (PDF32000:2008 – 9.8.2 Font Descriptor Flags): +1 for fixed font; +4 for symbol or +32 for non-symbol; +64 for italic. Fixed and Italic mode are generally autodetected so you have to set it to 32 = non-symbolic font (default) or 4 = symbolic font.
$outpath (string) Output path for generated font files (must be writeable by the web server). Leave empty for default font folder.
$platid (int) Platform ID for CMAP table to extract (when building a Unicode font for Windows this value should be 3, for Macintosh should be 1).
$encid (int) Encoding ID for CMAP table to extract (when building a Unicode font for Windows this value should be 1, for Macintosh should be 0). When Platform ID is 3, legal values for Encoding ID are: 0=Symbol, 1=Unicode, 2=ShiftJIS, 3=PRC, 4=Big5, 5=Wansung, 6=Johab, 7=Reserved, 8=Reserved, 9=Reserved, 10=UCS-4.
$addcbbox (boolean) If true includes the character bounding box information on the php font file.
$link (boolean) If true link to system font instead of copying the font data (not transportable) – Note: do not work with Type1 fonts.

If your overlay or footer are not looking right after you’ve added a new font, the filter ‘wwpdf_font_decode’ might need to be used to add html_entity_decode() around your overlay or footer input.


Be aware that protecting a PDF requires to encrypt it, which increases the processing time a lot. This can cause a PHP time-out in some cases, especially if the document contains images or fonts.

The file will be automatically encrypted if a password is set. If you don’t set any password, the document will open as usual. If you set a user password, the PDF viewer will ask for it before displaying the document. Typing the word “email” into the password field in WaterWoo settings will force the end user to open the PDF with the buyer’s email address. The word email works magic in this case, but must be lowercase and without punctuation. Note: If you type the shortcode “[EMAIL]” into the password field in WaterWoo settings, the password to open the PDF will be [EMAIL] (the shortcode does not work magic in the password field).

Keep your sanity — here are some ideas to consider before passwording your PDFs using WaterWoo.

Alternatively the ‘wwpdf_set_password’ hook can be used to set a different type of password if desired, see below.

The permission array is composed of values taken from the following ones (specify the ones you want to block):

  • The following are set together:
    • print : Print the document
    • print‑high : Print the document to a representation from which a faithful digital copy of the PDF content could be generated. When this is not set, printing is limited to a low-level representation of the appearance, possibly of degraded quality.
  • The following are set together:
    • modify : Modify the contents of the document by operations other than those controlled by ‘fill-forms’, ‘extract’ and ‘assemble’
    • assemble : Assemble the document (insert, rotate, or delete pages and create bookmarks or thumbnail images), even if ‘modify’ is not set
  • copy : Copy or otherwise extract text and graphics from the document
  • The following are set together:
    • annot‑forms : Add or modify text annotations, fill in interactive form fields, and, if ‘modify’ is also set, create or modify interactive form fields (including signature fields)
    • Fill‑forms : Fill in existing interactive form fields (including signature fields), even if ‘annot-forms’ is not specified

More information about SetProtection() here and here.

We recommended you allow:
  • Copy. If not allowed this document will not be readable by humans who rely on screen readers instead of their eyes to read. Keep it accessible!

As of version 2.11, the hook ‘wwpdf_set_permissions’ allows you more granular control of your file permissions. Keep in mind, this hook will override any general settings or per-product settings. You can take advantage of the filter as follows (in your child theme functions.php file or a custom plugin, preferrably):

add_filter( 'wwpdf_set_permissions', 'my_permission_altering_function', 10, 1 );
function my_permission_altering_function( $permissions ) {
    $permissions = array( 'modify', 'copy' ); // maybe add any others you may want to block here, in the array
    return $permissions;


Here’s an example of how to use the ‘wwpdf_set_password’ filter hook to set up your own password. In this example it uses the customer’s billing phone. It would be important in this instance to require a phone number from your customers!

add_filter( 'wwpdf_set_password', 'my_own_password_function', 10, 2 );
function my_own_password_function( $password, $order_id ) {
    $order = wc_get_order( $order_id );
    $order_data = $order->get_data();
    $phone = $order_data['billing']['phone']; // might be wise to set up a fallback in case this is empty
    // maybe remove any non-digit character from phone number
    $password = preg_replace('/D+/', '', $phone);
    // return phone as password
    return $password;

Learn more about order/customer data that would be accessible using the $order_id argument provided in this hook.

Barcodes (maybe adding)

To add a barcode somewhere on your page, you can use the ‘wwpdf_add_barcode’ filter. An example goes like this:

add_filter( 'wwpdf_add_barcode', 'my_barcode_function', 10, 2 );
function my_barcode_function( $barcode_array, $order_id ) {
    // if desired you could bring in order information using the $order_id variable
    // otherwise just return a 2D QRCODE that says "Test Barcode" when scanned, like this:
    return array( '2D', 'Test Barcode', 'QRCODE', 100, 230, 30, 30 );

The ‘my_barcode_function’ function returns an array used by WaterWoo to create a barcode.

  1. The first argument accepts either ‘1D’ or ‘2D’.
  2. The second argument will be your barcode contents.
  3. The third argument states the TYPE of barcode (please refer to TCPDF documentation for 1D vs 2D barcode setup and appropriate names for barcode types.)
  4. The fourth argument is X-axis placement. In the example, I have it set 10cm (100mm) over to the right.
  5. The fifth argument is Y-axis placement. In the example, I have it set 23cm (230mm) from the top of the page.
  6. The sixth argument is the width of the barcode in millimeters.
  7. The seventh argument is height of the barcode in millimeters.

Starting WaterWoo Premium version 2.12, the WooCommerce order ID is passed as a parameter to ‘wwpdf_add_barcode’ so you can include some order data in your barcode.

If you are unfamiliar with how to edit your [child] theme functions.php file to add hooked functions to your website, try using the Code Snippets plugin, which makes it simple to add PHP code like the examples on this page.

What happens to files on the server…

If you choose the WooCommerce “Force” download method, the file is watermarked, download is forced, and the temporary file is deleted.

Otherwise, if you have chosen “Redirect” or “XSendFile” download method, the file is watermarked, the buyer is redirected to the temporary file, and the file remains in a temporary folder in a WordPress “/uploadds/waterwoo-pdf” folder. It is recommended you set up a cron to keep this folder empty.

File Name Change

Like how filenames used to be customized with date and order number? I took this away with version 2.0 for folks not using the wp-content directory to store watermarked files, and for folks using forced downloads, BECAUSE… if a file doesn’t exist anymore on your end, what does it matter what it is called. The customer can rename a file anything they want, so it just made sense to fall back to your intended name.
Don’t fret! Function my_custom_PDF_filename() would makes it like how it used to be before v2.0.

add_filter( 'wwpdf_download_file_name', 'my_custom_PDF_filename', 10, 2 );
function my_custom_PDF_filename( $file_name, $order_num ) {

    $file_name = str_replace( '.pdf', '', $file_name ) . '_' . time() . '_' . $order_num . '.pdf';
    return $file_name;

This filter hook could also be used to customized your customer’s file download file name in other ways. That’s up to you.

Clean Up files after Download

The ‘wwpdf_do_cleanup’ filter will allow you to turn OFF file clean up for forced downloads:

add_filter( 'wwpdf_do_cleanup', __return_false );

Redirect and X-Accel-Redirect must have files on the server for the customer to fetch. Files are automatically stored to the WP uploads folder when using Redirect and X-Accel-Redirect. It’s recommended to set up a cron job to delete customized PDFs from the wp-content/uploads/waterwoo-pdf folder. To make this simple for yourself, use the WP Crontrol plugin, and add a PHP function like this on the schedule of your choice:

function wwpdf_file_cleanup() {

    // Bail if not in WordPress cron
	  if ( ! edd_doing_cron() ) {
    // this function assumes your watermarked PDFs are going to this folder:
    $dir = WP_CONTENT_DIR . '/uploads/waterwoo-pdf/';
    wwpdf_scheduled_cleanup( $dir );


function wwpdf_scheduled_cleanup( $dir ) {    
    // get straight to business deleting only PDFs
    // simple. no recursive sub-directory deletion here
    foreach( glob( $dir . "/*.[pP][dD][fF]" ) as $file ) {
        if ( is_file( $file ) ) {
            @unlink( $file );


Disclaimer: You’ll want to carefully review this function before using it to make sure it is suitable for your use. Things might have changed since we posted it and we cannot guarantee how or if it will perform.

Amazon S3 Hosted Files

If using WooTheme’s S3 plugin, you must create a SHORTCODE to use as the product file path. Documentation for how to set up a bucket, S3 file, and shortcode are here.

A shortcode will look like this:

[amazon_s3 bucket=MyBucketName object=MyFileName.ext]

Noted June 2018: WooCommerce’s Amazon S3 plugin does not work to deliver files if your bucket name is a domain name (e.g. “mydomain.com”) or has a period (“.”), dash (“-“), or space in it.

Dropbox Hosted Files

To set up WaterWoo to work with Dropbox, you will need the separate Woocommerce Dropbox Plugin. Please follow its installation instructions to set it up. Also please contact its developers with any questions about its setup. Once that plugin is set up correctly, you will be able to easily select PDF files from Dropbox in your product editor.

Note: In December 2018, support for WaterWoo/Woocommerce Dropbox plugin integration was dropped. Learn more here. In November 2020, support for WooCommerce Dropbox was added again.

Errors and Error Logging

If you are having troubles with WaterWoo (and maybe the libraries it uses, TCPDI/TCPDF), it’s often very helpful to know what’s going on “under the hood.” There are two ways to get more information, especially if you are not getting descriptive error messages printed to your screen. Here’s two places to look:

Especially if your site is in development, it’s great to leave WordPress debugging turned on. We usually turn it off for production sites unless there is a problem, and only then turn it on temporarily. Please read about how to turn on WordPress debugging. In the wp-config.php file, we use the following three lines so logs are saved to a file and not printed to the screen. It’s prettier that way.

define( 'WP_DEBUG', true );
define( 'WP_DEBUG_LOG', true );
define( 'WP_DEBUG_DISPLAY', false );

Logs will be stored in your WordPress /wp-content/ folder.

WaterWoo Logs

Since version 2.7 of WaterWoo PDF Premium, there are built-in logs specific to WaterWoo. You can find the settings, and the logs by clicking links at the top of your WaterWoo settings page:

Where to find waterwoo log settings and logs

If these logs are turned on while you are experiencing watermarking troubles, they will likely pick up some more detailed information which will be helpful during troubleshooting.

Little Package Web