Beispiel #1
0
        internal TPdfStream(Stream aDataStream, TPdfSignature aSignature)
        {
            EndTextData = TPdfBaseRecord.Coder.GetBytes(TPdfTokens.GetString(TPdfToken.CommandEndText) + TPdfTokens.NewLine);

            Signature = aSignature;
            if (Signature != null)
            {
                if (Signature.SignerFactory != null)
                {
                    Signer = Signature.SignerFactory.CreateSigner();
                }
                else
                {
                    PdfMessages.ThrowException(PdfErr.ErrUnassingedSignerFactory);
                }
            }

            if (Signer == null)
            {
                FDataStream = aDataStream;
            }
            else
            {
                FDataStream = new TSignedStream(aDataStream, Signer);                                                  //When signing we use a special stream that will compute the hash.
            }
            SignedStream = FDataStream as TSignedStream;
        }
Beispiel #2
0
 internal int GetPageId(int page)
 {
     if (page < 1 || page > FList.Count)
     {
         PdfMessages.ThrowException(PdfErr.ErrInvalidPageNumber, page, FList.Count);
     }
     return(FList[page - 1].Id);
 }
Beispiel #3
0
        internal void GoReal(byte[] AfterSign, int PKCSSize)
        {
            Debug.Assert(HelperStream != null);
            Signer.Write(AfterSign, 0, AfterSign.Length);

            if (PKCSSize + AfterSign.Length > SignOffset)
            {
                PdfMessages.ThrowException(PdfErr.ErrSigningLengthToSmall);
            }
            byte[] PaddedByteCount = Pad(0x20, SignOffset - (PKCSSize + AfterSign.Length));
            Signer.Write(PaddedByteCount, 0, PaddedByteCount.Length);

            byte[] bt = HelperStream.CurrentStream.ToArray();
            HelperStream.Dispose();
            HelperStream = null;

            Signer.Write(bt, 0, bt.Length);
            byte[] sg    = Signer.GetSignature();
            byte[] hexsg = TPdfBaseRecord.Coder.GetBytes("<" + PdfConv.ToHexString(sg, false));

            FDataStream.Write(hexsg, 0, hexsg.Length);

            if (hexsg.Length > PKCSSize - 1)
            {
                PdfMessages.ThrowException(PdfErr.ErrSigningLengthToSmall);
            }

            for (int i = hexsg.Length; i < PKCSSize - 1; i++) //pad the certificate.
            {
                FDataStream.WriteByte(0);
            }

            FDataStream.Write(TPdfBaseRecord.Coder.GetBytes(">"), 0, 1);

            FDataStream.Write(AfterSign, 0, AfterSign.Length);
            FDataStream.Write(PaddedByteCount, 0, PaddedByteCount.Length);  //Pad the whole thing.

            FDataStream.Write(bt, 0, bt.Length);
        }
Beispiel #4
0
        internal static void ProcessPng(Stream PngImageData, TPdfPngData OutData)
        {
            if (!CheckHeaders(PngImageData))
            {
                PdfMessages.ThrowException(PdfErr.ErrInvalidPngImage);
            }

            while (PngImageData.Position < PngImageData.Length)
            {
                ReadChunk(PngImageData, OutData);
            }

            if (OutData.ColorType == 4)
            {
                SuppressAlpha(OutData, 1);
            }

            if (OutData.ColorType == 6)
            {
                SuppressAlpha(OutData, 3);
            }
        }
Beispiel #5
0
        private void ReadPng(Stream Ms)
        {
            using (MemoryStream OutMs = new MemoryStream())
            {
                TPdfPngData ImgParsedData = new TPdfPngData(OutMs);
                TPdfPng.ProcessPng(Ms, ImgParsedData);

                FImage            = OutMs.ToArray();
                FImageWidth       = (int)ImgParsedData.Width;
                FImageHeight      = (int)ImgParsedData.Height;
                FBitsPerComponent = ImgParsedData.BitDepth;

                if (FBitsPerComponent == 16)
                {
                    PdfMessages.ThrowException(PdfErr.ErrInvalidPngImage);
                }

                int Colors = 1;
                switch (ImgParsedData.ColorType)
                {
                case 0:                         //GrayScale
                    FColorSpace = TPdfTokens.GetString(TPdfToken.DeviceGrayName);
                    if (ImgParsedData.tRNS != null && ImgParsedData.tRNS.Length >= 2)
                    {
                        FMask =
                            TPdfTokens.GetString(TPdfToken.OpenArray) +
                            String.Format(CultureInfo.InvariantCulture, "{0} {0}", (ImgParsedData.tRNS[0] << 8) + ImgParsedData.tRNS[1]) +
                            TPdfTokens.GetString(TPdfToken.CloseArray);
                    }

                    break;

                case 2:                          //TrueColor
                    FColorSpace = TPdfTokens.GetString(TPdfToken.DeviceRGBName);
                    Colors      = 3;
                    if (ImgParsedData.tRNS != null && ImgParsedData.tRNS.Length >= 6)
                    {
                        FMask =
                            TPdfTokens.GetString(TPdfToken.OpenArray) +
                            String.Format(CultureInfo.InvariantCulture,
                                          "{0} {0} {1} {1} {2} {2}", (ImgParsedData.tRNS[0] << 8) + ImgParsedData.tRNS[1],
                                          (ImgParsedData.tRNS[2] << 8) + ImgParsedData.tRNS[3],
                                          (ImgParsedData.tRNS[4] << 8) + ImgParsedData.tRNS[5]
                                          ) +
                            TPdfTokens.GetString(TPdfToken.CloseArray);
                    }
                    break;

                case 3:                         //Indexed Color
                    FColorSpace = GetPalette(ImgParsedData.PLTE);
                    if (ImgParsedData.tRNS != null && ImgParsedData.tRNS.Length > 0)
                    {
                        ImgParsedData.SMask = TPdfPng.GetIndexedSMask(FImage, FImageWidth, FImageHeight, ImgParsedData.tRNS, FBitsPerComponent);
                    }
                    break;

                case 4:                          //GrayScale + Alpha
                    FColorSpace = TPdfTokens.GetString(TPdfToken.DeviceGrayName);
                    break;

                case 6:                         //TrueColor + Alpha
                    FColorSpace = TPdfTokens.GetString(TPdfToken.DeviceRGBName);
                    Colors      = 3;
                    break;

                default: PdfMessages.ThrowException(PdfErr.ErrInvalidPngImage); break;
                }

                FSMask     = ImgParsedData.SMask;
                OneBitMask = ImgParsedData.OneBitMask;

                if (ImgParsedData.InterlaceMethod != 0)
                {
                    PdfMessages.ThrowException(PdfErr.ErrInvalidPngImage);
                }

                FFilterName = TPdfTokens.GetString(TPdfToken.FlateDecodeName);

                FDecodeParmsName =
                    TPdfTokens.GetString(TPdfToken.StartDictionary) +
                    String.Format(CultureInfo.InvariantCulture, TPdfTokens.GetString(TPdfToken.PredictorName) + " {0} ", 15) +
                    String.Format(CultureInfo.InvariantCulture, TPdfTokens.GetString(TPdfToken.ColorsName) + " {0} ", Colors) +
                    String.Format(CultureInfo.InvariantCulture, TPdfTokens.GetString(TPdfToken.BitsPerComponentName) + " {0} ", FBitsPerComponent) +
                    String.Format(CultureInfo.InvariantCulture, TPdfTokens.GetString(TPdfToken.ColumnsName) + " {0} ", FImageWidth) +
                    TPdfTokens.GetString(TPdfToken.EndDictionary);

                FDecodeParmsSMask =
                    TPdfTokens.GetString(TPdfToken.StartDictionary) +
                    String.Format(CultureInfo.InvariantCulture, TPdfTokens.GetString(TPdfToken.PredictorName) + " {0} ", 15) +
                    String.Format(CultureInfo.InvariantCulture, TPdfTokens.GetString(TPdfToken.ColorsName) + " {0} ", 1) +
                    String.Format(CultureInfo.InvariantCulture, TPdfTokens.GetString(TPdfToken.BitsPerComponentName) + " {0} ", 8) +
                    String.Format(CultureInfo.InvariantCulture, TPdfTokens.GetString(TPdfToken.ColumnsName) + " {0} ", FImageWidth) +
                    TPdfTokens.GetString(TPdfToken.EndDictionary);
            }
        }
Beispiel #6
0
        private static byte[] LoadFont(Font aFont, TFontEvents FontEvents)
        {
            byte[] FFontData = null;

            if (FontEvents.OnGetFontData != null)
            {
                GetFontDataEventArgs fe = new GetFontDataEventArgs(aFont);
                FontEvents.OnGetFontData(FontEvents.Sender, fe);
                if (fe.Applied)
                {
                    FFontData = fe.FontData;
                }
            }

#if (FRAMEWORK30 && !WPF && !__MonoCS__ && COMMENTED_OUT_BECAUSE_IT_CAN_FAIL_IN_MULTITHREAD_CASES)
            if (FFontData == null && !WithoutWPFSupport)
            {
                try
                {
                    FFontData = GetFontWithWPF(aFont, FFontData);
                }
                catch (MissingMethodException) //happens when running in mono the assemmbly compiled with VS.
                {
                    WithoutWPFSupport = true;
                    FFontData         = null;
                }
                catch (FileNotFoundException)
                {
                    WithoutWPFSupport = true;
                    FFontData         = null;
                }
            }
#endif
            if (FFontData == null)
            {
                String FontPath = null;
                try
                {
                    if (!WithoutGetFolderPathPermissions)
                    {
                        FontPath = Environment.GetFolderPath(Environment.SpecialFolder.System);
                    }
                }
                catch (SecurityException)
                {
                    WithoutGetFolderPathPermissions = true; //to avoid repeating each time, as this exception is mostly going to happen in a server.
                    FontPath = null;
                }

                bool AppendFontFolder = true;
                if (FontEvents.OnGetFontFolder != null)
                {
                    GetFontFolderEventArgs ae = new GetFontFolderEventArgs(aFont, FontPath);
                    FontEvents.OnGetFontFolder(FontEvents.Sender, ae);
                    if (ae.Applied)
                    {
                        FontPath = ae.FontFolder;
                    }
                    AppendFontFolder = ae.AppendFontFolder;
                }

                if (FontPath != null && FontPath.Length > 0 && AppendFontFolder)
                {
                    FontPath = Path.Combine(Path.Combine(FontPath, TPdfTokens.GetString(TPdfToken.UpDir)), TPdfTokens.GetString(TPdfToken.FontFolder));
                }

                if (FontPath == null || FontPath.Length == 0)  //We are probably on MONO. let's try the default.
                {
                    //See if it is on /usr/X11R6/lib/X11/fonts/truetype
                    if (Directory.Exists(TPdfTokens.GetString(TPdfToken.LinuxFontFolder)))
                    {
                        FontPath = TPdfTokens.GetString(TPdfToken.LinuxFontFolder);
                    }
                    else  //Put it on the folder where the dll is, /Fonts. You could make a symbolic link from there to the place where files actually are.
                    {
                        FontPath = Path.Combine(Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location), TPdfTokens.GetString(TPdfToken.FontFolder));
                    }
                }

                if (FontPath != null && FontPath.Length > 0 && FontPath[FontPath.Length - 1] != Path.DirectorySeparatorChar)
                {
                    FontPath += Path.DirectorySeparatorChar;
                }

                FFontData = PdfFontFactory.GetFontData(aFont, FontPath);
            }

            if (FFontData == null)
            {
                PdfMessages.ThrowException(PdfErr.ErrFontNotFound, aFont.Name);
            }

            return(FFontData);
        }