РазмеÑиÑе на ÑÑÑаниÑиÑе на PDF Ñа ÑикÑиÑани в моменÑа на ÑÑздаване на ÑÑÑаниÑаÑа, Ñака Ñе не можеÑе пÑоÑÑо да пÑеоÑазмеÑиÑе ÑÑдÑÑжаниеÑо на мÑÑÑо, какÑо Ð±Ð¸Ñ Ñе напÑавили Ñ Ð¸Ð·Ð¾Ð±Ñажение. ÐоделÑÑ Ð½Ð° библиоÑекаÑа, койÑо пÑави ÑмалÑванеÑо пÑакÑиÑно, е âÑлавÑнÐ?и повÑоÑно изÑеÑÑаванеâ?(capture-and-redraw): извлиÑаÑе ÑÑдÑÑжаниеÑо на вÑÑка ÑÑÑаниÑа Ð¾Ñ Ð´Ð¾ÐºÑменÑа в манипÑлаÑоÑ, ÑÑздаваÑе нова пÑазна ÑÑÑаниÑа Ñ Ð¾ÑÐ¸Ð³Ð¸Ð½Ð°Ð»Ð½Ð¸Ñ ÑÐ°Ð·Ð¼ÐµÑ Ð½Ð° ноÑиÑÐµÐ»Ñ Ð¸ Ñлед Ñова изÑеÑÑаваÑе обÑаÑно ÑловеноÑо ÑÑдÑÑжание в намалена огÑаниÑиÑелна кÑÑиÑ. ÐколноÑо пÑазно пÑоÑÑÑанÑÑво Ñе пÑевÑÑÑа в поле. ÐÑи маÑаб Ð¾Ñ 70% на ÑÑÑаниÑа Ð4 напÑимеÑ, 15% Ð¾Ñ ÑиÑинаÑа оÑÑава Ð¾Ñ Ð²ÑÑка ÑÑÑана и ÑÑÑаÑа ÑаÑÑ Ñе пада оÑгоÑе и оÑдолÑ, коеÑо е ÑоÑно Ñова, коеÑо аÑиÑмеÑикаÑа за ÑамкаÑа по-Ð´Ð¾Ð»Ñ Ð¸Ð·ÑиÑлÑва.
Ðак ÑабоÑи CapturePage
ÐеÑодÑÑ CapturePage пÑиема Ð½Ð¾Ð¼ÐµÑ Ð½Ð° ÑÑÑаниÑа, пÑеÑ
вÑÑÐ»Ñ ÑÑдÑÑжаниеÑо на Ñази ÑÑÑаниÑа в Ð¾Ð±ÐµÐºÑ Ð·Ð° ÑлавÑне в памеÑÑа и пÑемаÑ
ва ÑÑÑаниÑаÑа Ð¾Ñ Ð´ÑÑвоÑо на ÑÑÑаниÑиÑе на докÑменÑа. Това пÑемаÑ
ване е ÑмиÑлено и е пÑиÑинаÑа ÑикÑлÑÑ Ð²Ð¸Ð½Ð°Ð³Ð¸ да избиÑа ÑÑÑаниÑа 1, незавиÑимо Ð¾Ñ Ð¸Ð½Ð´ÐµÐºÑа на иÑеÑаÑиÑÑа: Ñлед каÑо ÑÑÑаниÑа 1 е Ñловена и изÑÑиÑа, Ñова, коеÑо е било ÑÑÑаниÑа 2, ÑÑава новаÑа ÑÑÑаниÑа 1 и Ñ.н. Ðко ÑвелиÑаваÑе ÑелекÑоÑа на ÑÑÑаниÑи заедно Ñ Ð±ÑоÑÑа на ÑикÑла, Ñе пÑеÑкоÑиÑе вÑÑка вÑоÑа ÑÑÑаниÑа и Ñе полÑÑиÑе наполовина по-малко ÑÑÑаниÑи Ð¾Ñ Ð¾ÑакваноÑо.
ÐанипÑлаÑоÑÑÑ Ð·Ð° ÑлавÑне, вÑÑÐ½Ð°Ñ Ð¾Ñ CapturePage, не е ÑеÑеÑенÑÐ¸Ñ ÐºÑм ÑÑÑаниÑа; Ñой е по-ÑкоÑо моменÑна Ñнимка на ÑÑдÑÑжаниеÑо. Той оÑÑава валиден, докаÑо не извикаÑе DrawCapturedPage or не го оÑвободиÑе изÑиÑно. DrawCapturedPage пÑиема Ñози манипÑлаÑÐ¾Ñ Ð¿Ð»ÑÑ Ñелеви пÑавоÑгÑлник, зададен каÑо лÑво оÑмеÑÑване, долно оÑмеÑÑване, ÑиÑина и виÑоÑина, вÑиÑки в ÑоÑки. ÐиблиоÑекаÑа маÑабиÑа ÑловеноÑо ÑÑдÑÑжание, за да паÑне ÑоÑно на Ñози пÑавоÑгÑлник, каÑо запазва пÑопоÑÑииÑе Ñамо ако пÑавоÑгÑлникÑÑ Ð²Ð¸ ÑÑвпада Ñ Ð¾ÑигиналниÑе пÑопоÑÑии. Ðа ÑавномеÑно маÑабиÑане ÑелевиÑÑ Ð¿ÑавоÑгÑлник ÑÑÑбва да бÑде оÑигиналниÑÑ ÑазмеÑ, Ñмножен по коеÑиÑиенÑа на маÑабиÑане, ÑенÑÑиÑан на ÑÑÑаниÑаÑа.
ÐаÑемаÑикаÑа зад ÑенÑÑиÑанеÑо
ÐÑи маÑаб Ð¾Ñ 70%, оÑÑаналиÑе 30% Ð¾Ñ Ð²ÑÑко измеÑение Ñе ÑазделÑÑ Ð¿Ð¾Ñавно Ð¼ÐµÐ¶Ð´Ñ Ð´Ð²ÐµÑе ÑÑÑани. Така Ñ
оÑизонÑалноÑо оÑмеÑÑване е pageWidth * (1.0 - 0.70) / 2, коеÑо е 15% Ð¾Ñ ÑиÑинаÑа, а веÑÑикалноÑо оÑмеÑÑване Ñледва ÑÑÑаÑа ÑоÑмÑла, каÑо Ñе използва виÑоÑинаÑа на ÑÑÑаниÑаÑа. Тогава ÑелевиÑÑ Ð¿ÑавоÑгÑлник за DrawCapturedPage запоÑва Ð¾Ñ (horizBorder, vertBorder) и Ñе ÑазпÑоÑÑиÑа на pageWidth - 2 * horizBorder по pageHeight - 2 * vertBorder. Тази аÑиÑмеÑика не е ÑпеÑиÑиÑна за библиоÑекаÑа; ÑÑ Ðµ пÑоÑÑо геомеÑÑÐ¸Ñ Ð½Ð° ÑимеÑÑиÑноÑо впиÑване на по-малÑк пÑавоÑгÑлник в по-голÑм.
Ðдно неÑо, коеÑо Ñи ÑÑÑÑва да Ñе оÑбележи: SetOrigin(1) поÑÑÐ°Ð²Ñ Ð½Ð°ÑалоÑо на кооÑдинаÑнаÑа ÑиÑÑема в гоÑÐ½Ð¸Ñ Ð»Ñв ÑгÑл вмеÑÑо в Ð´Ð¾Ð»Ð½Ð¸Ñ Ð»Ñв. СÑойноÑÑиÑе за гÑаниÑаÑа, коиÑо пÑедаваÑе на DrawCapturedPage, Ñе измеÑÐ²Ð°Ñ Ð¾Ñ Ñова наÑало, коеÑо ÑÑе задали, Ñака Ñе ако пÑевклÑÑиÑе ÑежимиÑе на кооÑдинаÑноÑо наÑало Ð¼ÐµÐ¶Ð´Ñ Ð·Ð°ÑежданеÑо и изÑеÑÑаванеÑо, ÑенÑÑиÑанеÑо Ñе Ñе измеÑÑи.
ÐÑÐ¸Ð¼ÐµÑ Ð½Ð° C#
СледниÑÑ ÐºÐ¾Ð´ обÑабоÑва вÑÑка ÑÑÑаниÑа Ð¾Ñ Pages.pdf ÑÑез ÑикÑла на ÑлавÑне и повÑоÑно изÑеÑÑаване и запиÑва ÑезÑлÑаÑа в newpages.pdf. PDFL е ActiveX/COM обвиваÑиÑÑ Ð¾Ð±ÐµÐºÑ, добавен кÑм пÑоекÑа Ð¾Ñ PDFlibDLL64.dll.
private void ScalePages_Click(object sender, EventArgs e)
{
File.Delete("newpages.pdf");
double pageWidth, pageHeight, horizBorder, vertBorder;
double scaleFactor = 0.70;
int capturedPageId, ret;
PDFL.LoadFromFile("Pages.pdf", "");
PDFL.SetOrigin(1);
int numPages = PDFL.PageCount();
for (int i = 1; i <= numPages; i++)
{
// Always select page 1: CapturePage removes the page, so page 2
// becomes page 1 on the next iteration.
PDFL.SelectPage(1);
pageWidth = PDFL.PageWidth();
pageHeight = PDFL.PageHeight();
horizBorder = pageWidth * (1.0 - scaleFactor) / 2;
vertBorder = pageHeight * (1.0 - scaleFactor) / 2;
capturedPageId = PDFL.CapturePage(1);
PDFL.NewPage();
PDFL.SetPageDimensions(pageWidth, pageHeight);
ret = PDFL.DrawCapturedPage(
capturedPageId,
horizBorder, vertBorder,
pageWidth - 2 * horizBorder,
pageHeight - 2 * vertBorder);
}
PDFL.SaveToFile("newpages.pdf");
}
ÐÑÐ¸Ð¼ÐµÑ Ð½Ð° Delphi
ÐеÑÑиÑÑа за Delphi използва диÑекÑно TPDFlib вмеÑÑо пÑез COM ÑлоÑ, но поÑледоваÑелноÑÑÑа на извикваниÑÑа е иденÑиÑна. Ðдна пÑакÑиÑеÑка Ñазлика е заÑиÑаÑа на изÑ
Ð¾Ð´Ð½Ð¸Ñ Ñайл: използване на FileExists плÑÑ DeleteFile вмеÑÑо File.Delete, ÑÑй каÑо SaveToFile Ñе Ñе пÑовали, ако ÑелевиÑÑ Ñайл е заклÑÑен Ð¾Ñ Ð¿ÑедиÑно ÑÑаÑÑиÑане и е оÑвоÑен в ÑеÑеÑ.
procedure TForm1.ScalePagesClick(Sender: TObject);
var
PDFLib: TPDFlib;
pageWidth, pageHeight, horizBorder, vertBorder: Double;
scaleFactor: Double;
capturedPageId, ret, numPages, i: Integer;
begin
if FileExists('newpages.pdf') then
DeleteFile('newpages.pdf');
scaleFactor := 0.70;
PDFLib := TPDFlib.Create;
try
PDFLib.LoadFromFile('Pages.pdf', '');
PDFLib.SetOrigin(1);
numPages := PDFLib.PageCount();
for i := 1 to numPages do
begin
PDFLib.SelectPage(1);
pageWidth := PDFLib.PageWidth();
pageHeight := PDFLib.PageHeight();
horizBorder := pageWidth * (1.0 - scaleFactor) / 2;
vertBorder := pageHeight * (1.0 - scaleFactor) / 2;
capturedPageId := PDFLib.CapturePage(1);
PDFLib.NewPage();
PDFLib.SetPageDimensions(pageWidth, pageHeight);
ret := PDFLib.DrawCapturedPage(
capturedPageId,
horizBorder, vertBorder,
pageWidth - 2 * horizBorder,
pageHeight - 2 * vertBorder);
end;
PDFLib.SaveToFile('newpages.pdf');
finally
PDFLib.Free;
end;
end;
Ðакво вÑÑÑноÑÑ ÐºÐ¾Ð½ÑÑолиÑа коеÑиÑиенÑÑÑ Ð½Ð° маÑабиÑане
СÑойноÑÑÑа 0.70 ÑÑк ознаÑава, Ñе изобÑазеноÑо ÑÑдÑÑжание заема 70% Ð¾Ñ Ð²ÑÑко измеÑение на ÑÑÑаниÑаÑа, а не Ñе ÑайлÑÑ ÑÑава 70% Ð¾Ñ Ð¾ÑÐ¸Ð³Ð¸Ð½Ð°Ð»Ð½Ð¸Ñ Ñи ÑÐ°Ð·Ð¼ÐµÑ Ð² байÑове. РазмеÑÑÑ Ð½Ð° Ñайла Ñлед Ñази опеÑаÑÐ¸Ñ Ð·Ð°Ð²Ð¸Ñи Ð¾Ñ ÑложноÑÑÑа на оÑигиналноÑо ÑÑдÑÑжание; ÑÑÑаниÑа Ñ Ð³Ð¾Ð»ÐµÐ¼Ð¸ изобÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð½Ñма да Ñе Ñмали пÑопоÑÑионално, ÑÑй каÑо данниÑе за пикÑелиÑе Ñе пÑенаÑеÑÑÐ°Ð²Ð°Ñ ÑÑÑ ÑÑÑаÑа ÑезолÑÑÐ¸Ñ Ð² по-малка облаÑÑ. Ðко ÑелÑа е компÑеÑÐ¸Ñ Ð½Ð° ниво байÑове, пÑавилниÑÑ Ð¿Ð¾Ð´Ñ
од е LinearizeFile или повÑоÑно запазване Ñ ÐºÐ¾Ð¼Ð¿ÑеÑÐ¸Ñ Ð½Ð° поÑока, а не геомеÑÑиÑно маÑабиÑане.
СÑойноÑÑÑа Ð¾Ñ 70% ÑÑÑо Ñака не е ÑвÑÑдо огÑаниÑение. ÐÑÑка ÑÑойноÑÑ Ð¼ÐµÐ¶Ð´Ñ 0.0 и 1.0 ÑабоÑи, а ÑÑойноÑÑи над 1.0 ÑвелиÑÐ°Ð²Ð°Ñ ÑÑдÑÑжаниеÑо извÑн пÑÑвонаÑалниÑе гÑаниÑи на ÑÑÑаниÑаÑа, коеÑо го изÑÑзва на ÑÑба на медийнаÑа кÑÑÐ¸Ñ (media box), оÑвен ако не ÑвелиÑиÑе и ÑазмеÑиÑе на ÑÑÑаниÑаÑа. ÐокÑменÑи Ñ ÑазлиÑен ÑÐ°Ð·Ð¼ÐµÑ Ð½Ð° ÑÑÑаниÑиÑе Ñе обÑабоÑÐ²Ð°Ñ ÐµÑÑеÑÑвено, ÑÑй каÑо PageWidth и PageHeight Ñе запиÑÐ²Ð°Ñ Ð·Ð° вÑÑка ÑÑÑаниÑа пÑеди изÑиÑлÑванеÑо на гÑаниÑаÑа, Ñака Ñе докÑменÑ, в койÑо неÑеÑниÑе ÑÑÑаниÑи Ñа A4, а ÑеÑниÑе â?A3, Ñе генеÑиÑа пÑавилно ÑенÑÑиÑан изÑ
оден ÑезÑлÑÐ°Ñ Ð·Ð° вÑеки ÑÐ°Ð·Ð¼ÐµÑ Ð½Ð° ÑÑÑаниÑаÑа без нÑжда Ð¾Ñ ÑпеÑиална обÑабоÑка.
ÐÑде неÑаÑа Ð¼Ð¾Ð³Ð°Ñ Ð´Ð° Ñе обÑÑкаÑ
РпÑакÑикаÑа Ñе ÑÑеÑÐ°Ñ Ð´Ð²Ð° Ñежима на ÑÑив. ÐÑÑвиÑÑ Ðµ изÑ
одниÑÑ Ñайл да бÑде оÑÑавен оÑвоÑен в PDF ÑеÑÐµÑ Ð¾Ñ Ð¿ÑедиÑно ÑÑаÑÑиÑане: Ñогава SaveToFile Ñе Ñе пÑовали или Ñе запиÑе нÑла байÑа в завиÑимоÑÑ Ð¾Ñ Ð¿Ð»Ð°ÑÑоÑмаÑа, и новиÑÑ ÑезÑлÑÐ°Ñ Ð½Ð¸ÐºÐ¾Ð³Ð° нÑма да бÑде запиÑан. ÐаÑиÑаÑа за изÑÑиване на Ñайл в наÑалоÑо на ÑÑнкÑиÑÑа Ñе ÑпÑÐ°Ð²Ñ Ñ Ñова по вÑеме на ÑазÑабоÑка, но в пÑоизводÑÑвена ÑÑеда е по-безопаÑно да Ñе пиÑе вÑв вÑеменен пÑÑ Ð¸ ÑайлÑÑ Ð´Ð° Ñе пÑеименÑва пÑи ÑÑпеÑ
.
ÐÑоÑиÑÑ Ðµ неÑÑоÑвеÑÑÑвие в бÑÐ¾Ñ Ð½Ð° ÑÑÑаниÑиÑе. ТÑй каÑо CapturePage пÑемаÑ
ва ÑÑÑаниÑи Ð¾Ñ Ð´Ð¾ÐºÑменÑа, докаÑо ги обÑабоÑва, бÑоÑÑ, койÑо ÑеÑеÑе Ð¾Ñ PageCount() пÑеди ÑикÑла, е пÑавилнаÑа гÑаниÑа, ÑпÑÑмо коÑÑо да извÑÑÑваÑе иÑеÑаÑииÑе. ÐзвикванеÑо на PageCount() вÑÑÑе в ÑикÑла би вÑÑнало намалÑÐ²Ð°Ñ Ð±Ñой пÑи вÑÑко пÑеминаване и ÑикÑлÑÑ Ñе завÑÑÑи пÑеждевÑеменно, оÑÑавÑйки поÑледниÑе ÑÑÑаниÑи необÑабоÑени. ÐÑоменливаÑа на ÑикÑла в пÑимеÑиÑе ÑлÑжи Ñамо каÑо бÑоÑÑ Ð½Ð° оÑÑаваÑиÑе иÑеÑаÑии; ÑÑ Ð½Ð¸ÐºÐ¾Ð³Ð° не Ñе използва за Ð¸Ð·Ð±Ð¾Ñ Ð½Ð° ÑÑÑаниÑа, ÑÑй каÑо ÑÑÑаниÑаÑа за Ð¸Ð·Ð±Ð¾Ñ Ð²Ð¸Ð½Ð°Ð³Ð¸ е 1 поÑади обÑÑненаÑа по-гоÑе пÑиÑина.
ÐзвикваниÑÑа за манипÑлиÑане на ÑÑÑаниÑи, показани ÑÑк, вклÑÑиÑелно CapturePage, DrawCapturedPage и SetPageDimensions, Ñа ÑаÑÑ Ð¾Ñ PDF библиоÑекаÑа на losLab за Delphi, C#, VB.NET и C++.