Migreer van Quick PDF Library en PdfiumViewer naar sgcPDF

Foxit heeft Quick PDF Library op 13 december 2021 beëindigd en de PdfiumViewer-repository is sinds 2 augustus 2019 alleen-lezen. sgcPDF vervangt beide: puur Pascal dat in je Delphi-exe wordt gecompileerd en beheerde C# voor WinForms, zonder PDF-DLL om te distribueren. Deze kit brengt de functies van Quick PDF Library en de klassen van PdfiumViewer in kaart voor sgcPDF, met code uit twee voorbeelden die compileren en hun zelftests doorstaan.

Toepassingen op basis van een PDF-bibliotheek die niet meer verder wordt ontwikkeld

Twee veelvoorkomende gevallen: een Delphi-toepassing die PDF-bestanden maakt, samenvoegt, invult en rendert met Quick PDF Library, en een WinForms-toepassing die PDF-bestanden toont met PdfiumViewer.

Van Quick PDF Library (Delphi)

Quick PDF Library (Debenu Quick PDF Library, later Foxit Quick PDF Library) wordt geleverd als DLL, ActiveX of LIB met een ontgrendelingssleutel en werkt met één object met een "geselecteerd" document, een geselecteerde pagina, lettertype en afbeelding. sgcPDF is een set Pascal-units met een objectmodel: TsgcPDFDocument, TsgcPDFPage, TsgcPDFEditor en TsgcPDFAcroForm, van Delphi 7 tot Delphi 13.

Van PdfiumViewer (WinForms)

PdfiumViewer verpakt de native PDFium-bibliotheek in een PdfViewer-besturingselement, een PdfRenderer en een PdfDocument. Het toont, doorzoekt, rendert en print PDF-bestanden. sgcPDF vervangt ze door één beheerd besturingselement, TsgcPDFViewerControl, en voegt toe wat PdfiumViewer nooit had: PDF-bestanden maken, formulieren invullen, annotaties toevoegen en wijzigingen opslaan.

Quick PDF Library. De mededeling van Foxit (gelezen op 2026-10-20) zegt: "Vanaf 13 december 2021 beëindigt Foxit de volgende producten", en het eerste product in de lijst is Foxit Quick PDF Library (All Platforms). Klanten met een actief onderhouds- en ondersteuningscontract werden ondersteund tot 13 december 2022: "Na die datum gaat het product naar end-of-support en wordt het niet meer ondersteund." De vervangers die Foxit noemt de eigen PDF-SDK's voor Windows, Mac, Linux, Android en iOS, de ActiveX-SDK en de .NET-SDK-suite.

PdfiumViewer. De GitHub-repository (gelezen op 2026-10-20) toont: "Deze repository is op 2 aug 2019 door de eigenaar gearchiveerd. Ze is nu alleen-lezen." De README legt uit: "Ik heb al heel lang geen echte tijd meer aan dit project kunnen besteden", en "Ik ben niet in staat om dit project goed te ondersteunen." Ook staat er: "Het PdfiumViewer-besturingselement vereist native PDFium-bibliotheken. Die zijn niet opgenomen in het PdfiumViewer NuGet-pakket." Het NuGet-pakket is voor het laatst bijgewerkt op 6 november 2017 (versie 2.13.0) en richt zich op net20.

Eén PDF-bibliotheek, broncode inbegrepen

sgcPDF is het PDF-product van sgcUI. Het maakt, bewerkt, vult, ondertekent, versleutelt, rendert en toont PDF-bestanden in Delphi en in .NET.

Geen PDF-DLL om te distribueren

In Delphi worden de sgcPDF-units in de exe gecompileerd: geen DLL, ActiveX of LIB om te distribueren en te registreren, en geen aanroep voor een ontgrendelingssleutel. In .NET is sgcPDF beheerde C#, dus er is geen pdfium.dll en geen native x86- of x64-pakket om uit te kiezen: het voorbeeld draait als AnyCPU.

Een objectmodel

Elke aanroep krijgt het paginaobject of de index mee, dus de "geselecteerde" status van Quick PDF Library verdwijnt. Imposition gebruikt vector-form-XObjects (AddPageAsForm, DrawForm, DrawFormInRect), formulieren gebruiken AcroForm en versleuteling gaat tot AES-256 (emAES_256).

Een viewer die bewerkt

TsgcPDFViewerControl past zich aan op breedte, pagina of hoogte, draait de weergave, zoekt en print met een dialoogvenster, en geeft in .NET een PrintDocument terug, net als PdfiumViewer. Het vult ook formuliervelden in (FormFilling), voegt annotaties toe met de muis (AnnotationTool) en selecteert tekst. Zijweergaven: TsgcPDFThumbnailView, TsgcPDFOutlineView, TsgcPDFCommentsView.

sgcPDF wordt los verkocht, vanaf €249 voor één ontwikkelaar in Delphi en C++ Builder en vanaf €249 voor .NET, met volledige broncode en 1 jaar updates, en maakt deel uit van sgcUI Enterprise en van de All-Access-bundel. De .NET-pakketten zijn ook beschikbaar als gratis Community-pakketten op NuGet, esegece.sgcPDF.Community en esegece.sgcPDF.WinForms.Community, met dezelfde functies. Zie de productpagina van sgcPDF.

Functies van Quick PDF Library in sgcPDF

De units zijn sgcPDF_Types, sgcPDF_Fonts en sgcPDF_Document, plus waar nodig sgcPDF_Editor, sgcPDF_Encryption, sgcPDF_Renderer_GDI en sgcPDF_Export. Paginaindexen in sgcPDF beginnen bij 0.

Quick PDF Library sgcPDF
UnlockKeyniets om in code aan te roepen
NewDocumentTsgcPDFDocument.Create, daarna AddPage (een nieuw document heeft geen pagina tot je er een toevoegt)
NewPage, SetPageDimensions, SetPageSizeTsgcPDFDocument.AddPage(AWidth, AHeight): TsgcPDFPage, InsertPage(AIndex, AWidth, AHeight)
LoadFromFile, LoadFromStringTsgcPDFDocument.LoadFromFile, LoadFromStream, LoadFromBytes
LoadFromFile met een wachtwoordTsgcPDFDocument.SetPassword(APassword) vóór LoadFromFile
SaveToFile, SaveToStringTsgcPDFDocument.SaveToFile, SaveToStream, SaveIncremental
PageCountTsgcPDFDocument.PageCount; alleen voor een bestand: sgcPDFGetPageCount(AFileName)
SelectPageTsgcPDFDocument.Pages[AIndex] (vanaf 0, standaardeigenschap), GetPage(AIndex)
SetInformationTsgcPDFDocument.Info.Title, .Author, .Subject, .Keywords, .Creator, .Producer
AddStandardFont + SelectFont + SetTextSize + DrawTextTsgcPDFPage.DrawText(AText, X, Y, AFont, AFontSize) met een TsgcPDFStandardFont (sfHelvetica, sfTimesRoman, sfCourier en hun vet- en cursiefvarianten)
SetTextColor + DrawTextTsgcPDFPage.DrawTextColor(AText, X, Y, AFont, AFontSize, R, G, B) (componenten van 0 tot 1)
AddTrueTypeFont + DrawTextTsgcPDFDocument.AddTrueTypeFont(AFontName, ABold, AItalic): Integer (of AddTrueTypeFontFromFile), daarna TsgcPDFPage.DrawTextTT
DrawLine, DrawBoxTsgcPDFPage.DrawLine(X1, Y1, X2, Y2, ALineWidth), DrawRectangle(X, Y, W, H, ALineWidth), DrawRectangleFill
AddImageFromFile + SelectImage + DrawImageTsgcPDFDocument.AddImage(AFileName): Integer + TsgcPDFPage.DrawImageFromIndex(AIndex, X, Y, W, H), of DrawImageFile(AFileName, X, Y, W, H)
GetPageTextTsgcPDFDocument.ExtractTextW(APageIndex), ExtractText, FindText; TsgcPDFEditor.ExtractAllText, SearchText
AddToFileList + MergeFileListsgcPDFMergeFiles([...], AOutputFile)
MergeDocumentTsgcPDFDocument.AppendDocument(ADoc), TsgcPDFEditor.MergeFrom(AFileName)
ExtractPageRanges, ExtractFilePagessgcPDFExtractPages(AInputFile, AOutputFile, ARange) (bereikstring vanaf 1, zoals '1,3,5-9'), TsgcPDFEditor.ExtractPages(ARange, AOutputFileName)
DeletePagesTsgcPDFDocument.DeletePages(ARange), DeletePage(AIndex)
RotatePageTsgcPDFEditor.RotatePage(AIndex, ADegrees)
SetTransparency + DrawText (watermerk)TsgcPDFEditor.AddWatermarkAllPages(TsgcPDFWatermarkOptions), AddWatermark, AddTransparentText
DrawText op elke pagina (stempel, koptekst, voettekst)TsgcPDFEditor.AddTextColor, AddHeaderText, AddFooterText, AddPageNumbers
RenderPageToDCTsgcPDFRendererGDI.RenderPage(ADC, ADocument.Parser, APage.PageDict, AWidth, AHeight); in de VCL-viewer TsgcPDFViewerControl.RenderPageToBitmap
RenderPageToFileTsgcPDFExporter.ExportPage(ADocument, APageIndex, AFileName) (BMP, PNG, JPEG), sgcPDFPageToImage(APDFFile, AImageFile, APageIndex, ADPI)
FormFieldCount, FindFormFieldByTitleTsgcPDFDocument.AcroForm.FieldCount, AcroForm.FindField(AName)
SetFormFieldValue, SetFormFieldValueByTitleAcroForm.FillField(AName, AValue), AcroForm.SetCheckBox(AName, AChecked), TsgcPDFEditor.FillFormField
GetFormFieldValueAcroForm.GetFieldValue(AName)
NewFormFieldAcroForm.AddTextField, AddCheckBox, AddComboBox, AddListBox, AddRadioGroup + AddRadioButton, AddButton, AddSignatureField
FlattenFormFieldAcroForm.FlattenFields, TsgcPDFEditor.FlattenForm
EncryptTsgcPDFDocument.SetEncryption(AMethod, AUserPassword, AOwnerPassword) met emAES_256, emAES_128, emRC4_128 of emRC4_40
CapturePageTsgcPDFDocument.AddPageAsForm(ASource, APageIndex): Integer (overloads met een paginabox, een rechthoek of annotaties)
DrawCapturedPageTsgcPDFPage.DrawForm(AFormIndex, X, Y, AScaleX, AScaleY, ARotation), DrawFormInRect(AFormIndex, ATarget, AKeepAspect, ARotation), DrawFormMatrix
GetPageBoxTsgcPDFPage.GetPageBox(ABox) (ppbTrimBox, ppbBleedBox, ...), TsgcPDFDocument.GetFormBBox
NewOutlineTsgcPDFEditor.AddBookmark(ATitle, APageIndex), AddBookmarkChild
AddLinkToPageTsgcPDFEditor.AddLinkAnnotation(APageIndex, ALeft, ABottom, ARight, ATop, ADestPage)
AddNoteAnnotationTsgcPDFEditor.AddTextAnnotation(APageIndex, ALeft, ABottom, ARight, ATop, AText)
SignFileTsgcPDFEditor.SignDocument(AOutputFile, ACertSubjectName, AReason, ALocation)
PrintDocumentVCL-viewer TsgcPDFViewerControl.Print(AFromPage, AToPage, ATitle) print zonder dialoogvenster, PrintDialog(ATitle) toont het printerdialoogvenster (paginabereik, aantal kopieën) en print. De FireMonkey-viewer TsgcPDFViewerFMX heeft dezelfde twee methoden op Windows en macOS.
SetMeasurementUnits(0), SetOrigin(0)het standaard en enige coördinatenstelsel: punten, oorsprong linksonder; hulpfuncties sgcPDFMMToPoints, sgcPDFRectMM

Ook in de Delphi-viewers: zoomen op paginahoogte (zmFitHeight op TsgcPDFViewerControl, fzmFitHeight op TsgcPDFViewerFMX, ZoomFitHeight op TsgcPDFViewer) en weergaverotatie (ViewRotation, RotateLeft, RotateRight), die de weergave draait en het document ongewijzigd laat.

De gangbare Quick PDF Library-taken in sgcPDF

Elk fragment is gekopieerd uit de MigrateFromQuickPDF-demo, die compileert met Delphi 7 (Win32) en Delphi 13 (Win32 en Win64) en zijn zelftest doorstaat. De opmerkingen noemen de Quick PDF Library-aanroepen die elke regel vervangt.

De uses-clausule

De importunit van Quick PDF Library en de DLL verdwijnen. Deze units dekken elke taak van de demo:

frmMain.pas
uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
  StdCtrls, ExtCtrls, ShellAPI,
  // sgc
  sgcPDF_Types, sgcPDF_Fonts, sgcPDF_Document, sgcPDF_Encryption,
  sgcPDF_Editor, sgcPDF_Renderer_GDI;

Een document maken met tekst, een kader en een afbeelding

Vervangt NewDocument, SetInformation, AddStandardFont, SelectFont, SetTextSize, SetTextColor, DrawText, DrawBox, AddImageFromFile, SelectImage, DrawImage en SaveToFile.

frmMain.pas
oDoc := TsgcPDFDocument.Create;
try
  // SetInformation(1, ...) / SetInformation(2, ...)
  oDoc.Info.Title := 'Created with sgcPDF';
  oDoc.Info.Author := 'Migration sample';
  // NewDocument creates page 1, sgcPDF adds every page explicitly
  oPage := oDoc.AddPage(CS_A4_WIDTH, CS_A4_HEIGHT);
  // AddStandardFont(4) + SelectFont + SetTextSize(28) + DrawText
  oPage.DrawText('Hello from sgcPDF', 72, 760, sfHelveticaBold, 28);
  // SetTextColor(r, g, b) + DrawText
  oPage.DrawTextColor('No DLL, pure Pascal.', 72, 725, sfHelvetica, 14,
    0.1, 0.3, 0.7);
  // SetLineColor + SetLineWidth + DrawBox(x, y, w, h, 0)
  oPage.DrawRectangle(72, 520, 260, 120, 1.5);
  // AddImageFromFile + SelectImage + DrawImage(x, y, w, h)
  vImage := oDoc.AddImage(OutFile('logo.bmp'));
  oPage.DrawImageFromIndex(vImage, 102, 540, 200, 80);
  oDoc.SaveToFile(OutFile('created.pdf'));
finally
  oDoc.Free;
end;

De tekst van een pagina extraheren

Vervangt LoadFromFile, PageCount, SelectPage en GetPageText. Let op de paginaindex vanaf 0.

frmMain.pas
oDoc.LoadFromFile(OutFile('input_a.pdf'));
Log('Extract text: input_a.pdf has ' + IntToStr(oDoc.PageCount) +
  ' pages');
// SelectPage(2) + GetPageText(0): sgcPDF page indexes are 0-based
vText := string(oDoc.ExtractTextW(1));
Log(vText);

Samenvoegen en splitsen

Vervangt AddToFileList met MergeFileList, en ExtractPageRanges of ExtractFilePages. Bereikstrings blijven beginnen bij 1.

frmMain.pas
sgcPDFMergeFiles([OutFile('input_a.pdf'), OutFile('input_b.pdf')],
  OutFile('merged.pdf'));
frmMain.pas
// 1-based range string, the same syntax as Quick PDF Library
sgcPDFExtractPages(OutFile('merged.pdf'), OutFile('pages_2-3.pdf'), '2-3');
// one file per page: split
sgcPDFExtractPages(OutFile('merged.pdf'), OutFile('page_4.pdf'), '4');

Watermerk en stempel op elke pagina

Vervangt SelectPage, SetTransparency, SetTextColor en DrawText in een lus over de pagina's.

frmMain.pas
oEditor.LoadFromFile(OutFile('input_a.pdf'));
vOptions.Text := 'CONFIDENTIAL';
vOptions.Font := sfHelveticaBold;
vOptions.FontSize := 72;
vOptions.Rotation := 45;
vOptions.Opacity := 0.3;
vOptions.R := 0.8;
vOptions.G := 0.1;
vOptions.B := 0.1;
oEditor.AddWatermarkAllPages(vOptions);
// a stamp in the top right corner of every page
for i := 0 to oEditor.Document.PageCount - 1 do
  oEditor.AddTextColor(i, 'APPROVED', 440, 800, sfHelveticaBold, 16,
    0.0, 0.5, 0.0);
oEditor.SaveToFile(OutFile('watermarked.pdf'));

Een pagina renderen naar een device context

Vervangt RenderPageToDC. De renderer neemt de Parser van het geladen document en de PageDict van de pagina.

frmMain.pas
oDoc.LoadFromFile(OutFile('created.pdf'));
oPage := oDoc.Pages[0];
// 96 DPI: points are 1/72 inch
vScale := 96 / 72;
vW := Round(oPage.Width * vScale);
vH := Round(oPage.Height * vScale);
oBitmap.PixelFormat := pf24bit;
oBitmap.Width := vW;
oBitmap.Height := vH;
oBitmap.Canvas.Brush.Color := clWhite;
oBitmap.Canvas.FillRect(Rect(0, 0, vW, vH));
oRenderer.RenderPage(oBitmap.Canvas.Handle, oDoc.Parser, oPage.PageDict,
  vW, vH);
GdiFlush;
oBitmap.SaveToFile(OutFile('created_page1.bmp'));

Een formulier invullen

Vervangt FormFieldCount, FindFormFieldByTitle en SetFormFieldValue.

frmMain.pas
oDoc.LoadFromFile(OutFile('form.pdf'));
Log('Fill form: form.pdf has ' + IntToStr(oDoc.AcroForm.FieldCount) +
  ' fields');
oDoc.AcroForm.FillField('Customer', 'ACME Corporation');
oDoc.AcroForm.FillField('Amount', '1250.00');
oDoc.AcroForm.SetCheckBox('Paid', True);
oDoc.SaveToFile(OutFile('form_filled.pdf'));

Versleutelen met AES-256 en openen met het wachtwoord

Vervangt Encrypt, en LoadFromFile met een wachtwoord.

frmMain.pas
oDoc.LoadFromFile(OutFile('input_a.pdf'));
oDoc.SetEncryption(emAES_256, CS_USER_PASSWORD, CS_OWNER_PASSWORD);
oDoc.SaveToFile(OutFile('encrypted.pdf'));
frmMain.pas
oDoc.SetPassword(CS_USER_PASSWORD);
oDoc.LoadFromFile(OutFile('encrypted.pdf'));
vText := string(oDoc.ExtractTextW(0));

2-up-impositie

Vervangt CapturePage, NewPage, SetPageDimensions en DrawCapturedPage. AddPageAsForm bewaart elke bronpagina als form-XObject, zodat de tekst vector en selecteerbaar blijft.

frmMain.pas
oSource.LoadFromFile(OutFile('merged.pdf'));
vHalf := CS_A4_HEIGHT / 2;
oSheet := nil;
for i := 0 to oSource.PageCount - 1 do
begin
  // a landscape A4 sheet for every 2 source pages
  if i mod 2 = 0 then
    oSheet := oTarget.AddPage(CS_A4_HEIGHT, CS_A4_WIDTH);
  // CapturePage
  vForm := oTarget.AddPageAsForm(oSource, i);
  // DrawCapturedPage, scaled to fit the left or the right half
  oSheet.DrawFormInRect(vForm, sgcPDFRect((i mod 2) * vHalf, 0,
    (i mod 2) * vHalf + vHalf, CS_A4_WIDTH), True);
end;
oTarget.SaveToFile(OutFile('imposed_2up.pdf'));

Klassen van PdfiumViewer in sgcPDF

Namespace esegece.sgcPDF, pakket esegece.sgcPDF.WinForms. Paginaindexen beginnen in beide bibliotheken bij 0.

PdfiumViewer sgcPDF .NET
PdfViewer (UserControl met een werkbalk en een bladwijzerpaneel)TsgcPDFViewerControl; bouw je eigen werkbalk, bladwijzers in TsgcPDFOutlineView
PdfRenderer (PdfViewer.Renderer)hetzelfde TsgcPDFViewerControl
PdfViewer.Document = PdfDocument.Load(path)TsgcPDFViewerControl.LoadFromFile(path) (de viewer bezit het document), LoadFromStream, of Document = vDoc (jij geeft het vrij)
PdfDocument.Load(path, password)TsgcPDFDocument.SetPassword vóór LoadFromFile, daarna TsgcPDFViewerControl.Document = vDoc
PdfDocument.PageCountTsgcPDFViewerControl.PageCount (eigenschap), TsgcPDFDocument.PageCount() (methode)
PdfDocument.PageSizesTsgcPDFDocument.GetPage(i).Width en .Height (punten)
PdfRenderer.PageTsgcPDFViewerControl.PageIndex, GotoPage, NextPage, PrevPage, FirstPage, LastPage, gebeurtenis OnPageChange
PdfViewerZoomMode.FitWidthZoomMode = TsgcPDFViewerZoomMode.zmFitWidth
PdfViewerZoomMode.FitHeightTsgcPDFViewerZoomMode.zmFitHeight
PdfViewerZoomMode.FitBestTsgcPDFViewerZoomMode.zmFitPage
Zoom (een factor, 1.0 = 100%)TsgcPDFViewerControl.Zoom (een percentage, 100 = 100%, zet zmCustom), ZoomIn, ZoomOut, zmActualSize, ZoomToRect
PdfRenderer.RotateLeft(), RotateRight()TsgcPDFViewerControl.RotateLeft(), RotateRight()
PdfRenderer.RotationTsgcPDFViewerControl.ViewRotation (TsgcPDFViewerRotation: pvr0, pvr90, pvr180, pvr270); PageRotation(i) geeft de getoonde rotatie terug
PdfDocument.Search(text, matchCase, wholeWord) + PdfRenderer.MarkersTsgcPDFViewerControl.FindText(AText, ACaseSensitive, AWholeWord) (markeert en scrolt), FindNext, FindPrevious, SearchResults, GetSearchMatch(i), ClearSearch
PdfDocument.CreatePrintDocument() + PrintDialog of PrintPreviewDialogTsgcPDFViewerControl.CreatePrintDocument() geeft een System.Drawing.Printing.PrintDocument terug voor dezelfde PrintDialog- en PrintPreviewDialog-code. In één aanroep: PrintDialog(ATitle); zonder dialoogvenster: Print(AFromPage, AToPage, ATitle)
PdfDocument.Render(page, dpiX, dpiY, forPrinting)TsgcPDFViewerControl.RenderPageToBitmap(APageIndex, ref Bitmap, AZoomPercent, ADPI); zonder viewer sgcPDF_Export.sgcPDFPageToImage of TsgcPDFExporter.ExportPage
PdfDocument.GetPdfText(page)TsgcPDFDocument.ExtractTextW(APageIndex); met tekenposities TsgcPDFViewerControl.PageText(i); selectie met de muis SelectedText, CopyToClipboard
PdfDocument.BookmarksTsgcPDFOutlineView
PdfViewer.LinkClickTsgcPDFViewerControl.OnLinkClick, OpenLinksInBrowser
PdfDocument.Save(path)TsgcPDFDocument.SaveToFile, SaveIncremental(AFileName) (behoudt de oorspronkelijke bytes en voegt de wijzigingen toe)
geen equivalent: formulieren invullenTsgcPDFViewerControl.FormFilling = true, OnFieldChange; in code AcroForm.FillField, SetCheckBox, GetFieldValue, FindField
geen equivalent: annotatiesTsgcPDFDocument.Annotations.AddText, AddFreeText, AddHighlight, AddStamp, AddLine, AddSquare, AddCircle, daarna AnnotationsChanged(); met de muis AnnotationTool en AnnotationEditing
geen equivalent: een PDF makenTsgcPDFDocument.AddPage, TsgcPDFPage.DrawText, DrawRectangle, AcroForm.AddTextField, AddCheckBox, SaveToFile

Een PdfiumViewer-formulier met de sgcPDF-viewer

Elk fragment is gekopieerd uit de MigrateFromPdfiumViewer-demo, die in Release compileert en zijn zelftest doorstaat. De opmerkingen citeren de PdfiumViewer-code die elk blok vervangt.

Eén besturingselement in plaats van PdfViewer en PdfRenderer

MainForm.cs
// PdfiumViewer: PdfViewer (UserControl with toolbar) and its PdfRenderer (the page
// surface, PdfViewer.Renderer) -> one control, TsgcPDFViewerControl
private TsgcPDFViewerControl FViewer;
MainForm.cs
FViewer = new TsgcPDFViewerControl();
FViewer.Parent = pnlViewer;
FViewer.Dock = DockStyle.Fill;
// PdfiumViewer: PdfRenderer.DisplayRectangleChanged / polling PdfRenderer.Page -> OnPageChange
FViewer.OnPageChange = DoPageChange;
// PdfiumViewer: none, PdfiumViewer renders form fields but cannot edit them.
// sgcPDF: the user types into text fields and toggles check boxes in the viewer
FViewer.FormFilling = true;
FViewer.OnFieldChange = DoFieldChange;
// PdfiumViewer: none. sgcPDF: AnnotationTool adds notes, highlights, shapes, ink
// and stamps with the mouse; AnnotationEditing moves, resizes and deletes them
FViewer.AnnotationAuthor = "sgcPDF demo";

Een bestand openen

MainForm.cs
// PdfiumViewer: pdfViewer1.Document = PdfDocument.Load(AFileName)
// sgcPDF: the viewer loads and owns the document; to share a document you load
// yourself, assign it: FViewer.Document = vDoc (you dispose it)
FViewer.LoadFromFile(AFileName);
// PdfiumViewer: PdfViewer.ZoomMode = PdfViewerZoomMode.FitWidth
FViewer.ZoomMode = TsgcPDFViewerZoomMode.zmFitWidth;
// PdfiumViewer: PdfDocument.PageCount -> TsgcPDFViewerControl.PageCount
// (or TsgcPDFDocument.PageCount(), a method)
Log("Opened " + Path.GetFileName(AFileName) + ", " + sgcPDF_RTL.IntToStr(FViewer.PageCount) + " pages");

Zoommodi en weergaverotatie

Paginabreedte, hele pagina en paginahoogte komen één op één overeen. De zoom is een percentage in plaats van een factor.

MainForm.cs
internal void FitWidth()
{
    // PdfiumViewer: PdfViewerZoomMode.FitWidth -> TsgcPDFViewerZoomMode.zmFitWidth
    FViewer.ZoomMode = TsgcPDFViewerZoomMode.zmFitWidth;
}

internal void FitPage()
{
    // PdfiumViewer: PdfViewerZoomMode.FitBest -> TsgcPDFViewerZoomMode.zmFitPage
    FViewer.ZoomMode = TsgcPDFViewerZoomMode.zmFitPage;
}

internal void FitHeight()
{
    // PdfiumViewer: PdfViewerZoomMode.FitHeight -> TsgcPDFViewerZoomMode.zmFitHeight
    FViewer.ZoomMode = TsgcPDFViewerZoomMode.zmFitHeight;
}

internal void RotateLeft()
{
    // PdfiumViewer: PdfRenderer.RotateLeft() -> TsgcPDFViewerControl.RotateLeft()
    // (ViewRotation turns the view only, the document is not changed)
    FViewer.RotateLeft();
}

internal void RotateRight()
{
    // PdfiumViewer: PdfRenderer.RotateRight() -> TsgcPDFViewerControl.RotateRight()
    FViewer.RotateRight();
}

internal void SetZoomPercent(double APercent)
{
    // PdfiumViewer: PdfRenderer.Zoom is a factor (1.0 = 100%);
    // TsgcPDFViewerControl.Zoom is a percentage (100 = 100%) and sets ZoomMode to zmCustom
    FViewer.Zoom = APercent;
}

Zoeken

MainForm.cs
// PdfiumViewer: PdfDocument.Search(text, matchCase, wholeWord) returns PdfMatches
// and the app adds PdfMarker objects to PdfRenderer.Markers to highlight them.
// sgcPDF: FindText highlights every match and scrolls to the first one,
// FindNext / FindPrevious move between them, GetSearchMatch(i) gives page and chars
if (!FViewer.FindText(AText, false, false))
{
    Log("Not found: " + AText);
    return 0;
}
for (int i = 0; i < FViewer.SearchResults; i++)
{
    TsgcPDFViewerSearchMatch vMatch = FViewer.GetSearchMatch(i);
    Log("Match " + sgcPDF_RTL.IntToStr(i + 1) + ": page " + sgcPDF_RTL.IntToStr(vMatch.PageIndex + 1) +
      ", char " + sgcPDF_RTL.IntToStr(vMatch.FirstChar));
}
return FViewer.SearchResults;

Printen met CreatePrintDocument

De printcode van PdfiumViewer behoudt zijn vorm: CreatePrintDocument() geeft een PrintDocument terug voor een PrintDialog of een PrintPreviewDialog.

MainForm.cs
// PdfiumViewer: using (PrintDocument d = PdfDocument.CreatePrintDocument())
//   { PrintDialog dlg = new PrintDialog(); dlg.Document = d; if (dlg.ShowDialog() == OK) d.Print(); }
// sgcPDF: TsgcPDFViewerControl.CreatePrintDocument() returns the same kind of
// System.Drawing.Printing.PrintDocument, so the PdfiumViewer code stays as it is. It honours
// the page range (all, some pages, current page), copies and collate of its PrinterSettings.
// A shorter way: FViewer.PrintDialog(title) shows the dialog and prints in one call, and
// FViewer.Print(from, to, title) prints without a dialog (0-based pages, -1 = last page).
if (FViewer.PageCount == 0)
    return;
using (PrintDocument vDoc = FViewer.CreatePrintDocument())
using (PrintDialog vDialog = new PrintDialog())
{
    vDoc.DocumentName = "PdfiumViewer migration sample";
    vDialog.Document = vDoc;
    vDialog.AllowSomePages = true;
    vDialog.AllowCurrentPage = true;
    vDialog.UseEXDialog = true;
    vDoc.PrinterSettings.MinimumPage = 1;
    vDoc.PrinterSettings.MaximumPage = FViewer.PageCount;
    vDoc.PrinterSettings.FromPage = 1;
    vDoc.PrinterSettings.ToPage = FViewer.PageCount;
    if (vDialog.ShowDialog(this) == DialogResult.OK)
        vDoc.Print();
}
MainForm.cs
// PdfiumViewer: PrintPreviewDialog with PdfDocument.CreatePrintDocument()
// sgcPDF: the same with TsgcPDFViewerControl.CreatePrintDocument()
if (FViewer.PageCount == 0)
    return;
using (PrintDocument vDoc = FViewer.CreatePrintDocument())
using (PrintPreviewDialog vPreview = new PrintPreviewDialog())
{
    vPreview.Document = vDoc;
    vPreview.Width = 900;
    vPreview.Height = 700;
    vPreview.ShowDialog(this);
}

Een pagina renderen naar een bitmap

MainForm.cs
// PdfiumViewer: Image img = PdfDocument.Render(page, dpiX, dpiY, forPrinting)
// sgcPDF: RenderPageToBitmap(page, ref bitmap, zoomPercent, dpi); the bitmap passed
// in is disposed and replaced
Bitmap vBitmap = null;
FViewer.RenderPageToBitmap(APageIndex, ref vBitmap, 100, 150);
try
{
    vBitmap.Save(AFileName, ImageFormat.Png);
    Log("Page " + sgcPDF_RTL.IntToStr(APageIndex + 1) + " rendered at 150 dpi: " +
      sgcPDF_RTL.IntToStr(vBitmap.Width) + " x " + sgcPDF_RTL.IntToStr(vBitmap.Height) + " px, " +
      AFileName);
}
finally
{
    vBitmap.Dispose();
}
// without a viewer (server, batch): one call from file to image
sgcPDF_Export.sgcPDFPageToImage(FViewer.FileName, Path.ChangeExtension(AFileName, null) + "_file.png",
  APageIndex, 72);

Paginatekst

MainForm.cs
// PdfiumViewer: PdfDocument.GetPdfText(page) returns the plain text of a page.
// sgcPDF: TsgcPDFDocument.ExtractTextW(page) is the same plain text, and
// TsgcPDFViewerControl.PageText(page) returns a TsgcPDFTextExtractor with the
// characters and their positions (GetTextWithPositions); the user can also select
// text with the mouse and copy it (SelectedText, CopyToClipboard)
string vText = FViewer.Document.ExtractTextW(APageIndex);
Log("Text of page " + sgcPDF_RTL.IntToStr(APageIndex + 1) + ": " + vText.Trim());
TsgcPDFTextExtractor vExtractor = FViewer.PageText(APageIndex);
if (vExtractor != null)
    Log("Characters with positions: " + sgcPDF_RTL.IntToStr(vExtractor.GetCharCount()));
return vText;

Meer dan PdfiumViewer: een formulier invullen en een notitie toevoegen

MainForm.cs
// PdfiumViewer: none (no AcroForm API). sgcPDF: AcroForm.FillField / SetCheckBox,
// then an incremental save keeps the original bytes and appends the change
TsgcPDFDocument vDoc = FViewer.Document;
if (vDoc.AcroForm.FindField("CustomerName") == null)
{
    Log("This document has no CustomerName field, open the generated sample");
    return;
}
vDoc.AcroForm.FillField("CustomerName", "ACME Ltd.");
vDoc.AcroForm.SetCheckBox("Approved", true);
FViewer.ClearCache();
FViewer.Invalidate();
vDoc.SaveIncremental(AFileName);
Log("Form filled and saved: " + AFileName);
MainForm.cs
// PdfiumViewer: none (annotations are only rendered). sgcPDF: the document's
// Annotations manager adds notes, free text, highlights, stamps, lines, shapes and
// ink; the viewer shows them after AnnotationsChanged
TsgcPDFDocument vDoc = FViewer.Document;
int vPage = FViewer.PageIndex;
TsgcPDFTextAnnotation vNote = vDoc.Annotations.AddText(vPage, 420, 760, 444, 784,
  "Migrated from PdfiumViewer to sgcPDF.");
vNote.Author = "sgcPDF demo";
vNote.SetColor(1.0, 0.9, 0.2);
vDoc.Annotations.AddHighlight(vPage, 72, 728, 330, 728, 72, 742, 330, 742);
FViewer.AnnotationsChanged();
vDoc.SaveIncremental(AFileName);
Log("Note and highlight added on page " + sgcPDF_RTL.IntToStr(vPage + 1) + ", saved: " + AFileName);

Stap voor stap

Verplaats één taak of één formulier tegelijk en vergelijk de uitvoerbestanden voor en na.

Delphi: van Quick PDF Library

1

De units toevoegen

Voeg de Source-map van sgcPDF of het geïnstalleerde pakket toe en vervang de import van Quick PDF Library door sgcPDF_Types, sgcPDF_Fonts en sgcPDF_Document, plus waar nodig sgcPDF_Editor, sgcPDF_Encryption en sgcPDF_Renderer_GDI.

2

De DLL laten vallen

Verwijder de DLL of ActiveX uit de distributie en de aanroep van UnlockKey uit de code.

3

Eén object per document

Vervang het TQuickPDF-object door een TsgcPDFDocument per document, of een TsgcPDFEditor voor laden, bewerken en opslaan.

4

Pagina's zijn objecten

Vervang SelectPage en de tekenaanroepen door aanroepen op de TsgcPDFPage uit AddPage of Pages[i], en trek 1 af van elk paginanummer.

5

De aanroepen mappen

Gebruik de tabel hierboven. Standaardlettertypen zijn een argument van DrawText; TrueType-lettertypen voeg je één keer toe met AddTrueTypeFont en teken je met DrawTextTT.

6

Imposition

Vervang CapturePage en DrawCapturedPage door AddPageAsForm en DrawForm of DrawFormInRect.

7

De uitvoer vergelijken

Voer de omgezette taak uit en controleer de bestanden. De zelftest van de demo is een sjabloon: hij opent elke uitvoer opnieuw en controleert paginatellingen, tekst en formulierwaarden.

WinForms: van PdfiumViewer

1

De native onderdelen verwijderen

Verwijder het PdfiumViewer-pakket, elk PdfiumViewer.Native.*-pakket en elke met de hand gekopieerde pdfium.dll, inclusief de x86- en x64-mappen. Het project kan terug naar AnyCPU.

2

sgcPDF toevoegen

Voeg esegece.sgcPDF.WinForms toe (of esegece.sgcPDF.WinForms.Community), dat esegece.sgcPDF meebrengt, en voeg using esegece.sgcPDF; toe.

3

Het besturingselement vervangen

Vervang de PdfViewer of PdfRenderer door een TsgcPDFViewerControl (Dock = Fill) en bouw de werkbalkknoppen die je gebruikte opnieuw op als aanroepen op het besturingselement.

4

Het document laden

Vervang PdfDocument.Load en Document = door LoadFromFile, of laad zelf een TsgcPDFDocument en wijs het toe aan Document.

5

De leden mappen

Page wordt PageIndex of GotoPage, de zoommodi komen overeen met TsgcPDFViewerZoomMode, de zoomfactor wordt met 100 vermenigvuldigd, Search wordt FindText, Render wordt RenderPageToBitmap.

6

De printcode behouden

Roep CreatePrintDocument() aan op de viewer in plaats van op het PdfiumViewer-document; de code voor PrintDialog en PrintPreviewDialog blijft. Of gebruik PrintDialog(ATitle).

7

De nieuwe onderdelen inschakelen

Optioneel: FormFilling = true, AnnotationTool en SaveIncremental, die PdfiumViewer niet kon bieden.

Wat niet één op één overeenkomt

Lees dit voordat je de overstap plant.

Quick PDF Library

PdfiumViewer

MigrateFromQuickPDF en MigrateFromPdfiumViewer

Beide demo's genereren hun eigen invoerbestanden, dus er is geen externe PDF nodig, en beide hebben een zelftest.

Delphi: waar staat het

Het sgcUI-installatieprogramma plaatst het in Demos\PDF\Delphi\MigrateFromQuickPDF: sgcPDF_Demo_MigrateFromQuickPDF.dpr, frmMain.pas, frmMain.dfm en een readme.html.

Delphi: hoe start je het

Open de .dpr in een willekeurige Delphi van 7 tot 13 (VCL, Win32 of Win64), klik op Generate sample inputs, daarna op een willekeurige knop of op Run all. De uitvoer komt in de map output naast de exe.

Delphi: zelftest

sgcPDF_Demo_MigrateFromQuickPDF.exe /selftest [folder] voert elke taak uit, controleert de resultaten en schrijft selftest.log, dat eindigt op SELFTEST OK.

.NET: waar staat het

In de .NET-demo's van sgcUI, map PDF\MigrateFromPdfiumViewer van de solution sgcUI_Demos.sln: sgcPDF_Demo_MigrateFromPdfiumViewer.csproj, Program.cs en MainForm.cs.

.NET: hoe start je het

dotnet run --project demos\PDF\MigrateFromPdfiumViewer (voeg -p:SgcCommunity=true toe voor de Community-editie), klik op Generate sample, dat output\sample.pdf schrijft en opent, daarna op een willekeurige knop.

.NET: zelftest

sgcPDF_Demo_MigrateFromPdfiumViewer.exe /selftest [folder] opent het voorbeeld, navigeert, zoomt, past de hoogte aan, draait, zoekt, rendert, telt de pagina's van een afdrukvoorbeeld, extraheert tekst, vult het formulier in, voegt een notitie toe en opent de opgeslagen bestanden opnieuw. Het schrijft selftest.log dat eindigt op SELFTEST OK.

Om eerlijk te zijn tegenover beide bibliotheken: een toepassing op basis van Quick PDF Library of PdfiumViewer blijft werken waar ze nu is geïmplementeerd, en Foxit noemt zijn eigen PDF-SDK's als opvolgers van Quick PDF Library. sgcPDF is de weg wanneer je de PDF-code in Pascal- of C#-broncode wilt die in je toepassing wordt gecompileerd, zonder native PDF-bibliotheek om te distribueren, en met één API die ook de bestanden maakt, invult, annoteert, ondertekent en versleutelt die je viewer toont. Voor de componenten en edities zie de productpagina van sgcPDF.

De beste deal: All-AccessElk eSeGeCe-product, inclusief Premium-ondersteuning, vanaf €1,059 per jaar.
Bekijk de All-Access-prijzen

Verplaats vandaag je eerste PDF-taak

Download sgcUI met sgcPDF, of voeg de gratis Community-pakketten van NuGet toe, en verplaats je eerste taak of formulier met de demo's MigrateFromQuickPDF en MigrateFromPdfiumViewer ernaast.