【问题标题】:Manually adding special characters to a pdf手动将特殊字符添加到 pdf
【发布时间】:2012-09-13 00:50:00
【问题描述】:

我有一个使用 R 生成的 pdf(一个简单的折线图),并且只是与纯文本流一起存储。用来生成图表的数据已经丢失,想通过编辑pdf来修改轴标签。

我找到了这一行:

/F2 1 Tf 12.00 0.00 -0.00 12.00 238.73 18.72 Tm (**Error Rate**) Tj

这似乎控制了我想要的轴标签(当前显示“错误率”)。改成这样说:

/F2 1 Tf 12.00 0.00 -0.00 12.00 238.73 18.72 Tm (**Different Label**) Tj

确实会导致轴标签更改为“不同标签”。

现在,我希望新标签是“Mu”。如,希腊字母 Mu。我知道这是可能的,因为我可以在 R 中生成带有希腊字母的轴标签中的 pdf。

我的第一个想法是使用vim trigraph ctrl+k m* 手动输入Mu的UTF-8字符,也可以通过字符映射等,给出:

/F2 1 Tf 12.00 0.00 -0.00 12.00 238.73 18.72 Tm ( μ ) Tj

如果我在执行此操作后尝试写入文件,我会收到一条错误消息“xyz 行中的转换错误”,其中 xyz 是修改后的行。打开保存的 pdf 会显示一个“?”用于轴标签。

pdf 如何对 mu 进行编码?如何相应地修改标签?

【问题讨论】:

  • 所以,关键是,我对 pdf 编码一无所知。我认为 F2 是这样指定的: 11 0 obj > endobj
  • 为什么不在标签中生成一个带有希腊语 mu 的测试图(以及一些不同的文本,例如 text(expression("LABEL GOES HERE"*mu)) 或其他内容)并探索 PDF 以查看 R 编码它的方式?
  • @BenBolker 这样做了,但结果显然以不同的格式编码,我无法在任何地方找到我的“LABLE GOES HERE”字符串。
  • 你需要使用compress=FALSE;请看下面我的回答

标签: r pdf utf-8 pdf-generation


【解决方案1】:

PDF 文件是二进制文件,在大多数情况下将它们修改为文本文件会损坏它们。为了保持文件有效,您需要更新外部参照表(有关详细信息,请参阅 PDF 规范)。如果整个文件的字节数发生变化,您将需要更新外部参照表的每个条目以使文件保持有效。另一种选择可能是一起删除外部参照表,并将生成的文件传递给另一个可以为您“猜测”它的工具。我过去做过with ghostscript,效果很好。

关于字体的问题,/F2对应的是哪个字体?它是否部分嵌入在 PDF 文件中? 如果是,您可能在文件中没有添加字符 μ 所需的信息。

【讨论】:

  • 查看我的评论以回应您之前的字体类型。
  • 这实际上很有帮助。解决方法是在pdf末尾粘贴符号字体定义,手动更新外部参照表中的字节数,然后将标签更改为“m”,即在符号字体mu中。
  • 下面 Ben 的回答比我的胡言乱语要清楚。 :) 编辑:现在上面。
【解决方案2】:

正如@yms 所指出的,PDF 通常不可在文本编辑器中编辑,因为它们很可能包含二进制数据并且有需要更新的外部参照表如果在 PDF 中插入或删除字符。如果您必须编辑 pdf,请使用 qpdf 到 edit the PDF。

【讨论】:

    【解决方案3】:

    我试过了:

    pdf("testmu.pdf",compress=FALSE)
    plot(1:10,1:10,xlab="abc",ylab=expression("LABEL "*mu))
    dev.off()
    

    并在结果文件中找到以下块:

    BT
    /F2 1 Tf 0.00 12.00 -12.00 0.00 10.28 235.40 Tm (LABEL ) Tj
    ET
    BT
    /F6 1 Tf 0.00 12.00 -12.00 0.00 10.28 276.09 Tm (m) Tj
    ET
    

    所以我怀疑你是否使用

    /F6 1 Tf 12.00 0.00 -0.00 12.00 238.73 18.72 Tm ( m ) Tj
    

    在您上面的示例中,它应该可以工作。我不知道 R 是否总是定义F6(符号字体),所以你可能还需要按照这些思路修改:

    13 0 obj
    << /Type /Font /Subtype /Type1 /Name /F6 /BaseFont /Symbol
    >>
    

    编辑:正如在另一个答案中指出的,以及它下面的评论,您似乎还需要通过(我认为)搜索xref 手动更新外部参照计数,找到一个块状

    xref
    0 13
    

    并增加第二个值...

    【讨论】:

    • 大约 5 秒前我自己想通了。您还必须手动更新外部参照表,但如果您将 F6 添加到末尾,这很容易,因为字节数仅针对新条目进行调整。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-02
    • 2016-02-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多