|
■No54026 (もりお さん) に返信
返信ありがとうございます。
もりおさんのご要望通りPDF結合部分のコードを公表します。
PDFの結合部分は別のClassで処理を行っております。
「Private Class ClsUnionPdf」がPDF結合部分のClass
「Public Function UnionPdf」が最上位のメソッド
「PdfOutPut」が実際にPDFを結合している部分になります。
---------------------------------
Private Class ClsUnionPdf
' 戻り値:結合したPDFファイルのファイルサイズ(結合しない場合は0)
Public Function UnionPdf(ByVal strProcessCode As String, ByVal strMode As String, ByVal strOutputFilePath As String) As String
Dim TempDirectoryControl As DirectoryControl
Dim DeleteFileControl As FileControl
Dim strViewFile As String()
Dim strInputPath(38) As String
Dim pdfFormat As PdfReader
Dim dc As Document
Dim fs1 As FileStream
Dim wr1 As PdfWriter
Dim pcb As PdfContentByte
Dim common As New Common
Dim FormatPageSize As Rectangle
Dim FormatWidth As Single
Dim FormatHeight As Single
Dim fi As System.IO.FileInfo
Dim strSampleFileNames As String()
Dim lngPageNo As Long
Dim fntFooter As Font
Dim strDeleteFilePath(9) As String
Dim OpenFileOrDirCheck As New OpenFileOrDirCheck
Dim intForCnt As Integer
'ファイルの読み込みパターンの決定
frmMainG0401_03.CasePattern(strProcessCode, strInputPath, strMode)
TempDirectoryControl = New DirectoryControl(frmMainG0401_03.strTempFilePath)
If TempDirectoryControl.GetSameNameFileAmount(frmMainG0401_03.strTempFileName) > 0 Then
TempDirectoryControl.DeleteFileFromDirectory(frmMainG0401_03.strTempFileName)
End If
TempDirectoryControl = Nothing
' フッターのフォント
fntFooter = New Font(com.lowagie.text.Font.BOLD, 10)
strSampleFileNames = System.IO.Directory.GetFiles(System.AppDomain.CurrentDomain.BaseDirectory() & "\ShipData\" & My.Settings.cfgSHIP_DATA & "\00_index")
pdfFormat = New PdfReader(strSampleFileNames(0))
' 出力用PDFオブジェクトの生成
dc = New Document(pdfFormat.getPageSizeWithRotation(1))
' 出力用PDFファイルのオープン
fs1 = New FileStream(frmMainG0401_03.strTempFilePath & "\" & frmMainG0401_03.strTempFileName, FileMode.Create, FileAccess.Write, FileShare.Write)
' 出力用PDFオブジェクトとPDFファイルの関連付け
wr1 = PdfWriter.getInstance(dc, fs1)
' PDF出力開始
dc.open()
' PdfContentByte取得
pcb = wr1.getDirectContent()
FormatPageSize = pdfFormat.getPageSize(1)
FormatWidth = FormatPageSize.width()
FormatHeight = FormatPageSize.height()
strViewFile = Nothing
'PDF出力部分(全フォルダを抽出)
For intForCnt = 0 To strInputPath.Length - 1
frmMainG0401_03.PdfOutPut(intForCnt, lngPageNo, strInputPath, strViewFile, FormatWidth, FormatHeight, fntFooter, dc, wr1, pcb)
Next
' PDF出力終了
dc.close()
fs1.Close()
fs1.Dispose()
pdfFormat.close()
DeleteFileControl = New FileControl(strOutputFilePath)
If DeleteFileControl.IsFileExist = True Then
DeleteFileControl.DeleteFile()
End If
DeleteFileControl = Nothing
System.IO.File.Copy(frmMainG0401_03.strTempFilePath & "\" & frmMainG0401_03.strTempFileName, strOutputFilePath)
'ファイルのサイズを取得
fi = New System.IO.FileInfo(strOutputFilePath)
UnionPdf2 = fi.Length
End Function
End Class
=================================
Public Sub PdfOutPut(ByVal j As Integer, _
ByRef lngPageNo As Long, _
ByRef strInputPath() As String, _
ByRef strViewFile() As String, _
ByVal FormatWidth As Single, _
ByVal FormatHeight As Single, _
ByVal fntFooter As Font, _
ByRef dc As Document, _
ByVal wr1 As PdfWriter, _
ByRef pcb As PdfContentByte)
Dim common As New Common
Dim NewWidthSize As Single
Dim NewHeightSize As Single
Dim rd As PdfReader
Dim blnPdfOverSize
Dim PageSize As Rectangle
Dim Width As Single
Dim Height As Single
Dim pn As Integer
Dim pip As PdfImportedPage
If j <= 27 Or j > 34 Then
lngPageNo = 0
End If
' 対象のディレクトリ直下にある、ファイル名に「.」を含むすべてのファイルのパスを配列で取得。
strViewFile = System.IO.Directory.GetFiles(System.AppDomain.CurrentDomain.BaseDirectory() & "\ShipData\" & My.Settings.cfgSHIP_DATA & "\" & strInputPath(j), "*.pdf", IO.SearchOption.TopDirectoryOnly)
' 入力用PDFファイル毎の処理
For p = 0 To strViewFile.Length - 1
If strInputPath(j) = "" Then
Exit For
End If
' 入力用PDFファイルのオープン
rd = New PdfReader(strViewFile(p))
blnPdfOverSize = False
'ページの用紙サイズを取得する
PageSize = rd.getPageSize(1)
Width = PageSize.width()
Height = PageSize.height()
NewWidthSize = 1
NewHeightSize = 1
If Width > FormatWidth Then
NewWidthSize = (Math.Floor(FormatWidth / Width * 100) / 100)
blnPdfOverSize = True
End If
If Height > FormatHeight Then
NewHeightSize = (Math.Floor(FormatHeight / Height * 100) / 100)
blnPdfOverSize = True
End If
' 入力用PDFファイルのページ数取得
pn = rd.getNumberOfPages()
' PDF出力処理
For i As Integer = 1 To pn
'フッター 埋込処理
SetFooter(j, lngPageNo, fntFooter, dc, i)
' 改ページ
dc.newPage()
' ページ取得
pip = wr1.getImportedPage(rd, i)
' ページ出力
If j = 0 Or j = 1 Or j = 2 Or j = 4 Or j = 6 Or j = 8 Or j = 10 Or j = 12 Or j = 14 Or j = 16 Or j >= 20 Then
pcb.addTemplate(pip, 1, 0, 0, 1, 0, 0)
Else
If blnPdfOverSize = True Then
If NewHeightSize >= NewWidthSize Then
pcb.addTemplate(pip, NewWidthSize - 0.1, 0, 0, NewWidthSize - 0.1, 0, 50)
Else
pcb.addTemplate(pip, NewHeightSize - 0.1, 0, 0, NewHeightSize - 0.1, 0, 50)
End If
Else
pcb.addTemplate(pip, 0.9F, 0, 0, 0.9F, 0, 50)
End If
End If
Next
rd.close()
rd = Nothing
Next
End Sub
---------------------------------
何かお気づきの点がございましたら、ご教授ください。
|