PDF ÑÑÑаниÑаÑа не ÑÑÑ ÑанÑва пикÑели и не ÑÑÑ ÑанÑва дÑÑво Ð¾Ñ Ð¾Ð±ÐµÐºÑи на ÑоÑми по наÑина, покоиÑо го пÑави SVG. Ð¢Ñ ÑÑÑ ÑанÑва пÑогÑама. ÐÑÑка линиÑ, кÑива, запÑлване и Ñазположено изобÑажение на ÑÑÑаниÑаÑа е ÑезÑлÑÐ°Ñ Ð¾Ñ Ð¸Ð·Ð¿ÑлнениеÑо на поÑедиÑа Ð¾Ñ Ð¾Ð¿ÐµÑаÑоÑи в поÑок Ð¾Ñ ÑÑдÑÑжание (content stream), оÑгоÑе надолÑ, ÑпÑÑмо ÑекÑÑоÑо гÑаÑиÑно ÑÑÑÑоÑние. РазбеÑеÑе ли Ñози ÑакÑ, по-голÑмаÑа ÑаÑÑ Ð¾Ñ Ð¿Ð¾Ð²ÐµÐ´ÐµÐ½Ð¸ÐµÑо на ÑоÑмаÑа ÑпиÑа да бÑде изненадваÑа: заÑо запÑлванеÑо Ñе нÑждае Ð¾Ñ Ð¾Ñделен опеÑаÑÐ¾Ñ Ð·Ð° изÑиÑÑване Ñлед изгÑажданеÑо на пÑÑÑ, заÑо ÑвеÑовеÑе и ÑиÑиниÑе на линииÑе изÑиÑÐ°Ñ Ð¾Ñ ÐµÐ´Ð½Ð° ÑоÑма в ÑледваÑаÑа, оÑвен ако не ги огÑаниÑиÑе, заÑо един и ÑÑÑ ÐºÐ¾Ð´ за ÑеÑÑане може да Ñе пÑиземи на напÑлно ÑазлиÑни меÑÑа Ñлед една-единÑÑвена кооÑдинаÑна ÑÑанÑÑоÑмаÑиÑ. Това е обиколка на Ñози модел на изпÑлнение, деÑиниÑан в ISO 32000: опеÑаÑоÑиÑе, коиÑо ÑÑеÑаÑе, когаÑо оÑвоÑиÑе поÑок Ð¾Ñ ÑÑдÑÑжание, и пÑавилаÑа, коиÑо опÑеделÑÑ ÐºÐ°ÐºÐ²Ð¾ Ñе показва на ÑÑÑаниÑаÑа.
ÐоÑокÑÑ Ð¾Ñ ÑÑдÑÑжание е поÑÑÑикÑен байÑкод
ÐоÑокÑÑ Ð¾Ñ ÑÑдÑÑжание е плоÑка поÑледоваÑелноÑÑ Ð¾Ñ Ð±Ð°Ð¹Ñове Ð¾Ñ Ð¾Ð¿ÐµÑанди, поÑледвани Ð¾Ñ Ð¾Ð¿ÐµÑаÑоÑи. ÐпеÑандиÑе Ð¸Ð´Ð°Ñ Ð¿ÑÑви, а опеÑаÑоÑÑÑ, койÑо ги конÑÑмиÑа, идва поÑледен, коеÑо е обÑаÑноÑо на извикване на ÑÑнкÑÐ¸Ñ Ð¸ е иденÑиÑно ÑÑÑ ÑÑекова маÑина: избÑÑайÑе ÑиÑлаÑа, Ñлед коеÑо дайÑе командаÑа. ÐÑма влагане, нÑма ÑинÑакÑÐ¸Ñ Ð·Ð° изÑази, нÑма пÑоменливи. ÐÑеÑÑаниеÑо на ÑÑиÑгÑлник Ñе ÑÑÑÑои Ð¾Ñ Ð¿ÐµÑ Ñеда:
100 100 m % moveto: start a new subpath at (100, 100)
200 200 l % lineto: add a segment to (200, 200)
300 100 l % lineto: add a segment to (300, 100)
h % closepath: connect back to the start
S % stroke: paint the path outline
ÐпеÑаÑоÑиÑе Ñа кÑаÑки по дизайн. РеалнаÑа ÑÑÑаниÑа ÑÑдÑÑжа Ñ Ð¸Ð»Ñди Ñакива, обикновено компÑеÑиÑани Ñ FlateDecode. ЦенаÑа на Ñази компакÑноÑÑ Ðµ, Ñе поÑокÑÑ Ð½Ðµ ноÑи ÑÑÑÑкÑÑÑа, коÑÑо можеÑе да заÑвиÑе: пÑогÑамаÑа за пÑеглед не може да попиÑа âкÑдÐ?е заглавиеÑо на Ñази ÑÑÑаниÑаâ? ÑÑ Ð¼Ð¾Ð¶Ðµ Ñамо да изпÑлни пÑогÑамаÑа и да види кÑде пада маÑÑилоÑо. Това е оÑновнаÑа пÑиÑина, поÑади коÑÑо извлиÑанеÑо на ÑекÑÑ Ð¾Ñ Ð¿Ñоизволни PDF Ñайлове е ÑÑÑдно.
ÐооÑдинаÑноÑо наÑало е Ð´Ð¾Ð»Ñ Ð²Ð»Ñво, а Y ÑаÑÑе нагоÑе
ÐÑеди коÑÑо и да е кооÑдинаÑа да пÑидобие ÑмиÑÑл, ÑÑÑбва да знаеÑе кÑде Ñе намиÑа (0, 0). PDF поÑÑÐ°Ð²Ñ ÐºÐ¾Ð¾ÑдинаÑноÑо наÑало в Ð´Ð¾Ð»Ð½Ð¸Ñ Ð»Ñв ÑгÑл на ÑÑÑаниÑаÑа, каÑо X наÑаÑÑва надÑÑно, а Y наÑаÑÑва нагоÑе, измеÑено в ÑоÑки пÑи 72 ÑоÑки на Ð¸Ð½Ñ (ISO 32000-2 §8.3.2). Ðа ÑÑÑаниÑа Ñ ÑÐ°Ð·Ð¼ÐµÑ US Letter гоÑниÑÑ ÑÑб Ñе намиÑа пÑи y = 792, а не пÑи y = 0. ÐÑеки, койÑо идва Ð¾Ñ ÐºÐ¾Ð¼Ð¿ÑÑÑÑнаÑа гÑаÑика, кÑдеÑо кооÑдинаÑноÑо наÑало е гоÑе влÑво и Y ÑаÑÑе надолÑ, бÑÑка Ñова Ð¾Ñ Ð¿ÑÑÐ²Ð¸Ñ Ð¾Ð¿Ð¸Ñ Ð¸ наÑеÑÑава пÑÑваÑа Ð»Ð¸Ð½Ð¸Ñ Ð¸Ð·Ð²Ñн дÑноÑо на ÑÑÑаниÑаÑа. ÐеÑнаÑа единиÑа ÑÑÑо Ñака е незавиÑима Ð¾Ñ Ð½Ð¾ÑиÑелÑ: 72 единиÑи Ñа един инÑ, незавиÑимо дали ÑÑÑаниÑаÑа Ñе изобÑазÑва на екÑана на ÑелеÑон или на пÑинÑеÑ.
ÐовеÑеÑо библиоÑеки за ÑеÑÑане на ÑÑÑаниÑи наÑледÑÐ²Ð°Ñ Ñази конвенÑÐ¸Ñ Ð´Ð¸ÑекÑно. Ð HotPDF, напÑимеÑ, TextOut и извикваниÑÑа за пÑÑиÑа измеÑÐ²Ð°Ñ Ð¾Ñ Ð´Ð¾Ð»Ð½Ð¸Ñ Ð»Ñв ÑгÑл в ÑоÑки, Ñака Ñе ÑÑойноÑÑ Ð±Ð»Ð¸Ð·Ð¾ до виÑоÑинаÑа на ÑÑÑаниÑаÑа поÑÑÐ°Ð²Ñ ÑÑдÑÑжание в гоÑнаÑа ÑаÑÑ:
// HotPDF, Delphi: y measured from the bottom edge upward, in points
Pdf.CurrentPage.SetLineWidth(2.0);
Pdf.CurrentPage.MoveTo(100, 700); // near the top of the page
Pdf.CurrentPage.LineTo(300, 700);
Pdf.CurrentPage.Stroke; // emits the moveto/lineto/stroke operators
Тази поÑледоваÑелноÑÑ Ð¾Ñ Ð¸Ð·Ð²Ð¸ÐºÐ²Ð°Ð½Ð¸Ñ Ñе компилиÑа ÑоÑно до опеÑаÑоÑиÑе m, l и S по-гоÑе. ÐиблиоÑекаÑа е пÑоÑÑо âмаÑинопиÑеÑâ?за поÑока Ð¾Ñ ÑÑдÑÑжание, ниÑо повеÑе, и познаванеÑо на Ñова какво излÑÑва ÑÑ Ðµ Ñова, коеÑо ви позволÑва да ÑазÑÑждаваÑе вÑÑÑ
Ñ ÑезÑлÑаÑа, когаÑо дадена ÑоÑма Ñе пÑиземи нÑкÑде, кÑдеÑо не ÑÑе оÑаквали.
ÐзгÑадеÑе пÑÑÑ, Ñлед коеÑо го изÑиÑÑвайÑе
PDF ÑÐ°Ð·Ð´ÐµÐ»Ñ Ð¸Ð·Ð³ÑажданеÑо на пÑÑÑ (path construction) Ð¾Ñ Ð½ÐµÐ³Ð¾Ð²Ð¾Ñо изÑиÑÑване (path painting) и Ñова Ñазделение не е педанÑиÑноÑÑ. ÐÑÑво опиÑваÑе ÑоÑма Ñ ÐºÐ¾Ð½ÑÑÑÑкÑивни опеÑаÑоÑи, коиÑо не добавÑÑ Ð½Ð¸Ñо видимо, Ñлед коеÑо издаваÑе един-единÑÑвен опеÑаÑÐ¾Ñ Ð·Ð° изÑиÑÑване, койÑо ÑеÑава какво да пÑави Ñ Ð½Ð°ÑÑÑÐ¿Ð°Ð½Ð¸Ñ Ð¿ÑÑ. Ðдин и ÑÑÑ ÑÑиÑгÑлник може да бÑде оÑеÑÑание, плÑÑно запÑлване или и двеÑе, в завиÑимоÑÑ ÐµÐ´Ð¸Ð½ÑÑвено Ð¾Ñ ÐºÐ¾Ð¼Ð°Ð½Ð´Ð°Ñа, Ñ ÐºÐ¾ÑÑо завÑÑÑваÑе.
ÐпеÑаÑоÑиÑе за изгÑаждане Ñа малко на бÑой. m запоÑва нов подпÑÑ (subpath) Ð¾Ñ ÑоÑка. l Ð´Ð¾Ð±Ð°Ð²Ñ Ð¿Ñав ÑегменÑ. c Ð´Ð¾Ð±Ð°Ð²Ñ ÐºÑбиÑна кÑива на Ðезие Ð¾Ñ ÑеÑÑ Ð¾Ð¿ÐµÑанда â?две конÑÑолни ÑоÑки и кÑайна ÑоÑка. re е пÑÑк пÑÑ, койÑо Ð´Ð¾Ð±Ð°Ð²Ñ ÑÑл пÑавоÑгÑлник Ð¾Ñ ÑеÑвоÑкаÑа x, y, ÑиÑина, виÑоÑина. h заÑваÑÑ ÑекÑÑÐ¸Ñ Ð¿Ð¾Ð´Ð¿ÑÑ Ð¾Ð±ÑаÑно до неговоÑо наÑало. Ðикой Ð¾Ñ ÑÑÑ
не поÑÑÐ°Ð²Ñ Ð¼Ð°ÑÑило на ÑÑÑаниÑаÑа; Ñе пÑоÑÑо наÑÑÑÐ¿Ð²Ð°Ñ Ð³ÐµÐ¾Ð¼ÐµÑÑиÑ.
200 250 m % start the subpath
300 350 400 450 500 250 c % cubic Bezier: two control points, then endpoint
150 200 re % a 150 x 200 rectangle, added as its own subpath
h % close
ÐÑигиналниÑÑ Ð¿ÑÐ¸Ð¼ÐµÑ Ð¸Ð·Ð¿Ð¾Ð»Ð·Ð²Ð° веÑе оÑÑаÑÐµÐ»Ð¸Ñ Ð²Ð°ÑÐ¸Ð°Ð½Ñ y на опеÑаÑоÑа за кÑива; c Ñ ÑÑиÑе Ñи изÑиÑни ÑоÑки е ÑоÑмаÑа, коÑÑо Ñе видиÑе на пÑакÑика и коÑÑо ÑÑÑбва да използваÑе. След каÑо пÑÑÑÑ ÑÑÑеÑÑвÑва, един опеÑаÑÐ¾Ñ Ð·Ð° изÑиÑÑване го завÑÑÑва. Този ÑеÑник е малÑк и Ñи ÑÑÑÑва да Ñе запомни, заÑоÑо вÑÑка ÑоÑма на вÑÑка ÑÑÑаниÑа завÑÑÑва Ñ ÐµÐ´Ð½Ð¾ Ð¾Ñ Ñези:
- `S` оÑеÑÑава пÑÑÑ (stroke), използвайки ÑекÑÑаÑа ÑиÑина на линиÑÑа и ÑвÑÑ Ð½Ð° оÑеÑÑаниеÑо.
- `f` запÑлва вÑÑÑеÑноÑÑÑа (fill), използвайки ÑекÑÑÐ¸Ñ ÑвÑÑ Ð½Ð° запÑлване и пÑавилоÑо за ненÑлево навиване (nonzero winding rule).
- `f*` запÑлва, използвайки пÑавилоÑо ÑеÑно-неÑеÑно (even-odd rule), коеÑо е важно за ÑамопÑеÑиÑаÑи Ñе ÑоÑми и ÑоÑми Ñ Ð´Ñпки.
- `B` запÑлва и Ñлед Ñова оÑеÑÑава в една опеÑаÑиÑ;
bпÑÑво заÑваÑÑ Ð¿ÑÑÑ. - `n` не изÑиÑÑва ниÑо, коеÑо е наÑинÑÑ Ð¿ÑÑÑÑ Ð´Ð° Ñе пÑевÑÑне в облаÑÑ Ð·Ð° изÑÑзване (clip region), без да оÑÑÐ°Ð²Ñ Ð²Ð¸Ð´Ð¸Ð¼Ð° Ñледа.
ÐÑавилоÑо за навиване е ÑаÑÑÑа, коÑÑо Ñ
оÑаÑа ÑеÑÑо бÑÑкаÑ. Nonzero (f, B) бÑÐ¾Ñ Ð¿ÑеÑиÑаниÑÑа ÑÑÑ Ð·Ð½Ð°Ðº на лÑÑ Ð¾Ñ ÑеÑÑоваÑа ÑоÑка и запÑлва навÑÑкÑде, кÑдеÑо бÑоÑÑ Ð½Ðµ е нÑла, Ñака Ñе оÑвоÑÑÑ Ð¾ÑÑава пÑазен Ñамо ако неговиÑÑ Ð¿Ð¾Ð´Ð¿ÑÑ Ðµ Ð½Ð°Ð²Ð¸Ñ Ð² поÑока, обÑаÑна на вÑнÑниÑ. Even-odd (f*, B*) пÑевклÑÑва пÑи вÑÑко пÑеÑиÑане, незавиÑимо Ð¾Ñ Ð¿Ð¾ÑокаÑа. Ðко ÑоÑма Ñип âпониÑкаâ?излезе плÑÑна, вÑÑÑеÑниÑÑ ÐºÑÑг е Ð½Ð°Ð²Ð¸Ñ Ð² ÑÑÑаÑа поÑока каÑо вÑнÑниÑ, и ÑÑÑбва или да го обÑÑнеÑе, или да пÑеминеÑе кÑм пÑавилоÑо ÑеÑно-неÑеÑно.
ЦвеÑÑÑ Ðµ Ñежим, а не паÑамеÑÑÑ
ЦвеÑÑÑ Ð² поÑока Ð¾Ñ ÑÑдÑÑжание е âлепкавâ?(sticky). ÐадаваÑе ÑвÑÑ Ð¸ Ñой оÑÑава в Ñила, докаÑо не зададеÑе дÑÑг или не вÑзÑÑановиÑе пÑедиÑно ÑÑÑÑоÑние â?еÑо заÑо неогÑаниÑенаÑа пÑомÑна на ÑвеÑа ÑÐ¸Ñ Ð¾ оÑвеÑÑва вÑиÑко, наÑеÑÑано Ñлед неÑ. PDF ÑÑÑо Ñака пази ÑвеÑа на запÑлване и ÑвеÑа на оÑеÑÑаниеÑо каÑо две незавиÑими наÑÑÑойки, Ñ Ð¾Ð¿ÐµÑаÑоÑи Ñ Ð¼Ð°Ð»ÐºÐ¸ бÑкви за запÑлване и главни бÑкви за оÑеÑÑание. ЦвеÑовиÑе пÑоÑÑÑанÑÑва на ÑÑÑÑойÑÑваÑа Ð¸Ð¼Ð°Ñ Ñвои ÑобÑÑвени ÑÑкÑаÑениÑ:
0.5 g % DeviceGray fill, mid gray (0 = black, 1 = white)
0.2 0.6 0.8 rg % DeviceRGB fill
0.8 0.2 0.1 RG % DeviceRGB stroke (uppercase = stroke)
0.2 0.8 0.0 0.1 k % DeviceCMYK fill
DeviceRGB е подÑ
одÑÑ Ð·Ð° изÑ
од на екÑан, DeviceCMYK е Ñова, коеÑо Ñе оÑаква пÑи пеÑаÑ, а DeviceGray е най-икономиÑниÑÑ Ð¸Ð·Ð±Ð¾Ñ Ð·Ð° моноÑ
Ñомно ÑÑдÑÑжание. ÐÑоÑÑÑанÑÑваÑа на ÑÑÑÑойÑÑваÑа Ñа Ñдобни, но не Ñа калибÑиÑани: една и ÑÑÑа ÑÑойка RGB може да Ñе визÑализиÑа ÑазлиÑно на два мониÑоÑа, коеÑо е пÑоблемÑÑ, койÑо базиÑаниÑе на ICC ÑвеÑови пÑоÑÑÑанÑÑва и изÑ
одниÑе пÑоÑили на PDF/A (output intents) ÑÑÑеÑÑвÑÐ²Ð°Ñ Ð´Ð° ÑеÑаÑ. Ðа пÑеÑизна ÑабоÑа Ñ ÑвеÑове избиÑаÑе калибÑиÑано пÑоÑÑÑанÑÑво Ñ cs и CS и задаваÑе компоненÑи Ñ sc and scn, но за обикновени докÑменÑи ÑÑкÑаÑениÑÑа за ÑÑÑÑойÑÑва вÑÑÑÐ°Ñ Ð¾ÑновнаÑа ÑабоÑа. ÐиблиоÑекаÑа обвива Ñези Ð¸Ð·Ð²Ð¸ÐºÐ²Ð°Ð½Ð¸Ñ Ð² ÑипизиÑани ÑÑнкÑии. HotPDF, напÑимеÑ, пÑиема единÑÑвен TColor и излÑÑва ÑÑоÑвеÑниÑе опеÑаÑоÑи:
Pdf.CurrentPage.SetRGBFillColor(clRed);
Pdf.CurrentPage.Rectangle(100, 100, 200, 150); // x, y, width, height
Pdf.CurrentPage.Fill;
Pdf.CurrentPage.SetRGBFillColor(RGB(0, 255, 0));
Pdf.CurrentPage.Circle(150, 400, 50); // x, y, radius
Pdf.CurrentPage.Fill;
ÐÑаÑиÑноÑо ÑÑÑÑоÑние и q/Q ÑÑекÑÑ
ÐÑиÑко, коеÑо не е ÑамиÑÑ Ð¿ÑÑ, живее в гÑаÑиÑноÑо ÑÑÑÑоÑние: ÑекÑÑаÑа маÑÑиÑа на ÑÑанÑÑоÑмаÑииÑе (CTM), ÑвеÑовеÑе на запÑлване и оÑеÑÑаване, ÑиÑинаÑа на линиÑÑа, моделÑÑ Ð½Ð° ÑÑиÑ
оване, облаÑÑÑа за изÑÑзване, алÑа каналÑÑ. СÑÑÑоÑниеÑо е глобално и пÑоменливо, Ñака Ñе единÑÑвениÑÑ Ð±ÐµÐ·Ð¾Ð¿Ð°Ñен наÑин да напÑавиÑе локална пÑомÑна е да запиÑеÑе ÑÑлоÑо ÑÑÑÑоÑние, да го пÑомениÑе, да наÑеÑÑаеÑе ÑоÑмаÑа и да го вÑзÑÑановиÑе обÑаÑно. ТоÑно Ñова пÑавÑÑ Ð¾Ð¿ÐµÑаÑоÑиÑе q и Q. q вкаÑва копие на ÑекÑÑоÑо ÑÑÑÑоÑние в ÑÑек; Q го извлиÑа, оÑÑ
вÑÑлÑйки вÑÑка пÑомÑна, напÑавена Ñлед ÑÑоÑвеÑноÑо q.
q % save the entire graphics state
2 0 0 2 100 100 cm % concatenate a transform: scale 2x, translate to (100,100)
0.8 g % gray fill, scoped to this block
% ... draw scaled, gray content ...
Q % restore: transform and color revert
ÐебаланÑиÑаниÑе опеÑаÑоÑи q и Q Ñа ÑеÑÑо ÑÑеÑан наÑин, по койÑо ÑÑÑно изгÑаден или ÑÑÑÐ¸Ñ Ð¿Ð¾Ñок Ð¾Ñ ÑÑдÑÑжание Ñе ÑÑÑпва. ÐаблÑден q без ÑÑоÑвеÑÑÑÐ²Ð°Ñ Q оÑÑÐ°Ð²Ñ ÑÑека пÑепÑлнен, когаÑо ÑÑÑаниÑаÑа пÑиклÑÑи; допÑлниÑелен Q води до недоÑÑиг на елеменÑи в ÑÑека (underflow). Рв дваÑа ÑлÑÑÐ°Ñ ÑеÑеÑÑÑ Ð¼Ð¾Ð¶Ðµ да запази ÑÑаÑо изÑÑзване или ÑÑанÑÑоÑмаÑÐ¸Ñ Ð² Ñила, и ÑÑдÑÑжаниеÑо изÑезва или попада на гÑеÑно мÑÑÑо. ÐогаÑо гÑаÑикиÑе изÑÐµÐ·Ð½Ð°Ñ Ð±ÐµÐ· видима пÑиÑина, коÑÑо пÑÑÑÑ Ð¼Ð¾Ð¶Ðµ да обÑÑни, пÑÑво одиÑиÑайÑе ÑÑека на ÑÑÑÑоÑниеÑо.
CTM ÑÑанÑÑоÑмиÑа вÑÑка кооÑдинаÑа
ТекÑÑаÑа маÑÑиÑа на ÑÑанÑÑоÑмаÑииÑе (CTM - Current Transformation Matrix) ÑÑои Ð¼ÐµÐ¶Ð´Ñ ÑиÑлаÑа вÑв ваÑиÑе опеÑаÑоÑи и ÑамаÑа ÑÑÑаниÑа. ÐÑÑка кооÑдинаÑа Ñе Ñмножава по CTM пÑеди ÑеÑÑанеÑо, Ñака Ñе пÑомÑнаÑа на маÑÑиÑаÑа пÑÐ¾Ð¼ÐµÐ½Ñ Ð¼ÑÑÑоÑо и наÑина на поÑва на ÑÑлоÑо поÑледваÑо ÑеÑÑане, без да Ñе докоÑва ниÑо една кооÑдинаÑа на пÑÑÑ. ÐпеÑаÑоÑÑÑ cm обединÑва нова маÑÑиÑа Ñ ÑекÑÑаÑа, пÑиемайки ÑеÑÑ Ð¾Ð¿ÐµÑанда, коиÑо ÑÑоÑвеÑÑÑÐ²Ð°Ñ Ð½Ð° аÑиннаÑа маÑÑиÑа [a b c d e f]:
1 0 0 1 100 50 cm % translate by (100, 50): e and f carry the offset
2 0 0 1.5 0 0 cm % scale x by 2, y by 1.5: a and d are the scale factors
0.707 0.707 -0.707 0.707 0 0 cm % rotate 45 degrees (cos/sin in a, b, c, d)
Ðве неÑа обÑÑÐºÐ²Ð°Ñ Ñ
оÑаÑа. ÐÑÑво, cm ÑÑÑÑÐ°Ð²Ñ (composes) вмеÑÑо да заменÑ, Ñака Ñе ÑÑанÑÑоÑмаÑииÑе Ñе наÑÑÑÐ¿Ð²Ð°Ñ Ð¸ ÑедÑÑ Ð¸Ð¼Ð° знаÑение: маÑабиÑанеÑо, поÑледвано Ð¾Ñ Ð¿ÑемеÑÑване, не е ÑÑÑоÑо каÑо пÑемеÑÑване, поÑледвано Ð¾Ñ Ð¼Ð°ÑабиÑане. ÐÑоÑо, ÑоÑаÑиÑÑа и маÑабиÑанеÑо Ñе извÑÑÑÐ²Ð°Ñ Ð¾ÐºÐ¾Ð»Ð¾ ÑекÑÑоÑо кооÑдинаÑно наÑало, а не около ÑенÑÑÑа на ваÑаÑа ÑоÑма, Ñака Ñе за да завÑÑÑиÑе неÑо на мÑÑÑо, го пÑемеÑÑваÑе до наÑалоÑо, завÑÑÑаÑе и Ñлед Ñова пÑемеÑÑваÑе обÑаÑно â?вÑиÑко Ñова обвиÑо в q/Q. Тази ÑÑÑа маÑÑиÑа ÑлÑжи и за Ñазполагане на изобÑÐ°Ð¶ÐµÐ½Ð¸Ñ â?поÑледноÑо паÑÑе, коеÑо Ñи ÑÑÑÑва да Ñе види.
ÐзобÑажениÑÑа и повÑоÑно използваемоÑо ÑÑдÑÑжание Ñа XObjects
РаÑÑеÑниÑе изобÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð½Ðµ живеÑÑ Ð´Ð¸ÑекÑно в поÑока Ð¾Ñ ÑÑдÑÑжание. Те Ñе ÑÑÑ ÑанÑÐ²Ð°Ñ ÐºÐ°Ñо гÑаÑиÑни XObjects (image XObjects) â?вÑнÑни обекÑи ÑÑÑ ÑобÑÑвен ÑеÑник, опиÑÐ²Ð°Ñ ÑиÑинаÑа, виÑоÑинаÑа, дÑлбоÑинаÑа на ÑвеÑа, ÑвеÑовоÑо пÑоÑÑÑанÑÑво и компÑеÑиÑаÑÐ¸Ñ ÑилÑÑÑ, а поÑокÑÑ Ð¾Ñ ÑÑдÑÑжание Ñамо пÑепÑаÑа кÑм ÑÑÑ . Снимка, подкÑепена Ñ JPEG, Ñе деклаÑиÑа Ñака:
/Photo <<
/Type /XObject
/Subtype /Image
/Width 640
/Height 480
/BitsPerComponent 8
/ColorSpace /DeviceRGB
/Filter /DCTDecode % the image data is a JPEG stream
>>
ÐзобÑажениеÑо XObject Ñе ÑиÑÑва в единиÑÐ½Ð¸Ñ ÐºÐ²Ð°Ð´ÑÐ°Ñ (unit square): Ñо винаги заема облаÑÑÑа Ð¾Ñ (0, 0) до (1, 1) в пÑоÑÑÑанÑÑвоÑо на поÑÑебиÑелÑ. Ðе Ð¼Ñ Ð¿Ð¾Ð´Ð°Ð²Ð°Ñе позиÑÐ¸Ñ Ð¸Ð»Ð¸ ÑазмеÑ. ÐмеÑÑо Ñова наÑÑÑойваÑе CTM Ñака, Ñе Ñози единиÑен квадÑÐ°Ñ Ð´Ð° Ñе напаÑне кÑм Ð¶ÐµÐ»Ð°Ð½Ð¸Ñ Ð¾Ñ Ð²Ð°Ñ Ð¿ÑавоÑгÑлник, Ñлед коеÑо го извикваÑе Ñ Do. ÐÑо заÑо поÑÑавÑнеÑо на изобÑажение винаги пÑедÑÑавлÑва ÑÑанÑÑоÑмаÑиÑ, поÑледвана Ð¾Ñ Ð¸Ð·Ð²Ð¸ÐºÐ²Ð°Ð½Ðµ, обвиÑо в save/restore, Ñака Ñе маÑабÑÑ Ð´Ð° не изÑеÑе кÑм ÑледваÑаÑа опеÑаÑиÑ:
q
640 0 0 480 50 300 cm % map the unit square to a 640x480 box at (50, 300)
/Photo Do % paint the image XObject
Q
СÑÑиÑÑ Ð¼ÐµÑ
анизÑм Do ÑпÑавлÑва и ÑоÑмаÑа XObjects (form XObjects), койÑо ÑÑдÑÑжа повÑоÑно използваемо паÑÑе гÑаÑики, лого или повÑаÑÑÑ Ñе пеÑаÑ, каÑо негов ÑобÑÑвен поÑок Ð¾Ñ ÑÑдÑÑжание Ñ Ð¾Ð³ÑаниÑаваÑа кÑÑÐ¸Ñ (bounding box). ÐеÑиниÑайÑе го веднÑж, извикайÑе го многокÑаÑно Ñ ÑазлиÑен CTM и байÑовеÑе Ñе Ñе поÑвÑÑ Ð²Ñв Ñайла Ñамо веднÑж. ÐовеÑеÑо библиоÑеки ÑкÑÐ¸Ð²Ð°Ñ Ñова зад едно извикване за Ñазполагане: HotPDF ÑегиÑÑÑиÑа ÑаÑÑеÑно изобÑажение Ñ AddImage и го Ñазполага Ñ ShowImage, пÑиемайки изÑиÑни x, y, ÑиÑина и виÑоÑина, вмеÑÑо да ви каÑа да изгÑаждаÑе маÑÑиÑаÑа на ÑÑка:
var
Bmp: TBitmap;
ImgIndex: Integer;
begin
Bmp := TBitmap.Create;
try
Bmp.LoadFromFile('logo.bmp');
ImgIndex := Pdf.AddImage(Bmp, icFlate);
// x, y (bottom-left), width, height, rotation angle
Pdf.CurrentPage.ShowImage(ImgIndex, 50, 300, 200, 150, 0);
finally
Bmp.Free;
end;
end;
Ðод Ñози единÑÑвен Ñед библиоÑекаÑа запиÑва ÑеÑника на гÑаÑиÑÐ½Ð¸Ñ XObject, наÑÑÑойва CTM за оÑазмеÑÑване и позиÑиониÑане на единиÑÐ½Ð¸Ñ ÐºÐ²Ð°Ð´ÑÐ°Ñ Ð¸ излÑÑва Do. Този базов модел Ñи ÑÑÑÑва да Ñе знае, заÑоÑо обÑÑнÑва вÑеки ÑÑÑанен ÑезÑлÑаÑ: ÑазÑегнаÑо изобÑажение е CTM Ñ Ð½ÐµÑÑоÑвеÑÑÑваÑи ÑакÑоÑи на маÑаба, иденÑиÑно лого на ÑеÑиÑидеÑÐµÑ ÑÑÑаниÑи е една ÑоÑма XObject, извикана ÑеÑиÑидеÑÐµÑ Ð¿ÑÑи, а обÑÑнаÑо наопаки изобÑажение е пÑоÑÑо обÑÑÑане на знака в маÑÑиÑаÑа, а не повÑеден Ñайл.
ÐакÑде води Ñова
ÐÑаÑиÑниÑÑ Ð¼Ð¾Ð´ÐµÐ» е малÑк, Ñлед каÑо видиÑе ÑоÑмаÑа мÑ. ÐоÑокÑÑ Ð¾Ñ ÑÑдÑÑжание е поÑÑÑикÑен байÑкод, изпÑлнÑван ÑпÑÑмо пÑоменливо ÑÑÑÑоÑние; кооÑдинаÑиÑе запоÑÐ²Ð°Ñ Ð¾Ñ Ð´Ð¾Ð»Ð½Ð¸Ñ Ð»Ñв ÑгÑл и пÑÐµÐ¼Ð¸Ð½Ð°Ð²Ð°Ñ Ð¿Ñез CTM; пÑÑиÑаÑа Ñе изгÑÐ°Ð¶Ð´Ð°Ñ ÑиÑ
о и Ñе изÑиÑÑÐ²Ð°Ñ Ñ ÐµÐ´Ð¸Ð½ конкÑеÑен опеÑаÑоÑ; наÑÑÑойкиÑе за ÑвÑÑ Ð¸ Ð»Ð¸Ð½Ð¸Ñ Ð¾ÑÑÐ°Ð²Ð°Ñ Ð² Ñила, докаÑо не ги огÑадиÑе Ñ q/Q; изобÑажениÑÑа и повÑоÑно използваемиÑе гÑаÑики Ñа XObjects, Ñазположени ÑÑез ÑÑанÑÑоÑмиÑане на единиÑен квадÑаÑ. ÐоÑÑи вÑеки обÑÑÐºÐ²Ð°Ñ ÑезÑлÑÐ°Ñ Ð¿Ñи изобÑазÑване Ñе Ñвежда до едно Ð¾Ñ Ñези Ð¿ÐµÑ Ð¿Ñавила. Ðко иÑкаÑе да видиÑе как Ñези гÑаÑиÑни опеÑаÑоÑи Ñе намиÑÐ°Ñ Ð² ÑамкиÑе на по-Ð³Ð¾Ð»ÐµÐ¼Ð¸Ñ Ð¾Ð±ÐµÐºÑен модел â?ÑеÑниÑиÑе на ÑÑÑаниÑиÑе и ÑаблиÑаÑа Ñ ÐºÑÑÑÑоÑани пÑепÑаÑки, коиÑо ÑоÑÐ°Ñ ÐºÑм ÑÑÑ
â?ÑеÑ
ниÑеÑкиÑÑ Ð¿Ñеглед на ÑÑÑÑкÑÑÑаÑа на PDF Ñайлове покÑива Ñози Ñлой, а изгÑажданеÑо на обикновен PDF Ð¾Ñ Ð½ÑлаÑа пÑоÑледÑва байÑовеÑе Ð¾Ñ Ð½Ð°ÑалоÑо до кÑаÑ. ЧеÑÑанеÑо на ÑекÑÑ Ð¶Ð¸Ð²ÐµÐµ в ÑобÑÑвена ÑÐ°Ð¼Ð¸Ð»Ð¸Ñ Ð¾Ð¿ÐµÑаÑоÑи и има Ñвои ÑобÑÑвени капани, Ñазгледани в пÑидÑÑжаваÑаÑа ÑÑаÑÐ¸Ñ Ð·Ð° ÑабоÑа Ñ ÑекÑÑ Ð¸ ÑÑиÑÑове в PDF.
ÐоказаниÑе ÑÑк Ð¸Ð·Ð²Ð¸ÐºÐ²Ð°Ð½Ð¸Ñ Ð·Ð° ÑеÑÑане в Delphi â?MoveTo, LineTo, Stroke, Rectangle, Fill, SetRGBFillColor, AddImage и ShowImage â?Ñа ÑаÑÑ Ð¾Ñ HotPDF Component за Delphi и C++Builder, койÑо генеÑиÑа Ñези опеÑаÑоÑи на поÑока Ð¾Ñ ÑÑдÑÑжание вмеÑÑо ваÑ.