Skip to content

Instantly share code, notes, and snippets.

@Benshi
Last active October 3, 2023 12:07
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save Benshi/2693d42eb6fbd5ec9601d14845783bd0 to your computer and use it in GitHub Desktop.
Save Benshi/2693d42eb6fbd5ec9601d14845783bd0 to your computer and use it in GitHub Desktop.
PDF ファイルを TIFF 画像に変換する
'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
@Benshi
Copy link
Author

Benshi commented Aug 3, 2021

上記の対象 OS は Windows 10 Version 1803 (Build 17134) 以降となります。

また、packages.config ではなく PackageReference を使うことになるため、
Visual Studio 2017 バージョン 15.7 以降または
Visual Studio 2019 バージョン 16.0 以降が必要です。
Visual Studio 2022 以降でももちろん OK ですが、上記未満だと動作しません。

  1. [ツール]-[オプション] ダイアログを開く。
  2. オプションダイアログから [NuGet パッケージ マネージャー]-[全般]で、既定のパッケージ管理形式を PackageRerence に設定する
  3. この状態で新規に Windows Forms アプリケーションを作成。ターゲット フレームワークとしては
     「.NET Framework 4.6.1 以上 4.8 以下」または「.NET Core 3.0 / 3.1」「.NET 5」「.NET 6 Preview」とします。
  4. [ツール]-[NuGet パッケージ マネージャー]-[ソリューションの NuGet パッケージの管理]で、nuget.org から Microsoft.Windows.SDK.Contracts を検索する。
  5. この時、右側ペインのバージョン一覧から OS 環境に沿ったものを選択する。
Version Target OS
10.0.19041.1 Win10 version 2004 (Build 19041) 以降
10.0.18362.2005 Win10 version 1903 (Build 18362) / 1909 (Build 18363)
10.0.17763.1000 Win10 version 1809 (Build 17763)
10.0.17134.1000 Win10 version 1803 (Build 17134)
  1. Form1 に Button1 を貼ってコードを記載。

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment