当我使用模板时,我的文字方向写错了

2024-03-15

我想使用 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 + 我的文本“测试”,但该文本的书写方向不好,就好像我的文本是使用镜子书写的一样。

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

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

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


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

首先,我打开你的包装完整模板.pdf在...的帮助下qpdf http://qpdf.sf.net/,一个命令行实用程序“对 PDF 文件进行结构性、内容保留的转换”(自我描述):

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

结果,qdf---测试.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 Hex 表。该表证实:

T  54
e  65
s  73
t  74

其他运算符是什么意思?我们在官方中查找ISO 32000 PDF-1.7 规范 http://www.adobe.com/content/dam/Adobe/en/devnet/acrobat/pdfs/PDF32000_2008.pdf,附件 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

在这里,在 a 的每个动作之前Tj(显示文字)Tm操作员 (这是什么?!?) 正在进行中。我们也来看看Tm在 PDF 规范中:

 Tm  : set text matrix and text line matrix

然而奇怪的是,这个矩阵使用1 0 0 -1(而不是更常见的1 0 0 1)。这导致文本的颠倒镜像。

等一下!?!

The original文本内容用镜像文本矩阵进行描边,但仍然显示正常?但你的added文本不使用自己的任何文本矩阵,但显示为镜像?到底是怎么回事?!

我现在不打算进一步追踪它。然而,我的假设是,在原始 PDF 的内部某个地方,创作软件定义了一个'扩展图形状态'这会导致默认情况下镜像所有描边操作。

看来你没有做错什么,塞巴斯蒂安——你只是在选择测试对象时不走运,并且幸运地得到了一个相当奇怪的对象。尝试先用其他一些 PDF 继续您的“虾”实验...

人们可以“修复”你的完整模板.pdf通过替换这一行qdf---测试.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 将显示未镜像的文本。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

当我使用模板时,我的文字方向写错了 的相关文章

随机推荐

  • Portlet 在 Plone 中如何呈现/排序/布局?

    我正在尝试更改 Plone 站点中 portlet 的全局排序 我搜索了 Plone 源代码 但找不到实际迭代并呈现 portlet 的代码 例如 plone rightcolumn 和 plone leftcolumn 内容提供程序 该代
  • 如何在 Linux 中查找所有以 .rb 结尾的文件?

    我所在的目录包含更多目录 我可以使用什么命令来获取所有以 rb 你可以尝试 find type f name rb
  • 在 Laravel 中将会话从文件传输到数据库

    我已经积累了超过6000万个会话 这导致了文件描述符耗尽的情况 通过将会话传输到数据库解决了该问题 在 Laravel 5 6 上测试 为了这 准备桌子 https laravel com docs 8 x session database
  • 使用子查询中的多个值进行更新

    假设我有一张桌子 items 有一个名为的整数列priority 我正在尝试从另一个表更新它 另一个表是一个临时表 我已经在其中预先计算了所有适当的priority要应用的值 UPDATE items SET priority SELECT
  • 将 DateTimePicker 值设置为 null

    我正在开发一个 WinForms UI 有两个DateTimePicker控制 最初 我想将控件的值设置为 null 直到用户选择日期 如果用户没有选择日期 则会将 null 值传递给数据库 默认情况下 它采用当前日期 您能否提出一些建议或
  • 检测实时应用程序中死锁的方法

    在实时多线程应用程序中检测死锁的方法有哪些 如果我们发现存在死锁 是否有任何方法可以解决它 而无需关闭 重新启动应用程序 有两种流行的方法来检测死锁 一种是让线程设置检查点 例如 如果您有一个具有工作循环的线程 您可以在开始工作时设置一个计
  • Scala 脚本无法在 Ubuntu 上运行

    我有一个以前可以工作的 Scala 脚本 当我尝试在新 PC 上运行它时 编译失败 所以我做了简单的脚本来测试 bin sh exec scala J Xmx2g 0 println test 尝试运行它我得到 test scala err
  • 从谷歌地图中的纬度和经度获取位置地址

    我想在点击谷歌地图并获取纬度和经度后从他们那里获取位置并将其 地址 放入字段中input searchTextField 我该怎么办 我尝试过 但不适合我 DEMO http jsfiddle net DXkZJ http jsfiddle
  • 批量更新 Excel 文件连接字符串

    我们最近更改了 SQL 数据库服务器 我想知道是否有脚本或更简单的方法来更新所有 Excel 文件连接字符串 如果他们使用连接文件会容易得多 但不幸的是它们都是手动设置的 我们有大约 600 份报告 任何帮助深表感谢 Thanks Nick
  • 将多边形转换为网格

    我有很多多边形 理想情况下 所有多边形不得相互重叠 但它们可以彼此相邻 但实际上 我必须考虑到slight多边形重叠 由一定的公差定义 因为所有这些多边形都是从用户手绘输入获得的 这并不像我希望的那样机器精确 我的问题是 是否有任何软件库组
  • MicroMeter:删除/禁用某个标签

    我正在使用默认的 MicroMeter 活页夹 其中之一用于创建仪表jvm memory used 问题是它带有 2 个可用标签 area 和 id 这实际上生成了 6 个我不感兴趣的仪表 我能够做到这一点 Bean public Mete
  • 如何检查 Botframework 上的对话框堆栈

    我正在实现一个反馈对话框 并且想使用IScorable然后关掉 反馈 这个词并推动我的FeedbackDialog到堆栈上 我不希望在收集用户反馈时出现这种行为 有没有办法确定我的FeedbackDialog已经在堆栈上了吗 那么我不会不小
  • Python 中的数据结构

    names Peter John size X M L list price 1 2 3 4 5 6 There are 2 people will buy 3 size of shirt 我想将我的数据结构创建为 name u Peter
  • CakePHP 通过 Auth 记住我

    我已经成功使用了 Auth 但不幸的是 它似乎只适用于 Session 我希望如果用户选中 记住我 复选框 我将使用 Cookie 并且他将登录 2 周 我在官方书籍中找不到任何内容 在谷歌中我只找到了很少而且不是很好的博客文章 有没有办法
  • 领域驱动设计和 IoC/依赖注入

    我现在正在尝试应用我学到的有关 DDD 的知识 但我对域模型中的依赖关系流有点困惑 我的问题是 实体是否应该了解域中的工厂 存储库 服务 存储库应该了解域中的服务吗 另一件困扰我的事情是当我想向集合添加实体时如何处理集合 假设我正在开发一个
  • 如何使用 Owin Katana 记录器

    我在 Microsoft Owin 项目中的此类文件中看到正在调用记录器 https github com aspnet AspNetKatana blob dev src Microsoft Owin Security OpenIdCon
  • 分割字符串并修剪每个元素

    是否有任何库 API 或正则表达式模式可以在某些分隔符上拆分字符串并自动修剪每个元素的前导和尾随空格 而无需循环元素 例如 在分割时 A B C D E on 所需的输出是 A B C D E 我得到的最接近的是str split s s
  • 如何在创建帐户时向用户分配角色

    我正在使用 ASP NET 内置成员资格和角色提供程序 在我的应用程序中 管理员为用户创建帐户 目前我正在通过访问 ASP NET 配置网站来分配角色 请告诉我如何在创建用户帐户 API 中添加选择角色的额外步骤 Thanks 您只是问如何
  • 429 请求太多 - Angular 7 - 多个文件上传

    当我尝试同时上传数百个以上的文件时 我遇到了这个问题 API 接口仅适用于一个文件 因此我必须调用发送每个文件的服务 现在我有这个 onFilePaymentSelect event void if event target files l
  • 当我使用模板时,我的文字方向写错了

    我想使用 Rails 在现有 PDF 上添加文本 所以我这样做了 filename Rails root app assets images sample pdf Prawn Document generate Rails root app