本文介绍了(DOORS/DXL)导出为pdf或使用给定的模板进行打印的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我们对从正式模块中导出/打印一个视图感兴趣.因为我们希望它可以是一个正式文档,所以我们要添加具有自己的首页,带有给定文本字体,大小和颜色以及插入的图像(公司符号,客户的图像)的页眉页脚和页脚页的公司模板. ).

We are interested in export/print one view from formal module. As we want it can be an ofcial document we want to add our corporative template that have it own front page, and its own headers and footers pages with a given text font, size, and color, and inserted images (company symbol, clients ones).

据我所知,DOORS让我们打印添加页眉和页脚,但没有图像.另一方面,可以导出到Word中添加模板,但是我不能直接将其导出为pdf格式或打印机.

As far as I can see, DOORS let us print adding header&footer but without images. On the other side it is possible export to Word adding a template, but I can't do it directly to pdf format or to a printer.

对于我们来说很重要的一点是,无需使用Word或其他任何编辑器管理人员,就可以直接通过门直接制作公司文档,以便DOORS文档可以直接发布给客户而无需进行外部更改.

It is important for us that a corporative document can be directly made by doors without Word or any other editor management in order DOORS document could be directly released to clients without external changes.

是否可以通过DXL脚本实现?还是有其他选择可以实现?

Is it possible made it by a DXL script? Or there is any other option to make it?

我认为许多用户必须使用他们的公司法人图像打印(或制作pdf文件),我认为这可能非常有用.

I suppose that many users have to print (or make pdf files) using their company corporative images, and I think this can be so useful.

预先感谢您的帮助.

最诚挚的问候,

JM

推荐答案

恕我直言.我已经写了一个DXL脚本来将DOORS模块导出到可以编译成PDF的LaTeX文件中.您将在此答案的结尾找到它.随时根据您的需求进行调整.在运行它之前,您需要下载"智能文件夹浏览器"的源,然后除我的脚本外,将其存储为"smartFolderBrowser.inc".模具扩展名inc表示这是一个包含文件,而不是独立的DXl程序.

IMHO it is. I already wrote a DXL script to export DOORS modules to a LaTeX file which can be compiled into a PDF. You will find it at the end of this answer. Feel free to adapt it to your needs. Before you can run it you need to download the source of "Smart Folder Browser" and store it besides my script as "smartFolderBrowser.inc". Die extension inc indicates that this is an include file and not a standalone DXl program.

当然,每个想要使用这种方法的用户都需要一个已安装的TeX发行版,例如导出后,DXL脚本可以使用DXL内置函数void system(string command)启动PDF构建.

Of course every user which wants to use such an approach needs an installed TeX distribution like MiKTeX. The DXL script could start the PDF build after the export with the DXL built-in function void system(string command).

使用自定义DXL LaTeX导出脚本,您将必须完全控制生成的PDF的布局.但是请注意TeX适用的布局规则.配置(强制)TeX以呈现使用M $ Word创建的文档是一项非常艰巨的任务.

With your custom DXL LaTeX export script you will have to full control over the layout of the resulting PDF. But be aware of the layout rules which TeX applies. It can be a very challenging task to configure (force) TeX to render a document as it has been created with M$ Word.

// DOORS LaTeX Export
/**
Copyright (c) 2012-2013 Kai K.

Permission is hereby granted, free of charge, to any person obtaining a
copy of this software and associated documentation files (the
"Software"), to deal in the Software without restriction, including
without limitation the rights to use, copy, modify, merge, publish,
distribute, sublicense, and/or sell copies of the Software, and to
permit persons to whom the Software is furnished to do so, subject to
the following conditions:

The above copyright notice and this permission notice shall be included
in all copies or substantial portions of the Software.

THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
*/
pragma encoding, "UTF-8"


#include "smartFolderBrowser.inc"

DBE dbeOutputFolder = null;
DBE dbeOptions = null;
bool withTitles = true
Buffer tempBuf = create;

void escapeSpecialLaTeXCharacters(Buffer& str)
{
   Buffer temp = create;

   int i = 0;
   for(i = 0; i < length(str); ++i) 
   {
      char c = str[i]; 
      if( '\\' == c ) 
      {
         temp += "\\textbackslash{}";
      }
      else if( '{' == c )
      {
         temp += "\\"
         temp += c
      }
      else if( '}' == c )
      {
         temp += "\\"
         temp += c
      }
      else if( '_' == c )
      {
         temp += "\\"
         temp += c
      }
      else if( '^' == c )
      {
         temp += "\\textasciicircum{}";
      }
      else if( '#' == c )
      {
         temp += "\\"
         temp += c
      }
      else if( '&' == c )
      {
         temp += "\\"
         temp += c
      }
      else if( '$' == c )
      {
         temp += "\\"
         temp += c
      }
      else if( '%' == c )
      {
         temp += "\\"
         temp += c
      }
      else if( '~' == c )
      {
         temp += "\\textasciitilde{}";
      }
      else
      {
         temp += c;
      }
   }

   str = tempStringOf(temp);
   delete temp;
}

string makeLabel(Buffer& str)
{
   setempty(tempBuf);

   int i = 0;
   for(i = 0; i < length(str); ++i) 
   {
      char c = str[i]; 
      if( ' ' != c && '-' != c && '\n' != c && '\\' != c && '_' != c && '#' != c) 
      {
         tempBuf += c;
      }
   }
   return stringOf(tempBuf);
}

string makeCaption(Buffer& str)
{
   setempty(tempBuf);

   int i = 0;
   for(i = 0; i < length(str); ++i) 
   {
      char c = str[i]; 
      if( '\n' != c && '\\' != c) 
      {
         tempBuf += c;
      }
   }
   escapeSpecialLaTeXCharacters(tempBuf);
   return stringOf(tempBuf);
}

void rtf2latex(Buffer& buf)
{
   Buffer txt = create;
   Buffer temp = create;
   RichTextParagraph rp = null;
   bool envopened = false;
   for rp in tempStringOf(buf) do {
      if(rp.indentLevel > 0)
      {
         real hspace = realOf(rp.indentLevel)/20.0;
         temp += "{\\hangindent" hspace "pt\\hangafter0"
      }
      if(rp.isBullet)
      {
         temp += "\\textbullet ";
      }      
      RichText rt = null      
      for rt in rp do {
         txt = rt.text;         
            escapeSpecialLaTeXCharacters(txt);

         if (rt.italic)
         {
            temp += "\\textit{";
            temp += txt;
            temp += "}";
         }
         else if (rt.bold)
         {
            temp += "\\textbf{";
            temp += txt;
            temp += "}";
         }
         else if (rt.strikethru)
         {
            temp += "\\sout{";
            temp += txt;
            temp += "}";
         }
         else if (rt.subscript)
         {
            temp += "\\textsubscript{";
            temp += txt;
            temp += "}";
         }
         else if (rt.superscript)
         {
            temp += "\\textsuperscript{";
            temp += txt;
            temp += "}";
         }
         else if (rt.underline)
         {
            temp += "\\underline{";
            temp += txt;
            temp += "}";
         }         
         else
         {
            temp += txt;
         }
         if (rt.newline && !rt.last)
         {
            temp += "\\par\n";
         }
         else if(rt.last)
         {
            temp += "\n";
         }
      }
      if(rp.indentLevel > 0)
      {
         temp += "}"
      }
   }
   buf = tempStringOf(temp);
   delete temp;
   delete txt;  
}

void getObjectText(Object obj, Buffer& buf)
{  
   if(!null(obj))
   {
      buf = richTextFragment(richText(obj."Object Text"));
      rtf2latex(buf);
   }
   else
   {
      buf = "null";
      print("ERROR: obj null!: "dxlHere() "\n");
   }   
}

int nextCell(Stream& oss, int curCol, int numCols )
{
   if( curCol == numCols )
   {
      oss << "\\\\\n\\hline\n"
   }
   else
   {
      oss << "\t&\t"
   }

   return( curCol % numCols + 1 )
}

void writePreamble(Stream& oss)
{
   oss << "\\documentclass[a4paper]{book}\n";
   oss << "%---- packages ----\n";
   oss << "\\usepackage{ulem}\n";
   oss << "\\usepackage{color}\n";
   oss << "\\usepackage{graphicx}\n";
   oss << "\\usepackage{supertabular}\n";
   oss << "\\usepackage{hyperref}\n";
   oss << "\\usepackage{makeidx}\n";
   oss << "\\usepackage{xltxtra}\n";
   oss << "\\makeindex\n";
   oss << "%\n---- settings ----\n";
   oss << "\\setcounter{secnumdepth}{6}\n";
   oss << "\\setlength{\\parindent}{0}\n";
   oss << "\\setlength{\\parskip}{2x}\n";
   oss << "%\n---- customizations ----\n";
   oss << "\\makeatletter\n";
   oss << "\\def\\maxwidth{%\n";
   oss << "\\ifdim\\Gin@nat@width>\\linewidth\n";
   oss << "\\linewidth\n";
   oss << "\\else\n";
   oss << "\\Gin@nat@width\n";
   oss << "\\fi\n";
   oss << "}\n";
   oss << "\\makeatother\n";
   oss << "\n%---- document ----\n";
   oss << "\\begin{document}\n";
   oss << "\\tableofcontents\n";
   oss << "\\listoffigures\n";
   oss << "\\listoftables\n";
}

void writeTableHeader(Stream& oss, Object tableobj, int& numCols )
{
   //print("Enter: writeTableHeader\n");
   numCols = 0
   int numRows = 0;
   int tableWidth = 0;

   Object cellobj = null;
   Object rowobj = null;
   // first count the columns and rows
   for rowobj in table( tableobj ) do {
      if( !isDeleted( rowobj ) )
      {
         if(numCols == 0)
         {
            for cellobj in rowobj do {
               if( !isDeleted( cellobj ))
               {
                  tableWidth += getCellWidth(cellobj);
                  numCols++;              
               }
            }
         }
         numRows++;
      }
   }

   // extract the header row
   int colCount = numCols;
   int col = 0;   
   Object headrow[colCount];
   for rowobj in table( tableobj ) do {
      if( !isDeleted( rowobj ) )
      {
         if(col == 0)
         {
            for cellobj in rowobj do {
               if( !isDeleted( cellobj ))
               {
                  headrow[col] = cellobj;
                  col++;
               }
            }
         }
         else
         {            
            break;
         }
      }
   }

   // export the table head
   oss << "\\begin{centering}\n";

   Buffer buf = create;
   oss << "\\tablefirsthead{";   
   for(col=0; col<colCount; ++col) {
      getObjectText(headrow[col], buf);
      oss << tempStringOf(buf);
      if(col+1<colCount)
         oss << "&";
   }
   oss << "\\\\}\n";

   oss << "\\tablehead{";
   for(col=0; col<colCount; ++col) {   
      getObjectText(headrow[col], buf);
      oss << tempStringOf(buf);
      if(col+1<colCount)
         oss << "&";         
   }
   oss << "\\\\}\n";
   oss << "\\tabletail{\\hline}\n";   

   oss << "\\begin{supertabular}{|";
   for(col=0; col<colCount; ++col) {
      cellobj = headrow[col];
      int w = getCellWidth(cellobj);
      real rw = w;
      real tw = tableWidth;
      w = intOf(rw/tw*100.0);
      rw = realOf(w)/100.0;
      oss << "p{" rw "\\textwidth}|";
   }  
   oss << "}\n\\hline\n"

   delete buf;

   //print("Leave: writeTableHeader\n");
}

void writeTableFooter(Stream& oss, Buffer& objtext)
{
   oss << "\\\\\n\\hline\n"
   oss << "\\end{supertabular}\n\\label{tab:";
   oss << makeLabel( objtext );
   oss << "}\n\\bottomcaption{"
   oss << makeCaption( objtext );
   oss << "}\n\\end{centering}\n"
}

void writeobjheading(Stream& oss, Buffer &objNum, Buffer &text, int level )
{
   if(1 == level)
   {
      oss << "\\chapter{";
   }
   else if(2 == level)
   {
      oss << "\\section{";        
   }
   else if(3 == level)
   {
      oss << "\\subsection{";        
   }
   else if(4 == level)
   {
      oss << "\\subsubsection{";        
   }
   else if(5 == level)
   {
      oss << "\\paragraph{";        
   }
   else
   {
      oss << "\\subparagraph{";        
   }

   oss << tempStringOf(text);
   oss << "}\n\\label{sec:";
   oss << makeLabel(text);
   oss << makeLabel(objNum);
   oss << "}\n";
}

void writeFigureHeadAndExport(Stream& oss, Object img, string outputDir)
{
   Module mod = module(img);   
   string n = mod."Prefix"img."Absolute Number"".png";
   string s = exportPicture(img, outputDir "\\" n, formatPNG);   
   oss << "\\begin{figure}[ht]\n";
   oss << "\\centering\n";
   oss << "\\includegraphics[width=\\textwidth]{"n"}\n";
}

void writeFigureFooter(Stream& oss, Buffer& objtext)
{
   oss << "\\label{fig:";
   oss << makeLabel( objtext );
   oss << "}\n\\caption{"
   oss << makeCaption( objtext );
   oss << "}\n\\end{figure}\n";
}

void writeRequirement(Stream& oss, Module& doorsModule, Object obj, Buffer& puid, Buffer& objtext)
{
   oss << "\\textbf{";
   oss << tempStringOf( puid );
   oss << "}\\\\\n" //"PUID style"
   oss << "\\label{req:";
   oss << makeLabel(puid)
   oss << "}\n";
   oss << "\\index{";
   oss << tempStringOf( puid );
   oss << "}\n";
   oss << "\\color{blue}\n"
   oss << tempStringOf( objtext )
   oss << "\n"//"requirement style"

   oss << "\\begin{tabbing}\n"
   Column col = null;
   Buffer var_name = create;
   int c=0;   
   for col in doorsModule do {      
      var_name = title( col )
      escapeSpecialLaTeXCharacters(var_name);

      if( ! main( col ) && search( regexp "(P|p)(U|u)(I|i)(D|d)", var_name, 0 ) == false )
      {         
         oss << "\\textbf{";
         oss << var_name;
         if(c == 0)
            oss <<  "}: \\hspace{2.0cm} \\= "
         else
            oss <<  "}: \\> "

         var_name = text( col, obj );
         escapeSpecialLaTeXCharacters(var_name);
         oss << var_name;
         oss << "\\\\\n";// "attribute valueBuf" )
         c++;
      }               
   }
   oss << "\\end{tabbing}\n"
   oss << "\\color{black}\n"
   delete var_name;
}

void timeString( int timeInSeconds, Buffer &t )
{
   t = ""

   int hours, minutes, seconds

   hours    =   timeInSeconds / 3600
   minutes  = ( timeInSeconds - hours * 3600 ) / 60
   seconds  = ( timeInSeconds - hours * 3600 - minutes * 60 )

   if( hours < 10 ) t = "0"
   t += ( hours "")
   t += ":"
   if( minutes < 10 ) t += "0"
   t += ( minutes "")
   t += ":"
   if( seconds < 10 ) t += "0"
   t += ( seconds "")
}

void doExport(DB db)
{
   int startTime = intOf( today )

   int progressLimit = 0;
   Object obj = null;
   for obj in current Module do {
      progressLimit++;
   }

   progressStart(db, "Exporting Module as LaTeX", "Object 0/"progressLimit"", progressLimit);
   string outputDir = get(dbeOutputFolder);
   string outputFileName = name(current Module);
   string outputFileExt = ".tex";
   string outputFilePath = outputDir "\\" outputFileName outputFileExt;

   Stream mainFile = write(outputFilePath);
   Stream oss = mainFile;

   writePreamble(oss);

   int progress = 1;
   int curCol = 1;
   int numCols = 0;
   bool lastObjWasFigure = false;
   bool lastObjWasTable = false;

   Buffer objheading = create;
   Buffer objtext = create;
   Buffer objNum = create;
   Buffer puid = create;

   int lev = 0
   int puidLevel = 0
   Regexp excel = regexp "objclass Excel.Sheet"
   Module doorsModule = current Module;
   int subfileCount = 1;
   for obj in current Module do {
      if(progressCancelled())
      {
         if( confirm(db, "Do you really want to abort the export?") )
         {
            break;
         }
      }

      progressMessage("Object "progress"/"progressLimit"");

      getObjectText(obj, objtext)

      // ------------------- Handle Tables ------------------------------------
      if( cell( obj ))
      {
         if( !lastObjWasTable )
         {
            writeTableHeader(oss, obj, numCols);            
            curCol           = 1;
            lastObjWasTable  = true;
         }
         else
         {
            curCol = nextCell(oss, curCol, numCols );
         }
         oss << tempStringOf( objtext ); // "Standard"
         progressStep(progress);
         progress++;
         continue
      }

      // ------------------- After Table write Table Title -----------------
      if( lastObjWasTable )
      {
         writeTableFooter(oss, objtext);
      }
      // ------------------- After Figure write Figure Title ---------------
      if( lastObjWasFigure )
      {
         writeFigureFooter(oss, objtext)
      }

      objNum  = number( obj )
      objheading = obj."Object Heading"
      escapeSpecialLaTeXCharacters(objheading)

      // ------------------- Handle End of Requirement ------------------------
      lev = level( obj )
      if( lev <= puidLevel )
      {
         //oss << "End Requirement\n\n"
         puidLevel = 0
      }

      if( withTitles && ( lastObjWasTable || lastObjWasFigure ))
      {
         lastObjWasTable  = false
         lastObjWasFigure = false
         continue
      }

      // ------------------- Handle objheading with hierarchy --------------------
      if( length( objheading ) > 0 )
      {
         writeobjheading(oss, objNum, objheading, lev )
      }

      if( length( objtext ) > 0 )
      {
         // remember, if Title has to be written after this object
         if( containsOle( obj."Object Text"))
         {
            if( excel objtext ) {
               lastObjWasTable = true
            }
            else
            {
               lastObjWasFigure = true;
               writeFigureHeadAndExport(oss, obj, outputDir);
            }
         }
         // ------------------- Handle Requirements objects Text -----------
         puid = obj."IE PUID"
         escapeSpecialLaTeXCharacters(puid)
         if( length( puid ) > 0 )
         {
            puidLevel = lev
            writeRequirement(oss, doorsModule, obj, puid, objtext);
         }
         // ------------------- No PUID means normal text Object -----------
         else
         {
            oss << tempStringOf( objtext );
            oss << "\n";// "Standard"
         }
      }


      progressStep(progress);
      progress++;      
   }

   oss << "\\printindex\n"
   oss << "\\end{document}\n";

   close(oss);
   progressStop();

   // ---------------------- show the result ----------------------------------
   int endTime = intOf( today ) - startTime

   Buffer totalTime = create;
   timeString( endTime, totalTime );

   infoBox( "Export successfully finished after " totalTime "\nThe result is located in\n" outputFilePath);

   delete objheading;
   delete objtext;
   delete objNum;
   delete puid;
   delete tempBuf;
}

DB db = create("LaTeX Export");
dbeOutputFolder = smartFolderBrowser(db, "Output Folder:", false);

ok(db, doExport);
show(db);

这篇关于(DOORS/DXL)导出为pdf或使用给定的模板进行打印的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!