mirror of
https://github.com/UglyToad/PdfPig.git
synced 2025-07-16 11:48:56 +08:00
109 lines
4.6 KiB
C#
109 lines
4.6 KiB
C#
namespace UglyToad.PdfPig.Tests.Integration
|
||
{
|
||
using UglyToad.PdfPig.Content;
|
||
using UglyToad.PdfPig.Outline;
|
||
using UglyToad.PdfPig.Outline.Destinations;
|
||
using UglyToad.PdfPig.Writer;
|
||
|
||
public class NonAsciiCharactersBookmarksTests
|
||
{
|
||
[Theory]
|
||
[MemberData(nameof(TestData.TestData_Pass), MemberType = typeof(TestData))]
|
||
[MemberData(nameof(TestData.TestData_Failed), MemberType = typeof(TestData))]
|
||
public void CanGetBookmarks(string words)
|
||
{
|
||
using var builder = new PdfDocumentBuilder();
|
||
builder.AddPage(PageSize.A4);
|
||
|
||
// Set bookmark items.
|
||
var inputs = words.Split(" ", StringSplitOptions.RemoveEmptyEntries);
|
||
builder.Bookmarks = new Bookmarks(inputs.Select(x => new DocumentBookmarkNode(x,
|
||
0,
|
||
new ExplicitDestination(1,
|
||
ExplicitDestinationType.XyzCoordinates,
|
||
ExplicitDestinationCoordinates.Empty),
|
||
Array.Empty<BookmarkNode>())).ToArray());
|
||
|
||
// Build PDF data
|
||
var bytes = builder.Build();
|
||
|
||
// Read PDF from bytes. And read bookmark data.
|
||
using var doc = PdfDocument.Open(bytes);
|
||
bool isSuccess = doc.TryGetBookmarks(out var bookmarks);
|
||
|
||
// Assert
|
||
Assert.True(isSuccess);
|
||
var results = bookmarks.GetNodes().Select(x => x.Title).ToArray();
|
||
Assert.Equivalent(inputs, results);
|
||
}
|
||
|
||
private static class TestData
|
||
{
|
||
public static TheoryData<string> TestData_Failed = new TheoryData<string>
|
||
{
|
||
"ШЩHI차岸岩還館小少尚",
|
||
"A Ш Z", // CYRILLIC CAPITAL LETTER
|
||
"AШZ", // CYRILLIC CAPITAL LETTER
|
||
"A Щ Z", // CYRILLIC CAPITAL LETTER
|
||
"AЩZ", // CYRILLIC CAPITAL LETTER
|
||
"H I", // FULLWIDTH LATIN CAPITAL LETTER A
|
||
"HI", // FULLWIDTH LATIN CAPITAL LETTER A
|
||
"차", // HANGUL
|
||
"岸 岩", // KANJI
|
||
"岸岩", // KANJI
|
||
"還 館", // KANJI
|
||
"還館", // KANJI
|
||
"小 少 尚", // KANJI
|
||
"小少尚", // KANJI
|
||
};
|
||
|
||
public static TheoryData<string> TestData_Pass = new TheoryData<string>
|
||
{
|
||
// FRENCH Alphabet Diacritics and ligatures
|
||
"É À È Ù Â Ê Î Ô Û Ë Ï Ü Ç Œ Æ",
|
||
"é à è ù â ê î ô û ë ï ü ç œ æ",
|
||
|
||
// GREEK Alphabet
|
||
"Α Β Γ Δ Ε Ζ Η Θ Ι Κ Λ Μ Ν Ξ Ο Π Ρ Σ Τ Υ Φ Χ Ψ Ω",
|
||
"α β γ δ ε ζ η θ ι κ λ μ ν ξ ο π ρ σ τ υ φ χ ψ ω",
|
||
|
||
// CYRILLIC CAPITAL LETTER
|
||
// "А Б В Г Д Е Ж З И К Л М Н О П Р С Т У Ф Х Ц Ч Ш Щ Ы Э Ю Я",
|
||
|
||
// CYRILLIC SMALL LETTER
|
||
"а б в г д е ж з и к л м н о п р с т у ф х ц ч ш щ ы э ю я",
|
||
|
||
// HANGUL CHOSEONG
|
||
"ㄱ ㄴ ㄷ ㄹ ㅁ ㅂ ㅅ ㅇ ㅈ ㅊ ㅋ ㅌ ㅍ ㅎ",
|
||
|
||
// HANGUL GANADA
|
||
//"가 나 다 라 마 바 사 아 자 차 카 타 파 하",
|
||
|
||
// FULLWIDTH LATIN CAPITAL LETTER
|
||
// "A B C D E F G H I J K L M N O P Q R S T U V W X Y Z",
|
||
|
||
// FULLWIDTH LATIN SMALL LETTER
|
||
"a b c d e f g h i j k l m n o p q r s t u v w x y z",
|
||
|
||
// Halfwidth Katakana
|
||
"ア イ ウ エ オ カ キ ク ケ コ サ シ ス セ ソ タ チ ツ テ ト ナ ニ ヌ ネ ノ ハ ヒ フ ヘ ホ マ ミ ム メ モ ヤ ユ ヨ ラ リ ル レ ロ ワ ヲ ン",
|
||
|
||
// Fullwidth Katakana
|
||
"ア イ ウ エ オ カ キ ク ケ コ サ シ ス セ ソ タ チ ツ テ ト ナ ニ ヌ ネ ノ ハ ヒ フ ヘ ホ マ ミ ム メ モ ヤ ユ ヨ ラ リ ル レ ロ ワ ヲ ン",
|
||
|
||
// Fullwidth Hiragana
|
||
"あ い う え お か き く け こ さ し す せ そ た ち つ て と な に ぬ ね の は ひ ふ へ ほ ま み む め も や ゆ よ ら り る れ ろ わ を ん",
|
||
|
||
// Kanji (Surrogate Pair)
|
||
"𩸽 𩹉 𡵅",
|
||
|
||
// Emoji
|
||
"🏠 🚗 📝",
|
||
|
||
// Emoji (with ZWJ Sequences)
|
||
"👨💻 👁🗨 😶🌫️"
|
||
};
|
||
}
|
||
}
|
||
}
|