ÐÑикаÑениÑе Ñайлове в PDF Ñе ÑÑÑ
ÑанÑÐ²Ð°Ñ Ð² йеÑаÑÑ
иÑнаÑа ÑÑÑÑкÑÑÑа за вгÑадени Ñайлове на докÑменÑа, ÑÑÑÑкÑÑÑа, коÑÑо повеÑеÑо пÑогÑами за пÑеглед Ð¿Ð¾ÐºÐ°Ð·Ð²Ð°Ñ ÐºÐ°Ñо панел Ñ ÐºÐ»Ð°Ð¼ÐµÑ Ð¸Ð»Ð¸ ÑÑÑаниÑна ленÑа за пÑикаÑени Ñайлове. Ð Delphi код PDFium VCL ÑазкÑива Ñази ÑÑÑÑкÑÑÑа ÑÑез малÑк Ð½Ð°Ð±Ð¾Ñ Ð¾Ñ Ð¸Ð½Ð´ÐµÐºÑиÑани ÑвойÑÑва на TPdf: обÑ
ождаÑе по ÑелоÑиÑлен индекÑ, ÑеÑеÑе имена и ÑÑдÑÑжание в байÑове, ÑÑздаваÑе нови позиÑии и изÑÑиваÑе ÑÑÑеÑÑвÑваÑи. ÐнÑеÑÑейÑÑÑ Ð½Ð° API е ÑеÑен; има Ñамо нÑколко огÑаниÑÐµÐ½Ð¸Ñ Ð² поÑледоваÑелноÑÑÑа и едно пÑавило за пÑеÑиÑÑване на пÑÑиÑа, коиÑо Ñи ÑÑÑÑва да знаеÑе, пÑеди да пиÑеÑе ÑоÑÑÑÐµÑ Ð·Ð° Ñеална ÑпоÑÑеба.
ЧеÑене на пÑикаÑени Ñайлове Ð¾Ñ Ð¾ÑвоÑен докÑменÑ
AttachmentCount дава бÑÐ¾Ñ Ð½Ð° вгÑадениÑе Ñайлове, деклаÑиÑани в докÑменÑа. То Ñе ÑеÑе диÑекÑно Ð¾Ñ Ð±Ð°Ð·Ð¾Ð²Ð¾Ñо извикване на PDFium, Ñака Ñе оÑÑазÑва Ñамо Ñова, коеÑо PDF ÑайлÑÑ Ð½Ð°Ð¸ÑÑина ÑÑдÑÑжа. СвойÑÑвоÑо AttachmentName[Index] вÑÑÑа показваноÑо име каÑо WString, а Attachment[Index] пÑедоÑÑÐ°Ð²Ñ ÑÑÑовиÑе байÑове каÑо маÑив Ð¾Ñ Ñип TBytes. РдвеÑе Ñа нÑлево базиÑани. ÐокÑменÑÑÑ ÑÑÑбва да бÑде оÑвоÑен (Pdf.Active = True), пÑеди да напÑавиÑе заÑвка кÑм нÑкое Ð¾Ñ ÑвойÑÑваÑа; извикванеÑо им пÑи заÑвоÑен докÑÐ¼ÐµÐ½Ñ Ð²ÑÑÑа нÑла или пÑазен ÑезÑлÑÐ°Ñ Ð±ÐµÐ· повдигане на изклÑÑение.
Ðажно е да запомниÑе: Attachment[Index] Ð·Ð°Ð´ÐµÐ»Ñ Ð¿Ð°Ð¼ÐµÑ Ð¸ вÑÑÑа пÑлноÑо ÑÑдÑÑжание на Ñайла пÑи вÑÑко ÑеÑене. Ðа докÑменÑ, ÑÑдÑÑÐ¶Ð°Ñ Ð³Ð¾Ð»Ñм вгÑаден ÑеÑÑÑÑ, обÑ
ожданеÑо на вÑиÑки пÑикаÑени Ñайлове Ñ Ñел изгÑаждане на ÑпиÑÑк за показване ознаÑава плаÑане на Ñази Ñена за заделÑне на Ð¿Ð°Ð¼ÐµÑ Ð¿Ñи вÑÑко извикване. Ðко Ñе нÑждаеÑе Ñамо Ð¾Ñ Ð¸Ð¼ÐµÐ½Ð°Ñа за показване в инÑеÑÑейÑа, пÑоÑеÑеÑе пÑÑво AttachmentName и оÑложеÑе извлиÑанеÑо на байÑовеÑе, докаÑо поÑÑебиÑелÑÑ Ð´ÐµÐ¹ÑÑвиÑелно не поиÑка Ñайла.
procedure ListAttachments(Pdf: TPdf);
var
I: Integer;
Data: TBytes;
begin
if not Pdf.Active then
Exit;
for I := 0 to Pdf.AttachmentCount - 1 do
begin
Data := Pdf.Attachment[I];
Writeln(Format('%d: %s (%d bytes)',
[I, Pdf.AttachmentName[I], Length(Data)]));
end;
end;
ÐкÑÑÑÐ°Ñ Ð¸Ñане на пÑикаÑен Ñайл на диÑка
ÐÑма вгÑадена помоÑна ÑÑнкÑÐ¸Ñ SaveAttachment. ЧеÑеÑе байÑовеÑе и ги запиÑваÑе кÑдеÑо е необÑ
одимо, коеÑо поÑÑÐ°Ð²Ñ Ð¸Ð·Ð³ÑажданеÑо и пÑеÑиÑÑванеÑо на пÑÑÑ Ð¸Ð·ÑÑло под конÑÑола на ваÑÐ¸Ñ ÐºÐ¾Ð´. Това е важно, когаÑо именаÑа на пÑикаÑениÑе Ñайлове Ð¸Ð´Ð²Ð°Ñ Ð¾Ñ Ð½ÐµÐ½Ð°Ð´ÐµÐ¶Ð´Ð½Ð¸ докÑменÑи. ÐменаÑа на пÑикаÑениÑе PDF Ñайлове Ñа низове, ÑÑÑ
ÑанÑвани вÑÑÑе вÑв Ñайла; Ñе Ð¼Ð¾Ð³Ð°Ñ Ð´Ð° ÑÑдÑÑÐ¶Ð°Ñ ÑазделиÑели за пÑÑиÑа, подобни на Unicode знаÑи и дÑÑги Ñимволи, коиÑо Ñе Ð´Ð¾Ð²ÐµÐ´Ð°Ñ Ð´Ð¾ неоÑаквани ÑезÑлÑаÑи, ако ги пÑедадеÑе диÑекÑно на TFileStream.Create. Ðинаги пÑекаÑвайÑе имеÑо пÑез ExtractFileName, пÑеди да изгÑадиÑе изÑ
Ð¾Ð´Ð½Ð¸Ñ Ð¿ÑÑ, и помиÑлеÑе за оÑÑ
вÑÑлÑне на имена, коиÑо запоÑÐ²Ð°Ñ Ñ ÑоÑка или ÑÑдÑÑÐ¶Ð°Ñ Ð·Ð½Ð°Ñи извÑн ноÑмално оÑакваниÑе Ð¾Ñ Ð²Ð°ÑаÑа ÑиÑÑема.
ÐаÑивÑÑ Ð¾Ñ Ð±Ð°Ð¹Ñове, вÑÑÐ½Ð°Ñ Ð¾Ñ Attachment[Index], Ñе пÑиÑежава Ð¾Ñ Ð¸Ð·Ð²Ð¸ÐºÐ²Ð°ÑÐ¸Ñ ÐºÐ¾Ð´. ÐапиÑеÑе го Ñ Ð¾Ð±Ð¸ÐºÐ½Ð¾Ð²ÐµÐ½ TFileStream и Ñой е Ð²Ð°Ñ Ð·Ð° обÑабоÑка по Ð²Ð°Ñ Ð¸Ð·Ð±Ð¾Ñ, вклÑÑиÑелно за пÑовеÑка на пÑÑвиÑе нÑколко байÑа Ñ Ñел пÑовеÑка на ÑÐµÐ°Ð»Ð½Ð¸Ñ Ñайлов ÑоÑмаÑ, вмеÑÑо да Ñе довеÑÑваÑе на деклаÑиÑаноÑо име.
procedure ExtractAttachment(Pdf: TPdf; Index: Integer; const OutputDir: string);
var
SafeName: string;
OutPath: string;
Data: TBytes;
FS: TFileStream;
begin
SafeName := ExtractFileName(Pdf.AttachmentName[Index]);
if SafeName = '' then
SafeName := Format('attachment_%d', [Index]);
OutPath := IncludeTrailingPathDelimiter(OutputDir) + SafeName;
Data := Pdf.Attachment[Index];
FS := TFileStream.Create(OutPath, fmCreate);
try
if Length(Data) > 0 then
FS.WriteBuffer(Data[0], Length(Data));
finally
FS.Free;
end;
end;
ÐобавÑне на пÑикаÑени Ñайлове и двÑÑÑÑпков запиÑ
СÑздаванеÑо на пÑикаÑен Ñайл изиÑква две извикваниÑ, а не едно. CreateAttachment(Name) ÑегиÑÑÑиÑа нова позиÑÐ¸Ñ Ð² дÑÑвоÑо на вгÑадениÑе Ñайлове и вÑÑÑа True пÑи ÑÑпеÑ
. Тази позиÑÐ¸Ñ Ð·Ð°Ð¿Ð¾Ñва каÑо пÑазна. След Ñова пÑиÑвоÑваÑе ÑÑдÑÑжаниеÑо, каÑо запиÑваÑе в Attachment[AttachmentCount - 1], наÑоÑено кÑм поÑледно ÑÑÐ·Ð´Ð°Ð´ÐµÐ½Ð¸Ñ Ð·Ð°Ð¿Ð¸Ñ. Ðко CreateAttachment вÑÑне False, позиÑиÑÑа не е била ÑÑздадена и пÑиÑвоÑванеÑо би повÑедило пÑикаÑÐµÐ½Ð¸Ñ Ñайл на индекÑа, койÑо Ñе оказва поÑледен в моменÑа.
След пÑомÑна на ÑпиÑÑка Ñ Ð¿ÑикаÑени Ñайлове, пÑомениÑе ÑÑÑеÑÑвÑÐ²Ð°Ñ Ñамо в памеÑÑа. ÐзвикайÑе SaveAs, за да запиÑеÑе нов Ñайл Ñ Ð°ÐºÑÑализиÑаноÑо дÑÑво на вгÑадениÑе Ñайлове. PDFium VCL не поддÑÑжа запазване обÑаÑно в ÑÑÑÐ¸Ñ Ñайл, койÑо е оÑвоÑен в моменÑа, ÑÑй каÑо ÑдÑоÑо дÑÑжи деÑкÑипÑÐ¾Ñ Ð·Ð° ÑеÑене кÑм изÑоÑника. СÑандаÑÑниÑÑ Ñаблон за акÑÑализаÑÐ¸Ñ Ð½Ð° мÑÑÑо е Ð·Ð°Ð¿Ð¸Ñ Ð²Ñв вÑеменен пÑÑ, заÑваÑÑне на докÑменÑа, изÑÑиване или пÑеименÑване на оÑигинала, поÑледвано Ð¾Ñ Ð¿ÑеименÑване на вÑÐµÐ¼ÐµÐ½Ð½Ð¸Ñ Ñайл на пÑавилноÑо мÑÑÑо и повÑоÑно оÑваÑÑне.
procedure AddFileAttachment(Pdf: TPdf; const FilePath: string);
var
FS: TFileStream;
Data: TBytes;
AttachName: string;
begin
if not Pdf.Active then
Exit;
FS := TFileStream.Create(FilePath, fmOpenRead or fmShareDenyWrite);
try
SetLength(Data, FS.Size);
if FS.Size > 0 then
FS.ReadBuffer(Data[0], FS.Size);
finally
FS.Free;
end;
AttachName := ExtractFileName(FilePath);
if Pdf.CreateAttachment(AttachName) then
Pdf.Attachment[Pdf.AttachmentCount - 1] := Data;
end;
ÐнÑоÑмаÑÐ¸Ñ Ð·Ð° Ñипа на пÑикаÑениÑе Ñайлове
ÐÑвен имеÑо и байÑовоÑо ÑÑдÑÑжание, AttachmentType[Index] вÑÑÑа низа за MIME Ñип, ÑÑÑ
Ñанен в ÑеÑника за вгÑадени Ñайлове на PDF докÑменÑа, ако ÑакÑв е бил запиÑан пÑи пÑÑвонаÑалноÑо пÑикаÑване. Ðного генеÑаÑоÑи оÑÑавÑÑ Ñова поле пÑазно или го Ð·Ð°Ð´Ð°Ð²Ð°Ñ Ð½Ð° обÑа ÑÑойноÑÑ ÐºÐ°Ñо application/octet-stream, Ñака Ñе не можеÑе да ÑазÑиÑаÑе на него за Ñазпознаване на ÑоÑмаÑа в пÑоизводÑÑвени пÑоÑеÑи. Ðа надеждно иденÑиÑиÑиÑане пÑоÑеÑеÑе пÑÑвиÑе нÑколко байÑа Ð¾Ñ ÑÑдÑÑжаниеÑо и пÑовеÑеÑе за извеÑÑни Ñайлови ÑигнаÑÑÑи: %PDF за вложен PDF, ZIP локален заглавен блок на Ñайл PK\x03\x04 за Office Open XML докÑменÑи, \xD0\xCF\x11\xE0 за оÑÑаÑели двоиÑни Ñайлове ÑÑÑ Ñложна ÑÑÑÑкÑÑÑа. ÐнÑоÑмаÑиÑÑа за Ñипа Ð¾Ñ ÑеÑника е подÑ
одÑÑа за показване в еÑÐ¸ÐºÐµÑ Ð½Ð° поÑÑебиÑелÑÐºÐ¸Ñ Ð¸Ð½ÑеÑÑейÑ, но не ÑÑÑбва да ÑпÑавлÑва ÑеÑÐµÐ½Ð¸Ñ Ð·Ð° обÑабоÑка, когаÑо имаÑе доÑÑÑп до ÑеалниÑе байÑове.
ÐзÑÑиване на пÑикаÑени Ñайлове
DeleteAttachment(Index) пÑемаÑ
ва запиÑа на Ñази позиÑÐ¸Ñ Ð¸ вÑÑÑа True пÑи ÑÑпеÑ
. След изÑÑиванеÑо оÑÑаналиÑе запиÑи Ñе измеÑÑÐ²Ð°Ñ Ð½Ð°Ð´Ð¾Ð»Ñ, Ñака Ñе ако изÑÑиваÑе нÑколко пÑикаÑени Ñайла в ÑикÑл, ÑÑÑбва да обÑ
ождаÑе Ð¾Ñ Ð¿Ð¾ÑÐ»ÐµÐ´Ð½Ð¸Ñ Ð¸Ð½Ð´ÐµÐºÑ Ð½Ð°Ð´Ð¾Ð»Ñ, а не напÑед, за да избегнеÑе пÑопÑÑкане на запиÑи Ñлед вÑÑко измеÑÑване. ÐÑомÑнаÑа Ñе извÑÑÑва Ñамо в памеÑÑа, докаÑо не извикаÑе SaveAs.
ЧеÑÑо ÑÑеÑан ÑÑенаÑий в ÑиÑÑемиÑе за обÑабоÑка на докÑменÑи е пÑÐµÐ¼Ð°Ñ Ð²Ð°Ð½ÐµÑо на вÑиÑки пÑикаÑени Ñайлове Ð¾Ñ Ð²Ñ Ð¾Ð´ÑÑ PDF докÑменÑ, пÑеди да бÑде пÑепÑаÑен наÑаÑÑк, Ð¾Ñ ÑÑобÑÐ°Ð¶ÐµÐ½Ð¸Ñ Ð·Ð° ÑигÑÑноÑÑ Ð¸Ð»Ð¸ ÑазмеÑ. ÐÑебÑойÑе ги веднÑж пÑеди ÑикÑла и Ð¾Ð±Ñ Ð¾Ð¶Ð´Ð°Ð¹Ñе в обÑаÑен Ñед:
procedure StripAllAttachments(Pdf: TPdf);
var
I: Integer;
begin
for I := Pdf.AttachmentCount - 1 downto 0 do
Pdf.DeleteAttachment(I);
end;
ÐÑде Ñе ÑÑеÑÐ°Ñ Ð¿ÑикаÑениÑе PDF Ñайлове на пÑакÑика
ÐнÑеÑÑейÑÑÑ Ð·Ð° пÑикаÑени Ñайлове ÑабоÑи Ñ Ð²Ñеки PDF, койÑо PDFium може да оÑвоÑи, но докÑменÑиÑе, пÑи коиÑо дейÑÑвиÑелно ÑÑеÑаÑе вгÑадени Ñайлове, Ñе гÑÑпиÑÐ°Ñ Ð¾ÐºÐ¾Ð»Ð¾ нÑколко ÑпеÑиÑиÑни ÑлÑÑаÑ. PDF/A-3 (ISO 19005-3) изÑиÑно позволÑва ÑÑвмеÑÑими вгÑадени Ñайлове каÑо Ð¼ÐµÑ Ð°Ð½Ð¸Ð·Ñм за пакеÑиÑане на Ð¸Ð·Ñ Ð¾Ð´Ð½Ð¸ данни заедно Ñ Ð°ÑÑ Ð¸Ð²Ð½Ð°Ñа веÑÑиÑ; елекÑÑонниÑе ÑакÑÑÑи ZUGFeRD и Factur-X ÑазÑиÑÐ°Ñ ÑоÑно на Ñова, за да вгÑадÑÑ ÑÑÑÑкÑÑÑиÑано XML ÑÑдÑÑжание в ÑеÑимоÑо Ð¾Ñ Ñовека PDF оÑоÑмление. PDF докÑменÑи, полÑÑени Ð¾Ñ Ð¸Ð¼ÐµÐ¹Ð»Ð¸, понÑкога ÑÑдÑÑÐ¶Ð°Ñ Ð¿ÑикаÑениÑе Ñайлове на оÑигиналноÑо ÑÑобÑение, пÑепÑаÑени в дÑÑвоÑо на вгÑадениÑе Ñайлове. Ð¢ÐµÑ Ð½Ð¸ÑеÑкаÑа докÑменÑаÑиÑ, ÑÑздадена в ÑÑÑÑкÑÑÑиÑани авÑоÑÑки ÑиÑÑеми, понÑкога пакеÑиÑа по ÑÑÑÐ¸Ñ Ð½Ð°Ñин ÑпомагаÑелни ÑеÑÑÑÑи.
ÐогаÑо ваÑеÑо пÑиложение обÑабоÑва вÑ
одÑÑи PDF Ñайлове извÑн ваÑаÑа оÑганизаÑиÑ, Ñи ÑÑÑÑва да пÑовеÑÑваÑе AttachmentCount каÑо ÑаÑÑ Ð¾Ñ Ð¿ÑиеманеÑо на докÑменÑи по две незавиÑими пÑиÑини. ÐÑÑво, вгÑадениÑе Ñайлове Ð¼Ð¾Ð³Ð°Ñ Ð´Ð° ÑÑдÑÑÐ¶Ð°Ñ Ð´Ð°Ð½Ð½Ð¸, коиÑо иÑкаÑе да извлеÑеÑе и обÑабоÑиÑе, каÑо напÑÐ¸Ð¼ÐµÑ XML вÑв ÑакÑÑÑа под ÑоÑÐ¼Ð°Ñ Ð½Ð° PDF. ÐÑоÑо, вгÑадениÑе Ñайлове Ð¼Ð¾Ð³Ð°Ñ Ð´Ð° ноÑÑÑ Ð¿Ñоизволно изпÑлнимо ÑÑдÑÑжание, Ñака Ñе знаниеÑо за пÑиÑÑÑÑвиеÑо им е важно, доÑи когаÑо нÑмаÑе намеÑение да ги извлиÑаÑе. ÐиÑо една Ð¾Ñ Ð¿ÑиÑиниÑе не изиÑква Ñложни дейÑÑвиÑ: пÑоÑеÑеÑе бÑоÑ, пÑовеÑеÑе именаÑа и вземеÑе ÑеÑение как да пÑоÑедиÑаÑе Ñ Ð±Ð°Ð¹ÑовеÑе.
СвойÑÑваÑа за пÑикаÑени Ñайлове, показани ÑÑк, Ñа ÑаÑÑ Ð¾Ñ ÐºÐ¾Ð¼Ð¿Ð¾Ð½ÐµÐ½Ñа PDFium VCL за Delphi и C++Builder.