% \iffalse meta-comment % % File: pdfx.dtx % % Copyright (c) 2008, CV Radhakrishnan , % Han The Thanh % % 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{376} % \iffalse % %<*driver> \documentclass[a4paper]{ltxdoc} \usepackage{rvdtx} \EnableCrossrefs \CodelineIndex \RecordChanges \begin{document} \DocInput{pdfx.dtx} \PrintChanges \PrintIndex \end{document} % % \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.} % \changes{v1.01}{2008/12/10}{glyphtounicode-cmr.tex included with the % package.} % \changes{v1.3}{2008/12/01}{Fix copyright in xmp files.} % % \title{Generation of PDF/X-1a and PDF/A-1b compliant PDF's % with PDF\TeX{} --- \texttt{pdfx.sty}} % \date{2008/12/10} % \version{1.3} % \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. A \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 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 mentioned above, 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\sep PDF/X-1a\sep 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 |\sep| which will % expand to \xml elements || 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 modified \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 the 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. % \item |glyphtounicode-cmr.tex| --- glyph names in cmr font to % corresponding Unicode. % \end{enumerate} % A directory named |pdfx| may be created under |$TEXMF/tex/latex| and % all |*.sty|, |*.xmp| and |glyphtounicode-cmr.tex| may be moved to % the same. \TeX's file database should then be updated by a suitable % command depending on your distribution and operating system. % % \subsection{Options} % % The package can be loaded with the command: % \begin{decl} % \defmacro{usepackage}|[} \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 an |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 |hyperref|. % % \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 % % % \end{macrocode} % \Finale % \PrintIndex % \PrintChanges % \endinput