Ben (benzer ihtiyaçlar için) önce bir yazdım ve şunu söyleyebilirim: eğlenin. Bu oldukça karmaşık bir görev. PDF specification, büyük ve hantal. Bunun içinde metin depolama çeşitli yöntemler vardır. Ve Kicker her PDF jeneratör nasıl çalıştığını farklı olmasıdır. TFPDF veya DOMPDF gibi bir şey (bir makine açısından) PDF'leri okumak için gerçekten kolay oluşturur iken Yani, Acrobat bazı gerçekten cehennemi belgeler yapar.
Nedeni metni yazar nasıl olduğunu. En DOM tabanlı render - Ben kullanmış olduğunuz - bir dize olarak tüm satır yazmak ve (okumak için gerçekten çok kolay olan) bir kez yerleştirin. Acrobat bir seferde sadece bir ya da belki bir kaç karakter yazma ve bağımsız bir şekilde konumlandırarak daha verimli (ve o) olmaya çalışır. Bu GERÇEKTEN oluşturmayı kolaylaştırır iken, çok daha zor okuma yapar.
Burada yukarı tarafı, kendi içinde PDF formatında gerçekten basit olmasıdır. Siz düzenli bir sözdizimi takip "nesneler" var. Sonra içeriği oluşturmak için onları birbirine bağlamak olabilir. Şartname dosya biçimini açıklayan iyi bir iş yok. Ama gerçek dünya okuma beyin gücünün biraz almaya gidiyor ...
Kendiniz yazmak için gidiyoruz eğer ben zor yoldan öğrenmek zorunda kaldı tavsiye bazı yardımcı parçalarıdır:
- Adobe re-map fontlar seviyor. Yani karakter
65
olasılıkla A
... bir harita nesneyi bulmak ve orada ne karakterler dayalı ne yaptığını anlamak gerek olmayacaktır. Bir karakter bu font için belgede görünmüyorsa, o (programlı bir PDF düzenlemek çalışırsanız hayatı zor kılan) da dahil olmadığından ve verimli ...
- Mümkün olduğunca soyut yazın. Her nesne türü ve her doğal türü (dizeleri, sayılar, vb) için sınıfları yaz. Bu sınıflar için ayrıştırmak olsun. Orada tekrarlama adil bir bit olacak, ama size sadece belirli bir tip) için bir şey çimdik gerektiğini fark ettiklerinde sonunda kendinizi tasarruf edeceksiniz ...
- PDF spec belirli bir sürümüne veya iki için yazmak, ve bunu uygulamak. Sürüm numarasını kontrol edin ve size beklediğinizden daha yüksek bulunuyor ise, ... kefaletle Ve "o iş yapmak" için çalışmayın. Eğer yeni sürümlerini desteklemek istiyorsanız, şartname patlak ve oradan ayrıştırıcı yükseltin. (Eğlenceli değil) deneme deneyin ve yolunuzu kadar hata yapmayın ...
- Sıkıştırılmış akışı ile iyi şanslar. Ben genellikle sıkıştırılmış açma ne doğrulamak için uzunluk argümanları güvenemem bulduk. Bazen (bazı jeneratörler için) iyi çalışıyor ... Diğerleri ise bir veya daha fazla byte ile kapalı bulunuyor. Ben sadece filtre eşleşen eğer deflate girişimi ve ardından uzunluğu zorlamak ...
- Uzunlukları test ederken, kullanmayın
strlen
. (Diğer chartsets'ten potansiyel geçersiz karakterleri ve izin) farklı karakter setleri için telafi edecek beri mb_strlen($string, '8bit')
kullanın.
Aksi halde, iyi şanslar ...