[ApiExplorerSettings(IgnoreApi = true)] [NonAction] public void addWaterMarkExcel(PdfGraphics graphics, PdfPage page) { var fontWatermark = new System.Drawing.Font("Arial", 60, FontStyle.Bold); // Daha büyük font boyutu var brushWatermark = new System.Drawing.SolidBrush(System.Drawing.Color.FromArgb(60, 0, 0, 0)); // Yarı şeffaf siyah string watermarkText = "KONTROLLÜ KOPYADIR"; // PDF boyutları float centerX = (float)(page.CropBox.Width / 2); float centerY = (float)(page.CropBox.Height / 2); // Sol ve alt için 50 piksel boşluk float offsetX = 150; float offsetY = 150; using (var g = System.Drawing.Graphics.FromImage(new Bitmap(1, 1))) { // Metin boyutlarını hesapla var textSize = g.MeasureString(watermarkText, fontWatermark); // Çapraz döndürme işlemi using (var path = new System.Drawing.Drawing2D.GraphicsPath()) { path.AddString( watermarkText, fontWatermark.FontFamily, (int)fontWatermark.Style, 60 * (72f / 96f), // 72 DPI'ye uygun font boyutu new PointF(-textSize.Width / 2, -textSize.Height / 2), // Metni merkezden başlat new StringFormat() ); // Döndürme ve konumlandırma için matris oluştur var matrix = new System.Drawing.Drawing2D.Matrix(); matrix.Translate(centerX + offsetX, centerY - offsetY); // Merkezden 50 piksel sola ve alta kaydır matrix.Rotate(-45); // Çapraz döndür (45 derece) path.Transform(matrix); // Matrise göre metni dönüştür // Döndürülmüş metni çiz graphics.FillPath(brushWatermark, path); } } } [ApiExplorerSettings(IgnoreApi = true)] [NonAction] public FileContentResult? ExcelToPdfByte(byte[] excelBytes, ReportXls report1, Files dosyam, int id, int kopya, bool ustBilgi, bool altBilgi) { try { if (excelBytes == null || excelBytes.Length == 0) { return null; } using (var stream = new MemoryStream(excelBytes)) { using (var workbook = new Workbook()) { workbook.LoadDocument(stream); foreach (var sheet in workbook.Worksheets) { // Üstbilgiler (Headers) için temizleme sheet.HeaderFooterOptions.FirstHeader.FromString(string.Empty); sheet.HeaderFooterOptions.EvenHeader.FromString(string.Empty); sheet.HeaderFooterOptions.OddHeader.FromString(string.Empty); // Altbilgiler (Footers) için temizleme sheet.HeaderFooterOptions.FirstFooter.FromString(string.Empty); sheet.HeaderFooterOptions.EvenFooter.FromString(string.Empty); sheet.HeaderFooterOptions.OddFooter.FromString(string.Empty); } var stringFormatCenter = new PdfStringFormat { Alignment = PdfStringAlignment.Near, LineAlignment = PdfStringAlignment.Center, }; var formatGenel = new PdfStringFormat { Alignment = PdfStringAlignment.Center, LineAlignment = PdfStringAlignment.Center, }; using (var tempPdfStream = new MemoryStream()) { workbook.ExportToPdf(tempPdfStream); tempPdfStream.Position = 0; using (var finalPdfStream = new MemoryStream()) { PdfDocumentProcessor processor = new PdfDocumentProcessor(); processor.LoadDocument(tempPdfStream); int pageCount = 0; int totalPageCount = processor.Document.Pages.Count; foreach (var page in processor.Document.Pages) { pageCount++; using (PdfGraphics graphics = processor.CreateGraphics()) { if (kopya == 1) { addWaterMarkExcel(graphics, page); } using (var brush = new System.Drawing.SolidBrush(System.Drawing.Color.Black)) using (var pen = new System.Drawing.Pen(System.Drawing.Color.Black, 1)) { var fontHeader = new System.Drawing.Font("Arial", 12, System.Drawing.FontStyle.Bold); var fontContent = new System.Drawing.Font("Arial", 10); var fontContentBold = new System.Drawing.Font("Arial", 10, FontStyle.Bold); // Üç sütun düzeni float columnWidth = (float)(page.CropBox.Width / 3); // Sayfayı 3 eşit sütuna böl float rowHeight = 75; // Her hücre için yükseklik // Resim sütunu genişliği %50 küçültüldü float imageWidth = columnWidth / 2; float imageHeight = rowHeight; float imageX = 0; float imageY = 0; // Başlık sütunu genişliği, resim sütunundan kazanılan alan kadar artırıldı float titleWidth = columnWidth + (columnWidth / 2); float titleHeight = rowHeight; float titleX = imageWidth; float titleY = 0; // Sağ sütun genişliği sabit kaldı float contentWidth = columnWidth; float contentHeight = rowHeight; float contentX = titleX + titleWidth; float contentY = 0; if (ustBilgi) { float marginAll = 20.0f; // Üst boşluk // Resim sütunu Image logoImage = null; try { string logoPath = Path.Combine(AppContext.BaseDirectory, "logo.png"); if (System.IO.File.Exists(logoPath)) { using (var streamImage = new FileStream(logoPath, FileMode.Open, FileAccess.Read)) { logoImage = Image.FromStream(streamImage); } } // Sol, üst, sağ ve alt boşluklar için padding float paddingAll = 20.0f; // Padding'i hesaba katan ayarlanmış koordinatlar float adjustedImageX = imageX + marginAll + paddingAll; float adjustedImageY = imageY + marginAll + paddingAll; // Görüntü boyutları için padding ekleme float adjustedImageWidth = imageWidth - (2 * paddingAll); float adjustedImageHeight = imageHeight - (2 * paddingAll); // Logo çizimi graphics.DrawImage(logoImage, new RectangleF(adjustedImageX, adjustedImageY, adjustedImageWidth, adjustedImageHeight)); // Çerçeve çizimi (padding dahil) DrawRectangle(graphics, pen, adjustedImageX - paddingAll, adjustedImageY - paddingAll, imageWidth, imageHeight); } catch { } // Başlık sütunu float adjustedTitleX = titleX + marginAll; // Başlığın solundan boşluk float adjustedTitleY = titleY + marginAll; // Çerçeve çizimi DrawRectangle(graphics, pen, adjustedTitleX, adjustedTitleY, titleWidth - marginAll, titleHeight); // Başlık metni çizimi graphics.DrawString( report1.txtBaslik.Text, fontHeader, brush, new PointF(adjustedTitleX + ((titleWidth - marginAll) / 2) - 75, adjustedTitleY + (titleHeight / 2) - 10) ); // Sağ sütun: Metinler float contentCellWidth = contentWidth / 2; // Etiket ve değer için ikiye böl float contentCellHeight = contentHeight / 5; // 5 satır float adjustedContentY = contentY + marginAll; string[] labels = { "Döküman No", "Revizyon No", "Revizyon Tarihi", "Yayın Tarihi", "Sayfa Sayısı" }; string[] values = { report1.txtDokumanNo.Text, report1.txtRevizyonNo.Text, report1.txtRevizyonTarihi.Text, report1.txtYayinTarihi.Text, $"{pageCount}/{totalPageCount}" }; for (int i = 0; i < labels.Length; i++) { // Etiket DrawRectangle(graphics, pen, contentX, adjustedContentY, contentCellWidth, contentCellHeight); graphics.DrawString(labels[i], fontContentBold, brush, new PointF(contentX + 5, adjustedContentY + 9), stringFormatCenter); // Değer DrawRectangle(graphics, pen, contentX + contentCellWidth, adjustedContentY, contentCellWidth - marginAll, contentCellHeight); graphics.DrawString(values[i], fontContent, brush, new PointF(contentX + contentCellWidth + 5, adjustedContentY + 9), stringFormatCenter); adjustedContentY += contentCellHeight; // Bir sonraki satıra geç } } if (altBilgi) { // Footer (Hazırlayan, Kontrol, Onay) float footerMargin = 20; // Sayfa sol ve sağ margin (10 piksel artırıldı) float footerTotalWidth = (float)page.CropBox.Width - (2 * footerMargin); // Tüm footer genişliği float footerCellWidth = footerTotalWidth / 3; // Her sütunun genişliği float footerCellHeight = 30; // Footer hücre yüksekliği // Alttan 20 piksel boşluk için ayarlama float footerBottomMargin = 20; // Alttan boşluk float footerYStart = (float)(page.CropBox.Height - footerCellHeight * 2 - footerBottomMargin); // Footer başlangıç Y string[] footerHeaders = { "HAZIRLAYAN", "KONTROL", "ONAY" }; string[] footerValues = { report1.txtHazirlayan.Text, report1.txtKontrolEden.Text, report1.txtOnaylayan.Text }; for (int i = 0; i < footerHeaders.Length; i++) { float footerX = footerMargin + (footerCellWidth * i); // Sol margin eklenerek düzen // Başlıklar için hücre DrawRectangle(graphics, pen, footerX, footerYStart, footerCellWidth, footerCellHeight); graphics.DrawString(footerHeaders[i], fontContentBold, brush, new PointF(footerX + 5, footerYStart + 9)); // Bold yapıldı // Değerler için hücre float valueY = footerYStart + footerCellHeight; DrawRectangle(graphics, pen, footerX, valueY, footerCellWidth, footerCellHeight); graphics.DrawString(footerValues[i], fontContent, brush, new PointF(footerX + 5, valueY + 9)); } } graphics.AddToPageForeground(page, 72, 72); } } } processor.SaveDocument(finalPdfStream); finalPdfStream.Position = 0; return File(finalPdfStream.ToArray(), "application/pdf", dosyam.orjiAd.Replace(dosyam.uzanti, "") + ".pdf"); } } } } } catch (Exception ex) { Console.WriteLine(ex.Message); return null; } } private void DrawRectangle(PdfGraphics graphics, System.Drawing.Pen pen, float x, float y, float width, float height) { // Dikdörtgenin konumunu ve boyutlarını tanımlayın var bounds = new System.Drawing.RectangleF(x, y, width, height); // System.Drawing.Pen'i DevExpress için uygun bir Pen'e dönüştürün var dxPen = SystemDrawingConverter.CreateDXPen(pen); // Dikdörtgeni çizin graphics.DrawRectangle(dxPen, bounds); } |