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; }
internal int GetPageId(int page) { if (page < 1 || page > FList.Count) { PdfMessages.ThrowException(PdfErr.ErrInvalidPageNumber, page, FList.Count); } return(FList[page - 1].Id); }
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); }
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); } }
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); } }
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); }