PageStamp.AlterContents () NullReferenceException - PullRequest
0 голосов
/ 20 октября 2010

это проблема:

У меня есть этот кусок кода ...

Он продолжает выдавать исключение NullReferenceException на stamp.AlterContents (); линия.

Я понятия не имею, что происходит. Любая помощь приветствуется!

    public static byte[] concatAndAddContent(List<byte[]> pdf) 
    { 
        byte [] todos; 

        using(MemoryStream ms = new MemoryStream()) 
        { 
            Document doc = new Document(); 
            doc.Open(); 

            PdfCopy copy = new PdfCopy(doc, ms); 
            PdfCopyFields copy2 = new PdfCopyFields(ms); 


            PdfReader reader; 
            foreach (byte[] p in pdf) 
            { 
                reader = new PdfReader(p); 
                int pages = reader.NumberOfPages; 

                // loop over document pages 
                for (int i = 1; i <= pages; i++) 
                { 
                    PdfImportedPage page = copy.GetImportedPage(reader, i); 
                    PdfCopy.PageStamp stamp = copy.CreatePageStamp(page); 
                    PdfContentByte cb = stamp.GetUnderContent(); 
                    cb.SaveState(); 
                    stamp.AlterContents(); 
                    copy.AddPage(page); 
                } 
            } 

            doc.Close(); 
            todos = ms.GetBuffer(); 
            ms.Flush(); 
            ms.Dispose(); 
        } 

        return todos; 
    } 

У меня установлена ​​версия iTextSharp 5.0.4 в VisualStudio 2010

1 Ответ

0 голосов
/ 21 октября 2010

Пожалуйста, опубликуйте трассировку стека исключений.

Хотя я не уверен, что вызвало исключение, я могу сказать, что вызов cb.saveState() без соответствия cb.restoreState() - это плохо.В версии Java это вызовет исключение IllegalPdfSyntaxException.В C # это, возможно, было преобразовано в NPE, но это кажется немного растянутым.

Сохранение и восстановление состояния используется, когда вы хотите что-то сделать, а затем «вернуться» позже.Например,

Draw some stuff
save the state
create a clipping region
   draw some clipped stuff
restore the state
draw some unclipped stuff.

Подобные вещи случаются ОЧЕНЬ МНОГО в PDF.Хотите нарисовать изображение?Вы должны изменить Матрицу текущей трансформации (CTM), чтобы поместить изображение в нужном вам размере.Если вы не хотите, чтобы все, что последует, было аналогичным образом преобразовано (а вы этого никогда не сделаете), вы должны обернуть изменение матрицы и отрисовку изображения в блоке сохранения / восстановления.iText обрабатывает это для вас, когда вы вызываете cb.addImage (...), но это все еще происходит за кулисами.

...