public ImageXObject( Document context, PdfStream baseDataObject ) : base(context, baseDataObject) { /* NOTE: It's caller responsability to adequately populate the stream header and body in order to instantiate a valid object; header entries like 'Width', 'Height', 'ColorSpace', 'BitsPerComponent' MUST be defined appropriately. */ baseDataObject.Header[PdfName.Subtype] = PdfName.Image; }
/** <summary>Sets the Javascript script into the specified base data object.</summary> */ internal static void SetScript( PdfDictionary baseDataObject, PdfName key, string value ) { PdfDataObject scriptObject = baseDataObject.Resolve(key); if(!(scriptObject is PdfStream) && value.Length > 256) {baseDataObject[key] = baseDataObject.File.Register(scriptObject = new PdfStream());} // Insert the script! if(scriptObject is PdfStream) { bytes::IBuffer scriptBuffer = ((PdfStream)scriptObject).Body; scriptBuffer.SetLength(0); scriptBuffer.Append(value); } else {baseDataObject[key] = new PdfTextString(value);} }
public virtual PdfObject Visit( PdfStream obj, object data ) { return obj; }
public override PdfObject Visit( PdfStream obj, object data ) { PdfStream clone = (PdfStream)obj.Clone(); { clone.header = (PdfDictionary)Visit(obj.header, data); clone.body = obj.body.Clone(); } return clone; }
/** <summary>Gets the character map extracted from the given data.</summary> <param name="stream">Character map data.</param> */ public static IDictionary<ByteArray, int> Get( PdfStream stream ) { return Get(stream.Body); }
/** <summary>Creates the character code mapping for composite fonts.</summary> */ private void Load_CreateEncoding( PdfDictionary font, PdfDictionary cidFont ) { // CMap [PDF:1.6:5.6.4]. bytes::Buffer cmapBuffer = new bytes::Buffer(); cmapBuffer.Append( "%!PS-Adobe-3.0 Resource-CMap\n" + "%%DocumentNeededResources: ProcSet (CIDInit)\n" + "%%IncludeResource: ProcSet (CIDInit)\n" + "%%BeginResource: CMap (Adobe-Identity-UCS)\n" + "%%Title: (Adobe-Identity-UCS Adobe Identity 0)\n" + "%%Version: 1\n" + "%%EndComments\n" + "/CIDInit /ProcSet findresource begin\n" + "12 dict begin\n" + "begincmap\n" + "/CIDSystemInfo\n" + "3 dict dup begin\n" + "/Registry (Adobe) def\n" + "/Ordering (Identity) def\n" + "/Supplement 0 def\n" + "end def\n" + "/CMapName /Adobe-Identity-UCS def\n" + "/CMapVersion 1 def\n" + "/CMapType 0 def\n" + "/WMode 0 def\n" + "2 begincodespacerange\n" + "<20> <20>\n" + "<0000> <19FF>\n" + "endcodespacerange\n" + glyphIndexes.Count + " begincidchar\n" ); // ToUnicode [PDF:1.6:5.9.2]. bytes::Buffer toUnicodeBuffer = new bytes::Buffer(); toUnicodeBuffer.Append( "/CIDInit /ProcSet findresource begin\n" + "12 dict begin\n" + "begincmap\n" + "/CIDSystemInfo\n" + "<< /Registry (Adobe)\n" + "/Ordering (UCS)\n" + "/Supplement 0\n" + ">> def\n" + "/CMapName /Adobe-Identity-UCS def\n" + "/CMapVersion 10.001 def\n" + "/CMapType 2 def\n" + "2 begincodespacerange\n" + "<20> <20>\n" + "<0000> <19FF>\n" + "endcodespacerange\n" + glyphIndexes.Count + " beginbfchar\n" ); // CIDToGIDMap [PDF:1.6:5.6.3]. bytes::Buffer gIdBuffer = new bytes::Buffer(); gIdBuffer.Append((byte)0); gIdBuffer.Append((byte)0); int code = 0; codes = new BiDictionary<ByteArray,int>(glyphIndexes.Count); PdfArray widthsObject = new PdfArray(glyphWidths.Count); foreach(KeyValuePair<int,int> glyphIndexEntry in glyphIndexes) { // Character code (unicode to codepoint) entry. code++; byte[] charCode = (glyphIndexEntry.Key == 32 ? new byte[]{32} : new byte[] { (byte)((code >> 8) & 0xFF), (byte)(code & 0xFF) }); codes[new ByteArray(charCode)] = glyphIndexEntry.Key; // CMap entry. cmapBuffer.Append("<"); toUnicodeBuffer.Append("<"); for(int charCodeBytesIndex = 0, charCodeBytesLength = charCode.Length; charCodeBytesIndex < charCodeBytesLength; charCodeBytesIndex++ ) { string hex = ((int)charCode[charCodeBytesIndex]).ToString("X2"); cmapBuffer.Append(hex); toUnicodeBuffer.Append(hex); } cmapBuffer.Append("> " + code + "\n"); toUnicodeBuffer.Append("> <" + glyphIndexEntry.Key.ToString("X4") + ">\n"); // CID-to-GID entry. int glyphIndex = glyphIndexEntry.Value; gIdBuffer.Append((byte)((glyphIndex >> 8) & 0xFF)); gIdBuffer.Append((byte)(glyphIndex & 0xFF)); // Width. int width; if(!glyphWidths.TryGetValue(glyphIndex, out width)) {width = 0;} else if(width > 1000) {width = 1000;} widthsObject.Add(PdfInteger.Get(width)); } cmapBuffer.Append( "endcidchar\n" + "endcmap\n" + "CMapName currentdict /CMap defineresource pop\n" + "end\n" + "end\n" + "%%EndResource\n" + "%%EOF" ); PdfStream cmapStream = new PdfStream(cmapBuffer); PdfDictionary cmapHead = cmapStream.Header; cmapHead[PdfName.Type] = PdfName.CMap; cmapHead[PdfName.CMapName] = new PdfName("Adobe-Identity-UCS"); cmapHead[PdfName.CIDSystemInfo] = new PdfDictionary( new PdfName[] { PdfName.Registry, PdfName.Ordering, PdfName.Supplement }, new PdfDirectObject[] { new PdfTextString("Adobe"), new PdfTextString("Identity"), PdfInteger.Get(0) } ); // Generic predefined CMap (Identity-H/V (Adobe-Identity-0)) [PDF:1.6:5.6.4]. font[PdfName.Encoding] = File.Register(cmapStream); PdfStream gIdStream = new PdfStream(gIdBuffer); cidFont[PdfName.CIDToGIDMap] = File.Register(gIdStream); cidFont[PdfName.W] = new PdfArray(new PdfDirectObject[]{PdfInteger.Get(1),widthsObject}); toUnicodeBuffer.Append( "endbfchar\n" + "endcmap\n" + "CMapName currentdict /CMap defineresource pop\n" + "end\n" + "end\n" ); PdfStream toUnicodeStream = new PdfStream(toUnicodeBuffer); font[PdfName.ToUnicode] = File.Register(toUnicodeStream); }