使用ColdFusion生成的.rtf文件中不需要的空格

使用ColdFusion生成的.rtf文件中不需要的空格,coldfusion,whitespace,rtf,Coldfusion,Whitespace,Rtf,这件事让我毛骨悚然!我使用ColdFusion生成.rtf文件,如下所示,用于打印Avery邮件标签。由于某些原因,第一列中的每个名称前都会出现空格,但仅出现在第一行之后。这让我很困惑,因为我已经查看了正在生成的源代码,在名称之前没有看到额外的字符,即使当我在文本编辑器中打开.rtf时,我可以手动删除该字符以修复此问题。有谁能告诉我为什么会有额外的空间吗?您可以通过以下URL下载实际的.rtf文件: 嗯,我想我不能发布图片…如果你需要澄清,请随意要求链接 在此处添加此内容,因为它太长,无法发表

这件事让我毛骨悚然!我使用ColdFusion生成.rtf文件,如下所示,用于打印Avery邮件标签。由于某些原因,第一列中的每个名称前都会出现空格,但仅出现在第一行之后。这让我很困惑,因为我已经查看了正在生成的源代码,在名称之前没有看到额外的字符,即使当我在文本编辑器中打开.rtf时,我可以手动删除该字符以修复此问题。有谁能告诉我为什么会有额外的空间吗?您可以通过以下URL下载实际的.rtf文件:

嗯,我想我不能发布图片…如果你需要澄清,请随意要求链接

在此处添加此内容,因为它太长,无法发表评论:

我使用的是十多年前的CF_AVERYRTF.CFM自定义标记……据我所知,从那以后就没有更新过。我将编辑我的问题,添加实际生成并保存RTF的代码。它使用cfsavecontent、cfscript和writeoutput创建作为.rtf文件保存到磁盘的变量,当我在.rtf写入磁盘之前cfdump该变量时,我看不到名称前有任何额外字符,但当我在代码编辑器中打开.rtf文件源时,我看到每个名称前都有一个空格,当我在mac上的文本编辑器中打开.rtf时,我只看到第一行后面第一列中名称前的空格…这让我抓狂,根据我查看数据的位置和方式看到不同的东西…这就是我发布示例文件的原因,以便有人可以查看并至少验证我看到的内容。这是症状出现在我的Mac电脑上的图像(圆圈)

下面是生成数据的代码:

<cfsavecontent variable="ThisTag.GeneratedRTF">
<cfscript>
// open RTF document with header information
writeOutput("{\rtf1\ansi\ansicpg1252\uc1 \deff0\deflang1033\deflangfe1033{\fonttbl{\f0\fswiss Arial;}{\f1\fswiss Helvetica;}{\f2\fswiss Impact;}{\f3\froman Times New Roman;}}");
writeOutput("{\colortbl;\red0\green0\blue0;\red0\green0\blue255;\red0\green255\blue255;\red0\green255\blue0;\red255\green0\blue255;\red255\green0\blue0;\red255\green255\blue0;\red255\green255\blue255;\red0\green0\blue128;\red0\green128\blue128;\red0\green128\blue0;\red128\green0\blue128;\red128\green0\blue0;\red128\green128\blue0;\red128\green128\blue128;\red192\green192\blue192;\red255\green255\blue255;}");
writeOutput("{\info{\title VFIVE Label Generator (#request.rtfLabels.labeltitle# Output)}{\author cf_averyRTF $Revision: 1.17 $}{\operator cf_averyRTF resides at http://rtf.vfive.com}{\*\company VFIVE (http://www.vfive.com)}{\creatim\yr#Year(now())#\mo#Month(now())#\dy#Day(now())#\hr#Hour(now())#\min#Minute(now())#}{\version1}{\edmins0}{\nofpages1}{\nofwords0}{\nofchars0}{\nofcharsws0}{\vern1000}}\paperw#request.rtfLabels.paperw#\paperh#request.rtfLabels.paperh#\margl#request.rtfLabels.margl#\margr#request.rtfLabels.margr#\margt#request.rtfLabels.margt#\margb#request.rtfLabels.margb#");
if (Attributes.landscape)
{
    writeOutput("\landscape");  
}
writeOutput("\gutter#request.rtfLabels.gutter# \widowctrl\ftnbj\aenddoc\noxlattoyen\expshrtn\noultrlspc\dntblnsbdb\nospaceforul\horzdoc \jexpand\viewkind1\viewscale#request.rtfLabels.viewscale#\nolnhtadjtbl \fet0\sectd \linex#request.rtfLabels.linex#\sectdefaultcl");

// loop over each row in the dataset
for (ii = 1; ii LTE arrayLen(thisTag.assocAttribs); ii = ii + 1)
{

    // if this is the first cell of a row, create the row (like <tr>)
    if (NOT ((ii + request.rtfLabels.columns - 1) MOD request.rtfLabels.columns))
    {
        // output the <tr>-like row start, cellBoundary
        writeOutput("\trowd \trrh#request.rtfLabels.trrhcell#\trkeep" & cellBoundary);

        // output row setup (align, indent, etc)
        writeOutput(" \pard\plain \q#request.rtfLabels.textalign# \li#request.rtfLabels.li#\ri#request.rtfLabels.ri#\widctlpar\intbl\faauto \f#request.rtfLabels.defaultfontface#\fs20\lang1033\langfe1033");
    }

    // output each individual cell header (like <td>)
    writeOutput("{\#request.rtfLabels.bold#\fs#request.rtfLabels.defaultfontsize#\f#request.rtfLabels.defaultfontface# ");

    // output barcode on top if appropriate
    if (len(trim(thisTag.assocAttribs[ii].zipCode)) AND thisTag.assocAttribs[ii].barPos EQ "top")
    {
        writeOutput("{\field\flddirty{\*\fldinst { BARCODE }{\lang1024\langfe1024\noproof #ThisTag.AssocAttribs[ii].zipcode#}{\\u  }}{\fldrslt }}\par");
    }


    // loop over the lines of content in this cell
    for (jj = 1; jj LTE arrayLen(ThisTag.AssocAttribs[ii].arrCell); jj = jj + 1)
    {

        // content to be displayed?
        if (len(trim(thisTag.assocAttribs[ii].arrCell[jj].content)) OR NOT thisTag.assocAttribs[ii].stripBlankLines)
        {
            // are we bolding this line of content?
            if (thisTag.assocAttribs[ii].arrCell[jj].bold)
            {
                writeOutput("\b");
            }
            else
            {
                writeOutput("\b0");
            }

            writeOutput("\fs#ThisTag.AssocAttribs[ii].arrCell[jj].fs#\f#ThisTag.AssocAttribs[ii].arrCell[jj].f##ThisTag.AssocAttribs[ii].arrCell[jj].content#");

            if (jj LT arrayLen(ThisTag.AssocAttribs[ii].arrCell))
            {
                writeOutput("\par");
            }
        }
    }

    // close out cell (like a </td>)
    writeOutput("}{\fs#request.rtfLabels.defaultfontsize#\f#request.rtfLabels.defaultfontface# ");

    // output barcode on bottom if appropriate
    if (len(trim(thisTag.assocAttribs[ii].zipCode)) AND thisTag.assocAttribs[ii].barPos EQ "bottom")
    {
        writeOutput(" {\field\flddirty{\*\fldinst { BARCODE }{\lang1024\langfe1024\noproof #ThisTag.AssocAttribs[ii].zipcode#}{\\u  }}{\fldrslt }}");
    }

    // prepare to close this cell </td>
    writeOutput("\cell } ");

    // close this cell out like a </td>
    if (ii MOD request.rtfLabels.columns)
    {
        writeOutput(" \pard \q#request.rtfLabels.textalign# \li#request.rtfLabels.li#\ri#request.rtfLabels.ri#\widctlpar\intbl\faauto {\cell }");
    }
    else
    {
        writeOutput("\pard\plain \q#request.rtfLabels.textalign# \li#request.rtfLabels.li#\ri#request.rtfLabels.ri#\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright \fs#request.rtfLabels.defaultfontsize#\f#request.rtfLabels.defaultfontface#\lang1033\langfe1033");
    }

    // if this is the last cell of a row, end it (like a </tr>) --->
    if (NOT (ii MOD request.rtfLabels.columns))
    {
        // start close: output code + cellCloser + " \row }"
        writeOutput("\pard\plain \q#request.rtfLabels.textalign# \li#request.rtfLabels.li#\ri#request.rtfLabels.ri#\widctlpar\intbl\aspalpha\aspnum\faauto\adjustright \fs#request.rtfLabels.defaultfontsize#\f#request.rtfLabels.defaultfontface#\lang1033\langfe1033 {\trowd \trrh#request.rtfLabels.trrhcell#\trkeep " & cellCloser & " \row }#chr(13)##chr(10)#");

        // add an extra spacer row?
        if (request.rtfLabels.useSpacer)
        {

            // output complete spacerRow as defined above           
            writeOutput(spacerRow);

        }
    }       

// end of outer for loop
}

// close out document
writeOutput("\pard \q#request.rtfLabels.textalign# \li#request.rtfLabels.li#\ri#request.rtfLabels.ri#\widctlpar\aspalpha\aspnum\faauto\adjustright { \par }{ \par }}");
</cfscript>
</cfsavecontent>

//打开带有标题信息的RTF文档
写输出(“{\rtf1\ansi\ansicpg1252\uc1\deff0\deflang1033\deflangfe1033{\fonttbl{\f0\fswiss Arial;}{\f1\fswiss Helvetica;}{\f2\fswiss Impact;}{\f3\来自《新罗马时报》;}”);
写输出(“{\colortbl;\red0\green0\blue0;\red0\green0\blue255;\red0\green255\blue255;\red0\green255\blue0\blue255;\red255\green0\blue0;\red255\green255\blue0;\red255\green255\blue255;\red0\green0\blue128\blue128;\red0\green0\blue128\blue128\blue128\green0\blue128\blue128\blue12892\green192\blue192;\red255\green255\blue255;});
writeOutput({\info{\title VFIVE Label Generator(#request.rtfLabels.labeltitle#Output)}{\author cf\u averyRTF$Revision:1.17$}{\operator cf\u averyRTF驻留在http://rtf.vfive.com}{\*\VFIVE公司(http://www.vfive.com)}{\creatim\yr年(现在())\mo月(现在())\dy日(现在())\hr小时(现在())\min分钟(现在()){\version1}{\edmins0}{\nofpages1}{\nofwords0}{\nofchars0}{\nofcharsws0}{\vern1000}}\paperw#request.rtfLabels.paperw#paperh#request.rtfLabels.paperh#margl#request.rtfLabels.margl#\margr##request.rtfLabels.rtfLabels.rtfLabels.rtfLabels#;
if(Attributes.landscape)
{
写输出(“\scape”);
}
writeOutput(“\gutter\request.rtfLabels.gutter\widowctrl\ftnbj\aenddoc\noxlatoyen\expshrtn\noultrlspc\dntblnsbdb\nospaceforul\horzdoc\jexpand\viewkind1\viewscale\request.rtfLabels.viewscale\nolnhtabl\fet0\sectd\linex\linex\rtfLabels.linex”\sectdefaultcl”);
//循环数据集中的每一行
对于(ii=1;ii LTE阵列(thisTag.assocatetribs);ii=ii+1)
{
//如果这是行的第一个单元格,请创建该行(类似)
如果(不是((ii+request.rtfLabels.columns-1)MOD request.rtfLabels.columns))
{
//输出类似于行开始、单元格边界的
writeOutput(“\trowd\trrh#request.rtfLabels.trrhcell#\trkeep”&cellbundary);
//输出行设置(对齐、缩进等)
writeOutput(“\pard\plain\q\request.rtfLabels.textalign\li\request.rtfLabels.li\ri\request.rtfLabels.ri\widctlpar\intbl\faauto\f\request.rtfLabels.defaultfontface\fs20\lang1033\langfe1033”);
}
//输出每个单独的单元格标题(类似)
writeOutput(“{\#request.rtfLabels.bold#\fs#request.rtfLabels.defaultfontsize#\f#request.rtfLabels.defaultfontface#”);
//如果合适,在顶部输出条形码
if(len(trim(thisTag.assocatetribs[ii].zipCode))和thisTag.assocatetribs[ii].barPos EQ“top”)
{
writeOutput(“{\field\flddrity{\*\fldinst{BARCODE}{\lang1024\langfe1024\noproof}ThisTag.assocatetribs[ii].zipcode}{\\u}}{\fldrslt}}\par”);
}
//循环此单元格中的内容行
对于(jj=1;jj LTE阵列(ThisTag.assocatetribs[ii].arrCell);jj=jj+1)
{
//要显示的内容?
if(len(trim(thisTag.assocatetribs[ii].arrCell[jj].content))或NOT thisTag.assocatetribs[ii].stripbanklines)
{
//我们是否要加粗这一行内容?
if(thisTag.assocatetribs[ii].arrCell[jj].bold)
{
注销输出(“\b”);
}
其他的
{
写输出(“\b0”);
}
writeOutput(“\fs#ThisTag.assocatetribs[ii].arrCell[jj].fs#\f#ThisTag.assocatetribs[ii].arrCell[jj].f#ThisTag.assocatetribs[ii].arrCell[jj].content#”;
if(jj LT arrayLen(ThisTag.assocatetribs[ii].arrCell))
{
注销输出(“\par”);
}
}
}
//收尾单元(如a)
writeOutput(“}{\fs#request.rtfLabels.defaultfontsize#\f#request.rtfLabels.defaultfontface#”);
//如果合适,在底部输出条形码
if(len(trim(thisTag.assocatetribs[ii].zipCode))和thisTag.assocatetribs[ii].barPos EQ“底部”)
{
writeOutput(“{\field\flddrity{\*\fldinst{BARCODE}{\lang1024\langfe1024\noproof}ThisTag.assocatetribs[ii].zipcode}{\\u}}{\fldrslt}”);
}
//准备关闭此单元格
写输出(“\cell}”);
//把这间牢房关起来,像个
if(ii模块请求rtfLabels.列)
{
writeOutput(“\pard\q#request.rtfLabels.textalig