【问题标题】:Same image operations applied to two different PDFs, different results相同的图像操作应用于两个不同的 PDF,结果不同
【发布时间】:2020-08-02 20:02:57
【问题描述】:

我正在处理两个不相同的 PDF,但要对其应用相同的操作。

  • 第一个是由 Microsoft Office 365 通过将 Word 文档下载为 PDF 生成的
  • 第二个是由 Google Drive 通过将 Google Docs 文档下载为 PDF 生成的

我正在使用Aspose 处理一些初步代码,以使用完全相同的代码将相同的图像应用于两个 PDF 文件。我不倾向于立即责怪该库,因为它能够在对 Office 365 文档进行操作时生成正确的输出:

// note: Anyone familiar with the PDF format itself should have no 
//       issues inferring the low-level operations being performed here...

fun Page.writeImage(image: InputStream) {

    val imageName = resources.images.add(image.inMemory());

    val rectangle = rectangleFromTopLeft(0.0, 0.0, 400.0, 200.0);
    val matrix = rectangle.defaultMatrix();

    contents.add(listOf(
        GSave(),
        ConcatenateMatrix(matrix),
        Do(imageName),
        GRestore()
    ));
}

无论我提供哪个文件,这两种情况下矩形和矩阵的坐标都保持不变。

对于 Office 365 派生的 PDF,图像将按照我指定的方式应用于页面。奇怪的是,当我打开 Google Docs 派生的 PDF 时,图像被垂直翻转并位于页面底部!

View the four PDF files in their before and after states.

我希望任何 PDF 专家能够向我解释这里发生了什么。我最初的怀疑是 Google Docs PDF 中的某些先前状态或操作在我的图像操作之前生效。

也就是说,我对 PDF 规范还不够熟悉(还没有!)来挑选它...

【问题讨论】:

  • 这与itext有何关系?
  • 它没有。我将编辑问题以删除 itext 标记。
  • 这是因为无论我使用哪个库,都会发生这种情况。

标签: pdf aspose


【解决方案1】:

我不知道你应该责备谁,但造成这种差异的原因很简单。

Google Docs 文档有一个以以下开头的页面流:

1 0 0 -1 0 792 cm

这基本上是做页面的垂直翻转,792是为了补偿和移动页面上的东西——它应该是页面的高度,以磅为单位。

它没有将其封装在q ... Q 对中以执行“保存...恢复”,这意味着该矩阵现在已设置为页面上所有后续内容的其余部分。您可能已经知道,PDF 规范没有提供重置页面矩阵的方法,您只能附加到它。

当您在页面末尾添加内容时,您的内容现在会继承此矩阵,这就是您看到它翻转并位于底部的原因。

Microsoft 文件没有这样做,因此它得到了正确处理。在这种情况下,矩阵仍然是单位矩阵,您最终会得到您期望的内容。

如何解决这个问题?好吧,如果您的库不提供知道当前页面矩阵是什么的方法,那将非常困难。当然,可以通过应用逆矩阵来消除 Google 在这里所做的愚蠢事情,“仅针对此文档”来解决它,但我可以想象这不是您正在寻找的处理这个问题的最终方法。

【讨论】:

  • 这条路:1.0, 0.0, 0.0, -1.0, 0.0, 792.0
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-02-17
  • 2019-02-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-05-23
相关资源
最近更新 更多