Extrahovat ohraničení v souboru PDF
tomto tutoriálu se naučíme, jak extrahovat ohraničení v souboru PDF pomocí Aspose.PDF pro .NET. Vysvětlíme si zdrojový kód v C# krok za krokem. Na konci tohoto tutoriálu budete vědět, jak extrahovat okraj z dokumentu PDF a uložit jej jako obrázek. Začněme!
Krok 1: Nastavení prostředí
Nejprve se ujistěte, že jste nastavili vývojové prostředí C# pomocí Aspose.PDF pro .NET. Přidejte odkaz do knihovny a importujte potřebné jmenné prostory.
Krok 2: Načtení dokumentu PDF
V tomto kroku načteme PDF dokument ze zadaného souboru.
Document doc = new Document(dataDir + "input.pdf");
Nezapomeňte nahradit “VÁŠ ADRESÁŘ DOKUMENTŮ” skutečným adresářem, kde se nachází váš soubor PDF.
Krok 3: Extrakce okrajů
Ohraničení extrahujeme z dokumentu PDF iterací přes operace obsažené v dokumentu.
Stack graphicsState = new Stack();
System.Drawing.Bitmap bitmap = new System.Drawing.Bitmap((int)doc.Pages[1].PageInfo.Width, (int)doc.Pages[1].PageInfo.Height);
System.Drawing.Drawing2D.GraphicsPath graphicsPath = new System.Drawing.Drawing2D.GraphicsPath();
System.Drawing.Drawing2D.Matrix lastCTM = new System.Drawing.Drawing2D.Matrix(1, 0, 0, -1, 0, 0);
System.Drawing.Drawing2D.Matrix inversionMatrix = new System.Drawing.Drawing2D.Matrix(1, 0, 0, -1, 0, (float)doc.Pages[1].PageInfo.Height);
System.Drawing.PointF lastPoint = new System.Drawing.PointF(0, 0);
System.Drawing.Color fillColor = System.Drawing.Color.FromArgb(0, 0, 0);
System.Drawing.Color strokeColor = System.Drawing.Color.FromArgb(0, 0, 0);
using (System.Drawing.Graphics gr = System.Drawing.Graphics.FromImage(bitmap))
{
// Zpracujte všechny operace s obsahem
foreach(Operator op in doc.Pages[1].Contents)
{
// Zkontrolujte typ operace
// ...
// Přidejte kód pro zpracování každé operace
}
}
Vytváříme agraphicsState
zásobník pro uložení grafických stavů, bitmapový obrázek pro zachycení extrahovaného okraje, aGraphicsPath
objekt pro ukládání cest výkresu a další proměnné pro sledování stavu a barev.
Krok 4: Zpracování transakce
tomto kroku zpracujeme každou operaci dokumentu, abychom extrahovali hranici.
// Zkontrolujte typ operace
if (opSaveState != null)
{
// Uložte předchozí stav a posuňte aktuální stav na vrchol zásobníku
graphicsState.Push(((System.Drawing.Drawing2D.Matrix)graphicsState.Peek()).Clone());
lastCTM = (System.Drawing.Drawing2D.Matrix)graphicsState.Peek();
}
else if (opRestoreState != null)
{
// Smazat aktuální stav a obnovit předchozí stav
graphicsState. Pop();
lastCTM = (System.Drawing.Drawing2D.Matrix)graphicsState.Peek();
}
else if (opCtm != null)
{
// Načtěte aktuální transformační matici
System.Drawing.Drawing2D.Matrix cm = new System.Drawing.Drawing2D.Matrix(
(float)opCtm.Matrix.A,
(float)opCtm.Matrix.B,
(float)opCtm.Matrix.C,
(float)opCtm.Matrix.D,
(float)opCtm.Matrix.E,
(float)opCtm.Matrix.F);
// Vynásobte aktuální matici stavovou maticí
((System.Drawing.Drawing2D.Matrix)graphicsState.Peek()).Multiply(cm);
lastCTM = (System.Drawing.Drawing2D.Matrix)graphicsState.Peek();
}
else if (opMoveTo != null)
{
// Aktualizujte poslední bod kreslení
lastPoint = new System.Drawing.PointF((float)opMoveTo.X, (float)opMoveTo.Y);
}
else if (opLineTo != null)
{
// Zpracujte kreslení čáry
// ...
// Přidejte kód pro zpracování čáry
}
// ...
// Přidejte bloky else if pro další operace
Zkontrolujeme typ operace pomocí podmínek a pro každou operaci spustíme příslušný kód.
Krok 5: Záložní obrázek
Nakonec bitmapový obrázek obsahující extrahovaný okraj uložíme do určeného souboru.
dataDir = dataDir + "ExtractBorder_out.png";
bitmap.Save(dataDir, ImageFormat.Png);
Nezapomeňte zadat správný adresář a název souboru pro uložení výstupního obrazu.
Příklad zdrojového kódu pro Extract Border pomocí Aspose.PDF pro .NET
// Cesta k adresáři dokumentů.
string dataDir = "YOUR DOCUMENT DIRECTORY";
Document doc = new Document(dataDir + "input.pdf");
Stack graphicsState = new Stack();
System.Drawing.Bitmap bitmap = new System.Drawing.Bitmap((int)doc.Pages[1].PageInfo.Width, (int)doc.Pages[1].PageInfo.Height);
System.Drawing.Drawing2D.GraphicsPath graphicsPath = new System.Drawing.Drawing2D.GraphicsPath();
// Výchozí hodnota matice ctm je 1,0,0,1,0,0
System.Drawing.Drawing2D.Matrix lastCTM = new System.Drawing.Drawing2D.Matrix(1, 0, 0, -1, 0, 0);
//System.Drawing souřadnicový systém je založen vlevo nahoře, zatímco pdf souřadný systém je založen vlevo dole, takže musíme použít inverzní matici
System.Drawing.Drawing2D.Matrix inversionMatrix = new System.Drawing.Drawing2D.Matrix(1, 0, 0, -1, 0, (float)doc.Pages[1].PageInfo.Height);
System.Drawing.PointF lastPoint = new System.Drawing.PointF(0, 0);
System.Drawing.Color fillColor = System.Drawing.Color.FromArgb(0, 0, 0);
System.Drawing.Color strokeColor = System.Drawing.Color.FromArgb(0, 0, 0);
using (System.Drawing.Graphics gr = System.Drawing.Graphics.FromImage(bitmap))
{
gr.SmoothingMode = SmoothingMode.HighQuality;
graphicsState.Push(new System.Drawing.Drawing2D.Matrix(1, 0, 0, 1, 0, 0));
// Zpracujte všechny příkazy obsahu
foreach (Operator op in doc.Pages[1].Contents)
{
Aspose.Pdf.Operators.GSave opSaveState = op as Aspose.Pdf.Operators.GSave;
Aspose.Pdf.Operators.GRestore opRestoreState = op as Aspose.Pdf.Operators.GRestore;
Aspose.Pdf.Operators.ConcatenateMatrix opCtm = op as Aspose.Pdf.Operators.ConcatenateMatrix;
Aspose.Pdf.Operators.MoveTo opMoveTo = op as Aspose.Pdf.Operators.MoveTo;
Aspose.Pdf.Operators.LineTo opLineTo = op as Aspose.Pdf.Operators.LineTo;
Aspose.Pdf.Operators.Re opRe = op as Aspose.Pdf.Operators.Re;
Aspose.Pdf.Operators.EndPath opEndPath = op as Aspose.Pdf.Operators.EndPath;
Aspose.Pdf.Operators.Stroke opStroke = op as Aspose.Pdf.Operators.Stroke;
Aspose.Pdf.Operators.Fill opFill = op as Aspose.Pdf.Operators.Fill;
Aspose.Pdf.Operators.EOFill opEOFill = op as Aspose.Pdf.Operators.EOFill;
Aspose.Pdf.Operators.SetRGBColor opRGBFillColor = op as Aspose.Pdf.Operators.SetRGBColor;
Aspose.Pdf.Operators.SetRGBColorStroke opRGBStrokeColor = op as Aspose.Pdf.Operators.SetRGBColorStroke;
if (opSaveState != null)
{
//Uložte předchozí stav a přesuňte aktuální stav na vrchol zásobníku
graphicsState.Push(((System.Drawing.Drawing2D.Matrix)graphicsState.Peek()).Clone());
lastCTM = (System.Drawing.Drawing2D.Matrix)graphicsState.Peek();
}
else if (opRestoreState != null)
{
// Zahodit současný stav a obnovit předchozí
graphicsState.Pop();
lastCTM = (System.Drawing.Drawing2D.Matrix)graphicsState.Peek();
}
else if (opCtm != null)
{
System.Drawing.Drawing2D.Matrix cm = new System.Drawing.Drawing2D.Matrix(
(float)opCtm.Matrix.A,
(float)opCtm.Matrix.B,
(float)opCtm.Matrix.C,
(float)opCtm.Matrix.D,
(float)opCtm.Matrix.E,
(float)opCtm.Matrix.F);
// Vynásobte aktuální matici stavovou maticí
((System.Drawing.Drawing2D.Matrix)graphicsState.Peek()).Multiply(cm);
lastCTM = (System.Drawing.Drawing2D.Matrix)graphicsState.Peek();
}
else if (opMoveTo != null)
{
lastPoint = new System.Drawing.PointF((float)opMoveTo.X, (float)opMoveTo.Y);
}
else if (opLineTo != null)
{
System.Drawing.PointF linePoint = new System.Drawing.PointF((float)opLineTo.X, (float)opLineTo.Y);
graphicsPath.AddLine(lastPoint, linePoint);
lastPoint = linePoint;
}
else if (opRe != null)
{
System.Drawing.RectangleF re = new System.Drawing.RectangleF((float)opRe.X, (float)opRe.Y, (float)opRe.Width, (float)opRe.Height);
graphicsPath.AddRectangle(re);
}
else if (opEndPath != null)
{
graphicsPath = new System.Drawing.Drawing2D.GraphicsPath();
}
else if (opRGBFillColor != null)
{
fillColor = opRGBFillColor.getColor();
}
else if (opRGBStrokeColor != null)
{
strokeColor = opRGBStrokeColor.getColor();
}
else if (opStroke != null)
{
graphicsPath.Transform(lastCTM);
graphicsPath.Transform(inversionMatrix);
gr.DrawPath(new System.Drawing.Pen(strokeColor), graphicsPath);
graphicsPath = new System.Drawing.Drawing2D.GraphicsPath();
}
else if (opFill != null)
{
graphicsPath.FillMode = FillMode.Winding;
graphicsPath.Transform(lastCTM);
graphicsPath.Transform(inversionMatrix);
gr.FillPath(new System.Drawing.SolidBrush(fillColor), graphicsPath);
graphicsPath = new System.Drawing.Drawing2D.GraphicsPath();
}
else if (opEOFill != null)
{
graphicsPath.FillMode = FillMode.Alternate;
graphicsPath.Transform(lastCTM);
graphicsPath.Transform(inversionMatrix);
gr.FillPath(new System.Drawing.SolidBrush(fillColor), graphicsPath);
graphicsPath = new System.Drawing.Drawing2D.GraphicsPath();
}
}
}
dataDir = dataDir + "ExtractBorder_out.png";
bitmap.Save(dataDir, ImageFormat.Png);
Console.WriteLine("\nBorder extracted successfully as image.\nFile saved at " + dataDir);
Závěr
V tomto tutoriálu jsme se naučili, jak extrahovat ohraničení z dokumentu PDF pomocí Aspose.PDF pro .NET. Pomocí tohoto podrobného průvodce můžete extrahovat ohraničení z jiných dokumentů PDF.
Časté dotazy k extrahování ohraničení v souboru PDF
Otázka: Jaký je účel extrahování ohraničení ze souboru PDF?
Odpověď: Extrahování ohraničení ze souboru PDF může být užitečné pro různé účely. Umožňuje izolovat a analyzovat strukturální prvky dokumentu, jako jsou tabulky, diagramy nebo grafické prvky. Extrahovaný okraj můžete použít k identifikaci rozvržení, rozměrů a umístění obsahu v dokumentu PDF.
Otázka: Mohu extrahovat ohraničení z konkrétních stránek nebo oblastí v dokumentu PDF?
Odpověď: Ano, můžete upravit poskytnutý zdrojový kód C# a extrahovat ohraničení z konkrétních stránek nebo oblastí v dokumentu PDF. Manipulací sdoc.Pages
shromažďování a specifikování vlastních kritérií, můžete si vybrat extrahování ohraničení z konkrétních stránek nebo oblastí zájmu.
Otázka: Jak mohu přizpůsobit formát a kvalitu výstupního obrázku?
Odpověď: V poskytnutém kódu C# je extrahovaný okraj uložen jako obrázek PNG. Pokud chcete změnit výstupní formát obrázku, můžete upravitImageFormat.Png
parametr vbitmap.Save
na jiné podporované formáty obrázků, jako je JPEG, BMP nebo GIF. Kromě toho můžete upravit nastavení kvality obrazu nebo komprese podle vašich požadavků.
Otázka: Jaké další operace mohu provést na extrahovaném okraji?
Odpověď: Jakmile vyjmete okraj jako obrázek, můžete jej dále zpracovat pomocí knihoven nebo algoritmů pro zpracování obrazu. Můžete analyzovat obraz, aplikovat obrazové filtry, detekovat vzory nebo provádět OCR (Optical Character Recognition), abyste v případě potřeby extrahovali text z obrazu.
Otázka: Existují nějaká omezení nebo úvahy při extrahování okrajů ze složitých dokumentů PDF?
Odpověď: Proces extrakce se může lišit v závislosti na složitosti dokumentu PDF. Složité soubory PDF s více vrstvami, průhledností nebo pokročilou grafikou mohou vyžadovat další zpracování nebo úpravy, aby bylo možné přesně extrahovat okraj. Pro zajištění spolehlivých výsledků je nezbytné důkladně otestovat proces extrakce na různých dokumentech PDF.