【问题标题】:Adobe breaks stamped PDF when saving as new file / what is difference in Adobe 'save as' vs. Foxit Reader 'save as' featureAdobe 在另存为新文件时会破坏标记的 PDF / Adob​​e“另存为”与 Foxit Reader“另存为”功能有什么区别
【发布时间】:2017-07-06 18:00:46
【问题描述】:

我正在与更大的开发者社区联系,寻求帮助以了解真正的原因并可能找到解决方法。我向 Aspose 提出了问题,他们还在他们的系统中跟踪了这个问题 (PDFNET-42880)。我认为他们不会很快对此进行调查,因为这是非常具体的情况。现在我在这里发帖询问更多细节:

  1. Adobe“另存为”与 Foxit Reader“另存为”与 Windows Reader“另存为”功能有何区别?

  2. Adobe 产品的问题并不那么明显。我什至不知道该问什么:D

链接到他们的(Aspose)旧论坛:https://www.aspose.com/community/forums/thread/845549/removing-stamps-fails-after-saving-stamped-file-from-adobe-acrobat.aspx

案例: 使用 OpenOffice(版本 3.4.0)创建带有表单的 PDF,使用 Aspose PDF 标记,使用 Adob​​e Reader DC(或 Adob​​e Acrobat XI)打开,填充,保存为新文件。现在这个新文件很好,但是当我尝试使用 Aspose 删除图章(并稍后用新图章替换)时,事情就变得有趣了。

我测试过的文件:https://1drv.ms/f/s!Auvpijam7a73iDzOqc6wZPuY9l81

  • Stamp_Location.png
  • OoPdfFormExample_WithStamp.pdf
  • OoPdfFormExample_WithStamp_StampRemoved.pdf
  • OoPdfFormExample_WithStamp_SavedFromFoxit.pdf
  • OoPdfFormExample_WithStamp_SavedFromFoxit_StampRemoved.pdf
  • OoPdfFormExample_WithStamp_SavedFromWindowsReader.pdf
  • OoPdfFormExample_WithStamp_SavedFromWindowsReader_StampRemoved.pdf
  • OoPdfFormExample_WithStamp_SavedFromAdobeReader.pdf
  • OoPdfFormExample_WithStamp_SavedFromAcrobat_StampRemoved.pdf

用于移除标记的 C# 代码:

/// <summary>
/// Removes stamps from PDF file.
/// </summary>
/// <param name="pdfFile"></param>
private static void RemoveStamps( string pdfFile )
{
    // Create PDF content editor.
    Aspose.Pdf.Facades.PdfContentEditor contentEditor = new Aspose.Pdf.Facades.PdfContentEditor();

    // Open the temp file.
    contentEditor.BindPdf( pdfFile );

    // Process all pages.
    foreach ( Page page in contentEditor.Document.Pages )
    {
        // Get the stamp infos.
        Aspose.Pdf.Facades.StampInfo[] stampInfos = contentEditor.GetStamps( page.Number );

        //Process all stamp infos
        foreach ( Aspose.Pdf.Facades.StampInfo stampInfo in stampInfos )
        {
            // Use try catch so we can output possible error w/out break point.
            try
            {
                contentEditor.DeleteStampById( stampInfo.StampId );
            }
            catch ( Exception e )
            {
                Console.WriteLine( e );
            }
        }
    }

    // Save changes to the temp file.
    contentEditor.Save( StampRemovedPdfFile );
}

使用 Adob​​e: 删除图章的过程可以正常工作,但尝试打开文件最终会导致文件出现问题。

“此页面存在错误。Acrobat 可能无法正确显示该页面。请联系创建 PDF 文档的人员以更正问题。”

编辑:在进行了更多测试之后,只需将文件打开到 Aspose,并在不修改的情况下保存它,这并没有破坏文件,只有在使用 Aspose 方法删除印章后,它才会被破坏。

使用 Foxit: 唯一的区别是打开文件到 Foxit Reader 并在那里保存表格。印章被移除,文件正常,适用于任何 PDF 阅读器。

使用 Windows (10) Reader: 唯一的区别是打开文件到 Windows Reader 并从那里保存。印章被移除,文件正常,适用于任何 PDF 阅读器。

【问题讨论】:

  • 在文件“OoPdfFormExample_WithStamp.pdf”中,我根本没有看到邮票...假设您指的是“邮票”注释。
  • 谢谢@joelgeraci - 邮票在哪里也不是很明显。我添加了一张图片Stamp_Location.png 以帮助查看邮票的位置。
  • @MattiKetonen,我在 Aspose 担任开发人员布道师。我已经记录了您对记录的问题的所有疑虑以及已在此处共享的更多详细信息。产品团队完成调查后,我们将在 Aspose 论坛的原始帖子中通知您。请给我们一点时间。
  • @AsadAli,也感谢您对此感兴趣。我正在寻找其他选项和信息,因为我也有截止日期。您的 (Aspose) 支持对我的体验非常好,从您的论坛获得帮助有助于解决此 PDF 标记所包含的解决方案的大部分问题。
  • Matti,@joelgeraci 的回答对您有帮助吗?还是您还有疑问?

标签: pdf adobe aspose aspose.pdf


【解决方案1】:

好的-您指的不是邮票注释。它是一个被绘制到页面内容中的 XObject。为什么 Aspose 将其称为邮票是……嗯……一个谜。当您删除“图章”(不是图章)时,Aspose 似乎正在删除 XObject,但 不是从页面内容流中绘制它的说明 ...这就是您收到错误的原因杂技演员。其他应用程序对错误的 PDF 更宽容,我猜当他们写出文件时,他们正在删除对不存在对象的引用。您可以通过选择“另存为优化的 PDF”让 Acrobat 尝试修复此类问题。但是,除了 XObject 之外,您最好删除绘图指令。

由于您创建文件和添加“标记”的方式,您的页面内容流是一个流数组。删除数组中的最后一项,即绘制 XObject 的指令,您的文件将在所有查看器中正常工作。注意:内容数组中的最后一项并不总是您的印章。只是你的印章是最后被绘制的,所以它在最后。

如果您的意图是“替换”“标记”,您需要像现在一样删除 XObject,然后删除指令,然后添加新的“标记”。

【讨论】:

  • “为什么 Aspose 将其称为 Stamp 是……嗯……一个谜。” - 嗯,每个 PDF 库或编辑器似乎都有其错误命名的项目.但是,即使 PDF 规范对特定注释类型使用“stamp”,对通用 xobject 使用“stamp”确实很奇怪。
  • 感谢@joelgeraci,这确实有助于理解幕后发生的事情。当我想出更多细节时,我将对原始问题添加一个编辑,但它只是证明了你所解释的邮票去除部分是它出错的地方。
猜你喜欢
  • 2022-01-01
  • 1970-01-01
  • 2014-07-21
  • 2020-09-23
  • 1970-01-01
  • 2022-06-10
  • 2020-02-20
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多