加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails-3 – 当我使用模板时,我的文字写得不好

发布时间:2020-12-17 03:38:48 所属栏目:百科 来源:网络整理
导读:我想使用Rails在现有PDF上添加文本,所以我做了: filename = "#{Rails.root}/app/assets/images/sample.pdf"Prawn::Document.generate("#{Rails.root}/app/assets/images/full_template.pdf",:template = filename) do text "Test",:align = :centerend 当我
我想使用Rails在现有PDF上添加文本,所以我做了:

filename = "#{Rails.root}/app/assets/images/sample.pdf"
Prawn::Document.generate("#{Rails.root}/app/assets/images/full_template.pdf",:template => filename) do
  text "Test",:align => :center
end

当我打开full_template.pdf时,我的模板PDF是我的文本“Test”,但是这个文本写的方向不好,好像我的文本是用镜子写的.

您可以在此处找到两个PDF文档:

原文:http://www.sebfie.com/wp-content/uploads/sample.pdf

生成:http://www.sebfie.com/wp-content/uploads/full_template.pdf

解决方法

让我们看看…… [切换到PDF调试模式].

首先,我在qpdf的帮助下解压你的full_template.pdf,这是一个命令行实用程序“在PDF文件上进行结构化,内容保留的转换”(自我描述):

qpdf --qdf full_template.pdf qdf---test.pdf

结果,qdf — test.pdf现在更容易在普通文本编辑器中进行分析,因为所有流都是解压缩的.

搜索字符串“est”会找到我们这一行:

[(T) 120 (est)] TJ

更多地阅读(并查看qpdf的非常有用的注释到其输出中!)我们发现:PDF对象,其中您的镜像字符串“Test”出现在原始PDF中是22号.它是一个完全独立的对象文件的其余部分,它也是唯一一个使用未嵌入的Helvetica字体的文本.

所以让我们从原始文件中分别提取:

qpdf --show-object=22 --filtered-stream-data full_template.pdf 

 q
 /DeviceRGB cs
 0.000 0.000 0.000 scn
 /DeviceRGB CS
 0.000 0.000 0.000 SCN
 1 w
 0 J
 0 j
 [ ] 0 d

 BT
 286.55 797.384 Td
 /F3.0 12 Tf
 [<54> 120 <657374>] TJ
 ET

 Q

好的,这里[[T] 120(est)] TJ显示为[< 54> 120< 657374> TJ.我们在ascii命令的帮助下验证了这一点,它为我们打印了一个漂亮的ASCII< - >十六进制表.该表证实:

T  54
e  65
s  73
t  74

其他操作符的意思是什么?我们在官方ISO 32000 PDF-1.7 spec附件A“操作符摘要”中查找它们.在这里,我们找到以下信息:

q   : gsave
 Q   : grestore
 cs  : setcolorspace for nonstroking ops
 CS  : setcolorspace for stroking ops
 scn : setcolor for nonstroking ops
 SCN : setcolor for stroking ops
 w   : setlinewidth
 j   : setlinejoin
 J   : setlinecap
 d   : setdash
 BT  : begin text object
 Td  : move text position
 Tf  : set text font and size
 TJ  : show text allowing individual glyph positioning
 Tj  : show text
 ET  : end text object

到目前为止没有任何可疑之处……

但是,查看原始页面内容出现的另一个对象,对象编号5,我们发现了一个区别.例如:

1 0 0 -1 -17.2308 -13.485 Tm
<0013001c001200130018001200140015> Tj

在这里,在Tj(显示文本)的每个单一动作之前,Tm操作符(这是什么?!?)正在进行中.让我们在PDF规范中查找Tm:

Tm  : set text matrix and text line matrix

然而奇怪的是,这个矩阵使用1 0 0 -1(而不是更常见的1 0 0 1).这导致文本的上侧向下镜像.

等一下!?!

原始文本内容是用镜像文本矩阵描边的,但仍然显得正常?但是您添加的文本不使用任何自己的文本矩阵,但显示为镜像?到底是怎么回事?!

我现在不打算追查它.然而,我的假设是,在原始PDF的内容中,创作软件定义了“扩展图形状态”,这导致默认情况下镜像所有描边操作.

看起来你没有做错任何事,塞巴斯蒂安 – 你刚刚选择了一个测试对象,并且得到了一个相当奇怪的测试对象.尝试先用其他一些PDF继续你的’Prawn’实验……

你可以通过在qdf — test.pdf中替换这一行来“修复”你的full_template.pdf:

286.55 797.384 Td

通过这个:

1 0 0 -1 286.55 797.384 Tm

然后运行最后一个qdf命令来修复(现在我们的编辑已损坏)PDF交叉引用表和流长度:

qpdf qdf — test.pdf full_template — fixed.pdf

控制台输出将显示您想要它:

WARNING: qdf---test.pdf: file is damaged
  WARNING: qdf---test.pdf (file position 151169): xref not found
  WARNING: qdf---test.pdf: Attempting to reconstruct cross-reference table
  WARNING: qdf---test.pdf (object 8 0,file position 9072): attempting to recover stream length
  qpdf: operation succeeded with warnings; resulting file may have some problems

“固定”PDF将显示未镜像的文本.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读