[scribus] Building Booklets with Multivalent

Frank Cox melville.theatre at gmail.com
Wed Jun 2 20:39:49 CEST 2010


On Wed, 2010-06-02 at 14:27 -0400, David Burleigh wrote:
> Has anyone written a script to automate building booklets with 
> Multivalent? 

Will pdftk do instead of multivalent?

#include <ncurses.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>
#include <stdbool.h>
#include <sys/stat.h>

#define LINESCREEN 110

void CreateScript(FILE *fp, const char *pdfname, const char *buffer1,
const int totalpages, int low, int high);

void start_dos_colors(void);
void doscolor(const int color);
void header(void);
char* left(char *string, const int length);
char* right(char *string, const int length);
char* mid(char*string,const int start, int length); // the start number
starts from string position number 0
int monthtonumber(const char *);
bool YesOrNo(void);

int main(void)
	{
	FILE *fp;
	int counter,totalpages;
	char buffer1[500], temp[500];
	char impose[]="/opt/bargainhunter/barghntr/impose .scr";
	bool evenodd=false;
	
	initscr();
	noecho();
	cbreak();
	keypad(stdscr,TRUE);
	start_color();
		
	start_dos_colors();
	
	header();
	
	// print compile date and time on the main menu
	strcpy(buffer1,__DATE__);
	left(buffer1,3);
	counter=monthtonumber(buffer1);
	mvprintw(23,62,"Version %02d",counter);
	strcpy(buffer1,__DATE__);
	mid(buffer1,4,2);
	printw("%02d",atoi(buffer1));
	strcpy(buffer1,__DATE__);
	right(buffer1,2);
	printw("%02d",atoi(buffer1));
	strcpy(buffer1,__TIME__);
	left(buffer1,2);
	printw("%02d",atoi(buffer1));
	strcpy(buffer1,__TIME__);
	mid(buffer1,3,2);
	printw("%s",buffer1);
	// end of print compile date and time on main menu
	
	mvaddstr(7,23,"1. Impose Parkland Bargain Hunter");
	mvaddstr(9,23,"2. Impose Regina Bargain Hunter");
	mvaddstr(11,23,"3. Impose Saskatoon Bargain Hunter");
	mvaddstr(13,23,"4. RIP 11x17 Layout");
	mvaddstr(15,23,"5. Impose 8.5x11 Layout");
	mvaddstr(17,23,"6. Quit");
	refresh();
	
	counter=0;
	flushinp();
	while (counter < 49 || counter > 54)
		counter=getch();
	strcpy(buffer1,"/opt/bargainhunter/scribus/impose/");
	switch(counter)
		{
		case 49: // Impose Parkland Bargain Hunter
			strcat(buffer1,"parkland/");
			impose[34]='p';
			break;
		case 50: // Impose Regina Bargain Hunter
			strcat(buffer1,"regina/");
			impose[34]='r';
			break;
		case 51: // Impose Saskatoon Bargain Hunter
			strcat(buffer1,"saskatoon/");
			impose[34]='s';
			break;
		case 52: // RIP 11x17 Layout
			header();
			mvaddstr(11,23,"RIP 11x17 Layout -- Proceed (Y/N)");
			refresh();
			if (!YesOrNo())
				{
				endwin();
				return 0;
				}
			endwin();
			printf("RIP 11x17 Layout\n");
			printf("----------------\n\n");
			printf("Counting pages . . .\n");
			system("cat /sda/impose/11x17/paper.ps | grep \\%\\%Page\\: | wc -l
> /opt/bargainhunter/barghntr/pagecnt.tmp");
			fp=fopen("/opt/bargainhunter/barghntr/pagecnt.tmp","r");
			fgets(temp,4,fp);
			fclose(fp);
			remove("/opt/bargainhunter/barghntr/pagecnt.tmp");
			totalpages=atoi(temp);
			printf("Writing RIP...\n");
			fp=fopen("/opt/bargainhunter/barghntr/impose11.scr","w");
			fprintf(fp,"#!/bin/bash\n");
			fprintf(fp,"cd /sda/impose/11x17\n");
			fprintf(fp,"ps2pdf -dPDFSETTINGS=/printer -sPAPERSIZE=ledger paper.ps
imposed.pdf\n");
			fprintf(fp,"pdftk imposed.pdf cat ");
			for (counter=1; counter < totalpages+1; counter++)
				{
				if (evenodd)
					fprintf(fp,"E ");
				else
					fprintf(fp,"W ");
				evenodd=!evenodd;
				}
			fprintf(fp,"output 11x17.pdf\n");
			fprintf(fp,"rm imposed.pdf\n");
			fprintf(fp,"gs -dNOPAUSE -sDEVICE=psmono -r1200 -sPAPERSIZE=11x17
-dCOLORSCREEN -dDITHERPPI=%d -sOUTPUTFILE=temp.ps 11x17.pdf -c quit
\n",LINESCREEN);
			fprintf(fp,"rm 11x17.pdf\n");
			fprintf(fp,"ps2pdf temp.ps temp.pdf\n");
			fprintf(fp,"pdftk temp.pdf cat ");
			evenodd=false;
			for (counter=1; counter < totalpages+1; counter++)
				{
				fprintf(fp,"%d",counter);
				if (evenodd)
					fprintf(fp,"E ");
				else
					fprintf(fp,"W ");
				evenodd=!evenodd;
				}
			fprintf(fp,"output 11x17.pdf\n");
			fprintf(fp,"rm temp.ps temp.pdf\n");
			// PDF OPTIMIZATION STARTS HERE
			fprintf(fp,"pdfopt 11x17.pdf opt.pdf\n");
			fprintf(fp,"rm 11x17.pdf\n");
			fprintf(fp,"mv opt.pdf 11x17.pdf\n");
			// PDF OPTIMIZATION ENDS HERE
			fprintf(fp,"chmod 666 *\n");
			fclose(fp);
			chmod("/opt/bargainhunter/barghntr/impose11.scr",S_IRWXU |
S_IRWXG); // -rwxrwx---
			printf("Starting 11x17 RIP.  This may take a while . . .\n");
			system("ssh jack /opt/bargainhunter/barghntr/impose11.scr");
			remove("/opt/bargainhunter/barghntr/impose11.scr");
			header();
			mvaddstr(11,14,"11x17 RIP completed.  Press any key to end
program.");
			refresh();
			flushinp();
			getch();
			endwin();
			return 0;
		case 53: // Impose 8.5x11 Layout
			strcat(buffer1,"8.5x11/");
			impose[34]='m';
			break;
		case 54:
			endwin();
			return 0;
		}
	header();
	mvprintw(6,15,"%spaper.ps",buffer1);
	mvaddstr(7,23,"Print Options: Print Separations");
	mvaddstr(11,4,"Are you sure you want to start imposing the ");
	doscolor(14);
	switch(counter)
		{
		case 49:
			addstr("Parkland");
			break;
		case 50:
			addstr("Regina");
			break;
		case 51:
			addstr("Saskatoon");
			break;
		case 53:
			addstr("Miscellaneous");
		}
	doscolor(8);
	addstr(" paper? (Y/N)");
	refresh();
	if (!YesOrNo())
		{
		endwin();
		return 0;
		}
	endwin();
	printf("\nImposing ");
	switch(counter)
		{
		case 49:
			printf("Parkland");
			break;
		case 50:
			printf("Regina");
			break;
		case 51:
			printf("Saskatoon");
			break;
		case 53:
			printf("Miscellaneous");
		}
	printf(" paper\n");
	printf("-----------------------\n");
	printf("Counting pages . . .\n");
	sprintf(temp,"cat %spaper.ps | grep \%\%Page\\: | wc -l
> /opt/bargainhunter/barghntr/pagecnt.tmp",buffer1);
	system(temp);
	fp=fopen("/opt/bargainhunter/barghntr/pagecnt.tmp","r");
	fgets(temp,4,fp);
	fclose(fp);
	remove("/opt/bargainhunter/barghntr/pagecnt.tmp");
	totalpages=atoi(temp);
	printf("Writing RIP...\n");
	fp=fopen(impose,"w");
	fprintf(fp,"#!/bin/bash\n");
	fprintf(fp,"cd %s\n",buffer1);
	CreateScript(fp,"black",buffer1,totalpages,1,totalpages-3);
	CreateScript(fp,"cyan",buffer1,totalpages,2,totalpages-2);
	CreateScript(fp,"magenta",buffer1,totalpages,3,totalpages-1);
	CreateScript(fp,"yellow",buffer1,totalpages,4,totalpages);
	fclose(fp);
	chmod(impose,S_IRWXU | S_IRWXG); // -rwxrwx---
	printf("Starting ");
	switch(counter)
		{
		case 49:
			printf("PARKLAND");
			break;
		case 50:
			printf("REGINA");
			break;
		case 51:
			printf("SASKATOON");
			break;
		case 53:
			printf("MISCELLANEOUS");
		}
	printf(" BARGAIN HUNTER job.  This may take a while...");
	strcpy(temp,"ssh jack ");
	strcat(temp,impose);
	system(temp);
	remove(impose);
	header();
	doscolor(14);
	switch(counter)
		{
		case 49:
			mvaddstr(11,13,"PARKLAND");
			break;
		case 50:
			mvaddstr(11,14,"REGINA");
			break;
		case 51:
			mvaddstr(11,13,"SASKATOON");
			break;
		case 53:
			mvaddstr(11,10,"MISCELLANEOUS");
		}
	doscolor(8);
	addstr(" RIP completed.  Press any key to end program.");
	refresh();
	flushinp();
	getch();
	endwin();
	return 0;
	}

void CreateScript(FILE *fp, const char *pdfname, const char *buffer1,
const int totalpages, int low, int high)
	{
	int page=1,counter;
	bool evenodd=false;
	fprintf(fp,"psselect -p");
	while (low <= high)
		{
		if (evenodd)
			fprintf(fp,"%d,%d",low,high);
		else
			fprintf(fp,"%d,%d",high,low);
		page++;
		low+=4;
		high-=4;
		if (low <=high)
			fprintf(fp,",");
		evenodd=!evenodd;
		}
	fprintf(fp," %spaper.ps ordered.ps\n",buffer1);
	fprintf(fp,"psnup -pledger -Pletter -nup 2 ordered.ps imposed.ps\n");
	fprintf(fp,"ps2pdf -dPDFSETTINGS=/printer -sPAPERSIZE=ledger imposed.ps
imposed.pdf\n");
	fprintf(fp,"pdftk imposed.pdf cat ");
	evenodd=false;
	for (counter=1; counter < totalpages/8+1; counter++)
		{
		fprintf(fp,"%d",counter);
		if (evenodd)
			fprintf(fp,"E ");
		else
			fprintf(fp,"W ");
		evenodd=!evenodd;
		}
	fprintf(fp,"output %s.pdf\n",pdfname);
	fprintf(fp,"rm imposed.pdf imposed.ps ordered.ps\n");
	fprintf(fp,"gs -dNOPAUSE -sDEVICE=psmono -r1200 -sPAPERSIZE=11x17
-dCOLORSCREEN -dDITHERPPI=%d -sOUTPUTFILE=temp.ps %s.pdf -c quit
\n",LINESCREEN,pdfname);
	fprintf(fp,"rm %s.pdf\n",pdfname);
	fprintf(fp,"ps2pdf temp.ps %s.pdf\n",pdfname);  
	fprintf(fp,"rm temp.ps\n");
	//***** PDF OPTIMIZE ROUTINE STARTS HERE
	fprintf(fp,"pdfopt %s.pdf opt.pdf\n",pdfname);
	fprintf(fp,"rm %s.pdf\n",pdfname);
	fprintf(fp,"mv opt.pdf %s.pdf\n",pdfname);
	//***** PDF OPTIMIZE ROUTINE ENDS HERE
	fprintf(fp,"chmod 666 *\n");
	return;
	}

void start_dos_colors(void)
	{
	init_pair(1,0,6); // black
	init_pair(2,3,6); // blue
	init_pair(3,2,6); // green
	init_pair(4,1,6); // red
	init_pair(5,5,6); // magenta
	init_pair(6,3,6); // brown
	init_pair(7,7,6); // white
	return;
	}

void doscolor(const int color)
	//these are all on a cyan background
	{
	switch (color)
		{
		case 0:
			attrset(COLOR_PAIR(1)); //black
			break;
		case 1:
			attrset(COLOR_PAIR(2)); // blue
			break;
		case 2:
			attrset(COLOR_PAIR(3)); //green
			break;
		case 3:
			// cyan -- not used on this cyan background
			break;
		case 4:
			attrset(COLOR_PAIR(4)); //red
			break;
		case 5:
			attrset(COLOR_PAIR(5)); //magenta
			break;
		case 6:
			attrset(COLOR_PAIR(6)); //brown
			break;
		case 7:
			attrset(COLOR_PAIR(7)); //white
			break;
		case 8:
			attrset(COLOR_PAIR(1)|A_BOLD); //gray
			break;
		case 9:
			attrset(COLOR_PAIR(2)|A_BOLD); //light blue
			break;
		case 10:
			attrset(COLOR_PAIR(3)|A_BOLD); //light green
			break;
		case 11:
			// light cyan -- not used on this cyan background
			break;
		case 12:
			attrset(COLOR_PAIR(4)|A_BOLD); // light red
			break;
		case 13:
			attrset(COLOR_PAIR(5)|A_BOLD); // light magenta
			break;
		case 14:
			attrset(COLOR_PAIR(6)|A_BOLD); // yellow
			break;
		case 15:
			attrset(COLOR_PAIR(7)|A_BOLD); // high intensity white
			break;
		}
	return;
	}
	
char* left(char *string, const int length)
	{
	if (strlen(string) > length)
		string[length]='\0';
	return string;
	}

char* right(char *string, const int length)
	{
	if (strlen(string) > length)
		memmove(string, &string[strlen(string)-length],length+1);
	return string;
	}

char* mid(char*string,const int start, int length) // the start number
starts from string position number 0
	{
	int counter1, counter2;
	if (start > strlen(string))
		{
		string[0]='\0';
		return string;
		}
	if (strlen(string) < start+length)
		length = strlen(string) - start;
	for (counter1=0, counter2=start; counter1 <length; counter1++, counter2
++)
		string[counter1] = string[counter2];
	string[counter1]='\0';
	return string;
	}

int monthtonumber(const char *month)
	{
	if (strcmp(month,"Jan")==0)
		return 1;
	if (strcmp(month,"Feb")==0)
		return 2;
	if (strcmp(month,"Mar")==0)
		return 3;
	if (strcmp(month,"Apr")==0)
		return 4;
	if (strcmp(month,"May")==0)
		return 5;
	if (strcmp(month,"Jun")==0)
		return 6;
	if (strcmp(month,"Jul")==0)
		return 7;
	if (strcmp(month,"Aug")==0)
		return 8;
	if (strcmp(month,"Sep")==0)
		return 9;
	if (strcmp(month,"Oct")==0)
		return 10;
	if (strcmp(month,"Nov")==0)
		return 11;
	if (strcmp(month,"Dec")==0)
		return 12;
	return 0; // we should never get here if we have a valid month	
	}
	
bool YesOrNo(void)
	{
	char input;
	flushinp();
	while (input != 'Y' && input != 'N')
		input = toupper(getch());
	if (input == 'Y')
		return true;
	else
		return false;
	}

void header(void)
	{
	clear();
	bkgd(COLOR_PAIR(1));
	doscolor(4);
	mvaddstr(1,12,"P A R K L A N D   B A R G A I N   H U N T E R   I N
C .");
	mvaddstr(2,27,"Imposition Script & RIP");
	doscolor(8);
	curs_set(0);
	}


-- 
MELVILLE THEATRE ~ Melville Sask ~ http://www.melvilletheatre.com





More information about the scribus mailing list