ItextSharp Ожидается объект Dict при попытке печати - PullRequest
2 голосов
/ 31 января 2011

У меня есть веб-страница, которая позволяет пользователю просматривать PDF и печатать PDF. Печать PDF является копией отображения PDF, и я использую ItextSharp, чтобы добавить JavaScript, чтобы разрешить автоматическую печать. У меня есть метод, который позволяет пользователю загружать PDF, и он вызывает этот метод ниже, чтобы скопировать отображаемую копию в PDF. Оба файла PDF затем сохраняются в базе данных. Однако, когда пользователь нажимает кнопку «Печать» на моей веб-странице, он получает следующую ошибку «ожидается, что объект dict». ниже мой код, который добавляет в автоматическую печать, которая отлично работает для меня, но не на моем сайте клиентов.

Я делаю что-то неправильно, что может повредить файл. Исходный контент в формате PDF передается в виде двоичного объекта.

Любая помощь по этому вопросу очень ценится, так как я очень запутался в этом. Также я использую ASP.NET MVC2.

MemoryStream originalPdf = new MemoryStream(Content.BinaryData);    
MemoryStream updatedPdf = new MemoryStream();  
updatedPdf.Write(Content.BinaryData,0, Content.BinaryData.Length);  
PdfReader pdfReader = new PdfReader(originalPdf);  
PdfStamper pdfStamper = new PdfStamper(pdfReader, updatedPdf);    

if (autoPrinting)
{
    pdfStamper.JavaScript = "this.print(true);\r";
}
else
{
    pdfStamper.JavaScript = null;
}

pdfStamper.Close();
pdfReader.Close();

Content.BinaryData = updatedPdf.ToArray();

1 Ответ

1 голос
/ 01 февраля 2011

Не записывайте оригинальный PDF в свой вывод. pdfStamper.close() сделает все запись для вас, даже в режиме добавления (который вы не используете).

Ваш код должен читать:

MemoryStream originalPdf = new MemoryStream(Content.BinaryData);
MemoryStream updatedPdf = new MemoryStream();

// Don't do that.
//updatedPdf.Write(Content.BinaryData,0, Content.BinaryData.Length);

PdfReader pdfReader = new PdfReader(originalPdf);
PdfStamper pdfStamper = new PdfStamper(pdfReader, updatedPdf); 

if (autoPrinting) {
  pdfStamper.JavaScript = "this.print(true);\r";
} else {
  pdfStamper.JavaScript = null;
}

pdfStamper.Close(); // this does it for you.
pdfReader.Close();

Content.BinaryData = updatedPdf.ToArray();

Я удивлен, что это "работает для вас". Если бы ничего другого, я ожидал бы, что JS потерпит неудачу, потому что смещения байтов были бы все неправильными ... фактически, все ваши смещения были бы все неправильными. Я думаю, что мое незнание C # показывает.

Но Write () ведет себя так, как я думал, поэтому я снова удивлен.

...