2013-12-01 1 views
0

Следующий код использует PDFsharp разделить из страниц PDF-документов на страницы, которые меньше, чем А4 и страницы, которые больше, чем A3:Использования о переменном повторном использовании с PDFsharp

''' <summary> 
''' Process the list of pdfs 
''' </summary> 
Public Sub ProcessPdfs() 

    Dim tempPath As String 

    ' Code omitted 

    ' Generate a temporary path in case pdfs need to be saved 
    If String.IsNullOrEmpty(Me.tempFolder) OrElse Not Directory.Exists(Me.tempFolder) Then 
     tempFolder = Path.GetTempPath() 
    End If 
    tempPath = Path.Combine(Me.tempFolder, Path.GetRandomFileName + ".pdf") 

    ' Loop through the pages of the pdfs and process each page in turn. Processing involves 
    ' determining the size of the page, then shrinking, adding the footer and then adding to 
    ' the appropriate output pdf 
    For Each referenceNumber As String In Me.Pdfs.Keys 
     For Each pdf As PdfDocument In Me.Pdfs(referenceNumber) 
      ' Save the pdf to disk for PDFSharp to be able to read it properly 
      If String.IsNullOrEmpty(pdf.FullPath) Then 
       pdf.Save(tempPath) 
       pdf = PdfReader.Open(tempPath) 
      End If 
      For Each page As PdfPage In pdf.Pages 

       ' Code omitted 

       Select Case pageArea 
        Case Is <= a4PageArea 
         Call AddPage(referenceNumber, pdf, page, PageSize.A4) 
        Case Else 
         Call AddPage(referenceNumber, pdf, page, PageSize.A3) 
       End Select 
      Next 
     Next 
    Next 

    ' Code omitted 

    ' Delete temporary pdfs if there are any 
    If File.Exists(tempPath) Then 
     File.Delete(tempPath) 
    End If 

End Sub 

''' <summary> 
''' Add the specified page to the specified output document 
''' </summary> 
''' <returns>The page which was added to the output pdf</returns> 
Private Function AddPage(ByVal ReferenceNumber As String, ByVal ParentPdf As PdfDocument, ByVal ParentPdfPage As PdfPage, ByVal PageSize As PageSize) As PdfPage 

    ' Code omitted 

    ' Copy the specified page onto thew newly created page 
    Using parentForm As XPdfForm = XPdfForm.FromFile(ParentPdf.FullPath) 
     parentForm.PageIndex = ParentPdf.Pages.Cast(Of PdfPage)().ToList().IndexOf(ParentPdfPage) 
     scaleFactor = 1 
     ' Create PdfSharp graphics object with which to write onto the page 
     Using graphics As XGraphics = XGraphics.FromPdfPage(outputPdfPage) 
      graphics.SmoothingMode = XSmoothingMode.HighQuality 

      ' Code omitted 

      ' Draw the page 
      Call graphics.DrawImage(parentForm, targetRect) 
     End Using 
    End Using 

    Return outputPdfPage 

End Function 

Что это делает возьмите pdf, прочитайте страницу esch и затем масштабируйте ее так, чтобы она соответствовала размеру страницы, на которую она должна быть напечатана.

У PDFSharp есть проблемы с открытием документов, которые были созданы в Adobe v6, поэтому я использую iTextSharp для восстановления PDF в версии, которую может открыть PDFSharp. Эти PDF-файлы перестраиваются в памяти, и по какой-то причине они должны быть записаны на диск, чтобы PDFSharp обрабатывал их соответствующим образом.

В ProcessPdfs() Я проверяю, имеет ли файл PDF физический путь, и если я не сохраню его во временном местоположении.

Проблема, которую я обнаружил, заключается в том, что AddPage(), похоже, постоянно работает с одним и тем же pdf. Я проверил временные файлы PDF, созданные на диске, и они правильные, т. Е. Каждый раз.

Но файл, загруженный в первый оператор using XPdfForm.FromFile(ParentPdf.FullPath), никогда не изменяется. Как будто код понимает, что путь к файлу не изменяется и поэтому решает не перезагружать файл.

Я думал, что использование инструкции using гарантирует, что переменная будет удалена в конце, и поэтому файл будет перезагружаться заново каждый раз. Я не понимаю? Или что здесь происходит?

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

+0

Нет, переменная не используется повторно. Вполне возможно, что создается новый экземпляр (объект), который указывает на тот же файл на диске. –

+0

Но тогда это должно быть хорошо, так как файл был перезаписан следующим pdf на этом этапе, не так ли? Я проверил его, открыв файл вручную между обработанным. Тем не менее, контент имеет правильные размеры страниц, но содержание каждой страницы - это тот самый первый pdf-файл, который нужно обработать. –

+0

Вы можете попробовать явно удалить файл после того, как он закончил с помощью pdf sharp, но я бы сказал, что имя каждого файла, которое у вас есть, проще и, вероятно, быстрее, и вы можете его использовать. –

ответ

0

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

Кэш-поток является локальным.

Так что это не ошибка, это особенность.

Должно быть возможно использовать потоки вместо файлов.

+0

Спасибо за ответ. Я думал, что это возможно, но не смог найти это в исходном коде. Хорошо знать. У меня были проблемы с потоками.Он загружал бы содержимое, но игнорировал свойства страницы, как описано в вопросе, который я разместил здесь: http://stackoverflow.com/questions/19869739/page-size-and-orientation-issues-when-using-pdfsharp-workaround -to-open-v6-pdfs Довольно уверен, что это неправильное поведение ... –

 Смежные вопросы

  • Нет связанных вопросов^_^