Вам нужен Adobe PDF, установленный на сервере для работы с iTextSharp? - PullRequest
1 голос
/ 29 февраля 2012

Я разработал решение на моей машине для разработки, где оно:

  1. Открывает PDF-файлы для файлового пути на стороне сервера через C #
  2. Объединяет их вместе
  3. Делает Response.BinaryWrite, чтобы отправить в браузер объединенный PDF

Отлично работает на локальном DEV. При отправке на сервер он получает некоторую «бинарную тарабарщину» в окне браузера.

Adobe или Foxit Reader НЕ установлены на сервере, однако они установлены на моем локальном компьютере разработчика. Насколько я понимаю, iTextSharp позволил вам вообще не устанавливать программы для чтения PDF, но так ли это? Или, может быть, это вещь IIS, где .pdf не указан как тип файла ...

Вот пример кода:

 // First set up the response and let the browser know a PDF is coming
            context.Response.Buffer = true;
            context.Response.ContentType = "application/pdf";
            context.Response.AddHeader("Content-Disposition", "inline");

            List<string> PDFs = new List<string>();
            PDFs.Add(@"c:\users\shane\documents\visual studio 2010\Projects\PDFMultiPrintTester\PDFMultiPrintTester\TEST1.pdf");
            PDFs.Add(@"c:\users\shane\documents\visual studio 2010\Projects\PDFMultiPrintTester\PDFMultiPrintTester\TEST2.pdf");
            PDFs.Add(@"c:\users\shane\documents\visual studio 2010\Projects\PDFMultiPrintTester\PDFMultiPrintTester\TEST3.pdf");

            // Second, some setup stuff
            System.IO.MemoryStream MemStream = new System.IO.MemoryStream();
            iTextSharp.text.Document doc = new iTextSharp.text.Document();
            iTextSharp.text.pdf.PdfReader reader = default(iTextSharp.text.pdf.PdfReader);
            int numberOfPages = 0;
            int currentPageNumber = 0;
            iTextSharp.text.pdf.PdfWriter writer = iTextSharp.text.pdf.PdfWriter.GetInstance(doc, MemStream);
            doc.Open();
            iTextSharp.text.pdf.PdfContentByte cb = writer.DirectContent;
            iTextSharp.text.pdf.PdfImportedPage page = default(iTextSharp.text.pdf.PdfImportedPage);
            int rotation = 0;

            foreach (string f in PDFs)
            {
                // Third, append all the PDFs--THIS IS THE MAGIC PART
                byte[] sqlbytes = null;
                sqlbytes = ReadFile(f);
                reader = new iTextSharp.text.pdf.PdfReader(sqlbytes);
                numberOfPages = reader.NumberOfPages;
                currentPageNumber = 0;

                while ((currentPageNumber < numberOfPages))
                {
                    currentPageNumber += 1;
                    doc.SetPageSize(PageSize.LETTER);
                    doc.NewPage();
                    page = writer.GetImportedPage(reader, currentPageNumber);
                    rotation = reader.GetPageRotation(currentPageNumber);
                    if ((rotation == 90) | (rotation == 270))
                    {
                        cb.AddTemplate(page, 0, -1f, 1f, 0, 0, reader.GetPageSizeWithRotation(currentPageNumber).Height);
                    }
                    else
                    {
                        cb.AddTemplate(page, 1f, 0, 0, 1f, 0, 0);
                    }
                }
            }

            // Finally Spit the stream out
            if (MemStream == null)
            {
                context.Response.Write("No Data is available for output");
            }
            else
            {
                doc.Close();
                context.Response.BinaryWrite(MemStream.GetBuffer());
                context.Response.End();
                MemStream.Close();
            }
        }
    }

    public static byte[] ReadFile(string filePath)
    {
        byte[] buffer;
        FileStream fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read);
        try
        {
            int length = (int)fileStream.Length;  // get file length
            buffer = new byte[length];            // create buffer
            int count;                            // actual number of bytes read
            int sum = 0;                          // total number of bytes read

            // read until Read method returns 0 (end of the stream has been reached)
            while ((count = fileStream.Read(buffer, sum, length - sum)) > 0)
                sum += count;  // sum is a buffer offset for next reading
        }
        finally
        {
            fileStream.Close();
        }
        return buffer;
    }

Ответы [ 3 ]

1 голос
/ 29 февраля 2012

Насколько я понимаю, iTextSharp позволил вам вообще не устанавливать программы чтения PDF, но делает ли это?

iTextSharp используется для генерации файлов PDF.Это не имеет ничего общего с тем, как эти файлы просматриваются.Если на клиентском компьютере не установлено приложение для чтения PDF-файлов, которое просматривает приложение, передающее этот PDF-файл в ответе, не ожидайте, что на этом клиентском компьютере будет получено что-то кроме фальши.

К сожалению, у вас нетНе показан код, который используется для создания этого PDF-файла на сервере, поэтому трудно сказать, может ли проблема быть как-то связана с ним.Важно установить для ContentType ответа значение application/pdf и отправить в ответ действительный файл PDF.То, как этот ответ интерпретируется на клиенте, будет в значительной степени зависеть от используемого браузера и различных плагинов и программ для чтения PDF, установленных на этом клиентском компьютере.

0 голосов
/ 29 февраля 2012

Наконец-то разобрался. Вам не требуется Adobe PDF Reader или Foxit Reader, установленные на сервере. Вам нужен только iTextReader, установленный на сервере (я имею в виду, что сборка существует в вашем решении). Что вам нужно, это MIME Type в IIS. Мы должны были добавить этот тип MIME, и он сразу же сработал. Забавно, что даже с этим, Chrome смог понять это и правильно отобразить. Я предполагаю, что IIS устанавливает правильные заголовки, которые связаны с этим MIME-типом, а этого не происходит. IE8 не мог понять это.

0 голосов
/ 29 февраля 2012

Возможно, вам придется установить Response.ContentType на application/pdf. См. соответствующий пост SO .

При рендеринге Content-Disposition: inline в IE используется плагин Adobe - «Adobe PDF Link Helper» ( или FoxIt Reader ). Поскольку у вас, вероятно, нет этого подключаемого модуля ActiveX на вашем сервере (AcroIEHelperShim.dll), он просто отобразит содержимое байта как text/html, поскольку у него нет встроенного интерпретатора.

...