Diğer cevaplayıcılar, grafiğin raster görüntüsüyle ilgilendiğinizi varsayar. Ancak günümüzde iyi uygulama grafiklerin vektör şeklinde yayınlanmasıdır. Bu durumda, kurtarılan verinin çok daha yüksek kesinliğini elde edebilir ve hatta vektör grafiğinin koduyla raster görüntüye dönüştürmeden çalışırsanız kurtarma hatasını tahmin edebilirsiniz.
Makaleler çevrimiçi olarak PDF dosyaları olarak yayınlandığından, ondan kurtarmak istediğiniz verilerle vektör arsa içeren (sayısal biçimde olsun) ve ortaya konan kurtarma hatasını tahmin eden bir PDF dosyanız olduğunu varsayalım.
Öncelikle, PDF temel olarak metinsel olan bir metin formatıdır (bir metin editörü tarafından okunabilir). Buradaki sorun, (ve hemen hemen her zaman) bir metin editörü tarafından okunması için sıkıştırılmaması gereken sıkıştırılmış veri akışları içermesidir. Bu sıkıştırılmış veri akışları genellikle ihtiyacımız olan bilgileri içerir.
PDF dosyasını okunabilir PDF koduna sahip bir metin belgesine dönüştürmek için veri akışlarını açmanın birkaç yolu vardır. Muhtemelen basit yolu özgür kullanmaktır QPDF programı ile --stream-data=uncompress
seçeneği :
qpdf infile.pdf --stream-data=uncompress -- outfile.pdf
Diğer bazı yollar burada ve burada açıklanmaktadır .
Oluşturulan outfile.pdf bir metin editörü tarafından açılabilir. Şimdi ne gördüğünüzü anlamak için PDF Referans Kılavuzu 1.7'ye ihtiyacınız var . Şu an panik yapmayın! Sayfa 226 - 227'deki "TABLO 4.9 Yolu inşaat operatörleri" bölümünde açıklanan yalnızca birkaç operatör bilmeniz gerekir. ):
x y m moveto
x y l lineto
x y width height re rectangle
h closepath
Çoğu durumda, verileri kurtarmak için bu dört operatörü bilmek yeterlidir.
Şimdi outfile.pdf dosyasını, verileri değiştirebileceğiniz bir programa metin olarak almanız gerekir. Mathematica ile nasıl yapıldığını göstereceğim .
Dosyayı içe aktarma:
pdfCode = Import["outfile.pdf", "Text"];
Şimdi en basit örneği kabul ediyorum: Grafik, birçok iki noktadan oluşan bir çizgi içeriyor. Bu durumda, çizginin her bir parçası şöyle kodlanır:
268.79999 408.92975 m
272.39999 408.92975 l
Tüm bu bölümleri PDF kodundan çıkarmak:
lines = StringCases[pdfCode,
StartOfLine ~~ x1 : NumberString ~~ " " ~~ y1 : NumberString ~~ " m\n" ~~
x2 : NumberString ~~ " " ~~ y2 : NumberString ~~ " l\n"
:> ToExpression@{{x1, y1}, {x2, y2}}];
Onları görselleştirmek:
Graphics[{Line[lines]}]
Böyle bir şey elde edersiniz (çalıştığım makale dört grafik içermektedir):
Her iki bitişik segment bir noktayı paylaşır. Yani bu durumda, bitişik bölümlerin dizilerini yollara dönüştürebilirsiniz:
paths = Split[lines, #1[[2]] == #2[[1]] &];
Artık tüm yolları ayrı ayrı görselleştirebilirsiniz:
Graphics[{Line /@ paths}]
Bu şekilde, aradığınız yolu (çift tıklatarak) seçebilir, grafik seçimini kopyalayabilir ve yeni olarak yapıştırabilirsiniz Graphics
. Onu geriye doğru dönüştürmek için elementi aldığınız noktaların listesine {1, 1, 1}
. Şimdi, grafiğin koordinat sisteminde değil, PDF dosyasının koordinat sisteminde puanlarımız var. Aralarında bir ilişki kurmalıyız.
Yukarıdaki çizimden elle keneleri seçersiniz ( Shift
çoklu seçim için basılı tutunuz ), sonra kopyalayınız ve yeni yapıştırınız Graphics
. Yatay kenelerin koordinatlarını şu şekilde çıkarabilirsiniz:
Şimdi keneler arasındaki farkları kontrol edin:
Differences[reHorTicks]
Bu farklılıklardan, kenelerin PDF dosyasındaki konumunun ne kadar kesin olduğunu görebilirsiniz. Orijinal veri noktalarının PDF dosyasına dahil edilen vektör grafiğine dönüştürülmesi sonucu ortaya çıkan bir hata tahmini verir. Kenelerin konumlandırılmasında kayda değer hatalar varsa, kenelerin koordinatlarını doğrusal bir modele takarak hatayı azaltabilirsiniz. Bu doğrusal işlev şimdi, yolun noktalarının orijinal koordinatlarını (arsanın koordinat sisteminde bulunan) elde etmek için kullanılabilir.