Translate Blog

19 Nisan 2013 Cuma

C# Word Belgesi Açmak / Open Office Word Documents

Eğer c# ile office belgelerini açmak istiyorsanız aşağıdaki gibi bir kod kullanmalısınız. Using satırına System.Diagnostics eklemelisiniz. Aksi halde ProcessStartInfo kodu çalışmayacaktır.
Belgenizi açacağınız programın yolunu çift slashlı (//) olarak yazmalı, belgenizin adını seçmeli ve hangi dizinde olduğunu (@"C:\";) da belirlemelisiniz. Bu kodda butona tıklandığında açılan bir a.docx belgesinin örneğidir. 32 veya 64 bitlik bilgisayarlarda Program Files değişmektedir, kalınızda olsun.

If you want to open any document with any program, you should use ProcessStartInfo on c#.
You can use these codes for open word file. Other file types has the same way. Show the main program way  as FileName, and your file that wanted to open as Arguments. This sample show "open a.docx file on C:/ when you click button".


using System.Diagnostics;
using System.IO; //for File.Exist() command

private void button1_Click(object sender, EventArgs e)
        {         
           ProcessStartInfo startInfo = new ProcessStartInfo();
            //32 Bits
            //startInfo.FileName = "C:\\Program Files\\Microsoft Office\\Office12\\WINWORD.EXE";

            //64 bits
            startInfo.FileName = "C:\\Program Files (x86)\\Microsoft Office\\Office12\\WINWORD.EXE";
            startInfo.Arguments = "a.docx";
            startInfo.WorkingDirectory = @"C:\";
            startInfo.WindowStyle = ProcessWindowStyle.Maximized;
            if (File.Exists(startInfo.WorkingDirectory + startInfo.Arguments))
            {
                Process process = Process.Start(startInfo);
            }
            else
            {
                MessageBox.Show("Belge Yok");
            }

18 Nisan 2013 Perşembe

C# ile Word ve Excel Den Veri Almak / Read Docx Word File Using C#

How to get data from Microsot Office Word file, means docx files.
First of all you must add referance to your project. Rigth Click to your project, click  Add Referance.
Choose the COM tab and find Microsoft Word Object Library. This is for using below code.
Dont forget to add using row.
Below code use a.docx that stay in C drive, and add the whole text into the richedit object. So you should add a button and richedit also.

Öncelikle kodları hemen vereceğim ama office referanslarını eklemeniz lazım projenize.
Proje adınıza sağ klik Add Referance, ordan COM sekmesini açın, listede Microsoft Word Object Library seçeneğini ekleyin.

Kodlarınınzın en yukarısında bulunan using satırına ise şunları ekleyin

using Word = Microsoft.Office.Interop.Word;
Sahnenize bir RichEdit ve buton ekleyin, butonunuza şu kodları ekleyin;
Microsoft.Office.Interop.Word.Application word = new Microsoft.Office.Interop.Word.Application();
            object miss = System.Reflection.Missing.Value;
            object path = @"C:\a.docx";
            object readOnly = true;
            Microsoft.Office.Interop.Word.Document docs = word.Documents.Open(ref path, ref miss, ref readOnly, ref miss, ref miss, ref miss, ref miss, ref miss, ref miss, ref miss, ref miss, ref miss, ref miss, ref miss, ref miss, ref miss);
            string totaltext = "";
            for (int i = 0; i < docs.Paragraphs.Count; i++)
            {
                totaltext += " \r\n " + docs.Paragraphs[i + 1].Range.Text.ToString();
            }
            richTextBox1.Text = totaltext;
            docs.Close();
            word.Quit();



İşlem tamam C sürücünüzde bulunan a.docx belgesini okudunuz. Excellide siz deneyin ben denemedim ;) ONun da referansdan eklemelisiniz. Microsoft.Excel, ....

Php İle Dizinde Bulunan Resimler Üzerine Toplu Yazı Yazmak

Dizinde bulunan yüzlerce resminiz olabilir, bunların hepsinin üzerine ayrı ayrı resim, logo veya yazı eklemek ihtiyacınız olabilir. Bunun için gidilecek yolu önce maddeler halinde yazayım. Yapmanız gereken şeyler;

  1. Kütüphane Kontrolü: Php GD kütüphanesi kullanarak resimleri işlemeniz lazım. Bu komutlarla resimleri düzenleyebilirsiniz. Muhtemelen kendi bilgisayarınızda localde kullanacağınız serverlarda bu kütüphane varmı yokmu kontrol edilmeli. Yoksa kurulmalı veya internetteki bir serverda denemelere devam edilmeli.
  2. Yazı Dizisi: Dizindeki resimlere yazdırılacak yazıları bir dizide tutacaksınız. Dizideki sıralama, server içindeki sıralama ile aynı olmalı. Bunun nasıl yapılabileceğinden bahsedeceğim merak etmeyin.
  3. Dizin Tarama ve Resim İşleme: Klasörünüzün içindeki resimleri taramak için kod kullanacağız, FAKAT KLASÖRDE RESİMDEN BAŞKA BİRŞEY BULUNMASIN. Her resim için GD kodları ile (imagecreatefromjpeg, imagecolorallocate, imagefill, imagecopyresampled, imagejpeg) düzenleme yapıp ilgili yazıyı resimlerimize yazdıracağız.
  4. Kayıt: İşlenen resimleri başka bir dizine aynı isimde kaydedeceğiz.
1. KÜTÜPHANE KONTROLÜ
Localde çalışıyorsanız aşağıdaki kodu bir php dosyasına yazıp çalıştırın.
<?php
phpinfo();
?>
Ekranda serverınıza ait bilgiler gelecektir. Burada aradığımız bilgi GD. GD Support  değerinin enabled yazıyor olması lazım. Yazmıyorsa veya GD ile alakalı birşey yok ise kurmalısınız. Nasıl olacak bilmiyorum :D Google amcaya sorun. İnternette bir serverınız varsa orada deneyin garanti açıktır.

2.YAZI DİZİSİ
Eğer elinizde 500 resim var ve bunlara 500 ayrı yazı yazmak istiyorsanız bu yazı dizisini oluşturmanız lazım.
Benim 532 dosyam var ve bu dosyaların her birine Türkçe karakterleri doğru yazılmış yazılar yazmak istiyorum. Bu yüzden bu resim belgelerinin Düzgün isimlerinin listesi lazım. Elinizle yazarsanız doğru sonucu elde edersiniz AMA YANLIŞ SIRADA. Yukarıda gördüğünüz sıralama işletim sisteminiz tarafından size gösterilen sıralamadır, fakat php kodu ile sıralama yaptığınızda yukarıdaki sırada resimleriniz sıralanmamaktadır.
Php ile sıralama kodu yazıp klasörünüzün belge isimlerinizi listelediğini zaman yukarıdaki gibi farklı sıralamalar elde edebilirsiniz. İşimizi garantiye almalıyız. Bunun için bir iki yazı önce bahsetmiş olduğum dizin sıralama kodlarını kullanacağız.

<?php
$dizi = array();
$dizin = "b/"; //dizininizin yolu
$ac = opendir($dizin);
while($x=readdir($ac)) {
if ($x != "." && $x != "..") {
$dizi[] = $x;
}
}
sort($dizi);

foreach($dizi as $x => $y) {
 echo $y."<br>";
}
?>

Yukarıdaki kodu bir php belgesine yapıştırıp, $dizin değişkeninizi de yolunuz olarak değiştirdikten sonra çalıştırın. Ekrana dizin listeniz gelecektir. Türkçe karakterleriniz bozuk geliyorsa Dreamweaver kullananlar için Page Propertiese'e girip Encoding değerini Türkçe yapmaları lazım. Sonuç şu şekilde;
Yukarıdaki listeyi kopyalayın ve excell'e yapıştırın. Amacımız bu isimlerin düzgün yazılmasını sağlamak veya resimlerin üzerine yazdıracağınız yazılar farklı yazılar ise bu belge içinde sırayla yanlarına yazmak istediğiniz metinleri yazabilirsiniz.


Ben siz görün diye formülü açık halini de yazmıştım. Bu excel belgesindeki amaç klasördeki aynı sırada bir metin dizisi elde etmek. Ve bu sayede metinleri dizindeki resimlerin üzerine aynı sırada yazdırabilmek. Tırnak işaretli metin satırlarınızı oluşturduysanız ki yukarıdaki ortadaki sütundan bahsediyorum, o sütunlarının tamamını kopyalayıp notpad veya varsa ki olsun notpad++ a yapıştırın.
'10 Kuruş',
'25 Kuruş',
'50 Kuruş',
'5 Kuruş',

Notpad programında yukarıdaki sarı kırmızı ile seçtiğim tırnak virgül ve alt satırdaki tırnağa kadar bir seçim yapın kopyalayın ve CTRL+H ile değiştir menüsünü açıp yapıştırın, yerine yine aynı işaretleri yazın ama elinizle. Amacımız ENTER kodunu ortadan kaldırmak ve hepsini yan yana yazdırmak aynı şu şekilde;
'10 Kuruş','25 Kuruş','50 Kuruş','5 Kuruş','Tl','Abla','Abla','Adım','Akrep','Akşam Yemeği',

Bu tarz bir liste elde ettiyseniz artık dizimiz hazır demektir. Şu kodu bir kenarda tutun bunu kullanacağız.
$etiket = array('10 Kuruş','25 Kuruş','50 Kuruş','5 Kuruş','Tl','Abla','Abla','Adım','Akrep','Akşam Yemeği',)

3. DİZİN TARAMA VE RESİM İŞLEME


  • Artık klasörünüzün içinde resimlerinizin bulunduğu bir klasör "a/". FAKAT KLASÖRDE RESİMDEN BAŞKA BİRŞEY BULUNMASIN.
  • Resimlerinizi son hallerini kaydedeceğiniz bir klasör "b/",
  • C:\Windows\Fonts klasörünüzden kopyalayıp yapıştırdığınız font belgeniz "verdanab.ttf", dışarıdan bulduğunuz başka bir ttf font dosyasını da koyabilirsiniz.
  • Ve dizin tarayıp resimleri metinlerle birleştirecek olan bir php dosyanız olmalı.
Bunlardan biri veya birkaçı yok ise hemen temin edin ;) Yemeğimizi pişirme zamanı geldi, aşağıdaki kodu kopyalayıp bir php dosyasına yapıştırın. 
<?php 
$etiket=array('10 Kuru?','25 Kuru?','50 Kuru?','5 Kuru?','Tl','Abla','Abla','Adym','Akrep','Ak?am Yeme?i');
//print_r($etiket);

$dizi = array(); 
$dizin = "a/"; 
$ac = opendir($dizin); 
while($x=readdir($ac)) { 
if ($x != "." && $x != "..") { 
$dizi[] = $x; 
} 
} 
sort($dizi);

// Bu kodlar dönüştürme işlemi uzun sürdüğü zaman serverın işleminizi iptal etmesini geciktiren kodlardır.
set_time_limit(10); 
ini_set('max_execution_time', 1000); // Buradaki 1000sn yi istediğiniz kadar uzatabilirsiniz. Ben 500 resim için 1.5dk bekledim. Fazla fazla süre verdim. Aksi halde işleminiz yarıda kalır 160 tanesini yaparsınız ve işleminiz kesilir. Resim işleme uzun bir süreçtir Unutmayın.


foreach($dizi as $x => $y) { 
 //echo $x.") ".$etiket[$x]." - ".$y."<br>";
 $font ='./verdanab.ttf'; //klasörümüe kopyaladigimiz boldlu font dosyasi
 $kaynak = "a/".$y; // resimleri alacagimiz dizin
 $resim = imagecreatefromjpeg($kaynak); //GD kodu ile resmimizi Ramde olusturuyoruz

 $yeniresim=imagecreatetruecolor(803,862); //GD kodu ile Daha büyük bir resim olusturuyoruz
 
 //kullanacagimiz renkleri tanimliyoruz
 $beyaz = imagecolorallocate($yeniresim, 255, 255, 255);
 $gri = imagecolorallocate($yeniresim, 128, 128, 128);
 $siyah = imagecolorallocate($yeniresim, 0,0,0); 
 //arkaplan rengimizi beyaz yapiyoruz
 imagefill($yeniresim, 0, 0, $beyaz);
 
 //yeni olusturdugumuz beyaz resim ile kaynaktan aldigimiz resimi birlestiriyoruz.
 //bu kodda resim yukaridan 94px bosluktan sonra ekrana yerlestirilmistir. En sondaki 2 deger resimin genislik ve yükseklik degerleridir.
 //
 imagecopyresampled($yeniresim,$resim, 0, 94, 0, 0, 803, 768, 803, 768);
 
 //yazilarin bulundugu diziden $etiket[$x] içinde bulunan yazidaki türkçe karakterleri UTF-8 yapiyoruz.
 $yazi= iconv("iso-8859-9","utf-8",$etiket[$x]); //türkçe karakter sorunu çözüldü
 
 //bu bir hizalama fonksiyonu, uzun aramalar sonucu denk geldim. Yazinizi ortalamak için kullabilirsiniz.
 hizala($yeniresim,40,0,0,63,$gri,$font,$yazi, $alignment='C');
 hizala($yeniresim,40,0,0,60,$siyah,$font,$yazi, $alignment='C');
 
 //Resminize yaziyi da ekledikten sonra artik bir yerlere kaydetmelisiniz. 
 //b/$y dedigimiz b dizininde $y ismiyle kaydedilecek bu resim.
 imagejpeg($yeniresim,"b/$y",100);

} 
closedir($ac); 


//yazıyı ortaya Hizalamak için bir fonksiyon. 

function hizala($image, $size, $angle, $x, $y, $color, $font, $text, $alignment='C') 
{ 
   //check width of the text 
   $bbox = imagettfbbox ($size, $angle, $font, $text); 
   $textWidth = $bbox[2] - $bbox[0]; 
   switch ($alignment) { 
       case "R": 
           $x -= $textWidth; 
           break; 
       case "C": 
           $x -= $textWidth / 2; 
           break; 
   } 

   //ekrana metni yazdır, ben metini resmin ortasında yazdırmak istediğim için 400 olan 
   //resmimin genişliğine -değer olan xi ekledim. ortalanmış oldu
   imagettftext ($image, $size, $angle, $x+400, $y, $color, $font, $text); 
} 
?>


Kodlar içine açıklamalar yazdım. Onları okuyarak nerenin ne işe yaradığını anlayabilirsiniz.
Yukarıdaki kodlarda öncelikle kelime dizimiz yazılmış. Ardından aynı dizin tarama kodu çalıştırılmış ve her bir resim için GD kütüphanesinin kodları kullanılarak resimlere dizininin içindeki bir kelime eklenmiş. Bu ekleme işlemi tam ortada yapılmış yani yazının resminizin ortasında durmakta. Bu hizalama olayı biraz sıkıntılı idi, araştırınca buldum. hizala isimli bir fonksiyon yazınızı alıp tam resminizin ortasına yazınızı eklemekte.

Kaydetme işlemide bu esnada yapılmakta.
imagejpeg($yeniresim,"b/$y",100);
Kodu ile. yeni oluşturulan resimi b dizininde eski ismi ile kaydetmiş oluyoruz.

Sonuç şu şekilde;

Yazının gölgesi olduğuna dikkati çekerim ;) Gd kodlarını araştırarak başka şeyler de yapabilirsiniz. Özellikle türkçe karakter destekleyen fontlar kullanın. Resim belgelerinizin isimlerinde boşluklar ve türkçe karkterler var ise problem yaşayabilirsiniz, yaşamamak için Tüm PHP belgeleriniz TÜRKÇE ENCODING yapılması gerekiyor. Yukarıda bahsetmiştim nasıl yapılacağından.

Benim kullandığım resim belge boyutları ile sizinkiler arasında farklar vardır. imagettftext ve imagecopyresampled


Komutlarında kullanılan koordinat, genişlik yükseklik bilgileri değiştirilmelidir. Hangisi hangisi olduğunu öğrenmek isterseniz googleda aratın php.net sitesinden çıkan yani ilk sonuçlara tıklayın hangisi hangisi orda yazıyor, ingilizce ama kolay gelsin (translate.google.com)

17 Nisan 2013 Çarşamba

Php İle Yapılan İşlemin Çalışma Süresini Arttırmak / Increase PHP Execution-Working Time

Sayfanızda kod çalışıyor ama tamamlanamadan duruyor mu?
Uzun bir döngüyü başlattınız ama sonlanmadan bitti mi?

Problem muhtemelen kodunuzdadır, düzeltin geçer ;)
Demeyeceğiz, ilacını vereceğiz,

Başlattığınız işlem serverınız tarafından çok uzun sürdüğü için iptal edilmekte. Ama bu bekleme süresini elinizle değiştirebilirsiniz. Hemde php.ini dosyanızı kurcalamadan ufak bir kod ile. Php dosyanızın içine aşağıdaki kodu ekleyin;


set_time_limit(10);

ini_set('max_execution_time', 1000);


max_execution_time komutunu çalıştırdığınız belge için arttırarak o an yapılan işlemin 1000sn de sürse kesilmeden devam ettirileceği anlamına gelmektedir.

Üzülerek bildirmek isterimki set_time_limit ne işe yarar bilmiyorum. Ama bu kod sayfamda 500 adet resim işlenip bir dizine kaydedilirken işlemlerimin yarıda kesilmesini engelledi.

If your php page has a log job to do, and has a deadlock while running, you should change your php execution settings. You can change file execution time on php.ini but you dont need to do this way.
As an easy way you can use above code on your php file. Make execution time to 1000 (16 min) ;)

I have 500 images to process on one time, and have a deathlock on 160th. I use this code and now i can process all my images for one attampt in one php file.

Php İle Alfabetik Türkçe Dizin Listeletme

Klasörlerin içindeki belgeleri alfabetik listelemek için aşağıdaki kodu kullanabilirsiniz. $dizin içini listelemek istediğiniz klasörün yoludur.

<?php
$dizi = array();
$dizin = "b/";
$ac = opendir($dizin);
while($x=readdir($ac)) {
    if ($x != "." && $x != "..") {
         $dizi[] = $x;
    }
}
sort($dizi); //listelenen isimler alfabetik sıralanıyor.

foreach($dizi as $x => $y) {
 echo $y."<br>"; //ekrana satır satır yazdırılıyor.
}
?>


Yukarıda görüldüğü gibi sayfanızdaki bilgilerin türkçe karakterlerinde bozulma oluyorsa belgenizin encoding olayını Türkçe olarak değiştirmelisiniz. Bunu Dreamweaverda veya Notpad++ ile yapabilirsiniz. Dreamweaver'da Properties panelinde Page Properties / Title Encoding / Türkçe (Windows)
Notpad++'da Kodlama/Karakter Grubu / Türkçe / Windows-1254

Hiçbiri işe yaramıyorsa kodlarınızı kopyalayın, boş bir belge açıp içine yapıştırın. Encoding ayarını yapıp yeniden kaydedin.