簡體   English   中英

返回PDF頁面的SHA256哈希

[英]Return SHA256 hash of PDF page

我正在編寫一個C#WPF應用程序,在其中插入“標題”頁作為一批PDF文檔的第一頁。 標題頁取自該批處理中第一個pdf的首頁。

用戶將啟動該過程,但是我想確保以后用戶不能再次運行此過程,這將導致插入另一個標頭。

所以我的計划是獲取頁眉的SHA256哈希值,並將其與其他pdf第一頁的哈希值進行比較。 如果它們匹配,則第一頁與標題頁相同,否則,我們插入標題。

我敲了下面的代碼以測試在pdf中獲取第一頁的哈希值,但是每次運行時哈希值都不同。

為什么每次都不同?

謝謝

using System.IO;
using System.Text;
using System.Security.Cryptography;
using PdfSharp.Pdf;
using PdfSharp.Pdf.IO;

namespace Syncada
{
    public class PDFDoc
    {

        private PdfDocument pdfDoc;

        public PDFDoc(string path)
        {
            pdfDoc = PdfReader.Open(path,PdfDocumentOpenMode.Import);
        }

        public string GetPageOneHash()
        {

            byte[] hash;

            PdfPage page = pdfDoc.Pages[0];
            using (MemoryStream stream = new MemoryStream())
            {
                PdfDocument doc = new PdfDocument();
                doc.AddPage(page);
                doc.Save(stream,false);

                SHA256 sha256 = SHA256.Create();
                hash = sha256.ComputeHash(stream);
            }

            StringBuilder sb = new StringBuilder();
            for (int i = 0; i < hash.Length; i++)
            {
                sb.Append(hash[i].ToString("X2"));
            }
            return sb.ToString();
        }
    }
}

我敲了下面的代碼以測試在pdf中獲取第一頁的哈希值,但是每次運行時哈希值都不同。

為什么每次都不同?

您不計算頁面哈希值,而是計算要添加相關頁面的新PDF文檔哈希值 不幸的是,為了您的努力,PDF文檔包含諸如創建日期,最后修改日期和唯一ID之類的信息。 由於每次計算哈希值時這些信息都不相同,因此您永遠不會獲得相同的哈希值(除非發生沖突)。

保存到流后,首先檢查流是否被倒帶。 如果不是,那么您實際上並沒有讀回任何內容,因為doc.Save(stream, false)您留在流的末尾。

要倒帶流,請使用stream.Seek(0, SeekOrigin.Begin);

如果仍不能解決問題,請檢查.Save生成的文檔在程序運行.Save是否相同。 每次生成文檔時,文檔中都有可能有所不同(也許是時間戳)。

正如mkl所寫,您每次都在創建一個新的PDF文檔,因此創建日期/時間和修改日期/時間將有所不同。

另外,隨機值用於PDF中包含的字體,因此每次您運行該程序時,它們也會有所不同。

當使用PDFsharp的DEBUG版本時,PDF文件將包含許多注釋。 您可以使用任何DIFF程序來查看有什么不同。

由於PDF頁面可以引用PDF文件中的許多其他對象,因此,計算可靠的哈希值並非易事。

一種不同的方法:使用類似GhostScript的庫來創建第一頁的圖像並計算該哈希值。 如果頁面看起來相同,您將獲得相同的哈希值。

您也可以在頁面字典中插入自定義鍵,然后在重新加載文件時檢查該鍵是否存在。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM