Как вернуть буфер документа pdf с цифровой подписью из метода, который получает буфер ist, так как он не подписан, подписывает его и возвращает его байты? - PullRequest
0 голосов
/ 13 февраля 2020

Я пытаюсь подписать документы, поступающие с WS, с помощью консольного приложения C#. Внутри файла Signer.sv c .cs я создал метод, который принимает байты pdf-файла в качестве параметра и возвращает буфер подписанного документа. Я пытался с "return pdfDictionary.GetBytes ()", но это приходит ноль. Каким способом я могу получить и вернуть подписанные байты pdf файла?

public static byte[] SetSignatureDefaultAppearance(byte[] doc)
        {
            using (MemoryStream output = new MemoryStream())
            {
                using (var reader = new PdfReader(doc))
                {
                    using (var stamper = new PdfStamper(reader, new FileStream(@"C:\Users\Admin\Desktop\PdfDocs\document_pdf.pdf", FileMode.Create, FileAccess.Write), '\0', true))
                    {
                        Rectangle mediaBox = reader.GetPageSizeWithRotation(1);
                        bool portrait = mediaBox.Width > mediaBox.Height ? false : true; // kontrollojme nese dokumentin e kemi portret apo landscape
                        AcroFields fields = stamper.AcroFields;

                        List<string> signatureNames = fields.GetSignatureNames();
                        string signatureName = signatureNames.LastOrDefault();
                        PdfPKCS7 pkcs7 = fields.VerifySignature(signatureName);
                        Org.BouncyCastle.X509.X509Certificate signerCert = pkcs7.SigningCertificate;
                        String signerName = CertificateInfo.GetSubjectFields(signerCert).GetField("CN");
                        string[] words = signerName.Split(' ');
                        AcroFields.Item field = fields.GetFieldItem(signatureName);
                        PdfAppearance appearance;
                        for (int i = 0; i < field.Size; i++)
                        {
                            PdfDictionary widget = field.GetWidget(i);

                            Rectangle rectangle = PdfReader.GetNormalizedRectangle(widget.GetAsArray(PdfName.RECT));
                            appearance = rectangle.Height > rectangle.Width ?
                                PdfAppearance.CreateAppearance(stamper.Writer, rectangle.Height, rectangle.Width)
                                : PdfAppearance.CreateAppearance(stamper.Writer, rectangle.Width, rectangle.Height);
                            string url = ""; // HttpRuntime.AppDomainAppPath;
                            string imagePath = @"C:\Users\Admin\Desktop\PdfDocs\signature.png"; // url + "images\\1.png";

                            iTextSharp.text.Image image = iTextSharp.text.Image.GetInstance(imagePath);
                            image.Alignment = iTextSharp.text.Image.ALIGN_MIDDLE;
                            image.ScaleToFit(100, 100);
                            image.SetAbsolutePosition(10, -25);
                            appearance.AddImage(image, false);

                            // first column
                            ColumnText firstColumn = new ColumnText(appearance);
                            Chunk firstChunk = new Chunk();
                            BaseFont firstFont = BaseFont.CreateFont(url + "C:\\Users\\Admin\\Downloads\\Helvetica.ttf" /*"css\\fonts\\Myriad Pro Regular.ttf"*/, BaseFont.CP1252, BaseFont.NOT_EMBEDDED);
                            iTextSharp.text.Font fontOne = new iTextSharp.text.Font(firstFont, 10, iTextSharp.text.Font.BOLD);
                            firstChunk.Append(words[0]);

                            firstColumn.AddElement(new Paragraph(firstChunk));
                            firstChunk.Font = fontOne;
                            //firstChunk = new Chunk();
                            //firstChunk.Append(words[i]);
                            //firstColumn.AddElement(new Paragraph(firstChunk));
                            //firstChunk.Font = fontOne;
                            firstChunk = new Chunk();
                            firstColumn.AddElement(new Paragraph(firstChunk));
                            if (rectangle.Height > rectangle.Width)
                            {
                                firstColumn.SetSimpleColumn(0, 0, rectangle.Height / 2, rectangle.Width);
                            }
                            else
                            {
                                firstColumn.SetSimpleColumn(0, 0, rectangle.Width / 2, rectangle.Height);
                            }
                            firstColumn.Go();

                            // second column
                            ColumnText secondColumn = new ColumnText(appearance);
                            Chunk secondChunk = new Chunk();
                            BaseFont secondFont = BaseFont.CreateFont(url + "C:\\Users\\Admin\\Downloads\\Helvetica.ttf" /*"css\\fonts\\Myriad Pro Regular.ttf"*/, BaseFont.CP1252, BaseFont.NOT_EMBEDDED);
                            iTextSharp.text.Font fontTwo = new iTextSharp.text.Font(secondFont, 6, iTextSharp.text.Font.NORMAL);
                            secondChunk.Font = fontTwo;
                            string text = "Digitally signed by " + signerName + "@Date: " + DateTime.Now.ToString("yyyy.MM.dd")
                                + " " + DateTime.Now.ToString("hh:mm:ss") + " " + "+02'00'";
                            text = text.Replace("@", "" + System.Environment.NewLine);
                            secondChunk.Append(text);
                            secondColumn.AddElement(new Paragraph(secondChunk));
                            Console.Write(rectangle.Width); ///////////////////////////////////////////////////////////////
                            if (rectangle.Height > rectangle.Width)
                            {
                                secondColumn.SetSimpleColumn(rectangle.Height / 2, 0, rectangle.Height, rectangle.Width);
                            }
                            else
                            {
                                secondColumn.SetSimpleColumn(rectangle.Width / 2, 0, rectangle.Width, rectangle.Height);
                            }
                            secondColumn.Go();
                            PdfDictionary dictionary = GetAsDictAndMarkUsed((PdfStamperImp)stamper.Writer, widget, PdfName.AP,
                                PdfName.N, PdfName.RESOURCES, PdfName.XOBJECT, PdfName.FRM, PdfName.RESOURCES, PdfName.XOBJECT);
                            dictionary.Put(PdfName.N2, appearance.IndirectReference);
                        }
                    }

                }


                return ?????????????????????????????????;
            }
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...