HotPDF, yüklü bir PDF'i fiziksel bir yazıcıya, herhangi bir Windows cihaz bağlamına veya panoya üç çağrı aracılığıyla yazdırır: PrintLoadedDocument bir VCL TPrinter'ını yönetir, RenderLoadedPageToDC bir sayfayı doğrudan herhangi bir HDC içine boyar og RenderLoadedPageToClipboard bir sayfayı bit eşlem veya vektör meta dosyası olarak kopyalar. HotPDF, Delphi ve C++Builder için yerel bir VCL PDF bileşenidir og bu birinci sınıf yazdırma yolunu v2.331.0 sürümünde ekleyip v2.348.0 sürümünde geliştirmiştir; böylece artık bir bit eşlem işleyici etrafında kendi başınıza bir TPrinter döngüsü kurmak zorunda kalmazsınız. Her üç çağrı da sayfanın vektör içeriğini doğrudan önemli olduğu yere çizer, böylece bir çıktı yazıcının oluşturabileceği kadar keskin kalır
PDF sayfasını bit eşlem yerine neden doğrudan yazıcıya çizmeliyiz?
Bir PDF sayfası, ISO 32000-1 grafik modeline göre yürütülen vektör çizim operatörlerinden — yollar, metinler ve resimler — oluşan bir programdır, piksellerden oluşan bir ızgara değildir. Birini yazdırmanın bariz yolu, sayfayı bir bit eşleme pikselleştirmek ve bu bit eşlemi yazıcı tuvaline aktarmaktır (blit); bu çalışır ancak yazıcının iyi olduğu tek şeyi çöpe atar. Modern bir lazer yazıcı 600 veya 1200 DPI çözünürlük sunar; 150 veya 300 DPI'da pikselleştirilen ve ardından kağıda sığacak şekilde genişletilen bir bit eşlem, pürüzlü metin kenarları ve görünür enterpolasyonla yumuşak gelir. RenderLoadedPageToDC daha iyi bir yol izler: sayfanın içerik akışını doğrudan hedef cihaz bağlamına yayılan GDI çağrıları olarak yeniden oynatır, böylece vektör metin ve çizgi sanatı yazıcıya vektör olarak ulaşır ve yazıcı tarafından kendi çözünürlüğünde bir kez pikselleştirilir
Delphi'de yüklü bir PDF fiziksel bir yazıcıya nasıl yazdırılır?
HotPDF, yüklü bir belgeyi PrintLoadedDocument(Printer, Options) ile yazdırır; bu yöntem atanmış bir VCL TPrinter'ını ve bir THPDFPrintOptions kaydını alır, seçilen sayfaları yazdırır ve gönderilen sayfa sayısını döndürür. Bir cihazın seçilmesi için önce Printer.PrinterIndex değerini ayarlayın, bir seçenekler kaydı doldurun — THPDFPrintOptions.Default sınıf işlevi size makul değerler verir — ve bunu bir kez çağırın. Kütüphane işi Printer.BeginDoc ile açar, sayfalar arasında bir Printer.NewPage yayarak sayfa aralığını tarar ve Printer.EndDoc ile kapatır; böylece yazdırma işi yaşam döngüsünü asla elle yönetmek zorunda kalmazsınız
uses Printers;
var
Pdf: THotPDF;
Opts: THPDFPrintOptions;
begin
Pdf := THotPDF.Create(nil);
try
if Pdf.LoadFromFile('invoice.pdf') > 0 then
begin
Printer.PrinterIndex := -1; // -1 selects the default printer
Opts := THPDFPrintOptions.Default; // all pages, 300 DPI, FitPage, colour
Opts.PageRange := '1,3-5'; // one-based; empty prints every page
Opts.Copies := 2;
Pdf.PrintLoadedDocument(Printer, Opts);
end;
finally
Pdf.Free;
end;
end;
PageRange dizesi bir tabanlıdır ve bir yazdırma iletişim kutusunun okuduğu şekilde okunur: '1,3-5' sayfa 1'i ve sayfa 3 ile 5 arasını yazdırır, boş bir dize ise tüm belgeyi yazdırır. Copies doğrudan Printer.Copies özelliğine eşlenir. Yine de Collate (harmanlama) konusunda kendinize karşı dürüst olun: VCL, Delphi sürümleri arasında harmanlamayı tutarsız bir şekilde sunduğundan, HotPDF kopya sayısını ayarlar ve harmanlamayı yazıcı sürücüsü varsayılanına bırakır; bu nedenle garantili bir harmanlama sırasına ihtiyaç duyduğunuzda, bunu bayrağa güvenmek yerine TPrinterSetupDialog aracılığıyla sürücü üzerinde ayarlayın
DPI ve FitPage yazdırma ölçeğini nasıl belirler?
FitPage ve DPI, dağıtım yapmadan önce anlamaya değer bir şekilde etkileşime girer. FitPage değeri True (varsayılan) olduğunda, HotPDF her sayfanın MediaBox'ını okur, en boy oranını koruyarak Printer.PageWidth ve Printer.PageHeight boyutlarına ölçeklendirir ve sayfanın kağıdı doldurmasını sağlayan ölçekte işler. Bu modda Options.DPI, sığdırma ölçeği tarafından fiilen geçersiz kılınır, çünkü çıktının yazıcının fiziksel sayfa boyutlarıyla eşleşmesi gerekir. FitPage False olduğunda ise HotPDF her sayfayı tam olarak Options.DPI çözünürlüğünde 1:1 olarak işler, 72 PDF birimini DPI cihaz pikseline eşler; bu, kaynak sayfa ile kağıt zaten aynı boyutta olduğunda ve kesin bir çözünürlük istediğinizde tercih edilen yoldur. Kaynak sayfa boyutu ile tepsi boyutu farklı olduğunda FitPage'e başvurun; eşleştiklerinde ve deterministik ölçeklendirme istediğinizde 1:1'e başvurun
v2.348.0 sürümünde eklenen iki seçenek, neredeyse doğru görünen çıktıları düzeltir. Her fiziksel yazıcının donanımın ulaşamayacağı sert bir kenar boşluğu — yazdırılamayan bir sınır — vardır ve varsayılan olarak sayfa başlangıç noktası bu boşluğun içine düşer, bu nedenle kenarlıksız bir sayfa iki kenarından bir şerit kaybeder. IgnoreHardMargin değerini True olarak ayarladığınızda HotPDF, yazıcının PHYSICALOFFSETX ve PHYSICALOFFSETY değerlerini sorgular, ardından sayfa başlangıç noktasının gerçek kağıt köşesine eşlenmesi için cihaz başlangıç noktasını bu kaymayı iptal edecek şekilde kaydırır. İkinci seçenek olan AutoRotate varsayılan olarak açıktır: her sayfanın MediaBox'ını okur ve bir sayfa dikey olduğundan daha geniş olduğunda, geniş sayfanın dikey olarak kırpılması yerine yatay olarak yazdırılması için yazıcıyı yatay moda geçirir. AutoRotate, Orientation özelliğini açıkça ayarladığınız an devre dışı kalır, böylece bilinçli bir yönlendirme seçimi her zaman geçerli olur
Bir PDF sayfasını herhangi bir cihaz bağlamına nasıl işlersiniz?
RenderLoadedPageToDC(PageIndex, DC, DPI, W, H) yazdırma döngüsünün altındaki ilkeldir ve tek başına kullanışlıdır. PrintLoadedDocument, bunu yazıcı tuvaline karşı sayfa başına bir kez çağırır, ancak hedef herhangi bir Windows HDC'si olabilir: ekran dışı bir bellek DC'si, özel bir görüntüleyicideki bir denetim tuvali veya bir yazdırma önizleme yüzeyi. PageIndex sıfır tabanlıdır, W ve H hedef yüzeyin cihaz birimleridir ve işleyici sayfanın /Contents'ini tarayarak DC'nize GDI çağrıları yayar. Bilinçli bir davranışın bilinmesinde fayda vardır: arka plan dolgusu çizmez. Yüzey çağıran kişiye aittir, bu nedenle sayfanın arkasında beyaz kağıt istiyorsanız, işlemeden önce DC'yi kendiniz doldurursunuz; bu da tam olarak istediğinizde bir sayfayı mevcut bir tuval üzerine kompoze etmenize olanak tanıyan şeydir
// Draw page 1 into an off-screen 24-bit surface at 150 DPI
var
Surface: TBitmap;
begin
Surface := TBitmap.Create;
try
Surface.PixelFormat := pf24bit;
Surface.SetSize(1275, 1650); // 8.5 x 11 in at 150 DPI
Surface.Canvas.Brush.Color := clWhite;
Surface.Canvas.FillRect(Surface.Canvas.ClipRect); // caller paints the background
Pdf.RenderLoadedPageToDC(0, Surface.Canvas.Handle, 150, Surface.Width, Surface.Height);
// Surface now holds the composited page, ready to blit or save
finally
Surface.Free;
end;
end;
Sadece tamamlanmış bir TBitmap'e — bir küçük resim, bir resim dışa aktarımı, önbelleğe alacağınız bir önizleme — ihtiyacınız olduğunda, PDF sayfalarını bir bit eşleme işleme makalesinde ele alınan RenderLoadedPageToBitmap yöntemine başvurun. Aralarındaki fark yüzeye kimin sahip olduğudur: bit eşlem çağrısı bir piksel tamponu tahsis eder ve döndürür, RenderLoadedPageToDC ise zaten elinizde tuttuğunuz bir cihaz bağlamına çizer; bu da bir yazıcı tuvali veya bir boyama işleyicisinin size sunduğu şeydir. Her ikisi de aynı içerik akışı yorumlayıcısını ve gömülü glif motorunu paylaşır, böylece her iki şekilde de metin tam gömülü ana hatlarla çıkar
Bir PDF sayfasını Word veya bir resim düzenleyiciye nasıl yapıştırırsınız?
RenderLoadedPageToClipboard(PageIndex, DPI, AsMetafile) bir sayfayı Windows panosuna yerleştirir, Word, PowerPoint, bir e-posta veya resim düzenleyiciye yapıştırılmaya hazır hale getirir. AsMetafile bayrağı biçimi seçer og bu seçim göründüğünden daha önemlidir. False değerini geçin; HotPDF, belirlediğiniz DPI çözünürlüğünde işlenen 24 bitlik bir cihaz bit eşlemi (CF_BITMAP) yerleştirir — bu, her yere yapıştırılabilen ancak alıcı bunu ölçeklendirdiğinde pikselleşen sabit bir piksel ızgarasıdır. True değerini geçin; sayfanın metin ve vektör sanatının GDI çizim komutları olarak seyahat ettiği geliştirilmiş bir meta dosyası (CF_ENHMETAFILE) yerleştirir, böylece yapıştırılan sonuç her yakınlaştırmada net kalır og hedef belgenin verdiği boyuta göre yeniden akar
// Copy page 2 as a scalable vector metafile for pasting into Word
Pdf.RenderLoadedPageToClipboard(1, 300, True);
// Copy the same page as a fixed 300-DPI bitmap instead
Pdf.RenderLoadedPageToClipboard(1, 300, False);
Pratik kural basittir. Bir insan sayfayı bir belgeye yapıştıracak ve yeniden boyutlandırabilecekse — bir rapordaki bir şekil, bir sözleşme taslağına bırakılan bir madde —, meta dosyasını kullanın, çünkü vektör metin temiz bir şekilde yazdırılır ve yakınlaştırılır. Hedef yalnızca piksel verilerini anlıyorsa veya belirli bir çözünürlükte donmuş bir anlık görüntü istiyorsanız, bit eşlemi kullanın. Sayfadaki kelimelerin bir resmini çekmek yerine onları çıkarmak ise, karakterleri ve konumlarını işlenmiş bir resim yerine döndüren metin çıkarma API'si tarafından işlenen tamamen farklı bir iştir
Yazdırma yolunun durduğu yer
Bu sayfadaki her şey yalnızca Windows'a özeldir ve bunu açıkça belirtmekte fayda vardır. PrintLoadedDocument, RenderLoadedPageToDC ve RenderLoadedPageToClipboard; TPrinter, GDI cihaz bağlamı modeli, Windows panosu ve geliştirilmiş meta dosyaları üzerine inşa edilmiştir — bunların tümü Win32 ve Win64 yapılarıdır. Diğer hedeflerde HotPDF'in geri kalanı hala PDF oluşturur, düzenler ve okur, ancak bu GDI destekli yazdırma ve pano yüzeyi mevcut değildir. İşleyici ayrıca metin, yollar ve resimlerden oluşan ortak belge alt kümesini hedefler, bu nedenle degrade yoğunluklu tasarım provaları ve ICC yönetimli renkler, bit eşlem işleyicinin taşıdığı aynı sınırla, kolorimetrik bir prova yerine aslına sadık bir önizleme olarak yazdırılır
Birçok dosya üzerinde toplu yazdırma için her belgeyi sırayla yükleyin ve yazdırın, ardından bellek faturasını izleyin: PrintLoadedDocument sayfaları birer birer işler, ancak yüklü belgenin grafik yapısı tüm iş boyunca bellekte yaşar. Yüzlerce büyük dosya üzerinde bir yazdırma kuyruğu yönetirken, büyük PDF iş akışları için doğrudan dosya API'si yazdırma yoluyla iyi bir uyum sağlar — önce diskte ihtiyacınız olan sayfaları bölün, birleştirin veya seçin, ardından yazdırmak için yalnızca ince sonucu yükleyin. PrintLoadedDocument, RenderLoadedPageToDC ve RenderLoadedPageToClipboard, Delphi ve C++Builder için HotPDF Bileşeni'nin bir parçası olarak bu şekilde gönderilir — harici DLL bağımlılığı olmayan, PDF oluşturma, düzenleme, metin çıkarma, işleme ve şimdi doğrudan TPrinter'a, herhangi bir cihaz bağlamına veya panoya yazdırma işlemlerini kapsayan yerel bir VCL kütüphanesidir