using System;
using System.Linq;
using System.Text.RegularExpressions;
public class EmptyLineRemover
{
public static string RemoveEmptyLinesLinq(string input)
{
if (string.IsNullOrEmpty(input)) return input;
return string.Join(
Environment.NewLine,
input.Split(new[] { Environment.NewLine }, StringSplitOptions.None)
.Where(line => !string.IsNullOrWhiteSpace(line))
);
}
public static string RemoveEmptyLinesRegex(string input)
{
if (string.IsNullOrEmpty(input)) return input;
return Regex.Replace(input, @"^\s*$\n|\r", "", RegexOptions.Multiline);
}
public static string RemoveEmptyLinesReader(string input)
{
if (string.IsNullOrEmpty(input)) return input;
using var reader = new System.IO.StringReader(input);
var result = new System.Text.StringBuilder();
string line;
bool isFirstNonEmptyLine = true;
while ((line = reader.ReadLine()) != null)
{
if (!string.IsNullOrWhiteSpace(line))
{
if (!isFirstNonEmptyLine)
{
result.AppendLine();
}
result.Append(line);
isFirstNonEmptyLine = false;
}
}
return result.ToString();
}
}
Visual Studio 2019で.NET Framework 4.7.2を使用している場合、PuppeteerSharpのBrowserFetcher().DownloadAsyncメソッドは動作しません。これは、PuppeteerSharpがasync/awaitに依存しており、.NET Framework環境では非同期メソッドのサポートに制限があるためです。
さらに、PuppeteerSharpの依存関係として、ヘッドレスブラウザ(Chromium)のダウンロード機能が含まれているため、これを手動で解決する必要があります。
対策方法
1. PuppeteerSharpの代わりにPuppeteerSharpを同期的に使用する方法
非同期処理を使わずにPuppeteerSharpを使用したい場合、BrowserFetcherを使わずにChromiumのパスを直接指定する方法があります。これにより、BrowserFetcher()の非同期ダウンロードを避け、手動でChromiumを準備できます。
2. 手動でChromiumをインストール
PuppeteerSharpを使うために、手動でChromiumをダウンロードして設定することができます。以下の手順に従ってください。
---
手動でChromiumをダウンロードする手順
1. Chromiumをダウンロード
PuppeteerSharpはChromiumを自動でダウンロードできますが、手動でChromiumをダウンロードすることも可能です。
以下のURLからChromiumをダウンロードします(Winのバージョンを選んでください):
Chromiumダウンロード
2. Chromiumのパスを指定
ダウンロードしたChromiumのパスを、PuppeteerSharpに指定します。これにより、BrowserFetcherによる自動ダウンロードを回避できます。
using PuppeteerSharp;
using System;
class Program
{
static void Main(string[] args)
{
string chromiumPath = @"C:\path\to\chromium\chrome.exe";
var options = new LaunchOptions
{
ExecutablePath = chromiumPath,
Headless = true
};
var browser = Puppeteer.LaunchAsync(options).GetAwaiter().GetResult();
var page = browser.NewPageAsync().GetAwaiter().GetResult();
page.GoToAsync("https://www.example.com").GetAwaiter().GetResult();
page.PdfAsync("output.pdf").GetAwaiter().GetResult();
Console.WriteLine("PDFが作成されました。");
browser.CloseAsync().GetAwaiter().GetResult();
}
}
---
3. PuppeteerSharpを同期的に動作させる方法
もし、async/awaitを使用できない環境であれば、GetAwaiter().GetResult()を使って非同期メソッドを同期的に実行できます。上記のコード例でも使用していますが、PuppeteerSharpがasyncメソッドであるため、非同期呼び出しを同期的に待機するには、次の方法で同期的に実行します。
GetAwaiter().GetResult()を使用して非同期メソッドを同期的に実行:
var browser = Puppeteer.LaunchAsync(options).GetAwaiter().GetResult();
---
まとめ
非同期処理を使わない場合、PuppeteerSharpのBrowserFetcher().DownloadAsyncを使用せず、手動でChromiumをダウンロードし、そのパスを指定して実行します。
GetAwaiter().GetResult() を使用することで、非同期処理を同期的に扱うことができます。
手動でChromiumをインストールしてPuppeteerSharpを使用する方法で解決できると思いますが、もし他の問題があればお知らせください。