J

using System;
using System.Linq;
using System.Text.RegularExpressions;

public class EmptyLineRemover
{
    // 方法1: LINQ を使用
    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))
        );
    }

    // 方法2: 正規表現を使用
    public static string RemoveEmptyLinesRegex(string input)
    {
        if (string.IsNullOrEmpty(input)) return input;
        
        return Regex.Replace(input, @"^\s*$\n|\r", "", RegexOptions.Multiline);
    }

    // 方法3: StringReader を使用
    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)
    {
        // 手動でダウンロードしたChromiumのパスを指定
        string chromiumPath = @"C:\path\to\chromium\chrome.exe";

        var options = new LaunchOptions
        {
            ExecutablePath = chromiumPath, // Chromiumのパスを指定
            Headless = true // ヘッドレスモード
        };

        var browser = Puppeteer.LaunchAsync(options).GetAwaiter().GetResult();
        var page = browser.NewPageAsync().GetAwaiter().GetResult();

        // ページにアクセスしてPDFに変換
        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を使用する方法で解決できると思いますが、もし他の問題があればお知らせください。

いいなと思ったら応援しよう!