ITextSharp添加直接内容条形码更改段落的字体颜色

时间:2016-12-11 18:50:42

标签: c# itext

我正在c#中创建一个应用程序,用于生成一些带有条形码的pdf文件。

我正在使用内存流并将数据放到表(一列)中,我将在最后写入pdf文件。 在我需要添加条形码之前,一切正常。为此,我使用直接内容。

pdfWriter = PdfWriter.GetInstance(pdfToCreate, outputStream);
PdfContentByte cb = new PdfContentByte(pdfWriter);

iTextSharp.text.Image bc128 = code128.CreateImageWithBarcode(cb, null, null);

创建条形码后,我使用以下方法将其添加到表中:

tableout.AddCell(image128);

然后我遇到了问题。显示我之前创建的表格中的行,但我看不到文本。如果我用条形码添加注释行,一切都还可以。

我在论坛上发现了一条评论:

  

是的。前景文本颜色由高级字体定义   文本布局代码。当你开始直接使用PdfContentByte时,   字体和颜色分开,但直到那时才开始。

我该如何解决这个问题?

我知道我可以使用系统绘图方法,但带条形码的图像不太清楚。

2 个答案:

答案 0 :(得分:0)

PdfContentByte用于直接渲染到pdf中的绝对位置。但你需要的是一个IE元素,你可以添加到"文档堆栈"。

尝试这个(使用完整的命名空间只是为了清楚地识别类):

  Barcode128 barcode = new Barcode128();
  System.Drawing.Image img = barcode.CreateDrawingImage(System.Drawing.Color.Black, System.Drawing.Color.White);
  iTextSharp.text.Image itextImg = iTextSharp.text.Image.GetInstance(img, System.Drawing.Imaging.ImageFormat.Bmp);
  table.AddCell(new PdfPCell(itextImg));

答案 1 :(得分:0)

我知道我可以使用系统绘图方法,但带条形码的图像不太清楚。

这是我使用的代码。我正在尝试根据文档中的行数获取不同大小的文档。所以我正在使用内存流(此处未显示)。我的想法是将数据写入内存中的表并计算行数。之后,我将创建新的pdf文档并将表添加到该文档。

如果我评论一行:

table.AddCell(image128);

两个文件都是一样的。但是,如果我在代码中留下该行,则最终文档显示所有行,但行中的文本不可见。如果我打开第二个文档,请访问Firefox,我甚至可以看到条形码。

任何建议都会很棒。或者根据内容的数量,有不同的方法来获取不同大小的文档。

    using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using iTextSharp.text;
using iTextSharp.text.pdf;
using System.IO;
using System.Drawing;

namespace testtables1
{
    class Program
    {
        static void Main(string[] args)
        {
            iTextSharp.text.Rectangle pageSize = new iTextSharp.text.Rectangle(300, 720);
            Document pdfToCreate = new Document(pageSize, 0, 0, 0, 0);
            PdfWriter writer = PdfWriter.GetInstance(pdfToCreate, new FileStream(@"D:\\testfile.pdf", FileMode.Create));
            pdfToCreate.Open();

            PdfPTable table = new PdfPTable(1);
            PdfPTable tableout = new PdfPTable(1);

            WriteLineToPdf("This is first row. Below is image generated using SystemDrawing.", table, out tableout);
            table = tableout;

            // Create bar code
            Barcode128 code128 = new Barcode128();
            code128.CodeType = Barcode.CODE128;
            code128.ChecksumText = true;
            code128.GenerateChecksum = true;
            code128.Code = "00100370006756555316";

            // Create a new PdfWrite object, writing the output to a MemoryStream
            var outputStream = new MemoryStream();
            var pdfWriter = PdfWriter.GetInstance(pdfToCreate, outputStream);
            PdfContentByte cb = new PdfContentByte(writer);

            // Image generated using System.Drawing and rendering
            System.Drawing.Bitmap bm = new System.Drawing.Bitmap(code128.CreateDrawingImage(System.Drawing.Color.Black, System.Drawing.Color.White));
            iTextSharp.text.Image bmCoverted = iTextSharp.text.Image.GetInstance(bm, System.Drawing.Imaging.ImageFormat.Bmp);
            table.AddCell(bmCoverted);

            pdfToCreate.Open();

            // Image generated using iTextSharp.text.Image
            WriteLineToPdf("This is third row. Below is image generated using code128.CreateImageWithBarcode.", table, out tableout);
            table = tableout;
            iTextSharp.text.Image image128 = code128.CreateImageWithBarcode(cb, null, null);
            table.AddCell(image128);
            table = tableout;

            WriteLineToPdf("This is fifth row.", table, out tableout);
            pdfToCreate.Add(tableout);

            // Create new document with height that depends on number of lines in document.
            iTextSharp.text.Rectangle psFinal = new iTextSharp.text.Rectangle(200, 300);
            Document pdfFinal = new Document(psFinal, 0, 0, 0, 0);
            PdfWriter writer1 = PdfWriter.GetInstance(pdfFinal, new FileStream(@"D:\\finalfile.pdf", FileMode.Create));
            pdfFinal.Open();
            pdfFinal.Add(tableout);

            cb = null;

            pdfToCreate.Close();
            pdfFinal.Close();
        }

        // Write a single line to the PDF.
        private static void WriteLineToPdf(string tLine, PdfPTable ticTable0In, out PdfPTable ticTableIN)
        {
            // Define fonts.
            BaseFont bfTimes = BaseFont.CreateFont(BaseFont.TIMES_ROMAN, BaseFont.CP1252, false);   // Base font.
            iTextSharp.text.Font timesN = new iTextSharp.text.Font(bfTimes, 12, iTextSharp.text.Font.NORMAL, BaseColor.BLACK); 

            Paragraph par = new Paragraph(tLine, timesN);
            par.Alignment = Element.ALIGN_CENTER;
            PdfPCell cell;

            cell = new PdfPCell();
            //cell.FixedHeight = 12f;
            //cell.Border = Rectangle.NO_BORDER;


            cell.AddElement(par);
            ticTable0In.AddCell(cell);
            ticTableIN = ticTable0In;
            par = null;

        }
    }
}

我的另一个想法是使用内存流中的数据。我能够创建具有我想要的大小的result.pdf文档,但是在我从内存大小更改中写入数据之后。

    using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;
using iTextSharp.text;
using iTextSharp.text.pdf;

namespace TableWithBC2
{
    class Program
    {
        static void Main(string[] args)
        {
            using (MemoryStream myMemoryStream = new MemoryStream())
            {
                PdfPTable tableIn;
                Document pdfDocument = new Document();
                PdfWriter writer = PdfWriter.GetInstance(pdfDocument, myMemoryStream);
                PdfPTable tableOut = new PdfPTable(new float[] { 200 });
                tableIn = new PdfPTable(new float[] { 200 });
                pdfDocument.Open();

                for (int i = 0; i < 5; i++)
                {
                    WriteLineToPdf("This is row no. " + i.ToString(), tableIn, out tableOut);
                    tableIn = tableOut;
                }

                // Create bar code
                PdfContentByte cb = writer.DirectContent;
                Barcode128 code128 = new Barcode128();
                code128.CodeType = Barcode.CODE128;
                code128.ChecksumText = true;
                code128.GenerateChecksum = true;
                code128.Code = "00100370006756555316";
                Image barCodeImage = code128.CreateImageWithBarcode(cb, null, null);
                PdfPCell cell1 = new PdfPCell(barCodeImage);
                tableOut.AddCell(cell1);
                tableIn = tableOut;
                WriteLineToPdf("This is a last row.", tableIn, out tableOut);

                pdfDocument.Add(tableOut);
                pdfDocument.Close();

                // Create final PDF document.
                Document pdfDocument1 = new Document(new Rectangle(200, 250));
                PdfWriter writer1 = PdfWriter.GetInstance(pdfDocument1, new FileStream(@"D:\\result.pdf", FileMode.Create));
                pdfDocument1.Open();
                pdfDocument1.Add(new Chunk());
                pdfDocument1.Close();

                byte[] content = myMemoryStream.ToArray();

                // Write out PDF from memory stream. 
                using (FileStream fs = File.OpenWrite(@"D:\\nikola bd - final\\out\\dummy22.pdf"))
                {
                    fs.Write(content, 0, (int)content.Length);
                }
            }
        }
        // Write a single line to the PDF.
        private static void WriteLineToPdf(string tLine, PdfPTable tTableIn, out PdfPTable tTableOut)
        {
            BaseFont bfTimes = BaseFont.CreateFont(BaseFont.TIMES_ROMAN, BaseFont.CP1252, false);
            iTextSharp.text.Font timesN = new iTextSharp.text.Font(bfTimes, 12, iTextSharp.text.Font.NORMAL, BaseColor.RED);

            Paragraph par = new Paragraph(tLine, timesN);
            par.Alignment = Element.ALIGN_CENTER;
            PdfPCell cell = new PdfPCell();
            cell.AddElement(par);
            tTableIn.AddCell(cell);
            tTableOut = tTableIn;
        }
    }
}