Adobe在保存为新文件时打破了PDF标记/ Adob​​e除了福克斯阅读器之外还有什么区别'保存为'功能

时间:2017-07-06 18:00:47

标签: pdf adobe aspose aspose.pdf

我正在接触更大的开发者社区,寻求帮助以了解真正的原因并可能找到解决办法。我问过Aspose的问题,他们也在他们的系统中跟踪了这个问题(PDFNET-42880)。我认为他们不会很快调查这个,因为它是非常具体的情况。现在我在这里发帖,询问有关的更多细节:

  1. Adob​​e'另存为'与福昕阅读器'有什么不同除了'与Windows阅读器'另存为'功能?

  2. Adob​​e产品的问题并不明显。我甚至不知道该问什么:D

  3. 链接到他们的(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标记,使用Adobe Reader DC(或Adobe 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 );
    }
    

    使用Adobe:删除邮票的过程正常,但尝试打开文件最终会导致文件出现问题。

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

      

    编辑:经过测试更多,只是打开文件到Aspose,并保存它没有修改,没有破坏文件,只有一旦使用Aspose方法删除了图章,它就被打破了。

    使用Foxit:这个过程的唯一区别就是将文件打开到Foxit Reader并在那里保存表单。邮票被删除,文件很好,适用于任何PDF阅读器。

    使用Windows(10)阅读器:仅在此过程中的区别是将文件打开到Windows阅读器并从那里保存。邮票被删除,文件很好,适用于任何PDF阅读器。

1 个答案:

答案 0 :(得分:1)

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

由于您创建文件的方式并添加了&#34;标记&#34;,您的网页内容流是一组流。删除数组中的最后一项,这是绘制XObject的指令,您的文件将在所有查看器中正常运行。注意:内容数组中的最后一项将永远不会是您的标记。只是你的邮票是最后一个被绘制的东西,所以它最终会被删除。

如果您的目的是&#34;替换&#34; &#34;戳&#34;,你想要通过删除现在正在做的XObject,然后删除指令,然后添加新的&#34;戳&#34;来实现。