PdfPig
                                
                                
                                
                                    PdfPig copied to clipboard
                            
                            
                            
                        I suggest reading w2 in the same way as reading w
https://github.com/UglyToad/PdfPig/blob/ee756088d909bba91c3aa2c1e00574ca6dc0f5e4/src/UglyToad.PdfPig/PdfFonts/Parser/Parts/CidFontFactory.cs#L192 It is recommended that this method be handled in the same way as reading W, considering that the I object is an IndirectReferenceToken。
  private VerticalWritingMetrics ReadVerticalDisplacements(DictionaryToken dict)
        {
            var verticalDisplacements = new Dictionary<int, double>();
            var positionVectors = new Dictionary<int, PdfVector>();
            // The default position vector and displacement vector are specified by the DW2 entry.
            VerticalVectorComponents dw2;
            if (!dict.TryGet(NameToken.Dw2, out var dw2Token) || !(dw2Token is ArrayToken arrayVerticalComponents))
            {
                dw2 = VerticalVectorComponents.Default;
            }
            else
            {
                var position = ((NumericToken)arrayVerticalComponents.Data[0]).Double;
                var displacement = ((NumericToken)arrayVerticalComponents.Data[1]).Double;
                dw2 = new VerticalVectorComponents(position, displacement);
            }
            // vertical metrics for individual CIDs.
            if (dict.TryGet(NameToken.W2, out var w2Token) && w2Token is ArrayToken w2)
            {
                for (var i = 0; i < w2.Data.Count; i++)
                {
                    var c = DirectObjectFinder.Get<NumericToken>(w2.Data[i], pdfScanner);
                    var next = w2.Data[++i];
                    if (DirectObjectFinder.TryGet(next, pdfScanner, out ArrayToken array))
                    {
                        for (var j = 0; j < array.Data.Count; j++)
                        {
                            var cid = c.Int + j;
                            // ReSharper disable InconsistentNaming
                            var w1y = DirectObjectFinder.Get<NumericToken>(array.Data[j], pdfScanner);
                            var v1x = DirectObjectFinder.Get<NumericToken>(array.Data[++j], pdfScanner);
                            var v1y = DirectObjectFinder.Get<NumericToken>(array.Data[++j], pdfScanner);
                            verticalDisplacements[cid] = w1y.Double;
                            positionVectors[cid] = new PdfVector(v1x.Double, v1y.Double);
                        }
                    } 
                    else
                    {
                        var first = c.Int;
                        var last = ((NumericToken)next).Int;
                        var w1y = DirectObjectFinder.Get<NumericToken>(w2.Data[++i], pdfScanner);
                        var v1x = DirectObjectFinder.Get<NumericToken>(w2.Data[++i], pdfScanner);
                        var v1y = DirectObjectFinder.Get<NumericToken>(w2.Data[++i], pdfScanner);
                        // ReSharper restore InconsistentNaming
                        for (var cid = first; cid <= last; cid++)
                        {
                            verticalDisplacements[cid] = w1y.Double;
                            positionVectors[cid] = new PdfVector(v1x.Double, v1y.Double);
                        }
                    }
                }
                //for (var i = 0; i < w2.Data.Count; i++)
                //{
                //    var c = (NumericToken)w2.Data[i];
                //    var next = w2.Data[++i];
                //    if (next is IndirectReferenceToken referenceToken)
                //    {
                //        next = pdfScanner.Get(referenceToken.Data).Data;
                //    }
                //    if (next is ArrayToken array)
                //    {
                //        for (var j = 0; j < array.Data.Count; j++)
                //        {
                //            var cid = c.Int + j;
                //            // ReSharper disable InconsistentNaming
                //            var w1y = (NumericToken)array.Data[j];
                //            var v1x = (NumericToken)array.Data[++j];
                //            var v1y = (NumericToken)array.Data[++j];
                //            verticalDisplacements[cid] = w1y.Double;
                //            positionVectors[cid] = new PdfVector(v1x.Double, v1y.Double);
                //        }
                //    }
                //    else
                //    {
                //        var first = c.Int;
                //        var last = ((NumericToken)next).Int;
                //        var w1y = (NumericToken)w2.Data[++i];
                //        var v1x = (NumericToken)w2.Data[++i];
                //        var v1y = (NumericToken)w2.Data[++i];
                //        // ReSharper restore InconsistentNaming
                //        for (var cid = first; cid <= last; cid++)
                //        {
                //            verticalDisplacements[cid] = w1y.Double;
                //            positionVectors[cid] = new PdfVector(v1x.Double, v1y.Double);
                //        }
                //    }
                //}
            }
            return new VerticalWritingMetrics(dw2, verticalDisplacements, positionVectors);
        }