David PHAM-VAN

Improve PdfName conformance

@@ -315,7 +315,27 @@ class PdfName extends PdfDataType { @@ -315,7 +315,27 @@ class PdfName extends PdfDataType {
315 @override 315 @override
316 void output(PdfStream s) { 316 void output(PdfStream s) {
317 assert(value[0] == '/'); 317 assert(value[0] == '/');
318 - s.putString(value); 318 + final bytes = <int>[];
  319 + for (final c in value.codeUnits) {
  320 + assert(c < 0xff && c > 0x00);
  321 +
  322 + if (c < 0x21 ||
  323 + c > 0x7E ||
  324 + c == 0x23 ||
  325 + (c == 0x2f && bytes.isNotEmpty) ||
  326 + c == 0x5b ||
  327 + c == 0x5d ||
  328 + c == 0x28 ||
  329 + c == 0x3c ||
  330 + c == 0x3e) {
  331 + bytes.add(0x23);
  332 + final x = c.toRadixString(16).padLeft(2, '0');
  333 + bytes.addAll(x.codeUnits);
  334 + } else {
  335 + bytes.add(c);
  336 + }
  337 + }
  338 + s.putBytes(bytes);
319 } 339 }
320 } 340 }
321 341
@@ -25,6 +25,12 @@ void main() { @@ -25,6 +25,12 @@ void main() {
25 expect(const PdfBool(false).toString(), 'false'); 25 expect(const PdfBool(false).toString(), 'false');
26 }); 26 });
27 27
  28 + test('PdfDataTypes Name ', () {
  29 + expect(const PdfName('/Test').toString(), '/Test');
  30 + expect(const PdfName('/Type 1').toString(), '/Type#201');
  31 + expect(const PdfName('/Num#1').toString(), '/Num#231');
  32 + });
  33 +
28 test('PdfDataTypes Num', () { 34 test('PdfDataTypes Num', () {
29 expect(const PdfNum(0).toString(), '0'); 35 expect(const PdfNum(0).toString(), '0');
30 expect(const PdfNum(.5).toString(), '0.5'); 36 expect(const PdfNum(.5).toString(), '0.5');