Last active
October 3, 2023 12:07
-
-
Save Benshi/2693d42eb6fbd5ec9601d14845783bd0 to your computer and use it in GitHub Desktop.
PDF ファイルを TIFF 画像に変換する
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
'NuGet で「Microsoft.Windows.SDK.Contracts」を参照しておく | |
Option Strict On | |
Imports System.Drawing.Imaging | |
Imports System.IO | |
Imports System.Linq | |
Imports Windows.Data.Pdf | |
Public Class Form1 | |
Private Const WICTiffEncoder As String = "0131be10-2001-4c5f-a9b0-cc88fab64ce8" | |
''' <summary> | |
''' PDF ファイルを TIFF 画像に変換する | |
''' </summary> | |
Private Async Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click | |
Button1.Enabled = False | |
Dim pdf As String = "D:\example.pdf" | |
Dim tif As String = "D:\example.tiff" | |
Using pdfFile As New FileStream(pdf, FileMode.Open, FileAccess.Read), | |
pdfStream = pdfFile.AsRandomAccessStream() | |
Dim pdfDoc = Await PdfDocument.LoadFromStreamAsync(pdfStream) | |
'最初のページを保存する | |
Using page = pdfDoc.GetPage(0UI), | |
tifFile = File.OpenWrite(tif), | |
tifStream = tifFile.AsRandomAccessStream() | |
Dim opt As New PdfPageRenderOptions() 'With {.BitmapEncoderId = Guid.Parse(WICTiffEncoder)} | |
opt.IsIgnoringHighContrast = True | |
'出力する幅や高さは、0 のままにしておけば自動的に決定されるのだが | |
'解像度を変更したい場合は、ページごとに幅と高さをセットすることができる | |
opt.DestinationHeight = CUInt(page.Size.Height * 3) | |
opt.DestinationWidth = CUInt(page.Size.Width * 3) | |
''背景色は、既定では不透明白(255, 255, 255, 255) になっているが | |
''他の色、たとえば透明色を指定することも可能 | |
'opt.BackgroundColor = Windows.UI.Color.FromArgb(0, 255, 255, 255) | |
Await page.RenderToStreamAsync(tifStream, opt) | |
Await tifStream.FlushAsync() | |
End Using | |
Using tiffImage As New Bitmap(New MemoryStream(File.ReadAllBytes(tif))) | |
' dpi 指定は省略可能だが、明示したい場合は最初に呼んでおく必要がある | |
tiffImage.SetResolution(300.0F, 300.0F) | |
Dim tiffICI As ImageCodecInfo = ImageCodecInfo.GetImageEncoders().First(Function(enc) enc.MimeType = "image/tiff") | |
'最初のページは MultiFrame で Save する | |
'色深度は省略可能だが、指定する場合は 1, 4, 8, 24, 32 の中から指定する | |
'圧縮指定は省略可能だが、None, LZW, Rle, CCITT3, CCITT4 の中から指定する | |
Dim epMultiFrame As New EncoderParameters() With {.Param = { | |
New EncoderParameter(Encoder.Compression, CLng(EncoderValue.CompressionLZW)), | |
New EncoderParameter(Encoder.ColorDepth, 8L), | |
New EncoderParameter(Encoder.SaveFlag, CLng(EncoderValue.MultiFrame)) | |
}} | |
tiffImage.Save(tif, tiffICI, epMultiFrame) | |
'2 ページ目以降 | |
For p = 1UI To pdfDoc.PageCount - 1UI | |
Using page = pdfDoc.GetPage(p), | |
pageMemory = New MemoryStream(), | |
tifStream = pageMemory.AsRandomAccessStream() | |
Dim opt As New PdfPageRenderOptions() 'With {.BitmapEncoderId = Guid.Parse(WICTiffEncoder)} | |
opt.IsIgnoringHighContrast = True | |
'出力する幅や高さは、0 のままにしておけば自動的に決定されるのだが | |
'解像度を変更したい場合は、ページごとに幅と高さをセットすることができる | |
opt.DestinationHeight = CUInt(page.Size.Height * 3) | |
opt.DestinationWidth = CUInt(page.Size.Width * 3) | |
''背景色は、既定では不透明白(255, 255, 255, 255) になっているが | |
''他の色、たとえば透明色を指定することも可能 | |
'opt.BackgroundColor = Windows.UI.Color.FromArgb(0, 255, 255, 255) | |
Await page.RenderToStreamAsync(tifStream, opt) | |
Await tifStream.FlushAsync() | |
Using pageImage = Image.FromStream(pageMemory) | |
'2ページ目以降は FrameDimensionPage で PageAdd する | |
Dim epFrameDimensionPage As New EncoderParameters() With {.Param = {New EncoderParameter(Encoder.SaveFlag, CLng(EncoderValue.FrameDimensionPage))}} | |
tiffImage.SaveAdd(pageImage, epFrameDimensionPage) | |
End Using | |
End Using | |
Next | |
' 全ページを追加したら、Flush を PageAdd する | |
Dim epFlush As New EncoderParameters() With {.Param = {New EncoderParameter(Encoder.SaveFlag, CLng(EncoderValue.Flush))}} | |
tiffImage.SaveAdd(epFlush) | |
End Using | |
End Using | |
Button1.Enabled = True | |
'保存した TIFF 画像を開く | |
Process.Start(tif) | |
End Sub | |
End Class |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
上記の対象 OS は
Windows 10 Version 1803 (Build 17134)
以降となります。また、
packages.config
ではなくPackageReference
を使うことになるため、Visual Studio 2017 バージョン 15.7 以降または
Visual Studio 2019 バージョン 16.0 以降が必要です。
Visual Studio 2022 以降でももちろん OK ですが、上記未満だと動作しません。
PackageRerence
に設定する「.NET Framework 4.6.1 以上 4.8 以下」または「.NET Core 3.0 / 3.1」「.NET 5」「.NET 6 Preview」とします。
Microsoft.Windows.SDK.Contracts
を検索する。