2016-04-07 37 views
0

Eski pdf dosyalarını, eski görüntü tarayıcıları için ayrı görüntü dosyaları olarak dönüştürmeye çalıştığımda, ABCPdf ile ilgili bir sorunum var.İşleme başlamadan önce ABCPdf ile sayfayı yeniden boyutlandırma (pdf'deki büyük resimler)

Sayfayı mükemmel şekilde işleyen ve görüntüyü istenen boyuta yeniden boyutlandıran bazı çalışma kodum var. Şimdi benim sorunum pdf sayfası büyük w7681px x h10978px olduğunda oluşur. Geliştirme makinemi neredeyse öldürüyor ve dağıtım makinesi dosyayı bile çiğnemiyor.

Normalde sayfa 1'i 1'i pdf sayfası olarak oluşturuyorum ve sonra bu görüntüyü yeniden boyutlandırmak için başka algoritmalar kullanıyorum. Bu, ABCPdf bu görüntüyü çıkarmak için bir sürü güç aldığından, verimli değildir. Ben aşağıdaki çözümleri denedim

private byte[] GeneratePng(Doc pdfDoc, int dpi) 
    { 
     var useDpi = dpi; 
     pdfDoc.Rendering.DotsPerInch = useDpi; 
     pdfDoc.Rendering.SaveQuality = 100; 
     pdfDoc.Rect.String = pdfDoc.CropBox.String; 
     pdfDoc.Rendering.ResizeImages = true; 

     int attemptCount = 0; 

     for (;;) 
     { 
      try 
      { 
       return pdfDoc.Rendering.GetData("defineFileTypeDummyString.png"); 
      } 
      catch 
      { 
       if (++attemptCount == 3) throw; 
      } 
     } 
    } 

: sayfa

pdfDoc.SetInfo(pdfDoc.Page, "/MediaBox:Rect", "0 0 200 300"); 

sayfayı yeniden boyutlandırma ve çıktısı yeniden boyutlandırma

Aşağıdaki kod var. Hangisi hiçbir değişiklik yapmıyor gibi görünüyor. işleme önce görüntüleri yeniden boyutlandırma

:

foreach (IndirectObject io in pdfDoc.ObjectSoup) { 
    if (io is PixMap) { 
    PixMap pm = (PixMap)io; 
    pm.Realize(); // eliminate indexed color images 
    pm.Resize(pm.Width/4, pm.Height/4); 
    } 
} 

şey yapmadım ya ve hala uzun bir yükleme süresine sonuçlandı.

görüntülenmesinden önce reduzed boyutu operasyonu Koşu:

using (ReduceSizeOperation op = new ReduceSizeOperation(pdfDoc)) 
    op.Compact(true); 

de bir şey yapmadım. Sadece doğrudan render yapmaya ve uzun bir zaman aldı.

Bana yardım eden var mı? Belki beni ABCPdf yeniden boyutlandırma algoritmasına veya başka bir şeye işaret et.

cevap

0

Tamam, ABCPdf'deki müşteri desteğiyle konuştum ve bana aşağıdakileri verdiler. gerekiyordu

doc1.Read(originalPDF); 

// Specify size of output page. (This example scales the page, maintaining the aspect ratio, 
// but you could set the MediaBox Height and Width to any desired value.) 
doc2.MediaBox.Height = doc1.MediaBox.Height/8; 
doc2.MediaBox.Width = doc1.MediaBox.Width/8; 
doc2.Rect.SetRect(doc2.MediaBox); 
doc2.Page = doc2.AddPage(); 

// Create the output image 
doc2.AddImageDoc(doc1, 1, null); 
doc2.Rendering.Save(savePath); 

tek sayfalık PDF kullanılmak üzere, bu nedenle büyük resim dolu bir pdf varsa, o zaman bunu doğramak gerekir. Diğer Q/A'mdan sonra yapabilecekleriniz: Chop PDFs into single pages

Yukarıdaki kodda kullandıkları oluşturma algoritması ABCPdf tarafından otomatik olarak algılanır ve kendiniz kontrol edemezsiniz (ve istemediğimi söylediler). Bu yüzden onların inancını onların kodlarına koyuyorum. En azından bir test yaptım ve kalite InterpolationMode.HighQualityBicubic'a oldukça benzer ve sadece yakınlaştırıldığında farklılık gösteriyor. Yani ben de onunla çok ilgilenmezdim.

Sonunda, yukarıdaki kod, yaklaşık 10 kat daha hızlı işleme ve ardından yeniden boyutlandırmaya kıyasla bana bir hız artışı sağladı. Bu operasyonu çok yaparsanız gerçekten bir şey değmez.