ruby-on-rails-3 – 当我使用模板时,我的文字写得不好
我想使用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 --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将显示未镜像的文本. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |