Следующий код использует PDFSharp для разделения страниц PDF-документов на страницы меньше A4 и страницы больше A3:
''' <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-файлы, созданные на диске, и они правильные, т.е. каждый раз разные.
Но файл, загруженный в первом операторе использования XPdfForm.FromFile(ParentPdf.FullPath)
, никогда не меняется. Как будто код понимает, что путь к файлу не меняется, и поэтому решает не перезагружать файл.
Я думал, что использование оператора using
гарантирует, что переменная будет удалена в конце, и поэтому файл будет каждый раз перезагружаться заново. Я неправильно понимаю? Или что здесь происходит?
Кстати, я обошел это, сохранив каждый файл PDF под другим именем файла. Вот почему я думаю, что переменная из используемого блока используется повторно каждый раз на основе имени файла...
using
имя файла не должно иметь значения, верно? - person yu_ominae   schedule 01.12.2013