PDF4me .NET SDK: C# PDF Perpustakaan dan API Klien
Pdf4me.Client adalah sebuah .NET pustaka klien untuk PDF4me API yang mengekspos 106 aksi dokumen sebagai metode asinkron bertipe. Instal dari NuGet, buat satu Pdf4meClient dengan milikmu API kunci, dan konversi, optimasi, gabungkan, pisahkan, OCR atau kutipan dari dokumen di C# tanpa mengirimkan mesin rendering.
Fakta kemasan
| Bidang | Nilai |
|---|---|
| Nama paket | Pdf4me.Client |
| Versi saat ini | 2.0.0 (terakhir diperbarui 2026-10-13) |
| Lisensi | MIT |
| .NET mendukung | .NET 8, 9 dan 10, ditambah .NET Standar 2.0 untuk .NET Framework 4.6.2 dan yang lebih baru |
| Total unduhan | 246,4 ribu di semua versi |
| Ukuran kemasan | 1,34 MB |
| Tindakan | 106 di 18 bagian |
| Ketergantungan saat runtime | Microsoft.Kiota.Bundle (>= 2.1.2) dan Microsoft.Extensions.Logging.Abstractions (>= 8.0.3) |
| Basis URL | https://api.pdf4me.com |
| Sumber | github.com/pdf4me/pdf4me-clientapi-dotnet |
| NuGet | nuget.org/packages/Pdf4me.Client |
Prasyarat
- .NET 8 atau lebih baru, atau .NET Framework 4.6.2 atau yang lebih baru melalui .NET Standar 2.0.
- A PDF4me akun dan API kunci.
Memasang
- dotnet CLI
- Package Manager
- PackageReference
dotnet add package Pdf4me.Client
NuGet\Install-Package Pdf4me.Client -Version 2.0.0
<PackageReference Include="Pdf4me.Client" Version="2.0.0" />
Otentikasi
Atur milik Anda API kunci dalam lingkungan:
- Bash / Zsh
- PowerShell
- Windows CMD
export PDF4ME_API_KEY="your-api-key"
$env:PDF4ME_API_KEY = "your-api-key"
set PDF4ME_API_KEY=your-api-key
Di Windows, set hanya berlaku untuk saat ini CMD sesi. Gunakan setx PDF4ME_API_KEY "your-api-key" Untuk nilai yang tetap berlaku setelah reboot, buka terminal baru agar proses tersebut dapat menggunakan nilai tersebut.
Klien mengambil kunci di konstruktornya. Tidak ada yang dicatatnya yang membawa kunci tersebut. API kunci atau isi dokumen, dan kunci kosong atau hanya spasi akan menimbulkan kesalahan. ArgumentException sebelum permintaan apa pun dikirimkan.
Mulai cepat
Program ini mengunggah input.pdf untuk optimasi dan menyimpan hasilnya sebagai optimized.pdf:
using Pdf4me.Client;
var apiKey = Environment.GetEnvironmentVariable("PDF4ME_API_KEY")
?? throw new InvalidOperationException("Set PDF4ME_API_KEY first.");
using var client = new Pdf4meClient(apiKey);
var result = await client.OptimizeAsync(
File.ReadAllBytes("input.pdf"), docName: "input.pdf", profile: OptimizeProfile.Max);
File.WriteAllBytes("optimized.pdf", result);
Buat satu klien dan gunakan kembali untuk setiap panggilan. Ini mempertahankan koneksi bersama, sehingga satu klien per panggilan akan melakukan negosiasi. TLS Setiap kali. Buang setelah selesai digunakan.
Apa itu PDF4me .NET SDK?
Ini adalah satu NuGet kemasan, Pdf4me.Client, yang membungkus PDF4me API v2 di balik satu kelas. Setiap aksi adalah metode asinkron pada Pdf4meClient dinamai berdasarkan titik akhirnya, jadi /api/v2/ConvertOcrPdf adalah ConvertOcrPdfAsyncParameter pertama adalah objek yang akan dikenai aksi, dan parameter lainnya bersifat opsional, jadi berikan parameter tersebut berdasarkan namanya:
var searchable = await client.ConvertOcrPdfAsync(
scan, language: "English", qualityType: QualityType.Draft);
var numbered = await client.AddPageNumberAsync(
pdf, pageNumberFormat: "Page # of {1}", alignX: AddPageNumberAlignX.Center);
Yang Generated Pohon di dalam kemasan diproduksi oleh Microsoft Kiota dari PDF4me OpenAPI deskripsi, itulah sebabnya model opsi dan hasil konsisten dengan REST API dan dengan Python Dan JavaScript Klien: tindakan yang sama, dengan nama dan pengaturan default yang sama.
Apa perbedaan antara pustaka PDF C# dan klien API?
Sebagian besar hasil untuk "c# pdf "Library" adalah pustaka rendering yang dihosting sendiri: Anda menambahkan paketnya, paket tersebut melakukan pekerjaan dalam proses Anda, dan Anda memiliki kendali atas mesin renderingnya. Pdf4me.Client adalah bentuk lainnya. Ia mengirimkan dokumen ke PDF4me dan mengembalikan byte yang sudah selesai. Perdagangan ini nyata di kedua arah, jadi ada baiknya kita menjelaskannya secara gamblang:
| Perpustakaan lokal vs. yang dihosting API | Perpustakaan yang dihosting sendiri | Pdf4me.Client |
|---|---|---|
| Tempat kerja berlangsung | Dalam proses Anda | Pada PDF4me melayani |
| Jaringan diperlukan | TIDAK | Ya, setiap panggilan |
| Bentuk biaya | Lisensi paket, terkadang per pengembang atau per penerapan. | MIT klien, API kredit pada paket gratis atau berbayar |
| Berfungsi secara offline atau terisolasi dari jaringan (air-gapped). | Ya | TIDAK |
| Dokumen meninggalkan infrastruktur Anda | TIDAK | Ya |
| OCR, AI ekstraksi, ZUGFeRD | Biasanya merupakan produk terpisah, jika tersedia. | Termasuk dalam 106 tindakan yang sama |
| Anda mempertahankan | Mesin, font-nya, dan CVES | Sebuah API kunci |
Pilih pustaka lokal ketika dokumen tidak dapat meninggalkan jaringan Anda, ketika Anda perlu bekerja secara offline, atau ketika biaya per dokumen untuk volume Anda lebih murah daripada berlangganan. Pilih klien ini ketika Anda biasanya akan mengintegrasikan beberapa produk untuk menangani konversi. OCR, barcode, faktur elektronik dan AI ekstraksi, dan Anda lebih memilih untuk tidak mengirimkan atau menambal mesin rendering sama sekali.
Perhatikan bahwa dua pertanyaan yang paling sering diajukan oleh fitur pelengkapan otomatis tentang kategori ini dijawab secara berbeda di sini. Klien itu sendiri adalah MIT berlisensi dan sumber terbukaJadi, kotak "gratis" dan "sumber terbuka" dicentang untuk kode yang Anda tautkan. Proses di baliknya adalah layanan yang dihosting, yang tidak gratis di luar tingkatan gratisnya.
Menyerahkan dokumen dan membaca hasil
Dokumen adalah DocumentSource: baik byte file, atau string API mengambil dirinya sendiri, yang mungkin merupakan pdf4meblobid://<id> referensi blob atau https URLKeduanya dikonversi secara implisit, jadi salah satunya dapat langsung dimasukkan. String tidak pernah dibaca sebagai jalur file lokal, jadi baca file tersebut dan berikan byte-nya.
byte[] fromBytes = await client.OptimizeAsync(File.ReadAllBytes("report.pdf"));
byte[] fromUrl = await client.OptimizeAsync("https://example.com/report.pdf");
byte[] fromBlob = await client.OptimizeAsync("pdf4meblobid://<id>");
Hasil kembali dengan salah satu dari dua cara. Tindakan yang menghasilkan dokumen akan mengembalikannya. byte[], Jadi File.WriteAllBytes Menerimanya secara langsung. Aksi yang menjawab dengan data akan mengembalikan model bertipe:
DocMetadata metadata = await client.GetPdfMetadataAsync(pdf);
Console.WriteLine($"{metadata.PageCount} pages, PDF {metadata.PdfVersion}");
ReadBarcodesRes scan = await client.ReadBarcodesAsync(pdf);
foreach (var barcode in scan.Barcodes ?? [])
Console.WriteLine($"page {barcode.Page}: {barcode.Value}");
Yang AI Pengurai dokumen menentukan sendiri bentuk responsnya, sehingga semua yang dikembalikannya sampai ke model. AdditionalData:
var parsed = await client.AiDocumentParserAsync(File.ReadAllBytes("invoice.pdf"), "invoice parser");
foreach (var (field, value) in parsed.AdditionalData)
Console.WriteLine($"{field}: {value}");
Beberapa dokumen Menggabungkan sesuai urutan yang diberikan, dan beberapa tindakan tidak memerlukan dokumen sama sekali karena inputnya berupa teks atau URL:
byte[] merged = await client.MergeAsync([File.ReadAllBytes("a.pdf"), File.ReadAllBytes("b.pdf")]);
byte[] qrCode = await client.CreateBarcodeAsync("https://pdf4me.com", barcodeType: CreateBarcodeBarcodeType.QRCode);
byte[] webPage = await client.ConvertUrlToPdfAsync("https://example.com");
Opsi yang berupa objek, seperti ConvertToPdfAction Dan ImageAction, dan semua model hasilnya, berada di Pdf4me.Client.Generated.ModelsEnum yang diambil oleh suatu tindakan memiliki nama pendek dalam Pdf4me.Client (QualityType, AlignX, SplitAction), sementara beberapa yang nama yang dihasilkan sudah pendek (DocType, ImageTypeExtract) digunakan langsung dari namespace yang dihasilkan:
using Pdf4me.Client;
using Pdf4me.Client.Generated.Models;
var pages = await client.CreateImagesAsync(
pdf, new ImageAction { ImageExtension = ImageExtension.Png }, pageNrs: "1");
Setiap tindakan juga membutuhkan tiga argumen opsional: extra, sebuah kamus berisi kolom permintaan tambahan untuk opsi-opsi tersebut API Deskripsi belum tercantum, dikirim apa adanya bersamaan dengan aksi itu sendiri; maxWait, yang membatasi waktu tunggu untuk pekerjaan yang antri untuk panggilan tersebut; dan cancellationToken, yang membatalkan permintaan dan semua polling.
Konfigurasi klien
using var client = new Pdf4meClient(apiKey, new Pdf4meClientOptions
{
BaseUrl = Pdf4meClient.DefaultBaseUrl, // https://api.pdf4me.com
Timeout = TimeSpan.FromSeconds(100), // each HTTP request
MaxWait = TimeSpan.FromMinutes(5), // waiting for one queued job
Logger = loggerFactory.CreateLogger<Pdf4meClient>(),
});
Di dalam ASP.NET Core, atau aplikasi apa pun yang menggunakan dependency injection, mendaftarkan satu klien untuk seluruh aplikasi dan membiarkan logger berasal dari pengaturan logging aplikasi itu sendiri:
builder.Services.AddSingleton(services => new Pdf4meClient(
builder.Configuration["Pdf4me:ApiKey"]!,
new Pdf4meClientOptions { Logger = services.GetRequiredService<ILogger<Pdf4meClient>>() }));
Berikan klien sebuah ILogger dari Microsoft.Extensions.Logging untuk melihat setiap permintaan, respons, pekerjaan yang antri, dan jajak pendapat di Debug level.
Bagaimana cara menangani pekerjaan yang memakan waktu lama dan OCR di C#?
Setiap tindakan dikirimkan sebagai pekerjaan asinkron. Sebuah panggilan mengembalikan hasil akhir, baik server langsung menjawab atau mengantrekan pekerjaan tersebut, dengan melakukan polling di antara interval yang disarankan server. Hal ini penting karena dua alasan: satu await bisa tertahan selama beberapa menit, dan hal yang mengakhiri penantian itu adalah... MaxWait, bukan Timeout.
Timeoutberlaku untuk setiap HTTP meminta.MaxWaitberlaku untuk seluruh pekerjaan yang mengantri, DanmaxWait:Pada suatu aksi, pengaturan tersebut akan ditimpa untuk panggilan tersebut.- Yang OCR tindakan,
ConvertOcrPdfAsyncDanImageExtractTextAsync, tunggu setidaknya 10 menit (DefaultOcrMaxWait), atau lebih lama ketikaMaxWaitlebih tinggi.
using var cancel = new CancellationTokenSource(TimeSpan.FromMinutes(20));
byte[] searchable = await client.ConvertOcrPdfAsync(
File.ReadAllBytes("scan.pdf"), language: "English",
maxWait: TimeSpan.FromMinutes(20), cancellationToken: cancel.Token);
Kesalahan
Permintaan yang ditolak atau gagal akan menimbulkan kesalahan. Pdf4meException, dari Pdf4me.Client.Generated.Models:
| Milik | Memegang |
|---|---|
Message | Yang APIpesannya, jika tidak, isi tanggapan dipersingkat menjadi 500 karakter, jika tidak HTTP status |
ResponseStatusCode | Yang HTTP kode status |
TraceId | Yang APIID pelacakan. Sebutkan ID ini saat melaporkan masalah. |
ResponseBody | Seluruh isi balasan seperti yang dikirim |
ResponseHeaders | Header respons |
Sebuah pekerjaan yang masih berjalan ketika waktu tunggu habis akan menimbulkan kesalahan. TimeoutExceptionArgumen yang tidak valid, seperti dokumen kosong, akan menimbulkan kesalahan. ArgumentException sebelum permintaan apa pun dikirim.
try
{
byte[] result = await client.OptimizeAsync(pdf);
}
catch (Pdf4meException e)
{
Console.Error.WriteLine($"PDF4me returned {e.ResponseStatusCode}: {e.Message} (trace {e.TraceId})");
}
catch (TimeoutException e)
{
Console.Error.WriteLine(e.Message);
}
Ke-18 bagian dan seluruh 106 tindakan
Tindakan dikelompokkan berdasarkan bagian-bagian dari PDF4me REST API referensi, dan metode-metode di setiap bagian berada dalam file masing-masing di kode sumber. Beberapa di antaranya berada di bagian yang mungkin tidak Anda duga dari namanya: OCR ada di Pencarian, PDF/A pembuatan ada di Konversi, dan MergeV3Async berada di dalam PDF alih-alih Menggabungkan & Memisahkan.
| Bagian | Tindakan | Metode tentang Pdf4meClient |
|---|---|---|
| AI Ekstraksi Dokumen | 14 | AiDocumentParserAsync, ProcessBankChequeAsync, ProcessBankStatementAsync, ProcessContractAsync, ProcessCreditCardAsync, ProcessHealthCardAsync, ProcessInvoiceAsync, ProcessMarriageCertificateAsync, ProcessMortgageDocumentAsync, ProcessOrderAsync, ProcessPayStubAsync, ProcessReceiptAsync, ProcessShippingLabelAsync, ProcessTaxDocumentAsync |
| Kode batang | 7 | AddBarcodeAsync, CreateBarcodeAsync, CreateSwissQrBillAsync, ReadBarcodesAsync, ReadSwissQrBillAsync, CreateEpcQrCodeAsync, ReadBarcodesFromImageAsync |
| Mengubah | 13 | ConvertHtmlToPdfAsync, ConvertJsonToExcelAsync, ConvertMdToPdfAsync, ConvertPdfToExcelAsync, ConvertPdfToPowerpointAsync, ConvertPdfToWordAsync, ConvertToPdfAsync, ConvertUrlToPdfAsync, ConvertVisioAsync, ConvertWordToPdfFormAsync, CreatePdfAAsync, FlattenPdfAsync, LinearizePdfAsync |
| Edit | 7 | AddAttachmentToPdfAsync, AddHtmlHeaderFooterAsync, ImageStampAsync, AddMarginAsync, AddPageNumberAsync, StampAsync, SignPdfAsync |
| Unggul | 1 | FindAndReplaceTextInExcelAsync |
| Ekstrak | 8 | ClassifyDocumentAsync, ExtractAttachmentFromPdfAsync, ExtractPdfFormDataAsync, ExtractResourcesAsync, ExtractTableFromPdfAsync, ExtractTextByExpressionAsync, ExtractTextFromWordAsync, ParseDocumentAsync |
| Temukan Pencarian | 2 | FindAndReplaceAsync, ConvertOcrPdfAsync |
| Formulir | 2 | AddFormFieldAsync, FillPdfFormAsync |
| Menghasilkan | 6 | EnableTrackingChangesInWordAsync, GenerateDocumentSingleAsync, GenerateDocumentMultipleAsync, GetTrackingChangesInWordAsync, ReplaceTextWithImageInWordAsync, GenerateDocumentSingleV2Async |
| Gambar | 13 | AddImageWatermarkToImageAsync, AddTextWatermarkToImageAsync, CompressImageAsync, ConvertImageFormatAsync, CreateImagesAsync, CropImageAsync, FlipImageAsync, GetImageMetadataAsync, ImageExtractTextAsync, RemoveExifTagsFromImageAsync, ResizeImageAsync, RotateImageAsync, RotateImageByExifDataAsync |
| Gabung & Pisahkan | 5 | MergeAsync, MergeOverlayAsync, SplitPdfAsync, SplitPdfByBarcodeAsync, SplitByTextAsync |
| Optimalkan | 1 | OptimizeAsync |
| Mengatur | 5 | DeleteBlankPagesAsync, DeletePagesAsync, ExtractPagesAsync, RotateAsync, RotatePageAsync |
| 16 | MergeV3Async, GetPdfMetadataAsync, RepairPdfAsync, CreateHyperlinkAnnotationAsync, DeleteHyperlinkAnnotationAsync, DigitalSignPdfAsync, ExtractHyperlinkAnnotationAsync, GetDocumentByTextAsync, GetTextAndCoordinatesAsync, GetTextByPositionAsync, HighlightTextAsync, PrepareForPrintAsync, ReplaceTextWithImageAsync, ResizePdfAsync, SetPdfMetadataAsync, SignDocumentAsync | |
| PDF4me | 1 | UpdateHyperlinkAnnotationAsync |
| Keamanan | 2 | ProtectAsync, UnlockAsync |
| Kata | 2 | DisableTrackingChangesInWordAsync, FindAndReplaceTextInWordAsync |
| ZUGFeRD | 1 | CreateZugferdInvoiceAsync |
Untuk parameter dan bentuk respons setiap tindakan, lihat PDF4me REST API referensiAtau, arahkan kursor ke metode tersebut di editor Anda: setiap metode memiliki ringkasan dokumentasi yang sesuai dengan halaman dokumentasinya.
Migrasi dari versi 1.x
Versi 2.0 adalah penulisan ulang dari PDF4me API v2 dan tidak ada satu pun dari versi 1.x yang masih berfungsi. Judulnya berubah:
- Ia berbicara kepada API v2. 1.x disebut sebagai endpoint v1 seperti
/Optimize/OptimizeByProfile; 2.0 panggilan/api/v2/.... - Klien tunggal dan klien per area sudah tidak ada lagi.
Pdf4me.Instance.Init(token)DanPdf4me.Instance.OptimizeClientmenjadi satunew Pdf4meClient(apiKey)dengan setiap tindakan sebagai metode di dalamnya. - Namespace tersebut adalah
Pdf4me.Client, bukanPdf4meClient. - Newtonsoft.Json tidak lagi menjadi ketergantungan, dan versi 12.0.3 yang rentan yang disertakan dalam versi 1.x juga ikut disertakan.
- Kesalahan adalah salah satu jenisnya.
Pdf4meApiExceptionDanPdf4meBackendExceptionmenjadiPdf4meException. - .NET Framework versi 4.5.2 dan 4.6.1 tidak lagi didukung. Minimumnya adalah 4.6.2, melalui .NET Standar 2.0.
| 1.x | 2.0 |
|---|---|
Pdf4me.Instance.Init(token) | using var client = new Pdf4meClient(apiKey); |
OptimizeClient.OptimizeByProfileAsync(file, profile) | client.OptimizeAsync(file, profile: ...) |
MergeClient.Merge2PdfsAsync(file1, file2) | client.MergeAsync([file1, file2]) |
SplitClient.SplitByPageNrAsync(file, pageNr) | client.SplitPdfAsync(file, splitActionNumber: pageNr) |
ExtractClient.ExtractPagesAsync(file, pageNrs) | client.ExtractPagesAsync(file, pageNumbers: pageNrs) |
ConvertClient.ConvertFileToPdfAsync(file, fileName) | client.ConvertToPdfAsync(file, docName: fileName) |
PdfAClient.CreatePdfAAsync(file, compliance) | client.CreatePdfAAsync(file, compliance: ...) |
PdfAClient.RotateDocumentAsync(file, rotate) | client.RotateAsync(file, rotationType: ...) |
PdfAClient.ProtectDocumentAsync(file, password, perms) | client.ProtectAsync(file, password: ..., pdfPermission: ...) |
PdfAClient.UnlockDocumentAsync(file, password) | client.UnlockAsync(file, password: ...) |
PdfAClient.RepairDocumentAsync(file) | client.RepairPdfAsync(file) |
ImageClient.CreateThumbnailAsync(file, width, pageNr, fmt) | client.CreateImagesAsync(file, new ImageAction { ... }, pageNrs: ...) |
Milikmu API Kuncinya tetap sama. Ganti using Pdf4meClient; dengan using Pdf4me.Client;, menambahkan using Pdf4me.Client.Generated.Models; di mana pun Anda menggunakan model opsi atau hasil atau menangkap Pdf4meExceptionKemudian, kerjakan tabel di atas.
Penyelesaian Masalah
TimeoutException pada dokumen yang besar. Pekerjaan itu tetap ada meskipun sudah lama ditunggu, yang mana... MaxWait dan secara default diatur ke 5 menit, bukan TimeoutSampaikan hal itu dalam panggilan telepon dengan... maxWait: TimeSpan.FromMinutes(20)atau pada klien untuk setiap panggilan.
Sebuah OCR Panggilan tersebut tampaknya terputus selama sepuluh menit. Itulah batas bawah yang tercatat. ConvertOcrPdfAsync Dan ImageExtractTextAsync tunggu setidaknya DefaultOcrMaxWait, yang lamanya 10 menit, jadi berikan mereka waktu mereka sendiri. cancellationToken jika penelepon perlu mengakhiri panggilan lebih cepat.
Angka 401 di Pdf4meException.ResponseStatusCode. Kuncinya ada tetapi ditolak. Buat ulang kuncinya di... PDF4me dasbor dan pastikan variabel tersebut terlihat oleh proses. Pada Windows, set tidak berlaku di seluruh sesi, jadi gunakan setx dan membuka terminal baru.
ArgumentException sebelum ada yang masuk ke jaringan. Pemeriksaan lokal gagal, paling sering berupa dokumen kosong, yang berarti pembacaan file mengembalikan nol byte. Verifikasi jalur dan pastikan file tidak terkunci oleh proses lain.
Anda memberikan jalur file, tetapi tidak terjadi apa pun pada file tersebut. Argumen string diperlakukan sebagai referensi blob atau https URL, bukan jalur lokal. Baca file dan berikan byte-nya.
CreateThumbnailAsync tidak ditemukan. Nama metode 1.x tidak ada di versi 2.0. Gambar mini sekarang CreateImagesAsync dengan sebuah ImageActionLihat tabel migrasi.
Kesalahan kompilasi pada tipe model atau enum. Objek opsi dan model hasil ada di Pdf4me.Client.Generated.Models, sementara sebagian besar enum yang diambil oleh suatu tindakan berada di Pdf4me.ClientImpor keduanya.
Pertanyaan umum
Apakah PDF4me .NET SDK gratis?
Yang Pdf4me.Client paket ini gratis dan MIT Berlisensi, jadi tidak ada biaya untuk menginstal atau mendistribusikannya. Paket ini adalah klien untuk PDF4me API, yang merupakan layanan hosting dengan tingkatan gratis dan paket berbayar di atasnya, sehingga pemrosesan dokumen membutuhkan sumber daya. API kredit di akun Anda. Kode yang Anda tautkan tidak dikenakan biaya; pemrosesan dihitung berdasarkan penggunaan.
Apakah klien PDF4me .NET bersifat open source?
Ya. Klien tersebut dipublikasikan di bawah MIT Lisensi dan sumbernya ada di github.com/pdf4me/pdf4me-clientapi-dotnetSatu catatan penting jika Anda berencana untuk berkontribusi: src/Pdf4me.Client/Generated/ diproduksi oleh Kiota dari OpenAPI Deskripsi tersebut diganti seluruhnya pada setiap regenerasi, jadi buatlah issue untuk hal yang salah di dalam tree tersebut daripada menambalnya. File klien dan file bagian di sekitarnya ditulis secara manual dan merupakan tempat yang tepat untuk pull request.
Versi .NET mana yang didukung oleh Pdf4me.Client?
Versi 2.0.0 menargetkan .NET 8, .NET 9 dan .NET 10, ditambah .NET Standar 2.0, yang berarti juga berjalan pada .NET Framework 4.6.2 dan yang lebih baru. .NET Framework 4.5.2 dan 4.6.1 didukung oleh versi 1.x dan tidak didukung oleh versi 2.0.
Bagaimana cara mengkonversi HTML ke PDF di C#?
Panggilan ConvertHtmlToPdfAsync dengan HTML byte file, atau ConvertUrlToPdfAsync dengan URL string, dan tulis nilai yang dikembalikan. byte[] ke disk:
byte[] fromHtml = await client.ConvertHtmlToPdfAsync(File.ReadAllBytes("page.html"));
byte[] fromUrl = await client.ConvertUrlToPdfAsync("https://example.com");
File.WriteAllBytes("page.pdf", fromUrl);
Proses rendering terjadi di layanan, sehingga tidak ada mesin browser yang perlu diinstal, dikontainerisasi, atau ditambal, yang biasanya merupakan biaya yang harus dikeluarkan jika menggunakan pustaka lokal.
Bagaimana cara membaca PDF di C#?
Itu tergantung pada apa arti "membaca". GetPdfMetadataAsync mengembalikan DocMetadata dengan jumlah halaman dan PDF versi. ExtractTextByExpressionAsync, GetTextByPositionAsync Dan GetTextAndCoordinatesAsync Ambil teksnya, yang terakhir berisi posisi. ExtractTableFromPdfAsync menangani konten tabular, dan ConvertOcrPdfAsync membuat hasil pindaian PDF pertama-tama dapat dicari. Tindakan ini mengembalikan model bertipe, bukan sekadar byte[].
Bisakah saya membuat PDF di C# tanpa menggunakan library?
Anda bisa menulis PDF Format byte secara manual, dan untuk satu halaman teks biasa, ini adalah latihan yang wajar. Namun, hal itu segera berhenti menjadi wajar, karena font, pengkodean, kompresi, dan tabel referensi silang semuanya harus benar, dan pembaca berbeda-beda dalam seberapa banyak kesalahan format yang mereka toleransi. Dalam praktiknya, pilihannya adalah antara pustaka rendering lokal yang Anda kirimkan dan terus diperbarui, dan sebuah API klien seperti ini di mana rendering terjadi di sisi server. PDF spesifikasi dipublikasikan sebagai ISO 32000-2 jika Anda ingin melihat skalanya.