İçeriğe geç
getnextpdf.com

Pro sürüm

Karşılaştırma

NextPDF\Pro\Diff, iki PDF belgesini karşılaştırır ve neyin değiştiğini raporlar. Hızlı yol, sayfa hizalı bir metin farkı üretir; yapılandırılmış yol, görüntü ve meta veri değişikliği algılaması ekler ve sonucu JSON veya HTML olarak biçimlendirir.

Bu yetenek NextPDF Pro (nextpdf/pro) içinde sunulur ve bir Pro katmanı lisans zarfıyla etkinleşir. Bu yetkilendirmeye sahip olmayan bir dağıtım, yeteneğin sınıflarını yüklemez. Sürümleri karşılaştırın ve bir lisans edinin.

Hiçbir çalışma zamanı yetenek bayrağı Diff sınıflarını kapılamaz; Pro paketi yüklendiğinde her zaman mevcutturlar.

Terminal window
composer require nextpdf/pro:^3

PdfDiffer::compare(), her belgeden sayfa başına metni çıkarır, onu satırlara böler ve sayfa çifti başına bir Myers satır farkı çalıştırarak eklenen, kaldırılan ve değiştirilen bölgeleri üretir. Metin çıkarımı, ISO 32000-2:2020 §9.4 metin gösterme operatörlerini (Tj, TJ, ') ayrıştırır.

StructuredDiffer, bunun üzerine kurulur: metin bölgelerini paragraf düzeyinde değişiklikler hâlinde gruplar, gömülü görüntüleri karşılaştırır, meta veriyi karşılaştırır ve bütünleşik bir özetle birlikte bir StructuredDiffResult üretir. DiffFormatter, bu sonucu bir JSON dizesine veya bir HTML rapor parçasına serileştirir.

İsteğe bağlı Artisan PDF okuyucusu yüklü olduğunda, metin çıkarımı sayfa düzeyinde doğru içerik için onu kullanır; aksi hâlde, sınırlı bir bayt düzeyinde geri dönüş, içerik akışlarını doğrudan tarar.

Fark alıcı, işlenmiş pikselleri değil, çıkarılan metni ve yapıyı karşılaştırır. Yapısal bir karşılaştırma belirlenimci ve ucuzdur ve bir incelemecinin önemsediği editoryal değişikliklerle eşleşir. Bir piksel farkı ise kenar yumuşatma ve yazı tipi ipucu gürültüsünü içerik olarak işaretlerdi. Bir PDF, okumaya hazır karakterleri değil, glifleri ve konumlandırmayı depoladığından, her karşılaştırma önce içerik akışından metni yeniden oluşturur. Bu çıkarım adımı, Artisan okuyucusunun doğruluğu neden keskinleştirdiğini, sınırlı FlateDecode geri dönüşünün kapsamı neden güvenlik için takas ettiğini ve taranmış sayfaların neden pek fark üretmediğini açıklar. Sayfa hizalaması, öngörülebilirlik için dizin tabanlı kalır; böylece eklenen bir sayfa, net bir aşağı akış kayması olarak okunur.

Tasarım arka planı: Bir PDF’teki metin neden gerçekten metin değildir.

  • Girdi. Kaynak ve hedef için ham PDF baytları. %PDF ile başlamayan bir arabellek, InvalidArgumentException oluşturur.
  • Çıktı (hızlı yol). added, removed, modified bölge listeleriyle birlikte isIdentical(), hasDifferences(), totalChanges() içeren bir DiffResult.
  • Çıktı (yapılandırılmış yol). Paragraf farkları, görüntü farkları, meta veri değişiklikleri ve bir DiffSummary içeren bir StructuredDiffResult.
  • Rapor çıktısı. DiffFormatter, bir JSON dizesi veya bir HTML parçası yayar. Görsel, yan yana bir kırmızı çizgili PDF üretmez.
  • Kaynak sınırları. Açma bombalarına karşı korumak için açılmış içerik akışı boyutu sınırlandırılır; bayt düzeyindeki tarayıcı, hazırlanmış girdide felaket düzeyinde regex geri izlemesinden kaçınır.
  • Belirlenimcilik. Aynı girdiler için fark bölgeleri ve biçimlendirilmiş çıktı kararlıdır.
TürÇeşitTemel üyeler
NextPDF\Pro\Diff\PdfDifferfinal classstatic compare(string $sourcePdf, string $targetPdf): DiffResult, static compareTexts(array $sourcePages, array $targetPages): DiffResult, static extractText(string $contentStream): string
NextPDF\Pro\Diff\StructuredDifferfinal class__construct(?ImageDiffer $imageDiffer = null, ?MetadataDiffer $metadataDiffer = null), compare(string $sourcePdf, string $targetPdf): StructuredDiffResult
NextPDF\Pro\Diff\DiffFormatterfinal classtoJson(StructuredDiffResult $result): string, toHtml(StructuredDiffResult $result): string
NextPDF\Pro\Diff\DiffResultfinal readonly classarray $added, array $removed, array $modified, isIdentical(): bool, hasDifferences(): bool, totalChanges(): int
NextPDF\Pro\Diff\StructuredDiffResultfinal readonly classmetin farkı, paragraflar, görüntüler, meta veri değişiklikleri, özet
NextPDF\Pro\Diff\DiffTypeenumAdded, Removed, Modified, Unchanged
<?php
declare(strict_types=1);
use NextPDF\Pro\Diff\PdfDiffer;
$diff = PdfDiffer::compare(
file_get_contents('v1.pdf'),
file_get_contents('v2.pdf'),
);
if ($diff->hasDifferences()) {
echo $diff->totalChanges(), " text changes detected\n";
}
<?php
declare(strict_types=1);
use NextPDF\Pro\Diff\DiffFormatter;
use NextPDF\Pro\Diff\StructuredDiffer;
function reviewReport(string $oldPdf, string $newPdf): string
{
$result = (new StructuredDiffer())->compare($oldPdf, $newPdf);
// JSON for machine consumption; toHtml() for a review UI fragment.
return (new DiffFormatter())->toJson($result);
}
  • Fark, dizine göre sayfa hizalıdır. Erken bir sayfa eklemek tüm sonraki sayfaları kaydırır ve büyük aşağı akış değişiklikleri raporlar — bu, dizine hizalı bir karşılaştırma için beklenen durumdur.
  • Görüntü karşılaştırması, eklenen, kaldırılan ve değiştirilen gömülü görüntüleri algılar; algısal bir görsel fark değildir ve sayfaları piksel düzeyinde işlemez.
  • Taranmış, yalnızca görüntü içeren PDF’ler, hiçbir OCR yapılmadığı için pek az veya hiç metin farkı üretmez.
  • İsteğe bağlı Artisan okuyucusu olmadan çıkarım, sınırlı geri dönüşü kullanır; yoğun sıkıştırılmış belgeler azaltılmış metin kapsamı verebilir.

Metin çıkarımı, belge baytlarında doğrusaldır; Myers farkı, benzer belgeler için neredeyse doğrusaldır ve en kötü durumda sayfa çifti başına ikinci derecedendir. Açma üst sınırı belleği sınırlar. Bkz. performance_budget.

Bayt düzeyindeki geri dönüş, hazırlanmış PDF’lerde felaket düzeyinde geri izlemeden kaçınmak için sınırsız regex yerine strpos tabanlı tarama kullanır ve açma çıktısını sınırlar. Fark alma, gömülü betikleri yürütmez. Core güvenlik modeline bakın.

İddiaStandart maddesiDurum
Çıkarım için Tj metin operatörü ayrıştırıldıISO 32000-2:2020 §9.4Doğrulandı (birim paketi)
Çıkarım için TJ dizi metin operatörü ayrıştırıldıISO 32000-2:2020 §9.4Doğrulandı (birim paketi)
Görsel yan yana kırmızı çizgili PDF çıktısıDesteklenmiyor (yalnızca JSON/HTML)

Belge karşılaştırması için hiçbir Core eşdeğeri yoktur. İsteğe bağlı Artisan okuyucusu, yüklendiğinde çıkarım doğruluğunu artırır ancak gerekli değildir.

Bu, bir içerik değişikliği algılayıcısıdır. Adli bir fark çözümleyicisi değildir ve delil niteliğinde veya kurcalama ataması raporları üretmez; bu konular bu modülün kapsamı dışındadır.

Bu sayfa yalnızca dışarıdan gözlemlenebilen davranışı ve desteklenen genel API yüzeyini açıklar. İç ad alanı yolları, yardımcı sınıflar, mekanizma tabloları, çalışma kılavuzu dosya adları ve bilet önekleri kapsam dışındadır.