# Adobe PDF Services API Documentation Site
## Introduction
This is the Adobe PDF Services API Documentation Site, a comprehensive developer documentation platform built with Gatsby 4.22 and React 17. The project serves as the central documentation hub for Adobe Acrobat Services APIs, including PDF Services API, PDF Extract API, Document Generation API, PDF Accessibility Auto-Tag API, PDF Electronic Seal API, PDF Embed API, Sign API, and the Power Automate Connector. It provides developers with API references, quickstart guides, how-to tutorials, and code examples across multiple programming languages (Node.js, Java, Python, and .NET).
The site leverages Adobe's Gatsby Theme AIO (@adobe/gatsby-theme-aio) for consistent design patterns and component architecture. It features full-text search powered by Algolia, Adobe Identity Management System (IMS) integration for authentication, comprehensive analytics tracking through Adobe Launch and Google Analytics, and is deployed to Azure Blob Storage with Fastly CDN for global content delivery. The documentation covers everything from getting started guides to advanced use cases for PDF manipulation, document generation from templates, accessibility tagging, electronic sealing, and embedded PDF viewing with analytics.
---
## Development Environment
### Local Development Setup
```bash
# Install dependencies (must use yarn, not npm)
yarn install
# Start development server
npm run dev
# Access local site
# Open http://localhost:8000/overview in browser
# Optional: Increase Node.js memory limit if needed
export NODE_OPTIONS=--max_old_space_size=8192
```
### Build Commands
```bash
# Production build
gatsby build
# Build with path prefix
gatsby build --prefix-paths && gatsby serve --prefix-paths
# Clean build cache
gatsby clean
# Incremental build (experimental)
GATSBY_EXPERIMENTAL_PAGE_BUILD_ON_DATA_CHANGES=true gatsby build --log-pages
# Validate internal links
npm run test:links
# Run linter
npm run lint
```
---
## Site Configuration
### Gatsby Config Structure (gatsby-config.js)
```javascript
module.exports = {
flags: {
DEV_SSR: false
},
siteMetadata: {
docs: {
title: 'Get credentials',
path: 'https://acrobatservices.adobe.com/dc-integration-creation-app-cdn/main.html'
},
pages: [
{
title: 'Adobe Acrobat Services',
subTitle: '',
path: '../../../document-services/'
},
{
title: 'APIs',
menu: [
{
title: 'PDF Services',
description: 'Create, combine and export PDFs',
path: '../document-services/apis/pdf-services/'
},
{
title: 'PDF Extract',
description: 'Extract text, tables, images, and document structure',
path: '../document-services/apis/pdf-extract/'
},
{
title: 'Document Generation',
description: 'Generate PDF and Word documents from custom Word templates',
path: '../document-services/apis/doc-generation/'
}
]
}
],
subPages: [
{
title: 'PDF Services API',
path: 'overview/pdf-services-api/index.md',
pages: [
{
title: 'Quickstarts',
path: 'overview/pdf-services-api/quickstarts',
pages: [
{ title: 'Node.js', path: 'overview/pdf-services-api/quickstarts/nodejs/index.md' },
{ title: 'Java', path: 'overview/pdf-services-api/quickstarts/java/index.md' },
{ title: '.NET', path: 'overview/pdf-services-api/quickstarts/dotnet/index.md' },
{ title: 'Python', path: 'overview/pdf-services-api/quickstarts/python/index.md' }
]
}
]
}
]
},
plugins: [
'@adobe/gatsby-theme-aio'
]
};
```
---
## Layout Component
### Main Layout Wrapper (src/@adobe/gatsby-theme-aio/components/Layout/index.js)
```javascript
import React, { createElement, useEffect, useState } from 'react';
import { Helmet } from 'react-helmet';
import { css, Global } from '@emotion/react';
import algoliaSearch from 'algoliasearch';
import { graphql, useStaticQuery } from 'gatsby';
import { Provider } from '@adobe/gatsby-theme-aio/src/components/Context';
import { SideNav } from '../SideNav';
import { GlobalHeader } from '@adobe/gatsby-theme-aio/src/components/GlobalHeader';
import { SEO } from '../SEO';
// Initialize Algolia search if configured
const hasSearch = !!(
process.env.GATSBY_ALGOLIA_APPLICATION_ID &&
process.env.GATSBY_ALGOLIA_SEARCH_API_KEY
);
let algolia = null;
if (hasSearch) {
algolia = algoliaSearch(
process.env.GATSBY_ALGOLIA_APPLICATION_ID,
process.env.GATSBY_ALGOLIA_SEARCH_API_KEY
);
}
// Check for Adobe IMS authentication
const hasIMS = !!(process.env.GATSBY_IMS_SRC && process.env.GATSBY_IMS_CONFIG);
// Helper function to get query string from URL
export const getQueryString = () => {
const params = new URLSearchParams(window.location.search);
return params.toString();
};
// Main Layout component with side navigation and content area
const Layout = ({ children, pageContext, location }) => {
const [showSideNav, setShowSideNav] = useState(false);
const [isLoading, setIsLoading] = useState(false);
return (
{children}
);
};
export default Layout;
```
---
## Side Navigation Component
### Hierarchical Navigation Renderer (src/@adobe/gatsby-theme-aio/components/SideNav/index.js)
```javascript
import React, { useState } from 'react';
import { Link as GatsbyLink } from 'gatsby';
import { css } from '@emotion/react';
import classNames from 'classnames';
import '@spectrum-css/sidenav';
const SideNav = ({ selectedPages, selectedSubPages, setShowSideNav }) => {
const [expandedPages, setExpandedPages] = useState([]);
// Custom subtitle renderer with visual badge
const handleSubtile = (title) => {
return (