Bir PDF dosyasının kodu nasıl görüntülenir ve düzenlenir


12

Nasıl bir PDF dosyasının kodunu görüntülemek ve düzenlemek için merak ediyordum?

  1. Görüntüleyerek, ikili biçimi görmek istemiyorum, bu yüzden hexdumpistediğim gibi olmayabilir düşünüyorum . Denedim gedit, ancak PDF içeriğinin kodunu çözmek için hiçbir kodlama yöntemi kullanılamaz.

  2. Düzenleyerek, /Fitonları aramak ve /XYZörneğin sed ile değiştirmek istiyorum . Ancak sed s/\/Fit/\/XYZ/ < 1.pdf > 2.pdfkomutum, herhangi bir hata bildirmemesine rağmen PDF'imin görünümünü beklediğim gibi değiştirmiyor gibi görünüyor. sedPDF dosyaları üzerinde düz metinmiş gibi çalışabilir miyim diye merak ediyordum.

Sorularımın bağlamı bu sorudan bulunabilir . İşletim sistemim Ubuntu 10.10.

Yanıtlar:


9

sedİkili dosyalarla kullanabilirsiniz (en azından GNU sed; bazı uygulamalarda boş karakterler içeren veya satırsonu karakteriyle bitmeyen dosyalarda sorun olabilir). Ancak kullandığınız komut /Fither satırdaki ilk oluşumun yerine geçer ve PDF dosyasında satırlar hemen hemen anlamsızdır. Tüm tekrarlamaları değiştirmeniz gerekir:

 sed s/\/Fit/\/XYZ/g

Sadece /Fitbir kelime bileşen tarafından takip edilmezse yerine daha sağlam olurdu (örneğin, yerine koymuyorum /Fitness; Dosyanızın /Fitsorun yaratacağı olaylar içerip içermediğini bilmiyorum ). İşte bir yol:

perl -pe 's!/Fit\b!/XYZ!g'

Teşekkürler! Şimdi çalışıyor! (1) İkili içeriklerde arama karakterlerinin nasıl sed olduğunu merak ediyordum? Sed öncelikle aramadan önce sorgu karakterlerini kodlar mı? Son buyruğunda (2), ne !, \bve gdemek? Perl olmadan sadece sed ile yapılabilir mi?
Tim

1
@Tim (1) Sed, verileri belleğe yükler, üzerinde çalışır ve yazdırır. Neden bir şey kodlaması gerekiyor? (2) gher satırdaki sed ve perl'deki tüm oluşumları değiştirmek anlamına gelir. !ayırıcı; skomut için ayırıcı olarak (neredeyse) herhangi bir karakteri seçebilirsiniz ( bu hem sed hem de perl'de gider). \bkelime sınırı anlamına gelir; perl'de var ama sed'de yok.
Gilles 'SO- kötü olmayı kes'

Hakkında (1), çünkü komutta sed'e verdiğiniz karakterler insan tarafından okunabilir. Aranacak içerik tamamen ikiliyse sed, orada sorgu kelimesini nasıl bulabilir?
Tim

@ Zaman Metin insan tarafından okunabilen ikili verilerdir.
Gilles 'SO- kötü olmayı kes'

1
@ Zaman Evet, sorguya ikili veri iletebilirsiniz. Karakterleri sed veya shell kaynak kodunuza tam anlamıyla eklemeniz gerekir.
Gilles 'SO- kötü olmayı kes'

17

1. sorunuzla ilgili olarak ("kaynak kodu görüntüler, ancak ikili kod içermez"): birçok nesneye bağlı dahili ikili akışların sıkıştırmasını kaldırmak için sahip olduğunuz birkaç seçenek vardır.

Bunun için en sevdiğim araç , tüm büyük işletim sistemi platformlarında bulunan QPDF'dir . Aşağıdaki komut tüm akışları ve tüm nesne akışlarını sıkıştırır :

 qpdf --qdf --object-streams=disable orig.pdf expanded.pdf

Artık PDF'nizi herhangi bir metin düzenleyicisinde açabilirsiniz. (Hala bazı ikili bloblar olabilir: örneğin, QPDF'nin genişlemesi mantıklı olmayan yazı tipi dosyaları ve ICC profilleri).

To yeniden sıkıştırmakexpanded.pdf düzenledikten sonra tekrar, sen çalıştırabilirsiniz:

 qpdf expanded.pdf orig2.pdf

(PDF'leri manuel olarak düzenlerken dikkatli olun! Bunu doğru yapmak için dahili söz dizimi hakkında çok şey bilmeniz gerekir. Tek bir bayt ekler veya siler kaldırmaz, artık yapamayan PDF okuyuculardan hata mesajları alabilirsiniz PDF'leri iç ToC bayt ofset hesaplamalara dayandığı, bozuk olduğundan, aç. Hemen değiştirilmesi Fitile XYZbirlikte, para cezası gitmeli dizeleri ...)


1
Ayrıca metin ekleyebilir veya kaldırabilirsiniz. Bir nesne akışının uzunluğu değiştiğinde bayt uzaklıkları fix-qdfqpdf'nin parçası olan program kullanılarak yeniden hesaplanabilir . Yine de biraz dikkatli olmalısın. Bkz. Qpdf.sourceforge.net/files/qpdf-manual.html#ref.qdf
H. Rittich

@ H.Rittich: Yorum için teşekkürler ... Sizce bu soruna nasıl yeni bir bakış açısı getiriyor? Bu şekilde metin ekleyebileceğimizi veya kaldırabileceğimizi bilmediğimizi düşündünüz mü?
Kurt Pfeifle

@KursPfeifle: Bildiklerin hakkında herhangi bir varsayımda bulunmuyorum. Yanıt, bir PDF'yi bu şekilde düzenlemenin , dosyadaki nesnelerin bayt uzaklığını koruması gerektiğini belirtir . Bununla birlikte, bayt ofsetlerini daha sonra kullanarak düzeltirken değiştirmek mümkündür fix-qdf. Bu nedenle, bir dizeyi farklı uzunlukta bir dizeyle değiştirmek istiyorsanız, bu mümkündür, ancak fix-qdfaracı kullanmanız gerekir . Bunun cevaba yararlı bir katkı olduğunu söyleyebilirim.
H.Rittich

@ H.Rittich: Bakış açınızı verdiğiniz için teşekkürler. Nesnelerin bayt uzaklığını koruma ihtiyacını vurguladığımda, insanlara bunu NASIL yapmaları gerektiği konusunda tavsiyede bulunmak istemedim . Yorumunuzu biraz farklı ifade etseydiniz, yorumunuzun niyetini daha hızlı anlayabilirdim.
Kurt Pfeifle

1

sedsatır yönelimlidir, bu da satır değil blok olarak yapılandırılmış ikili dosyalar için uygun değildir.
Bunun yerine bbe (bbe-.sourceforge.net) kullanmayı deneyin.

Alternatif olarak, hem Emacs (GNU ve XEmacs) hem de vim PDF dosyalarını sorunsuz bir şekilde açar. Karışık metin ve ikili olduğu için elbette çok güzel basılmıyor, ancak düzenleme amaçlarınız için yeterli. Vim için her şeyi kolaylaştıran
bir Pdftk eklentisi var, buradan indirin (zip dosyası).
Muhtemelen bildiğiniz gibi, yukarıdaki editörlerin her ikisi de güçlü arama ve değiştirme yeteneklerine sahiptir.

Ayrıca, PDF'yi daha önce QDF moduna dönüştürmek PDF dosyalarını düzenlemeyi gerçekten kolaylaştırır.


Anahtarı sedkullanarak düzenlemeyi de deneyebilirsiniz -b. eğer işe yararsa bunu cevabıma ekleyeceğim.
Philomath

@Tim: "hiçbir şey göstermiyor" ile ne demek istiyorsun, sadece boş? herhangi bir hata mesajı var mı? Ayrıca, XEmacs ile deneyebilir misiniz? (üçü de benim için çalıştı).
Philomath

Yaklaşık Aldırma -b, bu cygwin bir bilgi.
Philomath

Emacs "Dosya 1.pdf dosyası büyük (9MB), gerçekten açık mı? (Y veya n)" diyor. "Y" yi seçtim ve sonra hiçbir şey yok.
Tim

Muhtemelen bir Emacs sorunu, XEmac'larınız var mı? (Ben sadece 31 MB PDF sorunsuz açtım).
Philomath

0

PDF'yi açmak, görüntülemek, şeyleri değiştirmek, yeni bir PDF yazmak, vb.

Tarayıcılar gibi bazı kaynaklardan gelen PDF'lerin sayfaları genellikle metin yerine görüntü olarak içerdiğini ve bu nedenle arama ve değiştirme işlemlerinde şansınızın olmayacağını unutmayın.


3
(1/2) Aşağıdaki gerçeğe dikkat edin: LibreOffice yerel bir PDF editörü değildir. Bir PDF açıldığında, tüm sayfaları bir vektör görüntüsüne dönüştürür (raster parçalarını orijinal PDF'den raster parçaları olarak tutabilir) ve LibreOffice paketinin LibreOffice Draw bölümünde açar . Ardından, düzenlenen PDF dosyasını kaydettiğinde, yerel LibreOffice Draw formatından ( .odg son ekiyle ) PDF'ye dışa aktarılan bir PDF dosyası olacaktır .
Kurt Pfeifle

3
(2/2) Bu iş akışında beklenmeyen yan etkiler olabilir. Ayrıca, LibreOffice Draw uygulaması orijinal PDF'deki tüm öğeleri doğru şekilde alamayabilir. Bununla birlikte, birçok durumda, daha iyi bir yolu olmayan tüm insanlar için hala yararlı bir araç olabilir.
Kurt Pfeifle
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.