Print variable with ZPL II in smartforms

Hi all,
How can I print a variable in smartforms with ZPL II code?
I use commant in smartforms with ^FV but it could not be written to the label.
ZPL II Command String is :  XX is a variable that is stored a value in Programs Line before ZPL II Command.
S_LZPL_SETUP     'XAFO50,50GB0,203,5FSFWBFO115, 75A0,25,20FVXXFSXZ'
Best regards,
Munur

Hi Jack,
1.
data : ZZPL2 type string.
clear : zsaat,ztarih.
concatenate ZZCZEIT(2) ':' ZZCZEIT+2(2) ':' ZZCZEIT+4(2)
       into ZSAAT.
condense ZSAAT no-gaps.
concatenate ZZCDATE+6(2) '.' ZZCDATE+4(2) '.' ZZCDATE(4)
       into ZTARIH.
condense ZTARIH no-gaps.
concatenate '^BY4,2.0^FO20,50^B7N,4,1,1,0,N^FD'
              ZZKDMAT
            '^FS'
            '^FO490,15^GB0,250,5^FS'  
            '^FWB^FO500,60^A0,25,20^FD'
            ZSAAT                    
            '^FS'                      
            '^FWB^FO525,50^A0,25,20^FD'
            ZTARIH
            '^FS'                    
            '^FWN^A0,25,20^FD'
            '^FS'                      
       into ZZPL2.
2. In the command :
S_LZPL_SETUP           ZZPL2
That's all.
Best regards,
Munur

Similar Messages

  • Printing problem with gray cells in smartforms

    Hi there,
    i have developed a smart form with some color logo and some gray shaded cells. If i print it by SAPLPD it comes out fine but when i print it on a printer configured in SAP it doesn’t come out properly. All the gray cells print as black cells. Any advice?
    Regards.

    Asif,
    it some times depends upon the printer drivers also
    i faced the same problem with one printer then i tried with the other hpcolor printer then i got the printout perfectly that means sometimes the drivers of the printer will crash with the program
    so its better u try this one in the another printer
    if u have this problem futher let me know
    Regards
    naveen

  • Printing Standard TEXT  with multiple paragraphs in smartform

    Hello all,
    I have a requirement that, there is a very long standard text stored in a notification of an order in SAP ISU system. The text contains multiple paragraphs with indentations. I want to print this text directly into the smartform WITH SAME INDENTATION AND PARAGRAPH FORMATTING.
    First i am reading the entire text using FM READ_TEXT.
    My first  problem is even if i read the text into a variable of type STRING , it just prints 255 characters of it.
    And secondly if i try to printout it using LOOP AT node in smartforms, it prints the entire content but without any formatting .
    Please let me know whether it is possible to print standard text in smartforms or not
    Thanks
    Nilesh Puranik

    Hey ,
    Well thanks for that but my replies got posted 2-3 times unknowingly, could'nt help it.
    Coming to the problem, i  guess you did not get my point when i say dynamic texts for each service order.
    In my Report i am using LOOP AT ITAB ..where in itab i  am storing a service order no i.e. ITAB-ORDER_NO
    Now for every order there is standard text maintained in SO10 starting with order name
    so my code goes like this.
    LOOP AT ITAB.
    CALL FUNCTION 'READ_TEXT'
      EXPORTING
        ID                            = 'LTXT'
        LANGUAGE            = 'E'
        NAME                      = ITAB-order_no
        OBJECT                   = 'QMSM'
      TABLES
        LINES                         = LINES .
    CALL <SMART FORM Fm>
    ENDLOOP.
    Hence whatever Standard text maintained for that service order i  want to display it as it is in the smartform with same paragraphs formatting and indentation.
    IF i use a variable in smartform and pass the entire text  after using READ_TEXT , it does not format the text  and it just prints only 255 characters even if i define it of type STRING .
    Hence i am stuck in this scenario.
    Appreciate ur help though.
    Thanks
    Nilesh

  • Page printing issue with smartform PO

    Hi Super-Techies,
    I have created a z print program for my purchase order smartform. But the issue I am facing now is that when i try to view the purchase order from transaction me23n -> print preview ( with 15 items). I am getting output as a single page with 10 items on it. The rest 5 items are not being displayed. I mean the page is not getting printed from 2nd page onwards.
    What could be the issue??? Can anyone suggest me.
    Thanks & Regards,
    Vinit

    Hi,
    As said above, I have used table instead of template and the data is flowinf to next pages.
    BUt now the issue is that in the last page suppose if there are only 5 items, than the window border prints after 5 items. It is not good while print preview as there is a blank space created in form (for the rest 5 items which are not being used).
    I want to fix the main window border irrespective of the line items.
    Whats advice on this issue.
    Regards,
    Vinit

  • Integration of Print Workbench with Smartforms

    I am currently working on Print Workbench.I need a detailed documentation of print workbench with Smartforms.I already have with me the information from link http://www.sap.com/industries/media/pdf/FICAPWB_EN.pdf
    and also sap help.
    But these don't provide a detailed step by step procedure on the same.If any body has such documentation Please provide the same.
    Thanks in advance.
    Edited by: Pratyasha Shishodia on Jan 3, 2008 10:25 AM

    Bogdan,
    I don't think that statement is true as we have developed SMART Forms for PM in 4.6C itself.
    In the transaction OID1, all you have to do is to specify the SMART Form name and the print program name. I guess if you are developing a SMART Form, you will have a custom print program.
    So, you need to specify the FORM sub routine in the OID1 which will be dynamically called by the standard code and from there your custom program calls the smart form and prints the relevant info.
    Regards,
    Ravi
    Note : Please mark the helpful answers

  • Display issue with Long Text in Smartform

    Hi All,
    We have a custom smartform, where we are displaying the Invoice Item level details.
    The Item description (InvoiceItemItem Text) is of about 1000 character length and a variable v_temp with 2000 length has been defined and saved.
    In debug mode, the complete text is saved in the variable v_temp.
    The same variable is placed in the smartform to display the complete text.
    But the complete Text is not getting displayed and only the system displays 256 char.
    How to resolve this issue?
    Regards
    Pavan

    Hi,
    Another workaround will be to define internal table with a field of lenght 256, and use the function module RKD_WORD_WRAP to split the string (v_temp) into 256 characters length. Now loop at this internal table and print the same.
    Regards,
    Swarna Munukoti.

  • How not to print all the pages of a smartform? (for tr F150 - Dunning)

    Hi Forum
    We have the follow situation:
      For DUNNING (transaction F150) the user want stamp 3 diferents SMARTFORM.
       For the first time the transaction is executed is required only a list of documents, for the second time (via sample printout, indiv dunn notice or dunn history)  once the legal data of the customer is updated, the user wants the list of documents, a letter for the lawyers and a letter for the client, in the follows executions  (3 and up) the user can require only the list of documents or all smartforms (list and letters)
      Via customizing we can control the normal dunning and the legal dunnig, but once the client is in legal status the transaction create only the legal smarforms.
    We found  an user exit associated  EXIT_SAPF150D_001. in the F150 transaction, but is not complete, in sense that are failed some parameters .
      Another option is create an unique smartform with 3 pages where we can control the case for the print, but here is where we ask: How we can do to print a specific page of the smartform without print all of them (how can we print the 2nd and 3rd page without print the firs one) ??
    To control the 3rd execution, we can create a dictionary table with a flag .
    Thank you for your help

    You could create a report containing all the single reports in one using UNION. This report could be placed on a "hidden" page. The link for downloading that report you can place on your page. That should work.
    Denes Kubicek
    http://deneskubicek.blogspot.com/
    http://www.apress.com/9781430235125
    https://apex.oracle.com/pls/apex/f?p=31517:1
    http://www.amazon.de/Oracle-APEX-XE-Praxis/dp/3826655494

  • Print JTable with Multiple pages and rows

    I took the printing example at http://java.sun.com/developer/onlineTraining/Programming/JDCBook/advprint.html#pe and modified it a bit to include the following:
    1) To Print Multiple pages
    2) To wrap lines that is too long for the column
    3) To print with a more proffesional style, so that it doesn't look like a screen capture is printed
    4) To align the numbers to the right and center column headings
    import javax.swing.*;
    import javax.swing.table.*;
    import java.awt.print.*;
    import java.util.*;
    import java.awt.*;
    import java.awt.event.*;
    import java.awt.geom.*;
    import java.awt.Dimension;
    import javax.print.*;
    import javax.print.attribute.*;
    import javax.print.attribute.standard.*;
    import java.text.*;
    public class Report implements Printable
         private final int LEFT_ALIGN = -1;
         private final int CENTER_ALIGN = 0;
         private final int RIGHT_ALIGN = 1;
         private JFrame frame;
         private JTable tableView;
         private String lastPrintDate;
         private Font defaultFont;
         private Font headerFont;
         private Font footerFont;
         private int headerHeight;
         private int footerHeight;
         private int cellBuffer = 5;
         private boolean first_pass;
         private ArrayList pages;
         public Report()
              frame = new JFrame("Sales Report");
              frame.addWindowListener(new WindowAdapter()
                   public void windowClosing(WindowEvent e)
                        System.exit(0);
              final String[] headers =
                   "ID",
                   "Description",
                   "open price",
                   "latest price",
                   "End Date",
                   "Quantity"
              int count = 0;
              final Object[][] data =
                   {new Integer(count++), "Box of BirosBox of BirosBox of BirosBox of BirosBox of BirosBox of BirosBox of BirosBox of BirosBox of BirosBox of BirosBox of BirosBox of BirosBox of BirosBox of Biros ppppppppppppppp", "1.00", "4.99", new Date(), new Integer(200000)},
                   {new Integer(count++), "Blue Biro", "0.10", "0.14", new Date(), new Integer(1)},
                   {new Integer(count++), "legal pad", "1.00", "2.49", new Date(), new Integer(1)},
                   {new Integer(count++), "tape", "1.00", "1.49", new Date(), new Integer(1)},
                   {new Integer(count++), "stapler", "4.00", "4.49", new Date(), new Integer(1)},
                   {new Integer(count++), "Box of Biros", "1.00", "4.99", new Date(), new Integer(2)},
                   {new Integer(count++), "Blue Biro", "0.10", "0.14", new Date(), new Integer(1)},
                   {new Integer(count++), "legal pad", "1.00", "2.49", new Date(), new Integer(1)},
                   {new Integer(count++), "tape", "1.00", "1.49", new Date(), new Integer(1)},
                   {new Integer(count++), "stapler", "4.00", "4.49", new Date(), new Integer(1)},
                   {new Integer(count++), "Box of Biros", "1.00", "4.99", new Date(), new Integer(2)},
                   {new Integer(count++), "Blue Biro", "0.10", "0.14", new Date(), new Integer(1)},
                   {new Integer(count++), "legal pad", "1.00", "2.49", new Date(), new Integer(1)},
                   {new Integer(count++), "tape", "1.00", "1.49", new Date(), new Integer(1)},
                   {new Integer(count++), "stapler", "4.00", "4.49", new Date(), new Integer(1)},
                   {new Integer(count++), "Box of Biros", "1.00", "4.99", new Date(), new Integer(2)},
                   {new Integer(count++), "Blue Biro", "0.10", "0.14", new Date(), new Integer(1)},
                   {new Integer(count++), "legal pad", "1.00", "2.49", new Date(), new Integer(1)},
                   {new Integer(count++), "tape", "1.00", "1.49", new Date(), new Integer(1)},
                   {new Integer(count++), "stapler", "4.00", "4.49", new Date(), new Integer(1)},
                   {new Integer(count++),  "Box of Biros", "1.00", "4.99", new Date(), new Integer(2)},
                   {new Integer(count++),  "Blue Biro", "0.10", "0.14", new Date(), new Integer(1)},
                   {new Integer(count++),  "legal pad", "1.00", "2.49", new Date(), new Integer(1)},
                   {new Integer(count++),  "tape", "1.00", "1.49", new Date(), new Integer(1)},
                   {new Integer(count++),  "stapler", "4.00", "4.49", new Date(), new Integer(1)},
                   {new Integer(count++),  "Box of Biros", "1.00", "4.99", new Date(), new Integer(2)},
                   {new Integer(count++),  "Blue Biro", "0.10", "0.14", new Date(), new Integer(1)},
                   {new Integer(count++),  "legal pad", "1.00", "2.49", new Date(), new Integer(1)},
                   {new Integer(count++),  "tape", "1.00", "1.49", new Date(), new Integer(1)},
                   {new Integer(count++),  "stapler", "4.00", "4.49", new Date(), new Integer(1)},
                   {new Integer(count++),  "Box of Biros", "1.00", "4.99", new Date(), new Integer(2)}
              TableModel dataModel = new AbstractTableModel()
                   public int getColumnCount() { return headers.length; }
                   public int getRowCount() { return data.length;}
                   public Object getValueAt(int row, int col)
                        return data[row][col];
                   public String getColumnName(int column)
                        return headers[column];
                   public Class getColumnClass(int col)
                        return getValueAt(0,col).getClass();
                   public boolean isCellEditable(int row, int col)
                        return (col==1);
                   public void setValueAt(Object aValue, int row, int column)
                        data[row][column] = aValue;
              tableView = new JTable(dataModel);
              JScrollPane scrollpane = new JScrollPane(tableView);
              scrollpane.setPreferredSize(new Dimension(500, 80));
              frame.getContentPane().setLayout(new BorderLayout());
              frame.getContentPane().add(BorderLayout.CENTER,scrollpane);
              frame.pack();
              JButton printButton= new JButton();
              printButton.setText("print me!");
              frame.getContentPane().add(BorderLayout.SOUTH,printButton);
              // for faster printing turn double buffering off
              RepaintManager.currentManager(frame).setDoubleBufferingEnabled(false);
              printButton.addActionListener( new ActionListener()
                   public void actionPerformed(ActionEvent evt)
                        doPrint();
              frame.setVisible(true);
          * Reset variables before printing
         private void prepareForPrint()
              pages = new ArrayList();
              first_pass = true;
          * Display a print dialog with some hardcoded defaults
          * The print fonts are also hardcoded
         public void doPrint()
              try
                   String jobName = "Java Report";
                   defaultFont = new Font("Arial", Font.PLAIN, 8);
                   footerFont = new Font("Arial", Font.PLAIN, 6);
                   headerFont = new Font("Arial", Font.BOLD, 10);
                   PrinterJob prnJob = PrinterJob.getPrinterJob();
                   prnJob.setPrintable(this);
                   PrintRequestAttributeSet prnSet = new HashPrintRequestAttributeSet();
                   prnSet.add(new Copies(1));
                   prnSet.add(new JobName(jobName, null));
                   prnSet.add(MediaSizeName.ISO_A4);
                   PageFormat pf = prnJob.defaultPage();
                   pf.setOrientation(java.awt.print.PageFormat.PORTRAIT);
                   prnJob.setJobName(jobName);
                   PrintService[] services = PrinterJob.lookupPrintServices();
                   if (services.length > 0)
                        if (prnJob.printDialog(prnSet))
                              * Get print date
                             String dateFormat = "dd/MM/yyyy HH:mm:ss";
                             DateFormat m_DateFormat = new SimpleDateFormat(dateFormat);
                             lastPrintDate = m_DateFormat.format(new Date()).toString();
                             prepareForPrint();
                             prnJob.print(prnSet);
                   else
                        JOptionPane.showMessageDialog(frame, "No Printer was found!!", "Printer Error", JOptionPane.ERROR_MESSAGE);
                        return;
              catch (PrinterException e)
                   e.printStackTrace();
         public int print(Graphics g, PageFormat pageFormat, int pageIndex) throws PrinterException
               * Check if this is the first time the print method is called for this print action.
               * It is not guaranteed that the print will be called with synchronous pageIndex'es,
               * so we need to calculate the number of pages and which rows appear on which pages.
               * Then the correct page will be printed regardless of which pageIndex is sent through.
              if (first_pass)
                   calcPages(g, pageFormat);
              first_pass = false;
              // Stop printing if the pageIndex is out of range
              if (pageIndex >= pages.size())
                   return NO_SUCH_PAGE;
              Graphics2D     g2 = (Graphics2D) g;
              g2.setColor(Color.black);
              // The footer will be one line at the bottom of the page, cater for this.
              g2.setFont(footerFont);
              footerHeight = g2.getFontMetrics().getHeight() + g2.getFontMetrics().getDescent();
              g2.setFont(defaultFont);
              FontMetrics fontMetrics = g2.getFontMetrics();
              int fontHeight = fontMetrics.getHeight();
              int fontDescent = fontMetrics.getDescent();
              double pageHeight = pageFormat.getImageableHeight() + pageFormat.getImageableY();
              double pageWidth = pageFormat.getImageableWidth();
              double tableWidth = (double) tableView.getColumnModel().getTotalColumnWidth();
              // Shrink or expand the table to fit the page width
              double scale = pageWidth / (tableWidth+ (cellBuffer * tableView.getColumnCount()));
              // Calculate the width in pixels for each column
              double[] columnWidths = new double[tableView.getColumnCount()];
              for(int i = 0; i < tableView.getColumnCount(); i++)
                   columnWidths[i] = (double)tableView.getColumnModel().getColumn(i).getWidth() * scale;
              // Reset the view to the start of the page
              g2.translate(0, 0);
              // Draw a rectangle to see the printable area
              g2.draw3DRect((int)pageFormat.getImageableX(),
                        (int)pageFormat.getImageableY(),
                        (int)pageFormat.getImageableWidth(),
                        (int)pageFormat.getImageableHeight(),
                        false);
              // Calculate the header height
              g2.setFont(headerFont);
              fontMetrics = g2.getFontMetrics();
              // Print the headers and retreive the starting position for the data
              int next_row = printLine(g2, pageFormat, fontMetrics, -1, (int)pageFormat.getImageableY() + fontHeight, columnWidths);
              g2.setFont(defaultFont);
              fontMetrics = g2.getFontMetrics();
              // Start printing the detail
              ArrayList page = (ArrayList)pages.get(pageIndex);
              int start = ((Integer)page.get(0)).intValue();
              int end = ((Integer)page.get(1)).intValue();
              for (int i = start; i <= end; i++)
                   next_row = printLine(g2, pageFormat, fontMetrics, i, next_row, columnWidths);
              // Print the footer
              g2.setFont(footerFont);
              String pageFooter = "Page " + (pageIndex + 1) + " - " + lastPrintDate;
              g2.drawString(pageFooter,
                             (int)pageFormat.getWidth() / 2 - (fontMetrics.stringWidth(pageFooter) / 2),
                             (int)(pageHeight - fontDescent));
              return PAGE_EXISTS;
          * We can't guarantee that the same amount of rows will be displayed on each page,
          * the row heights are dynamic and may wrap onto 2 or more lines.
          * Thus we need to calculate the height of each row and then test how may rows
          * fit on a specific page. eg. Page 1 contains rows 1 to 10, Page 2 contains rows 11 to 15 etc.
         public void calcPages(Graphics g, PageFormat pageFormat) throws PrinterException
              Graphics2D     g2 = (Graphics2D) g;
              g2.setColor(Color.black);
              // The footer will be one line at the bottom of the page, cater for this.
              g2.setFont(footerFont);
              footerHeight = g2.getFontMetrics().getHeight() + g2.getFontMetrics().getDescent();
              g2.setFont(defaultFont);
              FontMetrics fontMetrics = g2.getFontMetrics();
              int fontHeight = fontMetrics.getHeight();
              int fontDescent = fontMetrics.getDescent();
              double pageHeight = pageFormat.getImageableHeight() - fontHeight;
              double pageWidth = pageFormat.getImageableWidth();
              double tableWidth = (double) tableView.getColumnModel().getTotalColumnWidth();
              // Shrink or expand the table to fit the page width
              double scale = pageWidth / (tableWidth+ (cellBuffer * tableView.getColumnCount()));
              // Calculate the width in pixels for each column
              double[] columnWidths = new double[tableView.getColumnCount()];
              for(int i = 0; i < tableView.getColumnCount(); i++)
                   columnWidths[i] = (double)tableView.getColumnModel().getColumn(i).getWidth() * scale;
              // Calculate the header height
              int maxHeight = 0;
              g2.setFont(headerFont);
              fontMetrics = g2.getFontMetrics();
              for (int j = 0; j < tableView.getColumnCount(); j++)
                   String value = tableView.getColumnName(j).toString();
                   int numLines = (int)Math.ceil(fontMetrics.stringWidth(value) / columnWidths[j]);
                   if (numLines > maxHeight)
                        maxHeight = numLines;
              headerHeight = g2.getFontMetrics().getHeight() * maxHeight;
              g2.setFont(defaultFont);
              fontMetrics = g2.getFontMetrics();
              int pageNum = 0;
              int bottom_of_page = (int)(pageFormat.getImageableHeight() + pageFormat.getImageableY()) - footerHeight;
              int prev_row = 0;
              int next_row = (int)pageFormat.getImageableY() + fontHeight + headerHeight;
              int i = 0;
              ArrayList page = new ArrayList();
              page.add(new Integer(0));
              for (i = 0; i < tableView.getRowCount(); i++)
                   maxHeight = 0;
                   for (int j = 0; j < tableView.getColumnCount(); j++)
                        String value = tableView.getValueAt(i, j).toString();
                        int numLines = (int)Math.ceil(fontMetrics.stringWidth(value) / columnWidths[j]);
                        if (numLines > maxHeight)
                             maxHeight = numLines;
                   prev_row = next_row;
                   next_row += (fontHeight * maxHeight);
                   // If we've reached the bottom of the page then set the current page's end row
                   if (next_row > bottom_of_page)
                        page.add(new Integer(i - 1));
                        pages.add(page);
                        page = new ArrayList();
                        page.add(new Integer(i));
                        pageNum++;
                        next_row = (int)pageFormat.getImageableY()
                                       + fontHeight
                                       + ((int)pageFormat.getHeight() * pageNum)
                                       + headerHeight;
                        bottom_of_page = (int)(pageFormat.getImageableHeight()
                                            + pageFormat.getImageableY())
                                            + ((int)pageFormat.getHeight() * pageNum)
                                            - footerHeight;
                        //Include the current row on the next page, because there is no space on this page
                        i--;
              page.add(new Integer(i - 1));
              pages.add(page);
          * Print the headers or a row from the table to the graphics context
          * Return the position of the row following this one
         public int printLine(Graphics2D g2,
                                       PageFormat pageFormat,
                                       FontMetrics fontMetrics,
                                       int rowNum,
                                       int next_row,
                                       double[] columnWidths)
                   throws PrinterException
              int lead = 0;
              int maxHeight = 0;
              for (int j = 0; j < tableView.getColumnCount(); j++)
                   String value = null;
                   int align = LEFT_ALIGN;
                   if (rowNum > -1)
                        Object obj = tableView.getValueAt(rowNum, j);
                        if (obj instanceof Number)
                             align = RIGHT_ALIGN;
                        value = obj.toString();
                   else
                        align = CENTER_ALIGN;
                        value = tableView.getColumnName(j);
                   int numLines = (int)Math.ceil(fontMetrics.stringWidth(value) / columnWidths[j]);
                   if (numLines > maxHeight)
                        maxHeight = numLines;
                   if (fontMetrics.stringWidth(value) < columnWidths[j])
                        // Single line
                        int offset = 0;
                        // Work out the offset from the start of the column to display alignment correctly
                        switch (align)
                             case RIGHT_ALIGN: offset = (int)(columnWidths[j] - fontMetrics.stringWidth(value)); break;
                             case CENTER_ALIGN: offset = (int)(columnWidths[j] - fontMetrics.stringWidth(value)) / 2; break;
                             default: offset = 0; break;
                        g2.drawString(value,
                                       lead + (int)(pageFormat.getImageableX() + offset),
                                       next_row);
                   else
                        for(int a = 0; a < numLines; a++)
                             //Multi-Line
                             int x = 0;
                             int width = 0;
                             for(x = 0; x < value.length(); x++)
                                  width += fontMetrics.charWidth(value.charAt(x));
                                  if (width > columnWidths[j])
                                       break;
                             int offset = 0;
                             // Work out the offset from the start of the column to display alignment correctly
                             switch (align)
                                  case RIGHT_ALIGN: offset = (int)(columnWidths[j] - fontMetrics.stringWidth(value)); break;
                                  case CENTER_ALIGN: offset = (int)(columnWidths[j] - fontMetrics.stringWidth(value)) / 2; break;
                                  default: offset = 0; break;
                             g2.drawString(value.substring(0, x),
                                            lead + (int)(pageFormat.getImageableX() + offset),
                                            next_row + (fontMetrics.getHeight() * a));                    
                             value = value.substring(x);
                   lead += columnWidths[j] + cellBuffer;
              // Draw a solid line below the row
              g2.draw(new Line2D.Double(pageFormat.getImageableX(),
                             next_row + (fontMetrics.getHeight() * (maxHeight - 1)) + fontMetrics.getDescent(),
                             pageFormat.getImageableY() + pageFormat.getImageableWidth(),
                             next_row + (fontMetrics.getHeight() * (maxHeight - 1)) + fontMetrics.getDescent()));
              // Return the position of the row following this one
              return next_row + (fontMetrics.getHeight() * maxHeight);
         public static void main(String[] args)
              new Report();
    }

    Fixed some bugs and added a title. Just pass in a JTable and the class will do the rest.
    import javax.swing.*;
    import javax.swing.table.*;
    import java.awt.print.*;
    import java.util.*;
    import java.awt.*;
    import java.awt.event.*;
    import java.awt.geom.*;
    import javax.print.*;
    import javax.print.attribute.*;
    import javax.print.attribute.standard.*;
    import java.text.*;
    import java.math.*;
    public class PrintJTable implements Printable
         private final int LEFT_ALIGN = -1;
         private final int CENTER_ALIGN = 0;
         private final int RIGHT_ALIGN = 1;
         private JFrame m_parent;
         private String m_title;
         private JTable tableView;
         private String lastPrintDate;
         private Font defaultFont;
         private Font headerFont;
         private Font footerFont;
         private int headerHeight;
         private int footerHeight;
         private int cellBuffer = 5;
         private boolean first_pass;
         private ArrayList pages;
         public PrintJTable(JFrame parent, JTable table)
              m_parent = parent;
              tableView = table;
              doPrint();
         public PrintJTable(JFrame parent, String title, JTable table)
              m_parent = parent;
              m_title = title;
              tableView = table;
              doPrint();
          * Reset variables before printing
         private void prepareForPrint()
              pages = new ArrayList();
              first_pass = true;
          * Display a print dialog with some hardcoded defaults
          * The print fonts are also hardcoded
         public void doPrint()
              try
                   String jobName = "Java Report";
                   defaultFont = new Font("Arial", Font.PLAIN, 8);
                   footerFont = new Font("Arial", Font.PLAIN, 6);
                   headerFont = new Font("Arial", Font.BOLD, 8);
                   PrinterJob prnJob = PrinterJob.getPrinterJob();
                   prnJob.setPrintable(this);
                   PrintRequestAttributeSet prnSet = new HashPrintRequestAttributeSet();
                   prnSet.add(new Copies(1));
                   prnSet.add(new JobName(jobName, null));
                   prnSet.add(MediaSizeName.ISO_A4);
                   PageFormat pf = prnJob.defaultPage();
                   pf.setOrientation(java.awt.print.PageFormat.PORTRAIT);
                   prnJob.setJobName(jobName);
                   PrintService[] services = PrinterJob.lookupPrintServices();
                   if (services.length > 0)
                        if (prnJob.printDialog(prnSet))
                              * Get print date
                             String dateFormat = "dd/MM/yyyy HH:mm:ss";
                             DateFormat m_DateFormat = new SimpleDateFormat(dateFormat);
                             lastPrintDate = m_DateFormat.format(new Date()).toString();
                             prepareForPrint();
                             prnJob.print(prnSet);
                   else
                        JOptionPane.showMessageDialog(m_parent, "No Printer was found!!", "Printer Error", JOptionPane.ERROR_MESSAGE);
                        return;
              catch (PrinterException e)
                   e.printStackTrace();
         public int print(Graphics g, PageFormat pageFormat, int pageIndex) throws PrinterException
               * Check if this is the first time the print method is called for this print action.
               * It is not guaranteed that the print will be called with synchronous pageIndex'es,
               * so we need to calculate the number of pages and which rows appear on which pages.
               * Then the correct page will be printed regardless of which pageIndex is sent through.
              if (first_pass)
                   calcPages(g, pageFormat);
              first_pass = false;
              // Stop printing if the pageIndex is out of range
              if (pageIndex >= pages.size())
                   return NO_SUCH_PAGE;
              Graphics2D     g2 = (Graphics2D) g;
              g2.setColor(Color.black);
              // The footer will be one line at the bottom of the page, cater for this.
              g2.setFont(footerFont);
              footerHeight = g2.getFontMetrics().getHeight() + g2.getFontMetrics().getDescent();
              g2.setFont(defaultFont);
              FontMetrics fontMetrics = g2.getFontMetrics();
              int fontHeight = fontMetrics.getHeight();
              int fontDescent = fontMetrics.getDescent();
              double pageHeight = pageFormat.getImageableHeight() + pageFormat.getImageableY();
              double pageWidth = pageFormat.getImageableWidth();
              double tableWidth = (double) tableView.getColumnModel().getTotalColumnWidth();
              // Shrink or expand the table to fit the page width
              double scale = (pageWidth - (cellBuffer * tableView.getColumnCount())) / tableWidth;
              // Calculate the width in pixels for each column
              double[] columnWidths = new double[tableView.getColumnCount()];
              double test = 0;
              for(int i = 0; i < tableView.getColumnCount(); i++)
                   columnWidths[i] = (double)Math.floor(tableView.getColumnModel().getColumn(i).getWidth() * scale);
                   test += columnWidths;
              // Reset the view to the start of the page
              g2.translate(0, 0);
              // Draw a rectangle to see the printable area
              g2.draw3DRect((int)pageFormat.getImageableX(),
                        (int)pageFormat.getImageableY(),
                        (int)pageFormat.getImageableWidth(),
                        (int)pageFormat.getImageableHeight(),
                        false);
              // Calculate the header height
              g2.setFont(headerFont);
              fontMetrics = g2.getFontMetrics();
              // Print the headers and retreive the starting position for the data
              int next_row = (int)pageFormat.getImageableY() + fontMetrics.getHeight();
              if ((m_title != null) && (!m_title.equalsIgnoreCase("")))
                   g2.drawString(m_title,
                                       (int)(pageFormat.getImageableX()),
                                       next_row);
                   Color current_color = g2.getColor();
                   g2.setColor(Color.lightGray);
                   int y = next_row + fontMetrics.getDescent();
                   g2.draw(new Line2D.Double(pageFormat.getImageableX(),
                                  y,
                                  (pageFormat.getImageableY() + pageFormat.getImageableWidth()),
                                  y));
                   g2.setColor(current_color);
                   next_row += fontMetrics.getHeight();
              next_row = printLine(g2, pageFormat, fontMetrics, -1, next_row, columnWidths);
              g2.setFont(defaultFont);
              fontMetrics = g2.getFontMetrics();
              // Start printing the detail
              ArrayList page = (ArrayList)pages.get(pageIndex);
              int start = ((Integer)page.get(0)).intValue();
              int end = ((Integer)page.get(1)).intValue();
              for (int i = start; i <= end; i++)
                   next_row = printLine(g2, pageFormat, fontMetrics, i, next_row, columnWidths);
              // Print the footer
              g2.setFont(footerFont);
              String pageFooter = "Page " + (pageIndex + 1) + " - " + lastPrintDate;
              g2.drawString(pageFooter,
                             (int)pageFormat.getWidth() / 2 - (fontMetrics.stringWidth(pageFooter) / 2),
                             (int)(pageHeight - fontDescent));
              return PAGE_EXISTS;
         * We can't guarantee that the same amount of rows will be displayed on each page,
         * the row heights are dynamic and may wrap onto 2 or more lines.
         * Thus we need to calculate the height of each row and then test how may rows
         * fit on a specific page. eg. Page 1 contains rows 1 to 10, Page 2 contains rows 11 to 15 etc.
         public void calcPages(Graphics g, PageFormat pageFormat) throws PrinterException
              Graphics2D     g2 = (Graphics2D) g;
              g2.setColor(Color.black);
              // The footer will be one line at the bottom of the page, cater for this.
              g2.setFont(footerFont);
              footerHeight = g2.getFontMetrics().getHeight() + g2.getFontMetrics().getDescent();
              g2.setFont(defaultFont);
              FontMetrics fontMetrics = g2.getFontMetrics();
              int fontHeight = fontMetrics.getHeight();
              int fontDescent = fontMetrics.getDescent();
              double pageHeight = pageFormat.getImageableHeight() - fontHeight;
              double pageWidth = pageFormat.getImageableWidth();
              double tableWidth = (double) tableView.getColumnModel().getTotalColumnWidth();
              // Shrink or expand the table to fit the page width
              double scale = (pageWidth - (cellBuffer * tableView.getColumnCount())) / tableWidth;
              // Calculate the width in pixels for each column
              double[] columnWidths = new double[tableView.getColumnCount()];
              for(int i = 0; i < tableView.getColumnCount(); i++)
                   columnWidths[i] = (double)Math.floor(tableView.getColumnModel().getColumn(i).getWidth() * scale);
              // Calculate the header height
              int maxHeight = 0;
              g2.setFont(headerFont);
              fontMetrics = g2.getFontMetrics();
              headerHeight = 0;
              if ((m_title != null) && (!m_title.equalsIgnoreCase("")))
                   headerHeight = fontMetrics.getHeight();
              for (int j = 0; j < tableView.getColumnCount(); j++)
                   String value = tableView.getColumnName(j).toString();
                   int numLines = (int)Math.ceil(fontMetrics.stringWidth(value) / columnWidths[j]);
                   if (numLines > maxHeight)
                        maxHeight = numLines;
              headerHeight += g2.getFontMetrics().getHeight() * maxHeight;
              g2.setFont(defaultFont);
              fontMetrics = g2.getFontMetrics();
              int pageNum = 0;
              int bottom_of_page = (int)(pageFormat.getImageableHeight() + pageFormat.getImageableY()) - footerHeight;
              int prev_row = 0;
              int next_row = (int)pageFormat.getImageableY() + fontHeight + headerHeight;
              int i = 0;
              ArrayList page = new ArrayList();
              page.add(new Integer(0));
              for (i = 0; i < tableView.getRowCount(); i++)
                   maxHeight = 0;
                   for (int j = 0; j < tableView.getColumnCount(); j++)
                        String value = formatObject(tableView.getValueAt(i, j));
                        int numLines = (int)Math.ceil(fontMetrics.stringWidth(value) / columnWidths[j]);
                        if (numLines > maxHeight)
                             maxHeight = numLines;
                   prev_row = next_row;
                   next_row += (fontHeight * maxHeight);
                   // If we've reached the bottom of the page then set the current page's end row
                   if (next_row > bottom_of_page)
                        page.add(new Integer(i - 1));
                        pages.add(page);
                        page = new ArrayList();
                        page.add(new Integer(i));
                        pageNum++;
                        next_row = (int)pageFormat.getImageableY()
                                       + fontHeight
                                       + ((int)pageFormat.getHeight() * pageNum)
                                       + headerHeight;
                        bottom_of_page = (int)(pageFormat.getImageableHeight()
                                            + pageFormat.getImageableY())
                                            + ((int)pageFormat.getHeight() * pageNum)
                                            - footerHeight;
                        //Include the current row on the next page, because there is no space on this page
                        i--;
              page.add(new Integer(i - 1));
              pages.add(page);
         * Print the headers or a row from the table to the graphics context
         * Return the position of the row following this one
         public int printLine(Graphics2D g2,
                                       PageFormat pageFormat,
                                       FontMetrics fontMetrics,
                                       int rowNum,
                                       int next_row,
                                       double[] columnWidths)
                   throws PrinterException
              int lead = 0;
              int maxHeight = 0;
              for (int j = 0; j < tableView.getColumnCount(); j++)
                   String value = null;
                   int align = LEFT_ALIGN;
                   if (rowNum > -1)
                        Object obj = tableView.getValueAt(rowNum, j);
                        if (obj instanceof Number)
                             align = RIGHT_ALIGN;
                        value = formatObject(obj);
                   else
                        //align = CENTER_ALIGN;
                        value = tableView.getColumnName(j);
                   int numLines = (int)Math.ceil(fontMetrics.stringWidth(value) / columnWidths[j]);
                   if (numLines > maxHeight)
                        maxHeight = numLines;
                   if (fontMetrics.stringWidth(value) < columnWidths[j])
                        // Single line
                        int offset = 0;
                        // Work out the offset from the start of the column to display alignment correctly
                        switch (align)
                             case RIGHT_ALIGN: offset = (int)(columnWidths[j] - fontMetrics.stringWidth(value)); break;
                             case CENTER_ALIGN: offset = (int)(columnWidths[j] - fontMetrics.stringWidth(value)) / 2; break;
                             default: offset = 0; break;
                        g2.drawString(value,
                                       lead + (int)(pageFormat.getImageableX() + offset),
                                       next_row);
                   else
                        for(int a = 0; a < numLines; a++)
                             //Multi-Line
                             int x = 0;
                             int width = 0;
                             for(x = 0; x < value.length(); x++)
                                  width += fontMetrics.charWidth(value.charAt(x));
                                  if (width > columnWidths[j])
                                       break;
                             int offset = 0;
                             // Work out the offset from the start of the column to display alignment correctly
                             switch (align)
                                  case RIGHT_ALIGN: offset = (int)(columnWidths[j] - fontMetrics.stringWidth(value.substring(0, x))); break;
                                  case CENTER_ALIGN: offset = (int)(columnWidths[j] - fontMetrics.stringWidth(value.substring(0, x))) / 2; break;
                                  default: offset = 0; break;
                             g2.drawString(value.substring(0, x),
                                            lead + (int)(pageFormat.getImageableX() + offset),
                                            next_row + (fontMetrics.getHeight() * a));                    
                             value = value.substring(x);
                   lead += columnWidths[j] + cellBuffer;
              // Draw a solid line below the row
              Color current_color = g2.getColor();
              g2.setColor(Color.lightGray);
              int y = next_row + (fontMetrics.getHeight() * (maxHeight - 1)) + fontMetrics.getDescent();
              g2.draw(new Line2D.Double(pageFormat.getImageableX(),
                             y,
                             (pageFormat.getImageableY() + pageFormat.getImageableWidth()),
                             y));
              g2.setColor(current_color);
              // Return the position of the row following this one
              return next_row + (fontMetrics.getHeight() * maxHeight);
         public String formatObject(Object obj)
              String value = (obj == null) ? "" : obj.toString();
              return value;

  • How can I get the variable with the value from Thread's run method

    We want to access a variable from the run method of a Thread externally in a class or in a method. Even though I make the variable as public /public static, I could get the value till the end of the run method only. After that scope of the variable gets lost resulting to null value in the called method/class..
    How can I get the variable with the value?
    This is sample code:
    public class SampleSynchronisation
         public static void main(String df[])
    sampleThread sathr= new sampleThread();
    sathr.start();
    System.out.println("This is the value from the run method "+sathr.x);
    /* I should get:
    Inside the run method
    But I get only:
    Inside*/
    class sampleThread extends Thread
         public String x="Inside";
         public void run()
              x+="the run method";
    NB: if i write the variable in to a file I am able to read it from external method. This I dont want to do

    Your main thread continues to run after the sathr thread is completed, consequently the output is done before the sathr thread has modified the string. You need to make the main thread pause, this will allow sathr time to run to the point where it will modify the string and then you can print it out. Another way would be to lock the object using a synchronized block to stop the main thread accessing the string until the sathr has finished with it.

  • Table in main window with page break in smartforms

    I want to print data with heading and items in tabuler form (grid form) using table with PAGE PROTECTION in main window in smartform.
    if you would say staight way to use Table or Template under FOLDER with page protection, will not work.
    So, it is little bit tricky. So,if any body have a proper solution please help.
    Thanks and regards,
    Vijay Kr. Gupta

    Hello,
    Include the Text ELEMENT U have used to draw the table in the loop of the main window.
    Vasanth

  • Printing PDF with English & Chinese

    Hi experts,
    I have encountered a following problem: we would like to print texts with mixture of English and Chinese on a smartform converted to a PDF format. But the chinese is not printed properly. Could you please advise on how should the output device / output type be configured. What are the neccessary settings that have to be made?
    Thanks a lot for your hints.
    Tomas

    I got it to work. I have a process that sets an application level item(CUR_WO_NBR) to the current value of the text field holding the work order number(P150_WO_NBR). This process runs right before the branch to print the pdf. the pdf of course uses the application level item in its query (CUR_WO_NBR).
    - Ghoulies

  • How to control the print pages in se71 form or smartforms

    Dear All:
             I have a issue for control the print pages in se71 form or smartforms.
    For example:my report used form or smartforms to print.it have 12  total pages.but user want to print the .3rd  page.3rd  page is customized.
             How can I do it?
    Thanks
    Sun

    Hi,
    By using command node, with some command we can handle this.

  • Printing QR-Code barcodes in SAP smartforms

    Hi,
    Is it possible to print QR-Code barcodes in SAP smartforms using system barcode font? Can anybody please let me know the font settings for QR-Code in SE73 font maintenance?
    A sample QR-Code lablel can be found [here|http://images.orkut.com/orkut/albums2/ATUAAADhaahG5MxsqQ66lcSO9oHRWD3X8zh7yv1kEakKwMtVHchChN1WfZlM__2D0_o8H7AS4_UaTTCymQQtvXHb9-q3AJtU9VCWnzkZ4gC1sVnCekVuQ90qmhzeMw.jpg].
    Regards,
    Milan

    Hi Milan,
    I'll blog in SDN about my research that I presented at TechEd during session CD119 (blog) but I'll begin sharing with you some ideas.
    Basically, without relay on any printer specific driver I would propose to follow the following steps:
    1.Generate the QR Code image file (.PNG) with one of the methods presented in the following pages
    2.Upload the image into the SAP system
    2.1 Convert the generated file (file.png) to TIFF using SAP IGS class CL_IGS_IMAGE_CONVERTER (see GRAPHICS_IGS_IMGCONV_DEMO)
    2.2.Upload. Use report RSTXLDMC to upload the image into SE78
    3.Include the image into the Form:
    3.1.SAPScript/:INCLUDE ZHEX-MARCO-name OBJECT TEXT ID ST
    If everything is clear, the missing point should now be the first one. To generate the PNG from ABAP I found some options if you like, the better I think is presented in my open source project called abap2qrcode published here http://code.google.com/p/abap2qrcode/.
    I know it's not trivial and I'm curious to know what do you think about it.
    Sergio

  • Include variables with minor difference in a loop

    How can I include variables with minor change inside a loop instead of hard code each one?
    For example
    aList = ""A", "B", "C", "D"]
    repeat with i = 1 to 4
      temp = aList[i]
      Variable[temp] = 1 (some calculation)
    end repeat
    The variables would be VariableA, VariableB, VariableC, VariableD...
    It's similar to Actionscript's
       this["q" + i + "_mc"]._x = this["dragTxt" + i]._x - 20;
       this["q" + i + "_mc"]._y = this["dragTxt" + i]._y + 14;
    then the instance is q1_mc, q2_mc etc..
    I remember that I could do similar things in Director but forgot how!
    Thanks for the help,

    Wow. Talk about not seeing the forest through the trees. There's never any good reason to create variables at runtime like that, regardless if there are ways to do it in the scripting language (which there invariably are). Your "on test" handler above uses a whole slew of lists to set up and create a bunch of "dynamic" variables when you should be stopping at lists and property lists (arrays and associative arrays) to do what you want, which is to store your data. The method you currently have conjured up is excessive at best, and bad programming practice at worst (See this link for some good discussion on why it should be avoided: http://programmers.stackexchange.com/questions/103083/how-can-variables-be-created-at-runt ime)
    So, I would do what you want like this:
    -- initialize the property list (associative array, in other scripting languages)
    gUserStatus = [:]
    -- add an entry
    gUserStatus["Bob"] = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
    -- print the property array to the message window
    put gUserStatus
    -- ["Bob": [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]]
    add a few more users:
    gUserStatus["Mary"] = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
    gUserStatus["Sue"] = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
    gUserStatus["Paul"] = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
    -- get value from property list, based off name
    put gUserStatus["Bob"]
    -- [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]
    -- set value in value list, based off name, then put to message window
    gUserStatus["Bob"][3] = 1
    put gUserStatus["Bob"]
    -- [0, 0, 1, 0, 0, 0, 0, 0, 0, 0]
    so, I can add as many users as I want... as long as they're identified with unique properties (or keys, in other languages). I can even get the count or number of users:
    put gUserStatus.count
    -- 4
    I can easily iterate through them and get/set information:
    cnt = gUserStatus.count
    repeat with i = 1 to cnt
      put "Name: " & gUserStatus.getPropAt(i) & ", Status: " & gUserStatus[i]
    end repeat
    In your example you don't know how many users you have because your variables are being dynamically created at runtime. You could create yet another variable to keep track of that, but why when you have lists and property lists that are perfect structures for this type of associative data?
    There's a huge gap in your understanding how to structure, keep track of, and manipulate data, and it's important to fill it now by learning about lists and property lists (arrays and associative arrays). Doing it now will truly open up a whole new way of programming to you.

  • Printing layout with colour images

    I am printing document with Canon 3100 iR colour printer.
    I am able to get print with device type 'ZCNC31EP' suggested in one of SAP note.
    But it is not giving colour print as seen in print preview.
    Layout is been printed using smartform. It contains some logos and some images in colour ?
    How do I used print control in command in smartform to print layout in colour ?
    Thanks,
    Amit R.

    Color Printing
    Prerequisites
    You can print lists in color if your output device uses one of the following device types:
    ·        HPLJ4000/HPLJ5000/HPLJ1100
    ·        KYOFS170
    ·        POST2
    ·        SWIN
    Activities
           1.      Edit the definition of the output device.
           2.      To do this, call Spool Administration (transaction SPAD).
           3.      Enter the name of the output device in the Output device field on the Devices /servers tab.
           4.      Save your entry.
           5.      Switch to the Output Attributes tab and select Color printer
    You must be in change mode () to be able to select the Color printer field.
    If you want to print both in color and black and white on your printer, you should create an individual output device for every print mode (for example, PRINTER_COL and PRINTER_MON).
    http://help.sap.com/saphelp_nw2004s/helpdata/en/90/78f07b030211d399b90000e83dd9fc/content.htm
    Regards
    Vasu

Maybe you are looking for

  • Missing files after powering down and back up

    I turned off my new Air for the first time in weeks. When I powered back up I was and am missing alot of  open office documents and pictures I had downloaded and saved. Please help these aren't files I can lose.

  • RM Error: No ports that send to the Integration Server could be found

    Hi, In the Runtime Monitor, End-to-End Monitoring Configuration, Logon to XI, Display--> It is showing the following error: No ports that send to the Integration Server could be found for the following ALE logical systems: ZSEND765: Unable to log on

  • Subscription App won't delete.

    I have an old app I was using that is in my subscriptions and I can't delete it. What do I do?

  • New with oracle form recognition where to start

    Hi everyone, I am new to oracle form recognition and I find the Oracle documentation very unhelpful! could you please point me to some useful links or tutorials on how to integrate OFR with ODC and Imaging ? Best Regrads.

  • Lost Photoshop Elements 10 Discs

    I have torn my house apart but cannot locate my box and discs. I still have my serial number as I registered my product online, but I really need to get this installed on my new laptop. Is there anything I can do, a download somewhere perhaps, to get