/// <summary> /// Writes the pages numbers /// </summary> /// <param name="font">Font</param> /// <param name="fontSize">Fonr size</param> /// <param name="xPt">X position from the bottom in points</param> /// <param name="yPt">Y position from the bottom in points</param> /// <param name="rgb">RGB color. Blue is the lower byte</param> public void WritePagesNumbers(PdfFont font, int fontSize, int xPt, int yPt, int rgb) { string color = FormatRGB(rgb); int pageCount = _pages.Count; for (int i = 0; i < pageCount; i++) { PdfPage page = _pages[i]; string txt = (i + 1) + "/" + pageCount; float txtWidth = font.MesureWidth(txt, fontSize); int xPtAbs = xPt < 0 ? (int)(xPt + page.Width - txtWidth) : xPt; StringBuilder sb = new StringBuilder(); sb.Append("BT "); sb.Append(color + " rg "); sb.Append(font.CodeName + " " + fontSize + " Tf "); sb.Append(xPtAbs + " " + yPt + " Td\n"); sb.Append("(" + txt + ")Tj\n"); sb.Append("ET"); int id = WriteStreamObject(sb); page.AddContent(id); } }
/// <summary> /// Adds an image. /// Encodes in JPEG if the image is already in JPEG and in PNG otherwise. /// </summary> /// <param name="bitmap">Bitmap</param> /// <param name="xPt">X position from the bottom in points</param> /// <param name="yPt">Y position from the bottom in points</param> /// <param name="widthPt">Width in points</param> /// <param name="heightPt">Height in points</param> public void WriteBitmap(Bitmap bitmap, int xPt, int yPt, int widthPt, int heightPt) { int idImg = _xRefs.CreateObject(); int idImgLength = _xRefs.CreateObject(); string imgName = "/I" + idImg; bool isJpeg = bitmap.RawFormat.Guid == ImageFormat.Jpeg.Guid; int dataLength = 0; _xRefs.RegisterObject(idImg); _pdfWriter.WriteLine(idImg + " 0 obj"); _pdfWriter.WriteLine("<<"); _pdfWriter.WriteLine("/Type /XObject"); _pdfWriter.WriteLine("/Subtype /Image"); _pdfWriter.WriteLine("/ColorSpace /DeviceRGB"); _pdfWriter.WriteLine("/BitsPerComponent 8"); if (isJpeg) { _pdfWriter.WriteLine("/Filter /DCTDecode"); } else { _pdfWriter.WriteLine("/Filter /FlateDecode"); _pdfWriter.WriteLine("/DecodeParms <<"); _pdfWriter.WriteLine(" /Columns " + bitmap.Width); _pdfWriter.WriteLine(" /Colors 3"); _pdfWriter.WriteLine(" /Predictor 15"); _pdfWriter.WriteLine(">>"); } _pdfWriter.WriteLine("/Name " + imgName); _pdfWriter.WriteLine("/Height " + bitmap.Height); _pdfWriter.WriteLine("/Width " + bitmap.Width); _pdfWriter.WriteLine("/Length " + idImgLength + " 0 R"); _pdfWriter.WriteLine(">>"); _pdfWriter.WriteLine("stream"); _pdfWriter.Flush(); if (isJpeg) { dataLength = PdfImage.WriteJPEG(bitmap, _pdfStream); } else { dataLength = PdfImage.WritePNG(bitmap, _pdfStream); } _pdfWriter.WriteLine(); _pdfWriter.WriteLine("endstream"); _pdfWriter.WriteLine("endobj"); //Writes the length object _xRefs.RegisterObject(idImgLength); _pdfWriter.WriteLine(idImgLength + " 0 obj"); _pdfWriter.WriteLine(dataLength); _pdfWriter.WriteLine("endobj"); //create image content and borders StringBuilder sb = new StringBuilder(); sb.Append("q "); sb.Append(widthPt + " 0 0 " + heightPt + " " + xPt + " " + yPt + " cm "); sb.Append(imgName); sb.Append(" Do Q\n"); sb.Append("0.5 w 0.2 G "); sb.Append(xPt + " " + yPt + " " + widthPt + " " + heightPt + " re s"); int idContent = WriteStreamObject(sb); //add the created objects to the page _currentPage.AddContent(idContent); _currentPage.AddXObject(idImg, imgName); }