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

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(使用前将#替换为@)

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

  • 使用 libre Office writer 将 docx 转换为 PDF/A

    我很高兴通过命令行 通过 C 进程调用控制 将 docx 文件转换为 PDF 不幸的是 我找不到任何关于如何设置 GUI 提供的输出 PDF 选项的互联网搜索结果 我专门寻找通过命令行生成 PDF A 和标记 PDF 有人做过这个并且知道怎
  • 解析 pdf 中的注释

    我想要一个 python 函数 它接受 pdf 并返回文档中注释注释文本的列表 我看过 python poppler https code launchpad net poppler python poppler python trunk
  • FB API 调用中“无法代表此用户调用 API”

    我在调用 facebook API 时遇到问题 我正在使用 Koala 进行服务器端 api 调用 但最近在进 行 api 调用时遇到问题 所以我尝试绕过 koala 调用并使用 call 进行原始 api http 调用 但无济于事 当我
  • Rails 3、mysql/mysql2 将某些检索到的字符串误解为 ASCII-8BIT

    这个问题最初是常见的 字符编码不兼容 ASCII 8BIT 和 UTF 8 问题 但事实是not我在问什么 相反 我发现发生此问题是因为数据库的某些字段在检索时被标记为 ASCII 8BIT 而大多数字段正确显示为 UTF 8 例如 在包含
  • 内容处置:ASP.Net 中的内联 PDF 文件不起作用

    我正在尝试将带有标题的 PDF 文件返回到浏览器Content Dispostion inline就在我创建这个文件之后 浏览器的查看者无法打开它 文件没有损坏 如果我放入浏览器 查看器会正确显示文件 但我想一次性创建文件并检查用户对文件的
  • 如何检查一个数字是否包含在一个范围内(在一个语句中)?

    我正在使用 Ruby on Rails 3 0 9 我想检查某个数字是否包含在某个范围内 也就是说 如果我有一个变量number 5我想检查一下1 lt number lt 10并检索一个布尔值 如果number值包含在该范围内 我可以这样
  • 如何将 pdf 文档显示到 Webview 中?

    我想在 webview 上显示 pdf 内容 这是我的代码 WebView webview new WebView this setContentView webview webview getSettings setJavaScriptE
  • ABCPdf 添加文档 javascript

    是否可以使用 ABCPdf 将文档 JavaScript 添加到生成的 PDF 中 如果你的意思是 在文档加载后执行的Javascript 那么看看本文档页面 http www websupergoo com helppdf8net sou
  • 使用 ApacheFOP 从 Java 中的 XML 生成 PDF

    我正在尝试从 Java 对象生成即时 PDF 报告 我找不到很多这方面的例子 所以我一直在关注这个例子 http svn apache org viewvc xmlgraphics fop trunk examples embedding
  • 使用 itextSharp 5.3.3 对 Pdf 文档进行数字签名和验证

    我正在尝试使用 iTextSharp 5 3 3 在服务器 c 上进行数字签名和验证 pdf 文档 我使用 DigiSign 在线工具 生成了 Pfx 文件 然后使用 Windows 生成证书 cer 文件
  • 使用其他应用程序打开 pdf

    我正在应用程序中显示 pdf 文件 我想在 nag bar 上显示 打开方式 选项 显示 iPhone 上安装的可以打开相同 pdf 的应用程序 如果用户选择任何应用程序 例如 pdf 查看器 则应该使用 pdf 查看器应用程序打开 pdf
  • 使用java编程将pdf可编辑字段转换为文本

    我准备了一份可编辑的表格 但无法使用java编程将pdf可编辑字段转换为文本 使用的 API pdfbox app 2 0 0 RC2 PDFBox 0 7 3 itextpdf 5 1 0 pdfclown 请帮助我了解如何将 pdf 可
  • UIDocumentInteractionController 显示空白 pdf

    我尝试使用 UIDocumentInteractionController PresentPreviewAnimated 方法在 iOS 设备上显示 pdf 但它一直显示空白文档 我认为这可能与字符编码有关 但我不确定 如果我使用 UIWe
  • 使用Rails UJS,如何从函数提交远程表单

    我正在使用Rails UJS 我有一个表单设置来进行远程提交 如下所示
  • Rails:关于产量

    我在a中看到了一些代码导轨 v2 3 app In layout car general html erb 这个视图是由 cars controller 中的方法调用的 我看到了代码 var some car new Object 有两个问
  • Rails 3 - “无法解析 Yaml”

    我不知道我做错了什么 我尝试运行 rails c 但它只是给了我一个错误 10 分钟前它还在工作 C Ruby192 lib ruby 1 9 1 psych rb 148 in parse couldn t parse YAML at l
  • TCPDF UTF-8 符号未显示

    我使用最新的 TCPDF 版本 5 9 但在编码方面遇到一些奇怪的问题 我需要立陶宛语语言符号 例如 但只能得到其中的一小部分 其他的还是这样 所以我该怎么做 我使用默认的 times 字体 它带有 TCPDF 下载 任何帮助 将不胜感激
  • 使用 apache PDF-Box 插入 PDF 附件的缩略图

    我有一个代码可以将文件附加到 PDF 文件 PDDocument doc new PDDocument PDPage page new PDPage doc addPage page read attachment file File fi
  • 适用于 iPhone / iPad / iOS 的快速、精益 PDF 查看器 - 提示和提示?

    最近有很多关于绘制 PDF 的问题 是的 您可以使用UIWebView但这无法提供您所期望的优秀 PDF 查看器的性能和功能 您可以绘制PDF页面到 CALayer http www cocoabuilder com archive coc
  • 为什么 Rails 中的区域设置充当全局(使用 Thin 时)?

    我刚刚意识到在控制器中设置区域设置的推荐 Rails 方法 before filter set locale def set locale I18n locale params locale I18n default locale end

随机推荐

  • 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