2012-04-10 13 views
8

Bir PDF dosyasını 'doğrusallaştırabileceğimi' biliyorum, örneğin Acrobat SDK'yı kullanarak veya ticari araçları kullanarak. Buna 'web için optimize edilmiş' de denir ve PDF'yi sayfa 1'in olabildiğince hızlı yüklenebilmesi için yeniden düzenler. Bu şekilde sunulan PDF'ler daha hızlı görüntülenir, çünkü PDF görüntüleyicinin tüm PDF’lerin indirilmesini beklemesi gerekmez.Doğrusallaştırılmış bir PDF dosyasında sayfa 1'in kapsamını (bayt cinsinden) nasıl belirleyebilirim?

Güncelleme: aşağıdaki cevaba göre, şimdi doğrusallaştırılmış bir PDF'nin sadece yeniden düzenlenmiş değil, aynı zamanda "doğrusallaştırma sözlüğü" biçiminde kendi yapısıyla ilgili meta veriler içerdiğini fark ediyorum.

Kullanıcının bunlardan birini görmek isteyeceği beklentisiyle birkaç PDF'yi (sorgulamanın sonuçlarını) almak istediğim bir uygulamam var. Müşterim, arama sonuçlarının her biri için sayfa 1'i ve yalnızca sayfa 1'i indirebilirse harika olurdu. Kullanıcı bunlardan birini seçtiğinde, sayfa 1 anında görüntülenebilir ve geri kalanı arka planda indirilebilir.

Sayfa 1'i ve geri kalanı ayrı ayrı saklayabilmem ve sunabilmem için PDF'lerimi ön işlemek için sunucu tarafında (Windows veya Linux) kullanılabilecek genel bir çözüm arıyorum. Gerçekten bilmem gereken tek şey, PDF'de sayfa 1'i düzgün bir şekilde görüntülemek için gereken son bayttır. Eğer bu numaraya sahip olabilirsem, her şey takip eder.

ISO specification for PDF'a göz attım ancak dosya biçimi sayfa 1'in bittiği yeri ayrıştırmak için çok karmaşık görünüyor. Öte yandan, PDF'leri doğrusallaştıran araçlar, sayfa 1'in nerede bittiğini kesinlikle bilmelidir.

PDF'leri müşterilere sunma zorluğuyla ilgilenmiyorum; İstemci bir uygulama değil, bir tarayıcı olduğu için bu bölüm zaten çözüldü ve tam kontrole sahibim.

Ayrıca PDF'yi AP Split gibi araçlarla "sayfa 1" PDF ve tam bir PDF'ye bölmeme yardımcı olacağını düşünmüyorum. Bunu yaparsam, istemci görüntüleyiciyi tek bir PDF dosyası olarak düşünmeye aldırmayacağım ve "sayfa 1" PDF'yi tam PDF ile değiştirdiğimde fark edilir bir titreme olacak.

Herhangi bir yardım veya işaretçiler takdir.

Uygun doğrusallaştırılmış PDF (PDF spec bölüm 7.5.2 tanımlanan) bir pompa çıkışı hattı ile başlar, örneğin "% PDF 1.7" ve ardından edilmiştir:

Çözelti (aşağıda Bobrovsky cevabı göre) En az dört ikili karakterin bir yorum satırı (128 veya üzeri bayt değerleri olarak tanımlanır). Örneğin:

%PDF-1.7 
    %¤¤¤¤ 

Bu başlık hemen (PDF spec Ek F tanımlanmıştır) doğrusallaştırma sözlük tarafından takip edilir. Bir örnek: bayt Bu veri yapısı hemen hemen herhangi bir dil kullanarak ayrıştırmak için yeterli basittir 5437. ofset bu örnekte

43 0 obj 
    << /Linearized 1.0 % Version 
    /L 54567 % File length 
    /H [475 598] % Primary hint stream offset and length (part 5) 
    /O 45  % Object number of first page’s page object (part 6) 
    /E 5437 % Offset of end of first page 
    /N 11  % Number of pages in document 
    /T 52786 % Offset of first entry in main cross-reference table (part 11) 
    >> 
    endobj 

, ilk sayfasının sonudur. "43 0 obj" sözcüğü bu sözlük için bir kimlik (43) ve bir nesil numarası (doğrusallaştırılmış dosyalar için her zaman sıfır) verir. Sözlüğün kendisi < < ve >> arasındadır, bunlar arasında anahtar değer çiftleri vardır (tuşların "/ E" gibi eğik çizgileri vardır).

Ve burada bir normal ifade kullanarak ilgili numarayı bulan bir C# yöntemi var:

public int GetPageOneLength(byte[] data) 
{ 
    // According to ISO PDF spec: "The linearization parameter dictionary shall be entirely contained within the first 1024 bytes of the PDF file" (p. 679) 
    string preamble = new string(ASCIIEncoding.ASCII.GetChars(data, 0, 1024)); // Note that the binary section on line 2 of the header will be entirely converted to question martks ('?') 
    var match = Regex.Match(preamble, @"<<\w*/Linearized.+/E\s+(?<offset>\d+).+>>"); 
    if (!match.Success) throw new InvalidDataException("PDF does not have a proper linearization dictionary"); 
    return int.Parse(match.Groups["offset"].Value); 
} 

Not Bir dosya nedeniyle bir artan düzenleme belki (lineerizasyon sözlüğü içerebilir, henüz düzgün doğrusallaştırılabilir olmayabilir Bobrovsky en ikaz ?). Benim durumumda, bu bir sorun değil, çünkü tüm PDF'leri kendim de doğrusallaştıracağım.

+1

Başka bir uyarı: PDF dosyalarını üstbilgi ve doğrusallaştırma sözlüğü başlangıcı arasında çöp baytları ile gördüm. – Bobrovsky

cevap

3

Lineerleştirme sözlüğü bu konuda size yardımcı olacaktır.

dosyanın başlangıcına göre birinci sayfasında (Örnek F.1'de kısmının 6 yılı sonu), sonu ofset olduğu E parametreyi içermesi gereken sözlük.

dosyalarınızı düzgün doğrusallaştırılmış olmak doğrulanmadı değilse sen açıklanan yaklaşım kullanmak mümkün olmayabilir, bir doğrusallaştırma sözlükle değil her dosya aslında (kırık jeneratörler, doğrusallaştırma vb sonra değişiklikleri) doğrusallaştırımı unutmayınız Yani lütfen .

lineerizasyon sözlüğü hakkında daha fazla bilgi için PDF Referans F.2.2 Lineerleştirmesi Parametre Sözlük (Bölüm 2) bir göz atınız.

İlgili konular