尝试将简单的UTF16字符嵌入到手动创建的PDF中,但失败 [英] Trying to embed simple UTF16 character into manually created PDF but failing

查看:22
本文介绍了尝试将简单的UTF16字符嵌入到手动创建的PDF中,但失败的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我正在尝试手动创建PDF文档(使用GitHub上的PDFGen C代码)。这是在存储空间有限的小型设备上实现的。

在我想嵌入(比方说)Unicode欧姆字符(U+2126)之前,一切正常。

下面是我正在使用的测试文件,应该在‘H’后显示Hello";和Ohms符号。

但是,它实际上显示的是";H!&;ello";。

%PDF-1.4
<hex chars removed>
1 0 obj
<< /Pages 2 0 R /Type /Catalog >>
endobj
2 0 obj
<< /Count 1 /Kids [ 3 0 R ] /Type /Pages >>
endobj
3 0 obj
<< /Contents 4 0 R /MediaBox [ 0 0 500 800 ] /Parent 2 0 R /Resources 5 0 R /Type /Page >>
endobj
4 0 obj
<< /Length 57 >>
stream
BT /F1 24 Tf 175 720 Td <FEFF004821260065006C006C006F> Tj ET
endstream
endobj
5 0 obj
<< /Font << /F1 6 0 R >> >>
endobj
6 0 obj
<< /BaseFont /Courier /Subtype /Type1 /Type /Font >>
endobj
xref
0 7
0000000000 65535 f 
0000000015 00000 n 
0000000064 00000 n 
0000000123 00000 n 
0000000229 00000 n 
0000000335 00000 n 
0000000378 00000 n 
trailer << /Root 1 0 R /Size 7 /ID [<89311a609a751f1666063e6962e79bd5><89311a609a751f1666063e6962e79bd5>] >>
startxref
448
%%EOF

我只能假定我的Unicode十六进制字符串<FEFF004821260065006C006C006F>的格式不正确。

还是字体定义不正确?

还是我对如何嵌入Unicode的理解有误?

我根本不想嵌入任何字体,因为我没有存储空间或处理能力。我只想添加Unicode字符,并依靠PDF呈现器来解决如何使用默认Courier字体显示它们。

这可能吗?

事先感谢您的帮助/建议/意见。

更新

在下面提供了一些有用的建议后,我现在已经设法实现了我所需要的。

我将代码修改为在Courier和Symbol之间按字符切换字体,现在支持(几乎)所有标准字符。

我还添加了一些字符缩放,以保持符号字符与Courier字体对齐,但最终结果适用于我:)

这是我的测试PDF的图像...

推荐答案

奇怪的是,最初的PC IBM437代码集包括Ω[3-1][03A9](234),但没有提供给Courier?? 您可以尝试将所需的几个字符编码为嵌入式子集符号字体,并很有可能使用ASCII(7位)或ANSI(8位)来实现,但对于您的几个字符来说,开销将是巨大的。

更简单地尝试将字体(根据目标字符的要求)切换为Symbol字体,结果可能如下所示

附注:代码不需要是两个字,只有256个字符。

    << /BaseFont /Symbol /Subtype /Type1 /Type /Font >>
    BT /F2 24 Tf 175 720 Td <4857657C7C6F20766FC27C64> Tj ET
通过交替使用信使和符号,您将获得您想要的

在您的代码中,它可能类似于(包含转换)

BT
/F0 24 Tf 1 0 0 1 0 .0675 Tm (H) Tj
ET
BT
/F1 24 Tf 1 0 0 1 14.4 .0675 Tm <003a> Tj
ET
BT
/F0 24 Tf 1 0 0 1 32.832 .0675 Tm (ello) Tj
ET
注意:我的编辑使用F0表示Courier,使用F1表示符号(以0为基数更正常) 它还使用了略微不同的代码方法,将Omega定义为<003a>

在这里,我在Windows记事本中调整文本,以观看编译(Ctrl+S)如何移动Omega字符间距,同时在预览器中实时观看它的侧向滑动。另请注意,大写Omega在原始符号字体中为W!!

所以我对您的代码的替换修复是这样的(通过删除空格和换行符,您可以很容易地使它看起来更接近您的代码,并且更简洁)

%PDF-1.4
%µ¶

1 0 obj
<<
  /Pages 2 0 R
  /Type /Catalog
>>
endobj

2 0 obj
<<
  /Count 1
  /Kids [ 3 0 R ]
  /Type /Pages
>>
endobj

3 0 obj
<<
  /Contents 4 0 R
  /MediaBox [ 0 0 500 800 ]
  /Parent 2 0 R
  /Resources <<
    /Font <<
      /F1 5 0 R
      /F2 6 0 R
    >>
  >>
  /Type /Page
>>
endobj

4 0 obj
<<
  /Length 133
>>
stream
q
BT
/F1 24 Tf
1 0 0 1 175 720 Tm
(H) Tj
ET
BT
/F2 24 Tf
1 0 0 1 189 720 Tm
(W) Tj
ET
BT
/F1 24 Tf
1 0 0 1 206 720 Tm
(ello) Tj
ET
Q

endstream
endobj

5 0 obj
<<
  /BaseFont /Courier
  /Subtype /Type1
  /Type /Font
>>
endobj

6 0 obj
<<
  /BaseFont /Symbol
  /Subtype /Type1
  /Type /Font
>>
endobj

xref
0 7
0000000000 65536 f 
0000000016 00000 n 
0000000070 00000 n 
0000000136 00000 n 
0000000307 00000 n 
0000000494 00000 n 
0000000569 00000 n 

trailer
<<
  /Size 7
  /Root 1 0 R
  /ID [ <89311A609A751F1666063E6962E79BD5> <EE408A115072E92E3A34C8BB8BDC6AE6> ]
>>
startxref
643
%%EOF

这篇关于尝试将简单的UTF16字符嵌入到手动创建的PDF中,但失败的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆