From 9b7554c973c64227c9f145564a63715a285ea4db Mon Sep 17 00:00:00 2001 From: Eliot Jones Date: Thu, 27 Aug 2020 09:06:14 +0100 Subject: [PATCH] #203 enable utf16 be strings to be written to the document builder --- .../Writer/PdfDocumentBuilderTests.cs | 18 +++++++++++++++ src/UglyToad.PdfPig/Writer/TokenWriter.cs | 22 ++++++++++++++++++- 2 files changed, 39 insertions(+), 1 deletion(-) diff --git a/src/UglyToad.PdfPig.Tests/Writer/PdfDocumentBuilderTests.cs b/src/UglyToad.PdfPig.Tests/Writer/PdfDocumentBuilderTests.cs index 87125b32..8dc9cb89 100644 --- a/src/UglyToad.PdfPig.Tests/Writer/PdfDocumentBuilderTests.cs +++ b/src/UglyToad.PdfPig.Tests/Writer/PdfDocumentBuilderTests.cs @@ -570,6 +570,24 @@ } } + [Fact] + public void CanCreateDocumentInformationDictionaryWithNonAsciiCharacters() + { + const string littlePig = "маленький поросенок"; + var builder = new PdfDocumentBuilder(); + builder.DocumentInformation.Title = littlePig; + var page = builder.AddPage(PageSize.A4); + var font = builder.AddTrueTypeFont(TrueTypeTestHelper.GetFileBytes("Roboto-Regular.ttf")); + page.AddText(littlePig, 12, new PdfPoint(120, 600), font); + + var file = builder.Build(); + WriteFile(nameof(CanCreateDocumentInformationDictionaryWithNonAsciiCharacters), file); + using (var document = PdfDocument.Open(file)) + { + Assert.Equal(littlePig, document.Information.Title); + } + } + private static void WriteFile(string name, byte[] bytes, string extension = "pdf") { try diff --git a/src/UglyToad.PdfPig/Writer/TokenWriter.cs b/src/UglyToad.PdfPig/Writer/TokenWriter.cs index 458905c1..89f95944 100644 --- a/src/UglyToad.PdfPig/Writer/TokenWriter.cs +++ b/src/UglyToad.PdfPig/Writer/TokenWriter.cs @@ -368,8 +368,28 @@ private static void WriteString(StringToken stringToken, Stream outputStream) { + if (stringToken.EncodedWith == StringToken.Encoding.Iso88591) + { + var isUtf16 = false; + for (var i = 0; i < stringToken.Data.Length; i++) + { + var c = stringToken.Data[i]; + // Close enough. + if (c > 250) + { + isUtf16 = true; + break; + } + } + + if (isUtf16) + { + stringToken = new StringToken(stringToken.Data, StringToken.Encoding.Utf16BE); + } + } + outputStream.WriteByte(StringStart); - var bytes = OtherEncodings.StringAsLatin1Bytes(stringToken.Data); + var bytes = stringToken.GetBytes(); outputStream.Write(bytes, 0, bytes.Length); outputStream.WriteByte(StringEnd);