0
votes

I'm creating a PDF using iTextSharp for check-printing purposes. My issue is that I cannot get the name/address to print on the check where the little window is on the envelope for the check. The spacing between the address lines is too big. I am setting the line-height in a font tag in the HTML document, but it is not being carried over.

Here is the address part, specifically:

            conn.Open();
            using (SqlDataReader itemReader = strSQL.ExecuteReader())
            {
                checksHolder.InnerHtml += "<table cellSpacing=\"0\" cellPadding=\"0\" border=\"0\" width=\"100%\">\n";

                while (itemReader.Read())
                {

                    if (i % 3 == 0 && i != 0)
                    {
                        checksHolder.InnerHtml += "</table>\n";
                        checksHolder.InnerHtml += "<!-- pagebreak -->\n";
                        checksHolder.InnerHtml += "<table cellSpacing=\"0\" cellPadding=\"0\" border=\"0\" width=\"100%\">\n";
                        f = 0;
                    }

                    if (i > 0 && i % 3 != 0)
                    {
                        checksHolder.InnerHtml += "<tr><td colspan=\"3\"><br/><br/><br/><br/><br/><br/>";
                        checksHolder.InnerHtml += "</td></tr>\n";
                    }

                    String[] tmpArray = getConsignorInfo(itemReader["check_cs_id"].ToString());

                    int CheckNum = Int32.Parse(itemReader["check_number"].ToString());
                    String CheckAmount = itemReader["check_amount"].ToString();
                    String PayableTo = tmpArray[0];
                    String Memo = itemReader["check_memo"].ToString();

                    String name = tmpArray[0];
                    String address = tmpArray[1];
                    String city = tmpArray[2];
                    String state = tmpArray[3];
                    String zip = tmpArray[4];

                    Char NBSP = '\u00A0';

                    checksHolder.InnerHtml += "<tr><td colspan=\"3\"><br/><br/></td></tr>\n";
                    checksHolder.InnerHtml += "<tr>\n";
                    //checksHolder.InnerHtml += "<td width=\"5\"></td>\n";
                    checksHolder.InnerHtml += "<td colspan=\"2\">\n";
                    checksHolder.InnerHtml += "<font size=\"2\">\n";
                    checksHolder.InnerHtml += "&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;\n";
                    checksHolder.InnerHtml += PayableTo + "</font>\n";
                    checksHolder.InnerHtml += "</td>\n";
                    checksHolder.InnerHtml += "<td align=\"right\">\n";
                    checksHolder.InnerHtml += "<font align=\"right\" size=\"2\">" + string.Format("{0:c}", Double.Parse(CheckAmount.ToString())).Replace("$", "") + "</font>\n";
                    checksHolder.InnerHtml += "</td>\n";
                    checksHolder.InnerHtml += "</tr>\n";
                    checksHolder.InnerHtml += "<tr>\n";
                    checksHolder.InnerHtml += "<td colspan=\"3\">\n";
                    checksHolder.InnerHtml += "&nbsp;\n";
                    checksHolder.InnerHtml += "</td>\n";
                    checksHolder.InnerHtml += "</tr>\n";
                    checksHolder.InnerHtml += "<tr>\n";
                    checksHolder.InnerHtml += "<td colspan=\"3\">\n";
                    checksHolder.InnerHtml += "<font size=\"2\">";
                    if (wordify(decimal.Parse(CheckAmount.ToString())).Length >= 90)
                    {
                        checksHolder.InnerHtml += wordify(decimal.Parse(CheckAmount.ToString()));
                    }
                    else
                    {
                        string exes = " ";
                        for (int x = wordify(decimal.Parse(CheckAmount.ToString())).Length; x <= 90; x++)
                        {
                            exes += "x";
                        }
                        checksHolder.InnerHtml += wordify(decimal.Parse(CheckAmount.ToString())) + exes;
                    }
                    checksHolder.InnerHtml += "</font>\n";
                    checksHolder.InnerHtml += "</td>\n";
                    checksHolder.InnerHtml += "</tr>\n";
                    checksHolder.InnerHtml += "<tr>\n";
                    checksHolder.InnerHtml += "<td colspan=\"2\">\n";

                    checksHolder.InnerHtml += "<table cellSpacing=\"0\" cellPadding=\"0\" border=\"0\" width=\"100%\">\n";
                    checksHolder.InnerHtml += "<tr>\n";
                    checksHolder.InnerHtml += "<td colspan=\"2\"><br/>\n";
                    checksHolder.InnerHtml += "<font size=\"2\" line-height=\"8p\">" + name + "<br/>\n";
                    checksHolder.InnerHtml += address + "<br/>\n";
                    checksHolder.InnerHtml += city + ",\n";
                    checksHolder.InnerHtml += state + " \n";
                    checksHolder.InnerHtml += zip + "</font>\n";
                    checksHolder.InnerHtml += "</td>\n";
                    checksHolder.InnerHtml += "</tr>\n";

                    checksHolder.InnerHtml += "<tr>\n";
                    checksHolder.InnerHtml += "<td colspan=\"3\">\n";
                    checksHolder.InnerHtml += "<br/></td>\n";
                    checksHolder.InnerHtml += "</tr>\n";

                    checksHolder.InnerHtml += "<tr>\n";
                    checksHolder.InnerHtml += "<td width=\"10\"></td>\n";
                    checksHolder.InnerHtml += "<td>\n";
                    checksHolder.InnerHtml += "<font size=\"2\">" + Memo.Substring(0, 50) + "...</font>\n";
                    checksHolder.InnerHtml += "</td>\n";
                    checksHolder.InnerHtml += "</tr>\n";
                    checksHolder.InnerHtml += "</table>\n";

                    checksHolder.InnerHtml += "</td>\n";
                    checksHolder.InnerHtml += "<td valign=\"bottom\" width=\"40\">\n";
                    checksHolder.InnerHtml += "<img valign=\"bottom\" align=\"left\" src=\"images/wesSig.png\" Alt=\"\" /><br/>\n";
                    checksHolder.InnerHtml += "</td>\n";
                    checksHolder.InnerHtml += "</tr>\n";


                    i++;
                    f++;
                }

                checksHolder.InnerHtml += "</table>\n";

                itemReader.Close();
            }

public void CreatePDFDocument(string strHtml)
{
    string strFileName = HttpContext.Current.Server.MapPath("printCheck.pdf");
    // step 1: creation of a document-object

    iTextSharp.text.Rectangle rec = new iTextSharp.text.Rectangle(612, 792);
    Document document = new Document(rec);
    document.SetMargins(45f, 30f, 55f, 30f);

    // step 2:
    // we create a writer that listens to the document
    var pdfWriter = PdfWriter.GetInstance(document, new FileStream(strFileName, FileMode.Create));
    pdfWriter.InitialLeading = 12.5f;

    string[] stringSeparators = new string[] { "<!-- pagebreak -->" };
    //Response.Write(strHtml);
    string[] newString = strHtml.Split(stringSeparators, StringSplitOptions.None);

    //HTMLWorker obj = new HTMLWorker(document);

    document.Open();

    var xmlWorkerHelper = XMLWorkerHelper.GetInstance();
    var cssResolver = new StyleAttrCSSResolver();
    var xmlWorkerFontProvider = new XMLWorkerFontProvider();

    var cssAppliers = new CssAppliersImpl(xmlWorkerFontProvider);
    var htmlContext = new HtmlPipelineContext(cssAppliers);
    htmlContext.SetTagFactory(Tags.GetHtmlTagProcessorFactory());

    PdfWriterPipeline pdfWriterPipeline = new PdfWriterPipeline(document, pdfWriter);
    HtmlPipeline htmlPipeline = new HtmlPipeline(htmlContext, pdfWriterPipeline);
    CssResolverPipeline cssResolverPipeline = new CssResolverPipeline(cssResolver, htmlPipeline);
    XMLWorker xmlWorker = new XMLWorker(cssResolverPipeline, true);
    XMLParser xmlParser = new XMLParser(xmlWorker);

    int i = 0;
    foreach (String currentString in newString) {
        if (i > 0)
        {
            document.NewPage();
        }

        StringReader sr = new StringReader(currentString);
        xmlParser.Parse(sr);

        i++;
    }

    document.Close();

    ShowPdf(strFileName);
}

I only have half an inch to put the name/address into. I've tried specifying the line-height with both 8px and just 8 just in case. Nothing worked. Does anyone know how I need to format the HTML to have the line height carried over? Thanks in advance.

1
It's not clear if you're using the deprecated HTMLWorker class or the newer XML Worker. Without that info, your question is unanswerable. - Bruno Lowagie
@BrunoLowagie Thanks for the reply. I'm using the HTMLWorker class. Didn't know it was deprecated. I don't mind switching to XMLWorker, though. Just whatever works correctly. - James

1 Answers

0
votes

I upgraded to itextsharp's xmlworker (http://sourceforge.net/projects/xmlworker/) which allows me to use css and div tags. Margin doesn't work, unfortunately, but padding does, so I was able to do what I needed to do.