报社利用自己的历史数据,印刷专题性质的纸质刊物,就需要利用indesign进行排版,而在手动排版之前,需要生成原始的模板,从而让后期的工作减少。

环境搭建

1. 从indesign的官网上下载indesign的sdk。下载地址在这里,我用的是Adobe InDesign CS5.5 Products SDK,解压。我的放在G:\indesign\Adobe InDesign CS5.5 SDK\

2. 配置环境变量。G:\indesign\Adobe InDesign CS5.5 SDK\devtools\sdktools\idmltools配置到环境变量的path。具体G:\indesign\Adobe InDesign CS5.5 SDK\docs\guides\idml-cookbook.pdf里有详细的说明。

这样的我们的环境就算搭建完成

 

概念

首先来说几个概念,完全是自己领悟的,肯定有不对的地方。

MasterSpread---spread---page---stroy---textframe,image

page当然就是最好理解的,就是一页,如果打印idml,就是一张纸

一个spread可以包含多个page,如果需要做程对页的,一个spread包含2个page

MasterSpread是spread的模板,简单的在indesign里可以定义MasterSpread,在添加spread的时候,直接用定义好的MasterSpread

stroy是包含一些基本单位(文字,图片)

 

xsl文件用途

designmap.xsl,indesign读取的入口就是它了。负责生成designmap.xml。这个的变化不大,在我的开发过程中基本上没动过。

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" version="1.1">
    <xsl:output method="xml" indent="yes"/>
    <xsl:template match="/package/designmap">
        <xsl:document href="{$workingdir}{$filesep}designmap.xml" method="xml" indent="yes">
            
<xsl:processing-instruction name="aid">style="50" type="document" readerVersion="6.0" featureSet="257" product="6.0(285)"</xsl:processing-instruction>
<Document xmlns:idPkg="http://ns.adobe.com/AdobeInDesign/idml/1.0/packaging" DOMVersion="6.0" Self="d">
    <Language Self="Language/$ID/[No Language]" Name="$ID/[No Language]" SingleQuotes="&apos;&apos;" DoubleQuotes="&quot;&quot;" PrimaryLanguageName="$ID/[No Language]" SublanguageName="$ID/[No Language]" Id="0" HyphenationVendor="$ID/" SpellingVendor="$ID/"/>
    <idPkg:Graphic src="Resources/Graphic.xml"/>
    <idPkg:Fonts src="Resources/Fonts.xml"/>
    <idPkg:Styles src="Resources/Styles.xml"/>
    <idPkg:Preferences src="Resources/Preferences.xml"/>
    <Layer Self="ub3" Name="Layer 1" Visible="true" Locked="false" IgnoreWrap="false" ShowGuides="true" LockGuides="false" UI="true" Expendable="true" Printable="true">
        <Properties>
            <LayerColor type="enumeration">LightBlue</LayerColor>
        </Properties>
    </Layer>
    <idPkg:MasterSpread src="MasterSpreads/MasterSpread_A.xml"/>
    <xsl:for-each select="/package/pagebuilder/spread">
        <idPkg:Spread src="Spreads/Spread_{@id}.xml"/>
    </xsl:for-each>
    <xsl:for-each select="/package/pagebuilder/story">
        <idPkg:Story src="Stories/Story_{@id}.xml"/>
    </xsl:for-each>
    
</Document>
</xsl:document>    
</xsl:template>
</xsl:stylesheet>

MasterSpreads/MasterSpreads.xsl,负责生成Master-page,主要是配置页面信息。比如说纸张大小,样式等

Resources/Fonts.xls,定义模板中需要要的字体

Resources/styles.xls,定义样式

Spreads/Spread.xls,生成spread.xml

Stroies/Stroy.xls,生成stroy.xml

以上这些就是我在开发种用到的。

 

开发流程

1. 既然是要做模板,那么就需要事先生成一个模块,要做成什么样子,一般也是由客户提供一个idml模板文件(jianbao.idml)。

2. 创建自己的xls文件夹。直接从G:\indesign\Adobe InDesign CS5.5 SDK\devtools\sdktools\idmltools\samples\pagebuilder里把xsl复制到自己的项目里。

3. 反解idml

package.bat -d  G:\模板\jianbao.idml G:\模板\decompress


这样就会在G:\模板\decompress下生成一堆文件,MasterSpreads,META-INF,Resources,Spreads,Stories,XML,designmap.xml

4. 生成自己的数据xml。G:\indesign\Adobe InDesign CS5.5 SDK\devtools\sdktools\idmltools\samples\pagebuilder里有一个pagebuilder.xml。这个xml是为indesgin提供基本的数据。xsl里的文件负责解析xml

5. 根据要求修改xsl和xml,用下面代码生成idml文件,文件名和xml的名字是一样的。

pagebuilder.bat G:\模板\pagebuilder.xml

 

 

具体案例

1. 修改字体,字体颜色,字号,行距。

在indesign是先定义样式,再将样式应用到indesign中,下面的例子,样式名词都是AlbumName

修改Resources/Fonts.xls和Resources/Style.xls。确保需要的用到的字体在Resources/Fonts.xls里有定义,如

<FontFamily Self="di33a" Name="方正细黑一_GBK">
  <Font Self="di33aFontn方正细黑一_GBK Regular" FontFamily="方正细黑一_GBK" Name="方正细黑一_GBK Regular" PostScriptName="$ID/FZXH1K--GBK1-0" Status="Substituted" FontStyleName="Regular" FontType="TrueType" WritingScript="25" FullName="FZXiHei I-Z08" FullNameNative="方正细黑一_GBK" FontStyleNameNative="Regular" PlatformName="$ID/" Version="3.00" /> 
 </FontFamily>

这些都能在反解的Fonts.xml里都能找的到。然后在Resources/Style.xls为样式名字体,字体颜色,字号,行距

<ParagraphStyle Self="ParagraphStyle/AlbumName" Name="AlbumName" Imported="false" NextStyle="ParagraphStyle/AlbumName" KeyboardShortcut="0 0" PointSize="48" FontStyle="Regular" Justification="RightAlign">
    <Properties>
            <Leading type="unit">26</Leading> #行距,PointSize表示字号
            <AppliedFont type="string">方正细黑一_GBK</AppliedFont> #字体
            <BasedOn type="string">$ID/[No paragraph style]</BasedOn>
            <PreviewColor type="enumeration">Nothing</PreviewColor>
    </Properties>
</ParagraphStyle>  

 

2. 修改页面大小。这个改动算是最大,不仅仅只是改变一个页面大小,而且需要调整页面上元素的坐标。

首先在MasterSpreads/MasterSpread.xls里修改GeometricBounds="0 0 841.889763778 595.275590551"

然后是页面上现有的元素坐标,工程量浩大,是个体力活

3. 修改元素的位置。

拿到反解后的文件,找到对应spread.xml里的元素,PathPointType里分别1,3对应的是左上右下2个点x,y坐标。修改程你需要就行,另外还需要修改ItemTransform。

<TextFrame ItemTransform="1 0 0 1 -928.3464566919686 -424.06299212522083"  ParentStory="u460"> 
    <Properties> 
        <PathGeometry> 
            <GeometryPathType PathOpen="false"> 
                <PathPointArray> 
                     <PathPointType RightDirection="420.944881889 108" LeftDirection="420.944881889 108" Anchor="420.944881889 108"/> 
                     <PathPointType RightDirection="420.944881889 125.00787401574804" LeftDirection="420.944881889 125.00787401574804" Anchor="420.944881889 125.00787401574804"/> 
                     <PathPointType RightDirection="837.6377952748268 125.00787401574804" LeftDirection="837.6377952748268 125.00787401574804" Anchor="837.6377952748268 125.00787401574804"/> 
                     <PathPointType RightDirection="837.6377952748268 108" LeftDirection="837.6377952748268 108" Anchor="837.6377952748268 108"/> 
                </PathPointArray> 
             </GeometryPathType> 
          </PathGeometry>
     </Properties> 
</TextFrame>

3. 对齐方式,换行等问题,在stroy.xls里修改。indesign用<Br/>换行

 

<ParagraphStyleRange AppliedParagraphStyle="ParagraphStyle/AlbumName" Justification="RightAlign">
    <CharacterStyleRange AppliedCharacterStyle="CharacterStyle/$ID/[No character style]">
                <xsl:for-each select="AlbumName">
                      <Content><xsl:value-of select="./text()"/></Content>
                     <Br/>
                </xsl:for-each>
    </CharacterStyleRange>
</ParagraphStyleRange>