/// <summary> /// Pobieranie wartości zoom okna dla pliku, tak by zmieścił się w oknie /// </summary> /// <param name="pdfFile">plik dla którego należy obliczyć zoom</param> /// <param name="pdfRotation">rotacja strony PDF</param> /// <returns>wartość zoom</returns> private int GetFitZoom(byte[] pdfFile, out int pdfRotation) { double pdfPageSizeXPoint; // wielkość pliku w punktach double pdfPageSizeYPoint; // wielkość pliku w punktach IRandomAccessSource byteSource = new RandomAccessSourceFactory().CreateSource(pdfFile); using (PdfReader reader = new PdfReader(byteSource, new ReaderProperties())) using (PdfDocument pdfDoc = new PdfDocument(reader)) { pdfRotation = pdfDoc.GetPage(1).GetRotation(); switch (pdfRotation) { case 0: case 180: pdfPageSizeYPoint = pdfDoc.GetPage(1).GetPageSize().GetHeight(); // wielkość pliku w punktach pdfPageSizeXPoint = pdfDoc.GetPage(1).GetPageSize().GetWidth(); // wielkość pliku w punktach break; case 90: case 270: pdfPageSizeYPoint = pdfDoc.GetPage(1).GetPageSize().GetWidth(); // wielkość pliku w punktach pdfPageSizeXPoint = pdfDoc.GetPage(1).GetPageSize().GetHeight(); // wielkość pliku w punktach break; default: throw new Exception(@"Błędny kąt obrotu!"); } } byteSource.Close(); float dpiX; float dpiY; // pobranie rozdzielczości ekranu using (Graphics graphics = Graphics.FromHwnd(IntPtr.Zero)) { dpiX = graphics.DpiX; dpiY = graphics.DpiY; } double pdfPageSizeXPix = pdfPageSizeXPoint * dpiX / 72; // przeliczenie rozmiaru dokumentu z punktów na piksele double pdfPageSizeYPix = pdfPageSizeYPoint * dpiY / 72; // przeliczenie rozmiaru dokumentu z punktów na piksele int pdfViewerSizeYPix = pdfDocumentViewer.Height - 8; // - 8 bo okno ma wewnętrzny margines 4 z każdej strony int pdfViewerSizeXPix = pdfDocumentViewer.Width - 8; // - 8 bo okno ma wewnętrzny margines 4 z każdej strony double scaleX = pdfViewerSizeXPix / pdfPageSizeXPix * 100; // obliczenie współczynnika skalowania double scaleY = pdfViewerSizeYPix / pdfPageSizeYPix * 100; // obliczenie współczynnika skalowania return(scaleX < scaleY ? (int)Math.Floor(scaleX) : (int)Math.Floor(scaleY)); }
/// <summary> /// Wstawianie znaku wodnego do przekazanego pliku /// </summary> /// <param name="pdfFile">Plik do którego należy wstawić znak wodny</param> /// <returns></returns> private void SetWatermarkPdf(byte[] pdfFile) { IRandomAccessSource byteSource = new RandomAccessSourceFactory().CreateSource(pdfFile); PdfReader pdfReader = new PdfReader(byteSource, new ReaderProperties()); MemoryStream memoryStreamOutput = new MemoryStream(); PdfWriter pdfWriter = new PdfWriter(memoryStreamOutput); PdfDocument pdfDoc = new PdfDocument(pdfReader, pdfWriter); FontProgram fontProgram = new TrueTypeFont(Resources.arial); PdfFont pdfFont = PdfFontFactory.CreateFont(fontProgram, PdfEncodings.IDENTITY_H, true); PdfCanvas over = new PdfCanvas(pdfDoc.GetFirstPage()); over.SetFillColor(ColorConstants.BLACK); Paragraph p = new Paragraph(File.ReadAllText("stopka.txt")); p.SetFont(pdfFont); p.SetFontSize(8); p.SetFixedLeading(8); over.SaveState(); PdfExtGState gs1 = new PdfExtGState(); gs1.SetFillOpacity(0.2f); gs1.SetStrokeOpacity(0.2f); over.SetExtGState(gs1); int pageRotation = pdfDoc.GetPage(1).GetRotation(); float textAngleRad = (float)(pageRotation * Math.PI / 180.0); float pageWidth = pdfDoc.GetPage(1).GetPageSizeWithRotation().GetWidth(); float pageHeight = pdfDoc.GetPage(1).GetPageSizeWithRotation().GetHeight(); using (Canvas stopka = new Canvas(over, pdfDoc, pdfDoc.GetPage(1).GetPageSizeWithRotation())) { switch (pageRotation) { case 0: stopka.ShowTextAligned(p, pageWidth / 2, 8, 1, TextAlignment.CENTER, VerticalAlignment.BOTTOM, textAngleRad); break; case 90: stopka.ShowTextAligned(p, pageHeight - 8, pageWidth / 2, 1, TextAlignment.CENTER, VerticalAlignment.BOTTOM, textAngleRad); break; case 180: stopka.ShowTextAligned(p, pageWidth / 2, pageHeight - 8, 1, TextAlignment.CENTER, VerticalAlignment.BOTTOM, textAngleRad); break; case 270: stopka.ShowTextAligned(p, 8, pageWidth / 2, 1, TextAlignment.CENTER, VerticalAlignment.BOTTOM, textAngleRad); break; default: throw new Exception("Błędny kąt obrotu strony"); } } over.RestoreState(); pdfDoc.Close(); Global.ScanFiles[Global.IdSelectedFile].PdfFile = memoryStreamOutput.ToArray(); byteSource.Close(); memoryStreamOutput.Close(); pdfReader.Close(); pdfWriter.Close(); }
/// <summary> /// Obsługa zdarzenia kliknięcia myszką na przycisku obrotu dokumentu, lub skrótu klawiszowego /// </summary> /// <param name="sender"></param> /// <param name="e"></param> private void BtnRotate_ClickOrKeyPress(object sender, EventArgs e) { // jeśli nie ma plików na liście to nic nie rób if (listBoxFiles.Items.Count <= 0) { return; } int desiredRot = 0; // jeśli obracanie zostało wywołane klawiszem if (e.GetType() == typeof(KeyEventArgs)) { KeyEventArgs arg = (KeyEventArgs)e; switch (arg.KeyData) { case Keys.Control | Keys.Right: desiredRot = 90; break; case Keys.Control | Keys.Left: desiredRot = 270; break; } } if (e.GetType() == typeof(MouseEventArgs)) // jeśli obracanie zostało wywołane myszką { MouseEventArgs arg = (MouseEventArgs)e; switch (arg.Button) { case MouseButtons.Left: desiredRot = 270; break; case MouseButtons.Right: desiredRot = 90; break; } } IRandomAccessSource byteSource = new RandomAccessSourceFactory().CreateSource(Global.ScanFiles[Global.IdSelectedFile].PdfFile); PdfReader pdfReader = new PdfReader(byteSource, new ReaderProperties()); MemoryStream memoryStreamOutput = new MemoryStream(); PdfWriter pdfWriter = new PdfWriter(memoryStreamOutput); PdfDocument pdfDoc = new PdfDocument(pdfReader, pdfWriter); PdfPage page = pdfDoc.GetPage(1); var rotate = page.GetPdfObject().GetAsNumber(PdfName.Rotate); if (rotate == null) { page.SetRotation(desiredRot); } else { page.SetRotation((rotate.IntValue() + desiredRot) % 360); } pdfDoc.Close(); Global.ScanFiles[Global.IdSelectedFile].PdfFile = memoryStreamOutput.ToArray(); // Przypisz nowy dokument do klasy obiektów ze skanami if (Global.SaveRotation) { File.WriteAllBytes(Global.ScanFiles[Global.IdSelectedFile].PathAndFileName, memoryStreamOutput.ToArray()); // zapisz nowy plik na dysku w miejsce starego } byteSource.Close(); memoryStreamOutput.Close(); pdfReader.Close(); pdfWriter.Close(); // Wyświetl nowy plik w oknie podglądu Global.Zoom = GetFitZoom(Global.ScanFiles[Global.IdSelectedFile].PdfFile, out int _); pdfDocumentViewer.LoadFromStream(new MemoryStream(Global.ScanFiles[Global.IdSelectedFile].PdfFile)); pdfDocumentViewer.ZoomTo(Global.Zoom); pdfDocumentViewer.EnableHandTool(); }