(DOORS / DXL) Export to PDF or print with a specified template

We are interested in exporting / printing one type from a formal module. Since we want this to be a separate document, we want to add our corporate template, which has its own page, as well as its own header and footer pages with the specified font, size and color of the text, as well as inserted images (company symbol, customers )

As far as I can see, DOORS allow us to print the addition of a header & footer, but without images. On the other hand, it is possible to export to Word, adding a template, but I can not do it directly in pdf format or on a printer.

It is important for us that a corporate document can be directly created with doors without Word or any other editor, so that a DOORS document can be directly issued to customers without external changes.

Is it possible to do this with a DXL script? Or is there another way to do this?

I believe that many users should print (or make pdf files) using corporate corporate images, and I think it can be so useful.

Thank you in advance for your help.

Yours faithfully,

Jm

+4
source share
3 answers

Is it possible to do this with a DXL script?

IMHO this is so. I already wrote a DXL script to export DOORS modules to a LaTeX file, which can be compiled into PDF. You will find it at the end of this answer. Feel free to adapt it to your needs. Before you start it, you need to download the source “Smart Folder Browser” and save it, except for my script, as “smartFolderBrowser.inc”. The extension extension inc indicates that this is an include file and not a separate DXl program.

Of course, every user who wants to use this approach must have a TeX distribution installed, for example MiKTeX . A DXL script can start building a PDF after export using the built-in DXL void system(string command) function.

With your custom DXL LaTeX script export, you will need to fully control the layout of the resulting PDF. But keep in mind the layout rules applied by TeX. This can be a very difficult task to set up (forced) TeX to render a document since it was created using 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); 
+4
source

What version of DOORS are you using?

In DOORS 9.3+, IBM has included RPE features in DOORS, which gives you more options for export, including for export to PDF. However, only until DOORS 9.4.0.1 (current release) could you create your own template in the IBM Rational Publishing Engine (RPE) and use this template inside DOORS directly.

So, the answer is that you need one license for RPE Full from IBM so that you can create the template you are looking for, then anyone who uses DOORS in your company can export DOORS documents using this template without additional licenses. You must also be on DOORS 9.4.0.1.

I also saw some companies export their headers and footers to Word, and then use Adobe Acrobat to add logos to their cover pages, etc. However, this means that only people with a full license for Acrobat can correctly create documents.

RPE is definitely your best bet.

Good luck.

0
source

"Is it possible to do this with a DXL script? Or is there another way to do this?"

While I read your request to print DXL data to PDF , we present a third-party tool that will help you move or print saved .DXL domino files in PDF format without any existing data.

DXL to PDF file conversion software is the best solution to help users hide DXL in PDF format without any errors. Software with the ability to convert DXL files or folders in just one click.

0
source

Source: https://habr.com/ru/post/1444531/


All Articles