% \iffalse meta-comment
%                                                                
%  File: pdfx.dtx
%
%  Copyright (c) 2008, CV Radhakrishnan <cvr@river-valley.org>,
%    Han The Thanh <thanh@river-valley.org>
%                      
%  This file may be distributed and/or modified under the conditions
%  of the LaTeX Project Public License, either version 1.2 of this
%  license or (at your option) any later version.  The latest version
%  of this license is in:
%    
%    http://www.latex-project.org/lppl.txt
%    
%  and version 1.2 or later is part of all distributions of LaTeX
%  version 1999/12/01 or later.
%
% \fi
%
% \CheckSum{374}
% \iffalse
%
%<*driver>
\documentclass[a4paper]{ltxdoc}
\usepackage{rvdtx}
\EnableCrossrefs         
\CodelineIndex
\RecordChanges 
\begin{document}
  \DocInput{pdfx.dtx}
  \PrintChanges
  \PrintIndex
\end{document}
%</driver>
% \fi
%
% \CharacterTable
%  {Upper-case    \A\B\C\D\E\F\G\H\I\J\K\L\M\N\O\P\Q\R\S\T\U\V\W\X\Y\Z
%   Lower-case    \a\b\c\d\e\f\g\h\i\j\k\l\m\n\o\p\q\r\s\t\u\v\w\x\y\z
%   Digits        \0\1\2\3\4\5\6\7\8\9
%   Exclamation   \!     Double quote  \"     Hash (number) \#
%   Dollar        \$     Percent       \%     Ampersand     \&
%   Acute accent  \'     Left paren    \(     Right paren   \)
%   Asterisk      \*     Plus          \+     Comma         \,
%   Minus         \-     Point         \.     Solidus       \/
%   Colon         \:     Semicolon     \;     Less than     \<
%   Equals        \=     Greater than  \>     Question mark \?
%   Commercial at \@     Left bracket  \[     Backslash     \\
%   Right bracket \]     Circumflex    \^     Underscore    \_
%   Grave accent  \`     Left brace    \{     Vertical bar  \|
%   Right brace   \}     Tilde         \~}
%
% \GetFileInfo{pdfx.dtx}
%
% \DoNotIndex{\newcommand,\newenvironment}
% 
% \DoNotIndex{\def,\edef,\gdef,\xdef,\global,\long,\let}
% \DoNotIndex{\expandafter,\string,\the,\ifx,\else,\fi}
% \DoNotIndex{\csname,\endcsname,\relax,\begingroup,\endgroup}
% \DoNotIndex{\DeclareTextCommand,\DeclareTextCompositeCommand}
% \DoNotIndex{\space,\@empty,\special,\@nil,\advance\@nnil}
% \DoNotIndex{\\,\@gobble,\@@,\@fornoop,\@fortmp,\@ifundefined}
% \DoNotIndex{\@tempcnta,\@tempcntb,\{,\},\alph,\bgroup,\egroup}
% \DoNotIndex{\do,\end,\HN,\ifcase,\ifnum,\IfFileExists,\ifvmode}
% \DoNotIndex{\ignorespaces,\immediate,\input,\item,\jobname}
% \DoNotIndex{\leavevmode,\loop,\repeat,\makeatletter,\makeatother}
% \DoNotIndex{\meaning,\newcounter,\next,\or,\par,\renewcommand}
% \DoNotIndex{\renewcommand,\renewenvironment,\stepcounter}
% \DoNotIndex{\Tg,\thepage,\unskip,\write,\advance,\{,\}}
%
% \changes{v1.00}{2008/12/01}{Initial commit to the CVS.}
%
% \title{Generation of PDF/X-1a and PDF/A-1b compliant PDF's
%  with PDF\TeX{} --- \texttt{pdfx.sty}}
% \date{2008/12/01}
% \version{1.1}
% \keywords{\pdf, \pdfx, \pdfa, pdf\TeX, \LaTeX}
% \author{C.\,V.\,Radhakrishnan {\upshape\small and} \thanh}
% \contact{\texttt{[cvr,thanh]@river-valley.org}}
% 
% \maketitle
%
% \StopEventually{}
%
% \section{Introduction}
%
% \textsc{pdf/x} and \textsc{pdf/a} are umbrella terms used to denote
% several \textsc{iso} standards that define different subsets of the
% \pdf standard. The objective of \textsc{pdf/x} is to facilitate
% graphics exchange between document creator and printer and
% therefore, has all requirements related to printing. For instance,
% in \pdfx, all fonts need to be embedded and all images need to be
% \textsc{cmyk} or spot colors. \textsc{pdf/x-2} and \textsc{pdf/x-3}
% accept calibrated \textsc{rgb} and \textsc{cielab} colors along with
% all other specifications of \pdfx.
%
% \textsc{pdf/a} defines a profile for archiving \pdf documents which
% ensures the documents can be reproduced the exact same way in years
% to come, a key element to achieve this is that the \textsc{pdf/a}
% documents shall be 100\% self contained.  All the information needed
% to display the document in the same manner every time, is embedded
% in the file. \textsc{pdf/a} document is not permitted to be reliant
% on information from external sources.  Other restrictions include
% avoidance of audio/video content, JavaScript and encryption.
% Mandatory inclusion of fonts, color profile and standards based
% metadata are absolutely essential for \textsc{pdf/a}.
%
% This package currently supports generation of \pdfx and \pdfa
% compliant documents using \pdftex. More and more standards will be
% included in future.
%
% \section{Usage}
%
% The file, namely |pdfx.dtx| is a composite document of
% program code and documentation in \LaTeX{} format in the
% tradition of \emph{literate programming}. You
% can extract the program code alone by stripping off the
% documentation part by running \LaTeX{} or \TeX{} over the installer
% namely, |pdfx.ins| which is also provided with this file.  To
% get the documentation which you are reading now, you need to run
% (\pdf)\LaTeX{} over the file, |pdfx.dtx|. 
%
% \subsection{Data file for XMP metadata}
%
% As you are aware, standards compliant \pdf documents need
% \textsc{xmp} metadata to be included. In order to create
% \textsc{xmp} in the prescribed \xml format, a simple data file
% holding the meta information of the document needs to be created
% either through a program or by hand. For our purposes, we name it as
% |\jobname.xmpdata|, a simple example of which will look like the
% following:
% \begin{verbatim}
%   \Keywords{pdfTeX</rdf:li><rdf:li>PDF/X-1a</rdf:li><rdf:li>PDF/A-b}
%   \Title{Sample LaTeX input file}
%   \Author{LaTeX project team}
%   \Org{TeX Users Group}
% \end{verbatim}
% You may note that the keywords are separated by \xml elements
% |</rdf:li><rdf:li>| instead of comma character.  This is the correct
% format required by the \xmp metadata which is in \xml format.
% Similarly, several other kinds of data can be captured using the
% following commands:
% \begin{enumerate}
% \item |\Subject|
% \item |\Creator|
% \item |\Producer|
% \item |\Volume|
% \item |\Issue|
% \item |\CoverDisplayDate|
% \item |\CoverDate|
% \item |\Copyright|
% \item |\Doi|
% \item |\Lastpage|
% \item |\Firstpage|
% \item |\Journaltitle|
% \item |\Journalnumber|
% \item |\CreatorTool|
% \item |\AuthoritativeDomain|
% \end{enumerate}
% The above commands are self-explanatory. Users can resort to
% alternate ways to create |xmp| file for inclusion in \pdf.  However,
% minimal |\jobname.xmpdata| shall be created with |\Title| and
% |\Author| commands along with their corresponding values for |pdfx|
% package to work correctly.  You may check
% \href{http://www.adobe.com/devnet/xmp/}{Adobe \textsc{xmp}
%   Development Center} for more exhaustive information about
% Extensible Metadata Platform (\textsc{xmp}).  An \textsc{xmp}
% Toolkit \textsc{sdk} which supports \textsc{gnu}/Linux, Macintosh
% and Windows operating systems is also provided under \textsc{bsd}
% licence.
%
% |pdfx| makes use of |xmpincl| package to include |xmp| data into the
% \pdf.  A good look at the documentation of |xmpincl| package will
% greatly help the users to understand the process of |xmp| data
% inclusion.
% 
% \subsection{Limitations and dependencies}
% 
%  |pdfx.sty| works only with \pdftex.  It further depends on the following
%  packages:
%  \begin{enumerate}
%  \item |xmpincl|  for insertion of metadata into \pdf.
%  \item |hyperref| for hyperlinking, bookmarks, etc.
%  \item |glyphtounicode.tex| maps glyph names to corresponding Unicode.
%  \item |glyphtounicode-cmr.tex| does the same for |cmr| fonts.
%  \end{enumerate}
%  Necessary color profile files may be obtained from International
%  Color Consortium.  Please take a look at
%  \url{http://www.color.org/iccprofile.xalter}.
%
% \subsection{Files included}
%
% Following files are included in the archive:
%
% \begin{enumerate}
% \item |pdfx.dtx| --- composite package and documentation.
% \item |pdfx.ins| --- installer batch file.
% \item |pdfx-1a.xmp| --- specimen |xmp| template for \pdfx.
% \item |pdfa-1b.xmp| --- specimen |xmp| template for \pdfa.
% \item |small2e.xmpdata| --- specimen data file to provide values
%   relating to the document to generate metadata.
% \end{enumerate}
% A directory named |pdfx| may be created under |$TEXMF/tex/latex| and
% all |*.sty| and |*.xmp| may be moved to the same.  \TeX's file
% database may need to be updated by suitable command depending on
% your distribution and operating system.
%
% \subsection{Options}
%
% The package can be loaded with the command:
% \begin{decl}
% \defmacro{usepackage}|[<option>]{pdfx}|
% \end{decl}
% where the options are:
% \begin{description}
%  \item[|x-1a|] generates \pdfx compliant \pdf.
%  \item[|a-1b|] generates \pdfa compliant \pdf.
%  \end{description} 
%
% \subsection{Useful production notes}
%
% We have included some useful notes about production problems which
% we have encountered while generating \pdfa compliant documents and
% the fixes recommended at:
% \url{http://support.river-valley.com/wiki/index.php?title=Generating_PDF/A_compliant_PDFs_from_pdftex}.
%
% \subsection{Miscellaneous information}
%
% The package is released under \LaTeX{} Project Public Licence. Bug
% reports, suggestions, feature requests, etc., may be sent to the
% authors at \href{mailto:cvr@river-valley.org}{\ttfamily
%   cvr@river-valley.org} and/or
% \href{mailto:thanh@river-valley.org}{\ttfamily
%   thanh@river-valley.org}.
% 
% \section{Implementation}
% \subsection{Various auxiliary macros}
% 
% Two booleans are defined to switch between two options, |a-1b| and
% |x-1a|. \pdfx further demands \pdf version 1.3 and properly placed
% mediabox, bleedbox and trimbox (innermost) in that order.  The
% MediaBox defines the size of the entire document, either the
% ArtBox or the TrimBox, defines the extent of the printable
% area. If the file is to be printed with bleed, a BleedBox, which
% must be larger than the TrimBox/ArtBox, but smaller than the
% MediaBox, must be defined.
%     
%    \begin{macrocode}
%<*package>
%
% $Id: pdfx.dtx,v 1.1 2008/12/01 10:28:01 cvr Exp cvr $
% 
\NeedsTeXFormat{LaTeX2e}
\ProvidesPackage{pdfx}
  [2008/12/01 v1.1 PDF/X and PDF/A support (CVR/HTH)]

\newif\ifpdfxonea \pdfxoneafalse
\newif\ifpdfaoneb \pdfaonebfalse

\DeclareOption{a-1b}{\global\pdfaonebtrue}
\DeclareOption{x-1a}{\global\pdfxoneatrue}
\ProcessOptions

\ifpdfxonea
 \pdfminorversion=3
 \pdfpageattr{/MediaBox[0 0 595 793]
              /BleedBox[0 0 595 793]
              /TrimBox[25 20 570 773]}
\else
 \pdfminorversion=4
\fi
%    \end{macrocode}
%
% Several macros were defined to capture data for the \xmp metadata to
% be inserted into the PDF during generation.
%    \begin{macrocode}
\def\hash{\expandafter\@gobble\string\#}
\def\amp{\expandafter\@gobble\string\&}
\def\xmpAmp{\amp\hash x0026;}
\def\TextCopyright{\amp\hash x00A9;}
\def\Title#1{\gdef\xmpTitle{#1}}
 \let\xmpTitle\@empty
\def\Author#1{\gdef\xmpAuthor{#1}}
 \let\xmpAuthor\@empty
\def\Keywords#1{\gdef\xmpKeywords{#1}}
 \let\xmpKeywords\@empty
 \let\xmpSubject\xmpKeywords
\def\Creator#1{\gdef\xmpCreator{#1}}
 \def\xmpCreator{\@pdfcreator}
\def\Producer#1{\gdef\xmpProducer{#1}}
 \def\xmpProducer{pdfTeX}
\def\Volume#1{\gdef\xmpVolume{#1}}
 \let\xmpVolume\@empty
\def\Issue#1{\gdef\xmpIssue{#1}}
 \let\xmpIssue\@empty
\def\CoverDisplayDate#1{\gdef\xmpCoverDisplayDate{#1}}
 \let\xmpCoverDisplayDate\@empty
\def\CoverDate#1{\gdef\xmpCoverDate{#1}}
 \let\xmpCoverDate\@empty
\def\Copyright#1{\gdef\xmpCopyright{#1}}
 \let\xmpCopyright\@empty
\def\Doi#1{\gdef\xmpDoi{#1}}
 \let\xmpDoi\@empty
\def\Lastpage#1{\gdef\xmpLastpage{#1}}
 \let\xmpLastpage\@empty
\def\Firstpage#1{\gdef\xmpFirstpage{#1}}
 \let\xmpFirstpage\@empty
\def\Journaltitle#1{\gdef\xmpJournaltitle{#1}}
 \let\xmpJournaltitle\@empty
\def\Journalnumber#1{\gdef\xmpJournalnumber{#1}}
 \let\xmpJournalnumber\@empty
\def\Org#1{\gdef\xmpOrg{#1}}
 \let\xmpOrg\@empty
\def\CreatorTool#1{\gdef\xmpCreatorTool{#1}}
 \def\xmpCreatorTool{\xmpProducer}
\def\AuthoritativeDomain#1{\gdef\xmpAuthoritativeDomain{#1}}
 \let\xmpAuthoritativeDomain\@empty
%    \end{macrocode}
%
% \subsection{Document and instance ID's}
% 
% Document \textsc{id} and instance \textsc{id} are created from
% values obtained from |\jobname.pdf| and |\pdfcreationdate| by making
% \DescribeMacro{\findUUID}
% \DescribeMacro{\uuid}
% use of |\pdfmdfivesum| primitive of \pdftex.
%    \begin{macrocode}
\def\findUUID#1{\edef\tmpstring{\pdfmdfivesum{#1}}
     \expandafter\eightofnine\tmpstring\end}
\def\eightofnine#1#2#3#4#5#6#7#8#9\end{%
     \xdef\eightchars{#1#2#3#4#5#6#7#8}
     \fouroffive#9\end}
\def\fouroffive#1#2#3#4#5\end{\xdef\ffourchars{#1#2#3#4}
     \sfouroffive#5\end}
\def\sfouroffive#1#2#3#4#5\end{\xdef\sfourchars{#1#2#3#4}
     \tfouroffive#5\end}
\def\tfouroffive#1#2#3#4#5\end{\xdef\tfourchars{#1#2#3#4}
     \xdef\laststring{#5}}

\def\uuid{\eightchars-%
          \ffourchars-%
          \sfourchars-%
          \tfourchars-%
          \laststring}

\findUUID{\jobname.pdf}
\edef\xmpdocid{\uuid}
\findUUID{\pdfcreationdate}
\edef\xmpinstid{\uuid}
%    \end{macrocode}
%
% |\jobname.xmpdata| is read if available and the package, |xmpincl|
% is also loaded which will take care of inserting metadata into the
% \pdf document. 
% 
%    \begin{macrocode}
\InputIfFileExists{\jobname.xmpdata}{}{}
\RequirePackage{xmpincl}
%    \end{macrocode}
% 
% \DescribeMacro{\convDate}
% \DescribeMacro{\convertDate}
% The date format needed by metadata is different from the value
% provided by the |\pdfcreationdate|. |\convertDate| macro generates
% the required date format from |\pdfcreationdate|. 
%
%    \begin{macrocode}
\def\convertDate{\getYear}
{\catcode`\D=12
 \gdef\getYear D:#1#2#3#4{\edef\xYear{#1#2#3#4}\getMonth}
}
\def\getMonth#1#2{\edef\xMonth{#1#2}\getDay}
\def\getDay#1#2{\edef\xDay{#1#2}\getHour}
\def\getHour#1#2{\edef\xHour{#1#2}\getMin}
\def\getMin#1#2{\edef\xMin{#1#2}\getSec}
\def\getSec#1#2{\edef\xSec{#1#2}\getTZh}
\def\getTZh +#1#2{\edef\xTZh{#1#2}\getTZm}
\def\getTZm '#1#2'{%
    \edef\xTZm{#1#2}%
    \edef\convDate{\xYear-\xMonth-\xDay
      T\xHour:\xMin:\xSec+\xTZh:\xTZm}}
\expandafter\convertDate\pdfcreationdate 
%    \end{macrocode}
%
% \subsection{Color profiles}
% \DescribeMacro{/OutputIntents} For better color management, \pdfx
% and \pdfa need an ICC profile included in the document.  An ICC
% profile is a set of data that characterizes a color input or output
% device, or a color space, according to standards promulgated by the
% International Color Consortium (ICC). Profiles describe the color
% attributes of a particular device or viewing requirement by defining
% a mapping between the device source or target color space and a
% profile connection space. For \pdfx, we have included the ICC
% profile namely, |FOGRA39L.icc| which is for \textsc{cmyk} data and
% for \pdfa, we have used |sRGBIEC1966-2.1.icm| for \textsc{rgb}
% data. You can change the value of the |file| attribute in the code
% below to use different color profile files.
%
%    \begin{macrocode}
\ifpdfxonea
 \def\@pctchar{\expandafter\@gobble\string\%}
 \def\@bchar{\expandafter\@gobble\string\\}
 \immediate\pdfobj stream attr{/N 4}  file{FOGRA39L.icc}
 \edef\OBJ@CVR{\the\pdflastobj}
 \pdfcatalog{/OutputIntents [ <<
   /Type/OutputIntent
   /S/GTS_PDFX
   /OutputCondition (FOGRA39)
   /OutputConditionIdentifier (FOGRA39 \@bchar(ISO Coated v2 
    300\@pctchar\space \@bchar(ECI\@bchar)\@bchar))
   /DestOutputProfile \OBJ@CVR\space 0 R
   /RegistryName(http://www.color.org)
  >> ]}
\else
 \immediate\pdfobj stream attr{/N 4}  file{sRGBIEC1966-2.1.icm}
 \edef\OBJ@RVT{\the\pdflastobj}
 \pdfcatalog{%
   /OutputIntents [ <<
   /Type /OutputIntent
   /S/GTS_PDFA1
   /DestOutputProfile \OBJ@RVT\space 0 R
   /OutputConditionIdentifier (sRGB IEC61966-2.1)
   /Info(sRGB IEC61966-2.1)
  >> ]}
\fi
%    \end{macrocode}
%
% One of the |xmp| files is selectively loaded based on the option
% chosen.
% 
%    \begin{macrocode}
\begingroup
\let\&=\xmpAmp
\ifpdfxonea
 \includexmp{pdfx-1a}
\else
 \includexmp{pdfa-1b}
\fi
\endgroup
%    \end{macrocode}
%
% |glyphtounicode.tex| and |glyphtounicode-cmr.tex| are read.  
% These files contain mapping from glyph names to corresponding unicode for
% embedded fonts, which are required by \pdfa. |glyphtounicode.tex| covers
% AGL (Adobe Glyph List), names from |texglyphlist.txt| (part of
% lcdf-typetools) and |zapfdingbats.txt|, plus a few exceptions.
% |glyphtounicode-cmr.tex| covers glyphs that are used in CM fonts but not
% listed in |glyphtounicode.txt|; the mappings come from file |goadb998.nam|
% (part of \TeX{} Gyre fonts).


% 
%    \begin{macrocode}
\input glyphtounicode.tex
\input glyphtounicode-cmr.tex
\pdfgentounicode=1
%    \end{macrocode}
%    
% Active content is not allowed in a \pdfx file. This means that
% standard \pdf features like forms, signatures, comments and embedded
% sounds and movies are not allowed in \pdfx. So |hyperref| is loaded
% in |draft| mode and |info| dictionary is defined with |\pdfinfo|
% command.
% 
%    \begin{macrocode}
\ifpdfxonea
  \RequirePackage[draft,pdftex,pdfpagemode=UseNone,bookmarks=false]{hyperref}
  \pdfinfo{
      /Title(\xmpTitle)%
      /Author(\xmpAuthor)%
      /Creator(\xmpProducer)%
      /CreationDate(\convDate)%
      /ModDate(\convDate)%
      /Producer(\xmpProducer)%
      /Trapped /False
      /GTS_PDFXVersion (PDF/X-1:2001)%
      /GTS_PDFXConformance (PDF/X-1a:2001)%
  }
\else
%    \end{macrocode}
%
% For \pdfa, load |hyperref| package with |pdfa| option, so that it
% will take care of the link annotations correctly. We have slightly
% modified the |\pdfinfo| by including |/GTS_PDFA1Version|
% |(PDA/A-1b:2005)|.  Take a look at the modified |\PDF@FinishDoc|
% macro of |hyprref|.
%  
%    \begin{macrocode}
  \RequirePackage[pdftex,pdfa]{hyperref}
 \def\PDF@FinishDoc{%
  \Hy@UseMaketitleInfos
  \pdfinfo{%
     /Creator(\xmpProducer)%
     \ifx\@pdfcreationdate\@empty
    \else
      /CreationDate(\@pdfcreationdate)%
    \fi
    \ifx\@pdfmoddate\@empty
    \else
      /ModDate(\@pdfmoddate)%
    \fi
      /Producer(\xmpProducer)%
     /Trapped /False
     /GTS_PDFA1Version (PDF/A-1b:2005)%
  }%
  \Hy@DisableOption{pdfauthor}%
  \Hy@DisableOption{pdftitle}%
  \Hy@DisableOption{pdfsubject}%
  \Hy@DisableOption{pdfcreator}%
  \Hy@DisableOption{pdfcreationdate}%
  \Hy@DisableOption{pdfmoddate}%
  \Hy@DisableOption{pdfproducer}%
  \Hy@DisableOption{pdfkeywords}}
\fi
%
%</package>
%    \end{macrocode}
% \Finale
% \PrintIndex
% \PrintChanges
% \endinput
