
はじめに
今日、同僚から「入手したPDFファイルが既存のソフトウェアフローに合わない。PDFファイルを画像に変換できないか?」と言われました。早速取り掛かりました。以前、PDFファイル関連のコンポーネントを研究していたことがあるので、GitHubで以前スターを付けたリポジトリ、PdfiumViewerのオープンソースアドレスを探しました: https://github.com/pvginkel/PdfiumViewer:

まず、NuGet で PdfiumViewer と ImageResizer.Plugins.PdfiumRenderer.Pdfium.Dll をインストールします。

要件に対して、操作対象となるオブジェクトがどのようなプロパティを持つかを理解すべきです。
それでは、PDFファイルを取得したら、PDFにはページ数、ファイルの高さや幅などのプロパティがあることを知っておく必要があります。
画像については、高さ、幅(解像度)、水平解像度と垂直解像度(dpi)などのプロパティが重要です。
これらのプロパティを理解したら、作業を開始できます。最初のステップは、PDFファイルを読み込み、ファイルのページ数とサイズを取得することです。
var pdf = PdfiumViewer.PdfDocument.Load(strpdfPath);
var pdfpage = pdf.PageCount;
var pagesizes = pdf.PageSizes;
次に、画像の高さ、幅、水平解像度、垂直解像度などのプロパティを組み立てます。
document.Render(pageNumber - 1, size.Width, size.Height, dpi, dpi, PdfRenderFlags.Annotations);
最後に、画像を保存します。
image.Save(stream, ImageFormat.Jpeg);
完全なコードは以下の通りです。
public class PdfToImage
{
/// <summary>
///
/// </summary>
/// <param name="filePath">PDFファイルパス</param>
/// <param name="picPath">画像ファイルパス</param>
public void PdfToPic(string filePath, string picPath)
{
var pdf = PdfiumViewer.PdfDocument.Load(filePath);
var pdfpage = pdf.PageCount;
var pagesizes = pdf.PageSizes;
for (int i = 1; i <= pdfpage; i++)
{
Size size = new Size();
size.Height = (int)pagesizes[(i - 1)].Height;
size.Width = (int)pagesizes[(i - 1)].Width;
// ".jpg" は他の形式に変更可能
RenderPage(filePath, i, size, picPath);
}
}
private void RenderPage(string pdfPath, int pageNumber, System.Drawing.Size size, string outputPath, int dpi = 300)
{
using (var document = PdfiumViewer.PdfDocument.Load(pdfPath))
using (var stream = new FileStream(outputPath, FileMode.Create))
using (var image = GetPageImage(pageNumber, size, document, dpi))
{
image.Save(stream, ImageFormat.Jpeg);
}
}
private static System.Drawing.Image GetPageImage(int pageNumber, Size size, PdfiumViewer.PdfDocument document, int dpi)
{
return document.Render(pageNumber - 1, size.Width, size.Height, dpi, dpi, PdfRenderFlags.Annotations);
}
}