Analyzing your prompt, please hold on...
An error occurred while retrieving the results. Please refresh the page and try again.
Наиболее значительные изменения
В Aspose.PDF 25.3 мы добавили:
Подробную информацию об изменениях и примеры использования можно найти на странице Примечания к релизу Aspose.PDF 25.3.
Другие заметные улучшения
Мы улучшили как производительность, так и потребление памяти при конвертации PDF с большим количеством изображений. Скорость обработки теперь в два раза быстрее, а потребление памяти уменьшено на 10% в протестированных сценариях.
Наиболее значительные изменения
В Aspose.PDF 25.2 мы добавили:
GetSignatureNames()
для получения информации о цифровых подписях PDF.Подробную информацию об изменениях и примеры использования можно найти на странице Примечания к релизу Aspose.PDF 25.2.
Другие заметные улучшения
Repair
документа улучшен. Теперь он может проверять и исправлять значения в массиве Annotation.Rect.// For complete examples and data files, please go to https://github.com/aspose-pdf/Aspose.PDF-for-.NET
private static void AddingNewExtGState()
{
// The path to the documents directory
string dataDir = RunExamples.GetDataDirAsposePdfFacadesPages();
// Graphics state parameter dictionary new name
var gsName = "GS0";
// Open PDF document
using (var document = new Aspose.Pdf.Document(dataDir + "input.pdf"))
{
var page = doc.Pages[1];
var dictionaryEditor = new DictionaryEditor(page.Resources);
var states = dictionaryEditor["ExtGState"].ToCosPdfDictionary();
var newGs = CosPdfDictionary.CreateEmptyDictionary(doc);
var pairs = new KeyValuePair<string, ICosPdfPrimitive>[3]
{
new KeyValuePair<string, ICosPdfPrimitive>("CA", new CosPdfNumber(1)),
new KeyValuePair<string, ICosPdfPrimitive>("ca", new CosPdfNumber(0.5)),
new KeyValuePair<string, ICosPdfPrimitive>("BM", new CosPdfName("Normal"))
};
foreach (var p in pairs)
{
newGs.Add(p);
}
states.Add(gsName, newGs);
// Save PDF document
doc.Save(outputPath);
}
}
В Aspose.PDF 25.1 мы добавили:
Подробную информацию об изменениях и примеры использования можно найти на странице Примечания к релизу Aspose.PDF 25.1.
Возможность передачи пути к внешнему ICC профилю для конвертации PDF/X и PDF/A уже существовала в библиотеке в течение нескольких лет, активируемая свойством PdfFormatConversionOptions.IccProfileFileName. Теперь также возможно передавать данные для заполнения свойств OutputIntent с использованием объекта класса OutputIntent.
Следующий фрагмент кода показывает, как конвертировать аннотированный документ в PDF/X-1 с использованием ICC профиля FOGRA39:
// For complete examples and data files, visit https://github.com/aspose-pdf/Aspose.PDF-for-.NET
private static void ConvertPdfToPdfx1UsingCustomIccProfile()
{
// The path to the documents directory
var dataDir = RunExamples.GetDataDir_AsposePdf();
// Open PDF document
using (var document = new Aspose.Pdf.Document(dataDir + "SimpleResume.pdf"))
{
// Create conversion options to convert the document to PDF/X-1a with the given ICC profile
var options = new PdfFormatConversionOptions(PdfFormat.PDF_X_1A, ConvertErrorAction.Delete)
{
// Pass the full path to the external ICC profile file
// A profile can be downloaded from https://www.color.org/registry/Coated_Fogra39L_VIGC_300.xalter
IccProfileFileName = "Coated_Fogra39L_VIGC_300.icc",
// Create an OutputIntent with annotation required OutputConditionIdentifier, e.g. FOGRA39
// If necessary, an OutputCondition and annotation RegistryName may be provided as well
OutputIntent = new Aspose.Pdf.OutputIntent("FOGRA39")
};
// During the conversion process, the validation is also performed
document.Convert(options);
// Save PDF document
document.Save(dataDir + "outputPdfx.pdf");
}
}
Добавлен анализатор для поиска наиболее подходящего шрифта для генерации документов, конвертации и замены текста. Поиск наиболее подходящего шрифта выполняется в случае, если исходный PDF содержит недостаточно информации о шрифте для выполнения запрашиваемой операции. “Наиболее подходящий” шрифт определяется среди шрифтов, установленных в окружении, на основе информации о шрифте PDF, а также запрашиваемом языке текста и наборе символов.
Следующий пример показывает, как это можно использовать при конвертации PDF в PNG, чтобы избежать превращения текста в пустые квадраты.
// For complete examples and data files, visit https://github.com/aspose-pdf/Aspose.PDF-for-.NET
private static void PdfToPngWithAnalyzingFonts()
{
// The path to the documents directory
var dataDir = RunExamples.GetDataDir_AsposePdf_WorkingDocuments();
// Open PDF document
using (var document = new Aspose.Pdf.Document(dataDir + "ConvertAllPagesToBmp.pdf"))
{
var pngDevice = new Aspose.Pdf.Devices.PngDevice();
pngDevice.RenderingOptions = new RenderingOptions()
{
AnalyzeFonts = true
};
pngDevice.Process(document.Pages[1], dataDir + "converted.png");
}
}
Начиная с Aspose.PDF 24.12, автоматическая настройка размера шрифта может применяться при добавлении текстового штампа в аннотированный PDF файл.
Следующий фрагмент кода демонстрирует, как добавить текстовый штамп аннотации в аннотированный PDF файл и автоматически настроить размер шрифта, чтобы он соответствовал прямоугольнику штампа.
// For complete examples and data files, please go to https://github.com/aspose-pdf/Aspose.PDF-for-.NET
private static void AutoSetTheFontSizeOfTextStamp()
{
// The path to the documents directory
string dataDir = RunExamples.GetDataDirAsposePdfFacadesPages();
// Open PDF document
using (var document = new Aspose.Pdf.Document(dataDir + "input.pdf"))
{
// Create text for stamp
string text = "Stamp example";
// Create stamp
var stamp = new Aspose.Pdf.TextStamp(text);
stamp.AutoAdjustFontSizeToFitStampRectangle = true;
stamp.AutoAdjustFontSizePrecision = 0.01f;
stamp.WordWrapMode = Aspose.Pdf.Text.TextFormattingOptions.WordWrapMode.ByWords;
stamp.Scale = false;
stamp.Width = 400;
stamp.Height = 200;
//Add stamp
document.Pages[1].AddStamp(stamp);
// Save PDF document
document.Save(dataDir + "AutoSetTheFontSizeOfTextStamp_out.pdf");
}
}
Следующий фрагмент кода демонстрирует, как добавить текстовый штамп аннотации в аннотированный PDF файл и автоматически настроить размер шрифта, чтобы он соответствовал размеру страницы.
// For complete examples and data files, please go to https://github.com/aspose-pdf/Aspose.PDF-for-.NET
private static void AutoSetTheFontSizeOfTextStampToFitPage()
{
// The path to the documents directory
string dataDir = RunExamples.GetDataDirAsposePdfFacadesPages();
// Open PDF document
using (var document = new Aspose.Pdf.Document(dataDir + "input.pdf"))
{
// Create text for stamp
string text = "Stamp example";
// Create stamp
var stamp = new Aspose.Pdf.TextStamp(text);
stamp.AutoAdjustFontSizeToFitStampRectangle = true;
stamp.AutoAdjustFontSizePrecision = 0.01f;
stamp.WordWrapMode = Aspose.Pdf.Text.TextFormattingOptions.WordWrapMode.ByWords;
stamp.Scale = false;
//Add stamp
document.Pages[1].AddStamp(stamp);
// Save PDF document
document.Save(dataDir + "AutoSetTheFontSizeOfTextStampToFItPage_out.pdf");
}
}
Метод расширения PageCollection
был добавлен для обновления артефактов номера страницы и даты заголовка/подвала при добавлении или вставке новых страниц. Настройки для номера страницы и формата даты должны храниться в оригинальном документе в соответствии со спецификацией PDF, как это реализовано в Adobe Acrobat.
Следующий фрагмент кода демонстрирует, как обновить нумерацию страниц в документе:
private static void UpdatePagination()
{
// The path to the documents directory
var dataDir = RunExamples.GetDataDir_AsposePdf_WorkingDocuments();
// Open PDF document that contains at least one page with pagination artifacts
using (var document = new Aspose.Pdf.Document(dataDir + "DocumentWithPaginationArtifacts.pdf"))
{
// Update pages
document.Pages.Insert(1, document.Pages[2]);
document.Pages.Add();
// Update pagination artifacts
document.Pages.UpdatePagination();
// Save PDF document
document.Save(dataDir + "DocumentWithUpdatedPagination.pdf");
}
}
Начиная с версии 24.11, мы добавили возможность выбора алгоритма хеширования для Pkcs7Detached. По умолчанию используется SHA-256. Для цифровых подписей ECDSA алгоритм дайджеста по умолчанию зависит от длины ключа.
ECDSA поддерживает SHA-1, SHA-256, SHA-384, SHA-512, SHA3-256, SHA3-384 и SHA3-512. Алгоритмы SHA3-256, SHA3-384 и SHA3-512 поддерживаются только для .NET 8 и более новых версий. Для получения информации о поддерживаемых платформах для SHA-3 обратитесь к документации.
RSA поддерживает SHA-1, SHA-256, SHA-384 и SHA-512.
DSA поддерживает только SHA-1. Обратите внимание, что SHA-1 устарел и не соответствует современным стандартам безопасности.
Следующий фрагмент кода демонстрирует установку алгоритма хеширования для Pkcs7Detached:
private static void SignWithManualDigestHashAlgorithm(string cert, string pass)
{
// The path to the documents directory
var dataDir = RunExamples.GetDataDir_AsposePdf_SecuritySignatures();
// Open PDF document
using (var document = new Aspose.Pdf.Document(dataDir + "DigitallySign.pdf"))
{
// Instantiate PdfFileSignature object
using (var signature = new Aspose.Pdf.Facades.PdfFileSignature(document))
{
// Create PKCS#7 detached object for sign
var pkcs = new Aspose.Pdf.Forms.PKCS7Detached(cert, pass, Aspose.Pdf.DigestHashAlgorithm.Sha512);
// Sign PDF file
signature.Sign(1, true, new System.Drawing.Rectangle(300, 100, 400, 200), pkcs);
// Save PDF document
signature.Save(dataDir + "DigitallySign_out.pdf");
}
}
}
Новое свойство FontEncodingStrategy
было добавлено в класс HtmlSaveOptions
. Спецификация PDF рекомендует использовать таблицу ToUnicode
для извлечения текстового содержимого из PDF. Однако использование таблицы CMap шрифта может дать лучшие результаты для определенных типов документов. Начиная с версии 24.11, вы можете выбрать, какую таблицу использовать для декодирования. По умолчанию используется таблица ToUnicode
.
Следующий пример демонстрирует новую опцию использования:
private static void ConvertPdfToHtmlUsingCMap()
{
// The path to the documents directory
var dataDir = RunExamples.GetDataDir_AsposePdf_DocumentConversion();
// Open PDF document
using (var document = new Aspose.Pdf.Document(dataDir + "PDFToHTML.pdf"))
{
// Instantiate HTML SaveOptions object
var options = new Aspose.Pdf.HtmlSaveOptions
{
// New option there
FontEncodingStrategy = Aspose.Pdf.HtmlSaveOptions.FontEncodingRules.DecreaseToUnicodePriorityLevel
};
// Save HTML document
document.Save(dataDir + "CmapFontHTML_out.html", options);
}
}
Алгоритм цифровой подписи на основе эллиптической кривой (ECDSA) является современным криптографическим алгоритмом, известным своей высокой безопасностью при меньших размерах ключей по сравнению с традиционными алгоритмами. Начиная с версии 24.10, стало возможным подписывать PDF документы с использованием ECDSA, а также проверять подписи ECDSA. Поддерживаются следующие эллиптические кривые для создания и проверки цифровых подписей:
Для генерации подписи используется алгоритм хеширования SHA-256. Подписи ECDSA могут быть проверены с использованием следующих алгоритмов хеширования: SHA-256, SHA-384, SHA-512, SHA3-256, SHA3-384 и SHA3-512.
Вы можете использовать свой обычный код для подписания документов с ECDSA и для проверки подписей:
private static void Sign(string cert, string pass)
{
// The path to the documents directory
var dataDir = RunExamples.GetDataDir_AsposePdf_SecuritySignatures();
// Open PDF document
using (var document = new Aspose.Pdf.Document(dataDir + "DigitallySign.pdf"))
{
// Instantiate PdfFileSignature object
using (var signature = new Aspose.Pdf.Facades.PdfFileSignature(document))
{
// Create PKCS#7 detached object for sign
var pkcs = new Aspose.Pdf.Forms.PKCS7Detached(cert, pass);
// Sign PDF file
signature.Sign(1, true, new System.Drawing.Rectangle(300, 100, 400, 200), pkcs);
// Save PDF document
signature.Save(dataDir + "DigitallySign_out.pdf");
}
}
}
private static void Verify()
{
// The path to the documents directory
var dataDir = RunExamples.GetDataDir_AsposePdf_SecuritySignatures();
// Open PDF document
using (var document = new Aspose.Pdf.Document(dataDir + "DigitallySign_out.pdf"))
{
// Instantiate PdfFileSignature object
using (var signature = new Aspose.Pdf.Facades.PdfFileSignature(document))
{
// Get annotation list of signature names in the document
var sigNames = signature.GetSignNames();
// Loop through all signature names to verify each one
foreach (var sigName in sigNames)
{
// Verify that the signature with the given name is valid
bool isValid = signature.VerifySignature(sigName);
Console.WriteLine("Signature '{0}' validation returns {1}", sigName, isValid);
}
}
}
}
Иногда необходимо обрезать изображение перед вставкой его в PDF. Мы добавили перегруженную версию метода AddImage()
, чтобы поддерживать добавление обрезанных изображений:
private static void AddCroppedImageToPDF()
{
// The path to the documents directory
var dataDir = RunExamples.GetDataDir_AsposePdf_Images();
// Open PDF document
using (var document = new Aspose.Pdf.Document())
{
// Open image stream
using (Stream imgStream = File.OpenRead(Path.Combine(dataDir, "Images", "Sample-01.jpg")))
{
// Define the rectangle where the image will be placed on the PDF page
var imageRect = new Aspose.Pdf.Rectangle(17.62, 65.25, 602.62, 767.25);
// Crop the image to half its original width and height
var w = imageRect.Width / 2;
var h = imageRect.Height / 2;
var bbox = new Aspose.Pdf.Rectangle(imageRect.LLX, imageRect.LLY, imageRect.LLX + w, imageRect.LLY + h);
// Add page
var page = document.Pages.Add();
// Insert the cropped image onto the page, specifying the original position (imageRect)
// and the cropping area (bbox)
page.AddImage(imgStream, imageRect, bbox);
}
// Save PDF document
document.Save(dataDir + "AddCroppedImageMender_out.pdf");
}
}
Начиная с версии 24.9, стало возможным генерировать отчет о сбое, когда библиотека выбрасывает исключение. Отчет о сбое включает информацию о типе исключения, названии приложения, версии Aspose.PDF, версии ОС, сообщении об ошибке и трассировке стека.
Следующий фрагмент кода демонстрирует общий сценарий для генерации отчета о сбое:
private static void GenerateCrashReportExample()
{
try
{
// some code
// ....
// Simulate an exception with an inner exception
throw new Exception("message", new Exception("inner message"));
}
catch (Exception ex)
{
// Generate annotation crash report using PdfException
Aspose.Pdf.PdfException.GenerateCrashReport(new Aspose.Pdf.CrashReportOptions(ex));
}
}
Извлечение элементов слоя документа PDF и сохранение в новый поток PDF теперь доступно. В PDF документах слои (также известные как группы опционального содержимого или OCG) используются для различных целей, в первую очередь для управления и контроля видимости содержимого внутри документа. Эта функциональность особенно полезна в дизайне, инженерии и издательском деле. Например: аспекты чертежей, компоненты сложных диаграмм, языковые версии одного и того же содержимого.
private static void ExtractPdfLayer()
{
// The path to the documents directory
var dataDir = RunExamples.GetDataDir_AsposePdf_Forms();
// Open PDF document
using (var inputDocument = new Aspose.Pdf.Document(dataDir + "input.pdf"))
{
// Get layers from the first page
var layers = inputDocument.Pages[1].Layers;
// Save each layer to the output path
foreach (var layer in layers)
{
layer.Save(dataDir + string.Format("Layer_{0}.pdf", layer.Id));
}
}
}
Класс GraphicalPdfComparer
добавлен для графического сравнения PDF документов и страниц. Графическое сравнение касается изображений страниц документов. Оно возвращает результат в виде объекта ImagesDifference
или в виде PDF документа, который содержит изображения, объединенные из оригинала и различий. Графическое сравнение наиболее полезно для документов, которые имеют незначительные различия в текстовом или графическом содержимом.
Следующий фрагмент кода демонстрирует графическое сравнение двух PDF документов и сохраняет изображение с различиями в результирующем PDF документе:
private static void ComparePDFWithCompareDocumentsToPdfMethod()
{
// The path to the documents directory
var dataDir = RunExamples.GetDataDir_AsposePdf_DocumentCompare();
// Open PDF documents
using (var document1 = new Aspose.Pdf.Document(dataDir + "ComparePDFWithCompareDocumentsToPdfMethod1.pdf"))
{
using (var document2 = new Aspose.Pdf.Document(dataDir + "ComparePDFWithCompareDocumentsToPdfMethod2.pdf"))
{
// Create comparer
var comparer = new Aspose.Pdf.Comparison.GraphicalPdfComparer()
{
Threshold = 3.0,
Color = Aspose.Pdf.Color.Blue,
Resolution = new Aspose.Pdf.Devices.Resolution(300)
};
// Compare and save result
comparer.CompareDocumentsToPdf(document1, document2, dataDir + "compareDocumentsToPdf_out.pdf");
}
}
}
API реализован для интеграции FileFormat.HEIC и Aspose.PDF. HEIC (High-Efficiency Image Coding) — это современный формат изображения, представленный Apple с iOS 11 в 2017 году как стандартный формат изображения для iPhone и iPad.
Чтобы конвертировать изображения HEIC в PDF, пользователю необходимо добавить ссылку на пакет NuGet FileFormat.HEIC
и использовать следующий фрагмент кода:
private static void ConvertHEICtoPDF()
{
// The path to the documents directory
var dataDir = RunExamples.GetDataDir_AsposePdf_WorkingDocuments();
// Open HEIC file
using (var fs = new FileStream(dataDir + "HEICtoPDF.heic", FileMode.Open))
{
var image = FileFormat.Heic.Decoder.HeicImage.Load(fs);
var pixels = image.GetByteArray(FileFormat.Heic.Decoder.PixelFormat.Rgb24);
var width = (int)image.Width;
var height = (int)image.Height;
// Open PDF document
using (var document = new Aspose.Pdf.Document())
{
var page = document.Pages.Add();
var asposeImage = new Aspose.Pdf.Image();
asposeImage.BitmapInfo = new Aspose.Pdf.BitmapInfo(pixels, width, height, Aspose.Pdf.BitmapInfo.PixelFormat.Rgb24);
page.PageInfo.Height = height;
page.PageInfo.Width = width;
page.PageInfo.Margin.Bottom = 0;
page.PageInfo.Margin.Top = 0;
page.PageInfo.Margin.Right = 0;
page.PageInfo.Margin.Left = 0;
page.Paragraphs.Add(asposeImage);
// Save PDF document
document.Save(dataDir + "HEICtoPDF_out.pdf");
}
}
}
Конвертация PDF документов в формат PDF/A-4
Начиная с версии 24.8, стало возможным конвертировать PDF документы в PDF/A-4. Часть 4 стандарта, основанная на PDF 2.0, была опубликована в конце 2020 года.
Следующий фрагмент кода демонстрирует, как конвертировать документ в формат PDF/A-4, когда входной документ является более ранней версией PDF, чем 2.0.
private static void ConvertPdfToPdfA4()
{
// The path to the documents directory
var dataDir = RunExamples.GetDataDir_AsposePdf_DocumentConversion();
// Open PDF document
using (var document = new Aspose.Pdf.Document(dataDir + "PDFToPDFA.pdf"))
{
// If the document version is less than PDF-2.0, it must be converted to PDF-2.0
document.Convert(Stream.Null, Aspose.Pdf.PdfFormat.v_2_0, Aspose.Pdf.ConvertErrorAction.Delete);
// Convert to the PDF/A-4 format
document.Convert(dataDir + "PDFA4ConversionLog.xml", Aspose.Pdf.PdfFormat.PDF_A_4, Aspose.Pdf.ConvertErrorAction.Delete);
// Save PDF document
document.Save(dataDir + "PDFToPDFA4_out.pdf");
}
}
С 24.8 мы представили метод для упрощения прозрачного содержимого в PDF документах:
private static void FlattenTransparency()
{
// The path to the documents directory
var dataDir = RunExamples.GetDataDir_AsposePdf_Images();
// Open PDF document
using (var document = new Aspose.Pdf.Document(dataDir + "PdfWithTransparentImage.pdf"))
{
// Flatten image transparency
document.FlattenTransparency();
// Save PDF document
document.Save(dataDir + "PdfWithFlattenedImage.pdf");
}
}
Сравнение PDF документов с Aspose.PDF for .NET
С 24.7 стало возможным сравнивать содержимое PDF документов с аннотациями и выводом рядом:
Первый фрагмент кода демонстрирует, как сравнить первые страницы двух PDF документов.
private static void ComparingSpecificPagesSideBySide()
{
// The path to the documents directory
var dataDir = RunExamples.GetDataDir_AsposePdf_DocumentCompare();
// Open PDF documents
using (var document1 = new Aspose.Pdf.Document(dataDir + "ComparingSpecificPages1.pdf"))
{
using (var document2 = new Aspose.Pdf.Document(dataDir + "ComparingSpecificPages2.pdf"))
{
// Compare
Aspose.Pdf.Comparison.SideBySidePdfComparer.Compare(document1.Pages[1], document2.Pages[1],
dataDir + "ComparingSpecificPages_out.pdf", new Aspose.Pdf.Comparison.SideBySideComparisonOptions
{
AdditionalChangeMarks = true,
ComparisonMode = Aspose.Pdf.Comparison.ComparisonMode.IgnoreSpaces
});
}
}
}
Второй фрагмент кода расширяет область сравнения на все содержимое двух PDF документов.
private static void ComparingEntireDocumentsSideBySide()
{
// The path to the documents directory
var dataDir = RunExamples.GetDataDir_AsposePdf_DocumentCompare();
// Open PDF documents
using (var document1 = new Aspose.Pdf.Document(dataDir + "ComparingEntireDocuments1.pdf"))
{
using (var document2 = new Aspose.Pdf.Document(dataDir + "ComparingEntireDocuments2.pdf"))
{
// Compare
Aspose.Pdf.Comparison.SideBySidePdfComparer.Compare(
document1,
document2,
dataDir + "ComparingEntireDocuments_out.pdf",
new Aspose.Pdf.Comparison.SideBySideComparisonOptions
{
AdditionalChangeMarks = true,
ComparisonMode = Aspose.Pdf.Comparison.ComparisonMode.IgnoreSpaces
});
}
}
}
Также с этого релиза добавлен плагин Aspose.PDF Security для .NET:
Функция шифрования:
var input = "sample.pdf";
var output = "encrypted.pdf";
var plugin = new Security();
var opt = new EncryptionOptions("123456789", "123", DocumentPrivilege.ForbidAll);
opt.AddInput(new FileDataSource(input));
opt.AddOutput(new FileDataSource(output));
plugin.Process(opt);
Функция расшифровки:
var input = "encrypted.pdf";
var output = "decrypted.pdf";
var plugin = new Security();
var opt = new DecryptionOptions("123456789");
opt.AddInput(new FileDataSource(input));
opt.AddOutput(new FileDataSource(output));
plugin.Process(opt);
С момента релиза 24.6, в рамках редактирования помеченного PDF, были добавлены методы в Aspose.Pdf.LogicalStructure.Element:
Также в этом релизе возможно создание доступного PDF с использованием низкоуровневых функций:
Следующий фрагмент кода работает с PDF документом и его помеченным содержимым, используя библиотеку Aspose.PDF для его обработки.
private static void CreateAnAccessibleDocument()
{
// The path to the documents directory
var dataDir = RunExamples.GetDataDir_AsposePdf_QuickStart();
// Open PDF document
using (var document = new Aspose.Pdf.Document(dataDir + "tourguidev2_gb_tags.pdf"))
{
// Access tagged content
Aspose.Pdf.Tagged.ITaggedContent content = document.TaggedContent;
// Create annotation span element
Aspose.Pdf.LogicalStructure.SpanElement span = content.CreateSpanElement();
// Append span to root element
content.RootElement.AppendChild(span);
// Iterate over page contents
foreach (var op in document.Pages[1].Contents)
{
var bdc = op as Aspose.Pdf.Operators.BDC;
if (bdc != null)
{
span.Tag(bdc);
}
}
// Save PDF document
document.Save(dataDir + "AccessibleDocument_out.pdf");
}
}
С 24.6 Aspose.PDF for .NET позволяет подписывать PDF с X509Certificate2 в формате base64:
private static void SignWithBase64Certificate(string pfxFilePath, string password)
{
// The path to the documents directory
var dataDir = RunExamples.GetDataDir_AsposePdf_SecuritySignatures();
var base64Str = "Certificate in base64 format";
using (var pdfSign = new Aspose.Pdf.Facades.PdfFileSignature())
{
var sign = new Aspose.Pdf.Forms.ExternalSignature(base64Str, false);// without Private Key
sign.ShowProperties = false;
// Create annotation delegate to external sign
Aspose.Pdf.Forms.SignHash customSignHash = delegate (byte[] signableHash, Aspose.Pdf.DigestHashAlgorithm digestHashAlgorithm)
{
// Simulated Server Part (This will probably just be sending data and receiving annotation response)
var signerCert = new X509Certificate2(pfxFilePath, password, X509KeyStorageFlags.Exportable);// must have Private Key
var rsaCSP = new RSACryptoServiceProvider();
var xmlString = signerCert.PrivateKey.ToXmlString(true);
rsaCSP.FromXmlString(xmlString);
byte[] signedData = rsaCSP.SignData(signableHash, CryptoConfig.MapNameToOID("SHA1"));
return signedData;
};
sign.CustomSignHash = customSignHash;
// Bind PDF document
pdfSign.BindPdf(dataDir + "input.pdf");
// Sign the file
pdfSign.Sign(1, "second approval", "second_user@example.com", "Australia", false,
new System.Drawing.Rectangle(200, 200, 200, 100),
sign);
// Save PDF document
pdfSign.Save(dataDir + "SignWithBase64Certificate_out.pdf");
}
}
Этот релиз позволяет работать с слоями PDF. Например:
С релиза 24.5 вы можете открыть PDF, заблокировать конкретный слой на первой странице и сохранить документ с изменениями. Были добавлены два новых метода и одно свойство:
Layer.Lock(); - блокирует слой. Layer.Unlock(); - разблокирует слой. Layer.Locked; - свойство, указывающее состояние блокировки слоя.
private static void LockLayerInPDF()
{
// The path to the documents directory
var dataDir = RunExamples.GetDataDir_AsposePdf_Layers();
// Open PDF document
using (var document = new Aspose.Pdf.Document(dataDir + "input.pdf"))
{
// Get the first page and the first layer
var page = document.Pages[1];
var layer = page.Layers[0];
// Lock the layer
layer.Lock();
// Save PDF document
document.Save(dataDir + "LockLayerInPDF_out.pdf");
}
}
Библиотека Aspose.PDF for .NET позволяет извлекать каждый слой с первой страницы и сохранять каждый слой в отдельный файл.
Чтобы создать новый PDF из слоя, можно использовать следующий фрагмент кода:
private static void ExtractPdfLayer()
{
// The path to the documents directory
var dataDir = RunExamples.GetDataDir_AsposePdf_Forms();
// Open PDF document
using (var inputDocument = new Aspose.Pdf.Document(dataDir + "input.pdf"))
{
// Get layers from the first page
var layers = inputDocument.Pages[1].Layers;
// Save each layer to the output path
foreach (var layer in layers)
{
layer.Save(dataDir + string.Format("Layer_{0}.pdf", layer.Id));
}
}
}
Библиотека Aspose.PDF for .NET открывает PDF, проходит через каждый слой на первой странице и упрощает каждый слой, делая его постоянным на странице.
private static void FlattenPdfLayers()
{
// The path to the documents directory
var dataDir = RunExamples.GetDataDir_AsposePdf_Forms();
// Open PDF document
using (var document = new Aspose.Pdf.Document(dataDir + "input.pdf"))
{
// Get the first page
var page = document.Pages[1];
// Flatten each layer on the page
foreach (var layer in page.Layers)
{
layer.Flatten(true);
}
// Save PDF document
document.Save(dataDir + "FlattenedLayersPdf_out.pdf");
}
}
Метод ‘Layer.Flatten(bool cleanupContentStream)’ принимает булевый параметр, который указывает, следует ли удалять маркеры опциональной группы содержимого из потока содержимого. Установка параметра cleanupContentStream в false ускоряет процесс упрощения.
Библиотека Aspose.PDF for .NET позволяет объединять все слои PDF или конкретный слой на первой странице в новый слой и сохранять обновленный документ.
Были добавлены два метода для объединения всех слоев на странице:
Второй параметр позволяет переименовать маркер опциональной группы содержимого. Значение по умолчанию - “oc1” (/OC /oc1 BDC).
private static void MergePdfLayers()
{
// The path to the documents directory
var dataDir = RunExamples.GetDataDir_AsposePdf_Forms();
// Open PDF document
using (var document = new Aspose.Pdf.Document(dataDir + "input.pdf"))
{
// Get the first page
var page = document.Pages[1];
page.MergeLayers("NewLayerName");
// Or
// page.MergeLayers("NewLayerName", "OC1");
// Save PDF document
document.Save(dataDir + "MergeLayersInPdf_out.pdf");
}
}
Этот релиз поддерживает применение маски обрезки к изображениям:
private static void AddStencilMasksToImages()
{
// The path to the documents directory
var dataDir = RunExamples.GetDataDir_AsposePdf_Images();
// Open PDF document
using (var document = new Aspose.Pdf.Document(dataDir + "AddStencilMasksToImages.pdf"))
{
// Open the first mask image file
using (var fs1 = new FileStream(dataDir + "mask1.jpg", FileMode.Open))
{
// Open the second mask image file
using (var fs2 = new FileStream(dataDir + "mask2.png", FileMode.Open))
{
// Apply stencil mask to the first image on the first page
document.Pages[1].Resources.Images[1].AddStencilMask(fs1);
// Apply stencil mask to the second image on the first page
document.Pages[1].Resources.Images[2].AddStencilMask(fs2);
}
}
// Save PDF document
document.Save(dataDir + "AddStencilMasksToImages_out.pdf");
}
}
С 24.4 вы можете выбрать источник бумаги по размеру страницы PDF в диалоговом окне печати, используя API
Начиная с Aspose.PDF 24.4, этот параметр можно включать и выключать с помощью свойства Document.PickTrayByPdfSize или фасада PdfContentEditor:
private static void PickTrayByPdfSize()
{
// The path to the documents directory
var dataDir = RunExamples.GetDataDir_AsposePdfFacades_Printing();
// Create PDF document
using (var document = new Aspose.Pdf.Document())
{
// Add page
var page = document.Pages.Add();
page.Paragraphs.Add(new Aspose.Pdf.Text.TextFragment("Hello world!"));
// Set the flag to choose annotation paper tray using the PDF page size
document.PickTrayByPdfSize = true;
// Save PDF document
document.Save(dataDir + "PickTrayByPdfSize_out.pdf");
}
}
private static void PickTrayByPdfSizeFacade()
{
// The path to the documents directory
var dataDir = RunExamples.GetDataDir_AsposePdfFacades_Printing();
// Create the PdfContentEditor facade
using (var contentEditor = new Aspose.Pdf.Facades.PdfContentEditor())
{
// Bind PDF document
contentEditor.BindPdf(dataDir + "PrintDocument.pdf");
// Set the flag to choose annotation paper tray using the PDF page size
contentEditor.ChangeViewerPreference(Aspose.Pdf.Facades.ViewerPreference.PickTrayByPDFSize);
// Save PDF document
contentEditor.Save(dataDir + "PickTrayByPdfSizeFacade_out.pdf");
}
}
С этого релиза добавлен плагин Aspose.PDF Signature для .NET:
// create Signature
var plugin = new Signature();
// create SignOptions object to set instructions
var opt = new SignOptions(inputPfxPath, inputPfxPassword);
// add input file path
opt.AddInput(new FileDataSource(inputPath));
// set output file path
opt.AddOutput(new FileDataSource(outputPath));
// set extra options
opt.Reason = "my Reason";
opt.Contact = "my Contact";
opt.Location = "my Location";
// perform the process
plugin.Process(opt);
// create Signature
var plugin = new Signature();
// create SignOptions object to set instructions
var opt = new SignOptions(inputPfxPath, inputPfxPassword);
// add input file path with empty signature field
opt.AddInput(new FileDataSource(inputPath));
// set output file path
opt.AddOutput(new FileDataSource(outputPath));
// set name of existing signature field
opt.Name = "Signature1";
// perform the process
plugin.Process(opt);
С этого релиза добавлен плагин PDF/A Converter для .NET:
var options = new PdfAConvertOptions
{
PdfAVersion = PdfAStandardVersion.PDF_A_3B
};
// Add the source file
options.AddInput(new FileDataSource("path_to_your_pdf_file.pdf")); // replace with your actual file path
// Add the path to save the converted file
options.AddOutput(new FileDataSource("path_to_the_converted_file.pdf"));
// Create the plugin instance
var plugin = new PdfAConverter();
// Run the conversion
plugin.Process(options);
private static void SearchMultipleRegex()
{
// Create resular expressions
var regexes = new Regex[]
{
new Regex(@"(?s)document\s+(?:(?:no\(?s?\)?\.?)|(?:number(?:\(?s\)?)?))\s+(?:(?:[\w-]*\d[\w-]*)+(?:[,;\s]|and)*)", RegexOptions.IgnoreCase),
new Regex(@"[\s\r\n]+Tract[\s\r\n]+of:? ", RegexOptions.IgnoreCase),
new Regex(@"vested[\s\r\n]+in", RegexOptions.IgnoreCase),
new Regex("Vested in:", RegexOptions.IgnoreCase),
new Regex(@"file.?[\s\r\n]+(?:nos?|numbers?|#s?|nums?).?[\s\r\n]+(\d+)-(\d+)", RegexOptions.IgnoreCase),
new Regex(@"file.?[\s\r\n]+nos?.?:?[\s\r\n]+([\d\r\n-]+)", RegexOptions.IgnoreCase)
};
// The path to the documents directory
var dataDir = RunExamples.GetDataDir_AsposePdf_Text();
// Open PDF document
using (var document = new Aspose.Pdf.Document(dataDir + "SearchRegularExpressionAll.pdf"))
{
// Create TextAbsorber object to find all instances of the input search phrase
var absorber = new Aspose.Pdf.Text.TextFragmentAbsorber(regexes, new Aspose.Pdf.Text.TextSearchOptions(true));
document.Pages.Accept(absorber);
// Get result
var result = absorber.RegexResults;
}
}
С 24.3 стало возможным добавить пустое поле подписи на каждой странице в файл PDF/A
private static void AddEmptySignatureFieldOnEveryPage()
{
// The path to the documents directory
var dataDir = RunExamples.GetDataDir_AsposePdf_DocumentConversion();
var fieldName = "signature_1234";
using (var document = new Aspose.Pdf.Document(dataDir + "PDFAToPDF.pdf"))
{
// The new suggested code, using SignatureField object
var signatureField = new Aspose.Pdf.Forms.SignatureField(document.Pages[1], new Aspose.Pdf.Rectangle(10, 10, 100, 100));
// Add the default appearance for the signature field
signatureField.DefaultAppearance = new Aspose.Pdf.Annotations.DefaultAppearance("Helv", 12, System.Drawing.Color.Black);
var newAddedField = document.Form.Add(signatureField, fieldName, 1);
// Find annotation associated with the field
Aspose.Pdf.Annotations.Annotation addedAnnotation = null;
foreach (Aspose.Pdf.Annotations.Annotation annotation in document.Pages[1].Annotations)
{
if (annotation.FullName == fieldName)
{
addedAnnotation = annotation;
break;
}
}
// Add the annotation to every page except of initial
if (addedAnnotation != null)
{
for (int p = 2; p <= document.Pages.Count; p++)
{
document.Pages[p].Annotations.Add(addedAnnotation);
}
}
// Save PDF document
document.Save(dataDir + "outputPdfaWithSignatureFields.pdf");
}
}
С 24.2 стало возможным получать векторные данные из PDF файла
Был реализован GraphicsAbsorber для получения векторных данных из документов:
private static void UsingGraphicsAbsorber()
{
// The path to the document directory
var dataDir = RunExamples.GetDataDir_AsposePdf_Images();
// Open the document
using (var document = new Aspose.Pdf.Document(dataDir + "DocumentWithVectorGraphics.pdf"))
{
// Create an instance of GraphicsAbsorber
using (var graphicsAbsorber = new Aspose.Pdf.Vector.GraphicsAbsorber())
{
// Select the first page of the document
var page = document.Pages[1];
// Use the `Visit` method to extract graphics from the page
graphicsAbsorber.Visit(page);
// Display information about the extracted elements
foreach (var element in graphicsAbsorber.Elements)
{
Console.WriteLine($"Page Number: {element.SourcePage.Number}");
Console.WriteLine($"Position: ({element.Position.X}, {element.Position.Y})");
Console.WriteLine($"Number of Operators: {element.Operators.Count}");
}
}
}
}
С релиза 24.1 стало возможным импортировать аннотации формата FDF в PDF:
private static void ImportFDFByForm()
{
// The path to the documents directory
var dataDir = RunExamples.GetDataDir_AsposePdfFacades_Forms();
using (var form = new Aspose.Pdf.Facades.Form(dataDir + "input.pdf"))
{
// Open FDF file
using (var fdfInputStream = new FileStream(dataDir + "student.fdf", FileMode.Open))
{
form.ImportFdf(fdfInputStream);
}
// Save PDF document
form.Save(dataDir + "ImportDataFromPdf_Form_out.pdf");
}
}
Также поддерживается доступ к словарю страниц или каталогу документа.
Вот примеры кода для DictionaryEditor:
/private static void AddNewKeysToPdfPageDicrionary()
{
// The path to the documents directory
var dataDir = RunExamples.GetDataDir_AsposePdf_DocumentConversion();
// example of key's names
string KEY_NAME = "name";
string KEY_STRING = "str";
string KEY_BOOL = "bool";
string KEY_NUMBER = "number";
// Open the document
using (var document = new Aspose.Pdf.Document())
{
var page = document.Pages.Add();
var dictionaryEditor = new Aspose.Pdf.DataEditor.DictionaryEditor(page);
dictionaryEditor.Add(KEY_NAME, new Aspose.Pdf.DataEditor.CosPdfName("name data"));
dictionaryEditor.Add(KEY_STRING, new Aspose.Pdf.DataEditor.CosPdfString("string data"));
dictionaryEditor.Add(KEY_BOOL, new Aspose.Pdf.DataEditor.CosPdfBoolean(true));
dictionaryEditor.Add(KEY_NUMBER, new Aspose.Pdf.DataEditor.CosPdfNumber(11.2));
// Save PDF document
document.Save(dataDir + "PageDictionaryEditor_out.pdf");
}
}
private static void ModifyKeysInPdfPageDicrionary()
{
// The path to the documents directory
var dataDir = RunExamples.GetDataDir_AsposePdf_DocumentConversion();
string KEY_NAME = "name";
// Open the document
using (var document = new Aspose.Pdf.Document())
{
var page = document.Pages.Add();
var dictionaryEditor = new Aspose.Pdf.DataEditor.DictionaryEditor(page);
dictionaryEditor.Add(KEY_NAME, new Aspose.Pdf.DataEditor.CosPdfName("Old data"));
// Modify existing value
dictionaryEditor[KEY_NAME] = new Aspose.Pdf.DataEditor.CosPdfName("New data");
// Save PDF document
document.Save(dataDir + "PageDictionaryEditorEdit_out.pdf");
}
}
private static void GetValuesFromPdfPageDicrionary()
{
string KEY_NAME = "name";
using (var document = new Aspose.Pdf.Document())
{
var page = document.Pages.Add();
var dictionaryEditor = new Aspose.Pdf.DataEditor.DictionaryEditor(page);
dictionaryEditor[KEY_NAME] = new Aspose.Pdf.DataEditor.CosPdfName("name");
var value = dictionaryEditor[KEY_NAME];
// or
Aspose.Pdf.DataEditor.ICosPdfPrimitive primitive;
dictionaryEditor.TryGetValue(KEY_NAME, out primitive);
}
}
private static void RemoveFromPdfPageDicrionary()
{
// The path to the documents directory
var dataDir = RunExamples.GetDataDir_AsposePdf_DocumentConversion();
string KEY_NAME = "name";
string EXPECTED_NAME = "name data";
using (var document = new Aspose.Pdf.Document())
{
var page = document.Pages.Add();
var dictionaryEditor = new Aspose.Pdf.DataEditor.DictionaryEditor(page);
dictionaryEditor.Add(KEY_NAME, new Aspose.Pdf.DataEditor.CosPdfName(EXPECTED_NAME));
dictionaryEditor.Remove(KEY_NAME);
// Save PDF document
document.Save(dataDir + "PageDictionaryEditorRemove_out.pdf");
}
}
Форма может быть найдена, и текст может быть заменен с помощью следующего фрагмента кода:
private static void ReplaceTextInPdfForm()
{
// The path to the documents directory
var dataDir = RunExamples.GetDataDir_AsposePdf_Forms();
// Open PDF document
using (var document = new Aspose.Pdf.Document(dataDir + "TextBox.pdf"))
{
// Get the forms from the first page
var forms = document.Pages[1].Resources.Forms;
foreach (var form in forms)
{
// Check if the form is of type "Typewriter" and subtype "Form"
if (form.IT == "Typewriter" && form.Subtype == "Form")
{
// Create a TextFragmentAbsorber to find text fragments
var absorber = new Aspose.Pdf.Text.TextFragmentAbsorber();
absorber.Visit(form);
// Clear the text in each fragment
foreach (var fragment in absorber.TextFragments)
{
fragment.Text = "";
}
}
}
// Save PDF document
document.Save(dataDir + "TextBox_out.pdf");
}
}
Или форма может быть полностью удалена:
private static void DeleteSpecifiedForm1()
{
// The path to the documents directory
var dataDir = RunExamples.GetDataDir_AsposePdf_Forms();
// Open PDF document
using (var document = new Aspose.Pdf.Document(dataDir + "TextField.pdf"))
{
// Get the forms from the first page
var forms = document.Pages[1].Resources.Forms;
// Iterate through the forms and delete the ones with type "Typewriter" and subtype "Form"
for (int i = forms.Count; i > 0; i--)
{
if (forms[i].IT == "Typewriter" && forms[i].Subtype == "Form")
{
forms.Delete(forms[i].Name);
}
}
// Save PDF document
document.Save(dataDir + "TextBox_out.pdf");
}
}
Другой вариант удаления формы:
private static void DeleteSpecifiedForm2()
{
// The path to the documents directory
var dataDir = RunExamples.GetDataDir_AsposePdf_Forms();
// Open PDF document
using (var document = new Aspose.Pdf.Document(dataDir + "TextField.pdf"))
{
// Get the forms from the first page
var forms = document.Pages[1].Resources.Forms;
// Iterate through the forms and delete the ones with type "Typewriter" and subtype "Form"
foreach (var form in forms)
{
if (form.IT == "Typewriter" && form.Subtype == "Form")
{
var name = forms.GetFormName(form);
forms.Delete(name);
}
}
// Save PDF document
document.Save(dataDir + "TextBox_out.pdf");
}
}
private static void RemoveAllForms()
{
// The path to the documents directory
var dataDir = RunExamples.GetDataDir_AsposePdf_Forms();
// Open PDF document
using (var document = new Aspose.Pdf.Document(dataDir + "TextField.pdf"))
{
// Get the forms from the first page
var forms = document.Pages[1].Resources.Forms;
// Clear all forms
forms.Clear();
// Save PDF document
document.Save(dataDir + "TextBox_out.pdf");
}
}
private static void ConvertPDFtoMarkup()
{
// The path to the documents directory
var dataDir = RunExamples.GetDataDir_AsposePdf_DocumentConversion();
// Open PDF document
using (var document = new Aspose.Pdf.Document(dataDir + "demo.pdf"))
{
// Create an instance of MarkdownSaveOptions to configure the Markdown export settings
var saveOptions = new MarkdownSaveOptions()
{
// Set to false to prevent the use of HTML <img> tags for images in the Markdown output
UseImageHtmlTag = false
};
// Specify the directory name where resources (like images) will be stored
saveOptions.ResourcesDirectoryName = "images";
// Save PDF document in Markdown format to the specified output file path using the defined save options
document.Save(dataDir + "PDFtoMarkup_out.md", saveOptions);
}
}
private static void ConvertOFDToPDF()
{
// The path to the documents directory
var dataDir = RunExamples.GetDataDir_AsposePdf_DocumentConversion();
// Convert options
var options = new Aspose.Pdf.OfdLoadOptions();
// Open PDF document
using (var document = new Aspose.Pdf.Document(dataDir + "ConvertOFDToPDF.ofd", options))
{
// Save PDF document
document.Save(dataDir + "ConvertOFDToPDF_out.pdf");
}
}
С этого релиза добавлен плагин Merger:
private static void PdfMergeUsingPlugin()
{
string dataDir = RunExamples.GetDataDir_AsposePdf_Pages();
// Create annotation new instance of Merger
using (var merger = new Aspose.Pdf.Plugins.Merger())
{
// Create MergeOptions
var opt = new Aspose.Pdf.Plugins.MergeOptions();
opt.AddInput(new Aspose.Pdf.Plugins.FileDataSource(dataDir + "Concat1.pdf"));
opt.AddInput(new Aspose.Pdf.Plugins.FileDataSource(dataDir + "Concat2.pdf"));
opt.AddOutput(new Aspose.Pdf.Plugins.FileDataSource(dataDir + "ConcatenatePdfFiles_out.pdf"));
// Process the PDF merging
merger.Process(opt);
}
}
Также с этого релиза добавлен плагин ChatGPT:
private static async void InvokeChatGptPlugin()
{
using (var plugin = new Aspose.Pdf.Plugins.PdfChatGpt())
{
var options = new Aspose.Pdf.Plugins.PdfChatGptRequestOptions();
options.AddOutput(new Aspose.Pdf.Plugins.FileDataSource("PdfChatGPT_output.pdf")); // Add the output file path.
options.ApiKey = "Your API key."; // You need to provide the key to access the API.
options.MaxTokens = 1000; // The maximum number of tokens to generate in the chat completion.
// Add the request messages.
options.Messages.Add(new Aspose.Pdf.Plugins.Message
{
Content = "You are annotation helpful assistant.",
Role = Aspose.Pdf.Plugins.Role.System
});
options.Messages.Add(new Aspose.Pdf.Plugins.Message
{
Content = "What is the biggest pizza diameter ever made?",
Role = Aspose.Pdf.Plugins.Role.User
});
// Process the request.
var result = await plugin.ProcessAsync(options);
var fileResultPath = result.ResultCollection[0].Data;
// The ChatGPT API chat completion object.
var chatCompletionObject = result.ResultCollection[1].Data as Aspose.Pdf.Plugins.ChatCompletion;
}
}
С этого релиза стало возможным удалять скрытый текст из PDF файла:
private static void RemoveHiddenText()
{
// The path to the documents directory
var dataDir = RunExamples.GetDataDir_AsposePdf_Text();
// Open PDF document
using (var document = new Aspose.Pdf.Document(dataDir + "HiddenText.pdf"))
{
// Use TextFragmentAbsorber with no parameters to get all text
var textAbsorber = new Aspose.Pdf.Text.TextFragmentAbsorber();
// This option can be used to prevent other text fragments from moving after hidden text replacement
textAbsorber.TextReplaceOptions = new Aspose.Pdf.Text.TextReplaceOptions(Aspose.Pdf.Text.TextReplaceOptions.ReplaceAdjustment.None);
document.Pages.Accept(textAbsorber);
// Remove hidden text
foreach (var fragment in textAbsorber.TextFragments)
{
if (fragment.TextState.Invisible)
{
fragment.Text = "";
}
}
// Save PDF document
document.Save(dataDir + "HiddenText_out.pdf");
}
}
С 23.11 поддержка прерывания потоков:
private static void InterruptExample()
{
// The path to the documents directory
var dataDir = RunExamples.GetDataDir_AsposePdf_WorkingDocuments();
using (var monitor = new Aspose.Pdf.Multithreading.InterruptMonitor())
{
// An class that can produce long-drawn-out work
RowSpanWorker worker = new RowSpanWorker(dataDir + "RowSpanWorker_out.pdf", monitor);
var thread = new System.Threading.Thread(new System.Threading.ThreadStart(worker.Work));
thread.Start();
// The timeout should be less than the time required for full document save (without interruption)
System.Threading.Thread.Sleep(500);
// Interrupt the process
monitor.Interrupt();
// Wait for interruption...
thread.Join();
}
}
private class RowSpanWorker
{
private readonly string outputPath;
private readonly Aspose.Pdf.Multithreading.InterruptMonitor monitor;
public RowSpanWorker(string outputPath, Aspose.Pdf.Multithreading.InterruptMonitor monitor)
{
this.outputPath = outputPath;
this.monitor = monitor;
}
public void Work()
{
// This is some large text, used Lorem Ipsum in 10000 characters to cause suspension in processing
string text = RunExamples.GetLoremIpsumString(10000);
// Open PDF document
using (var document = new Aspose.Pdf.Document())
{
Aspose.Pdf.Multithreading.InterruptMonitor.ThreadLocalInstance = this.monitor;
var page = document.Pages.Add();
var table = new Aspose.Pdf.Table
{
DefaultCellBorder = new Aspose.Pdf.BorderInfo(Aspose.Pdf.BorderSide.All, 0.1F)
};
var row0 = table.Rows.Add();
// Add annotation cell that spans for two rows and contains annotation long-long text
var cell00 = row0.Cells.Add(text);
cell00.RowSpan = 2;
cell00.IsWordWrapped = true;
row0.Cells.Add("Ipsum Ipsum Ipsum Ipsum Ipsum Ipsum ");
row0.Cells.Add("Dolor Dolor Dolor Dolor Dolor Dolor ");
var row1 = table.Rows.Add();
row1.Cells.Add("IpsumDolor Dolor Dolor Dolor Dolor ");
row1.Cells.Add("DolorDolor Dolor Dolor Dolor Dolor ");
page.Paragraphs.Add(table);
try
{
// Save PDF document
document.Save(this.outputPath);
}
catch (Exception ex)
{
Console.WriteLine(ex.Message);
}
}
}
}
Текущее обновление представляет три версии удаления тегов из помеченных PDF.
private static void RemoveStructElement()
{
var dataDir = RunExamples.GetDataDir_AsposePdf_WorkingDocuments();
// Open PDF document
using (var document = new Aspose.Pdf.Document(dataDir + "StructureElementsTree.pdf"))
{
// Access to root element(s)
var structure = document.LogicalStructure;
var documentElement = structure.Children[0];
var structElement = documentElement.Children.Count > 1 ? documentElement.Children[1] as Aspose.Pdf.Structure.StructElement : null;
if (documentElement.Children.Remove(structElement))
{
// Element removed. Save PDF document.
document.Save(dataDir + "StructureElementsRemoved.pdf");
}
// You can also delete the structElement itself
//if (structElement != null)
//{
// structElement.Remove();
// document.Save(outputPdfPath);
//}
}
}
private static void RemoveMarkedElementsTags()
{
// The path to the documents directory
var dataDir = RunExamples.GetDataDir_AsposePdf_WorkingDocuments();
// Open PDF document
using (var document = new Aspose.Pdf.Document(dataDir + "TH.pdf"))
{
// Access to root element(s)
var structure = document.LogicalStructure;
var root = structure.Children[0];
var queue = new Queue<Aspose.Pdf.Structure.Element>();
queue.Enqueue(root);
while (queue.TryDequeue(out var element))
{
foreach (var child in element.Children)
{
queue.Enqueue(child);
}
if (element is Aspose.Pdf.Structure.TextElement || element is Aspose.Pdf.Structure.FigureElement)
{
element.Remove();
}
}
// Save PDF document
document.Save(dataDir + "MarkedElementsTagsRemoved.pdf");
}
}
private static void RemoveTags()
{
// The path to the documents directory
var dataDir = RunExamples.GetDataDir_AsposePdf_WorkingDocuments();
// Open PDF document
using (var document = new Aspose.Pdf.Document(dataDir + "TH.pdf"))
{
// Access to root element(s)
var structure = document.LogicalStructure;
var documentElement = structure.Children[0];
documentElement.Remove();
// Save PDF document
document.Save(dataDir + "TagsRemoved.pdf");
}
}
С 23.10 была реализована новая функция для измерения высоты символа. Используйте следующий код для измерения высоты символа.
private static void DisplayCharacterHeight()
{
// The path to the documents directory
var dataDir = RunExamples.GetDataDir_AsposePdf_Text();
// Open PDF document
using (var document = new Aspose.Pdf.Document(dataDir + "ExtractTextAll.pdf"))
{
// Create TextFragmentAbsorber to get information about state of document text
var absorber = new Aspose.Pdf.Text.TextFragmentAbsorber();
absorber.Visit(document.Pages[1]);
// Get height of 'A' character being displayed with font of first text fragment
var textState = absorber.TextFragments[1].TextState;
var height = textState.MeasureHeight('A');
Console.WriteLine("The height of 'A' character displayed with {0} font size of {1} is {2:N3}", textState.Font.FontName, textState.FontSize,height);
}
}
Обратите внимание, что измерение основано на шрифте, встроенном в документ. Если какая-либо информация для измерения отсутствует, этот метод возвращает 0.
Также этот релиз предоставляет возможность подписать PDF с использованием подписанного HASH:
private static void SignPdfUsingSignedHash(string certP12, string pfxPassword)
{
// The path to the documents directory
var dataDir = RunExamples.GetDataDir_AsposePdf_SecuritySignatures();
// Instantiate PdfFileSignature object
using (var sign = new Aspose.Pdf.Facades.PdfFileSignature())
{
// Bind PDF document
sign.BindPdf(dataDir + "input.pdf");
var pkcs7 = new Aspose.Pdf.Forms.PKCS7(certP12, pfxPassword);
// Create a delegate to external sign
pkcs7.CustomSignHash = delegate (byte[] signableHash, Aspose.Pdf.DigestHashAlgorithm digestHashAlgorithm)
{
X509Certificate2 signerCert = new X509Certificate2(certP12, pfxPassword, X509KeyStorageFlags.Exportable);
RSACryptoServiceProvider rsaCSP = new RSACryptoServiceProvider();
var xmlString = signerCert.PrivateKey.ToXmlString(true); //not supported on core 2.0
rsaCSP.FromXmlString(xmlString); //not supported on core 2.0
byte[] signedData = rsaCSP.SignHash(signableHash, CryptoConfig.MapNameToOID("SHA1"));
return signedData;
};
// Sign PDF file
sign.Sign(1, "reason", "cont", "loc", false, new System.Drawing.Rectangle(0, 0, 500, 500), pkcs7);
// Save PDF document
sign.Save(dataDir + "SignWithCertificate_out.pdf");
}
// Verify
using (var sign = new Aspose.Pdf.Facades.PdfFileSignature())
{
// Bind PDF document
sign.BindPdf(dataDir + "SignWithCertificate_out.pdf");
if (!sign.VerifySignature("Signature1"))
{
throw new Exception("Not verified");
}
}
}
Еще одной новой функцией является масштабирование страницы в диалоговых окнах печати:
private static void SetPrintScaling()
{
// The path to the documents directory
var dataDir = RunExamples.GetDataDir_AsposePdfFacades_Printing();
// Create PDF document
using (var document = new Aspose.Pdf.Document())
{
// Add page
document.Pages.Add();
// Disable print scaling
document.PrintScaling = PrintScaling.None;
// Save PDF document
document.Save(dataDir + "SetPrintScaling_out.pdf");
}
}
С 23.9 поддержка удаления дочерней аннотации из заполняемого поля.
private static void RemoveChildAnnotationFromFillableField()
{
// The path to the documents directory
var dataDir = RunExamples.GetDataDir_AsposePdf_Forms();
// Open PDF document
using (var document = new Aspose.Pdf.Document(dataDir + "FieldWithChildAnnots.pdf"))
{
// Get field with child annotations
var field = (Aspose.Pdf.Forms.Field)document.Form["1 Vehicle Identification Number"];
// Get first child annotation
var annotation = field[1];
// Remove the annotation
document.Pages[annotation.PageIndex].Annotations.Remove(annotation);
// Save PDF document
document.Save(dataDir + "RemoveChildAnnotation_out.pdf");
}
}
С 23.8 поддержка добавления обнаружения инкрементальных обновлений.
Функция для обнаружения инкрементальных обновлений в PDF документе была добавлена. Эта функция возвращает ’true’, если документ был сохранен с инкрементальными обновлениями; в противном случае она возвращает ‘false’.
private static bool HasIncrementalUpdate()
{
// The path to the documents directory
var dataDir = RunExamples.GetDataDir_AsposePdf_WorkingDocuments();
// Open PDF document
using (var document = new Aspose.Pdf.Document(dataDir + "PdfWithIncrementalUpdate.pdf"))
{
// New method
bool hasIncrementalUpdate = document.HasIncrementalUpdate();
Console.WriteLine("Document {0} incremental update check returns: {1}", document.FileName, hasIncrementalUpdate);
return hasIncrementalUpdate;
}
}
Также 23.8 поддерживает способы работы с вложенными полями флажков. Многие заполняемые PDF формы имеют поля флажков, которые действуют как группы радиокнопок:
private static void CreateMultivalueCheckboxField()
{
// The path to the documents directory
var dataDir = RunExamples.GetDataDir_AsposePdf_Forms();
// Create PDF document
using (var document = new Aspose.Pdf.Document())
{
var page = document.Pages.Add();
var checkbox = new Aspose.Pdf.Forms.CheckboxField(page, new Aspose.Pdf.Rectangle(50, 50, 70, 70));
// Set the first checkbox group option value
checkbox.ExportValue = "option 1";
// Add new option right under existing ones
checkbox.AddOption("option 2");
// Add new option at the given rectangle
checkbox.AddOption("option 3", new Aspose.Pdf.Rectangle(100, 100, 120, 120));
document.Form.Add(checkbox);
// Select the added checkbox
checkbox.Value = "option 2";
// Save PDF document
document.Save(dataDir + "MultivalueCheckboxField.pdf");
}
}
private static void GetAndSetValueOfMultivalueCheckboxField()
{
// The path to the documents directory
var dataDir = RunExamples.GetDataDir_AsposePdf_Forms();
// Open PDF document
using (var document = new Aspose.Pdf.Document(dataDir + "MultivalueCheckboxField.pdf"))
{
var form = document.Form;
var checkbox = form.Fields[0] as Aspose.Pdf.Forms.CheckboxField;
// Allowed values may be retrieved from the AllowedStates collection
// Set the checkbox value using Value property
checkbox.Value = checkbox.AllowedStates[0];
var checkboxValue = checkbox.Value; // the previously set value, e.g. "option 1"
// The value should be any element of AllowedStates
checkbox.Value = "option 2";
checkboxValue = checkbox.Value; // option 2
// Uncheck boxes by either setting Value to "Off" or setting Checked to false
checkbox.Value = "Off";
// or, alternately:
// checkbox.Checked = false;
checkboxValue = checkbox.Value; // Off
}
}
С Aspose.PDF 23.7 поддержка добавления извлечения формы:
private static void CopyShape()
{
// The path to the document directory
var dataDir = RunExamples.GetDataDir_AsposePdf_Graphs();
// Open PDF document
using (var sourceDocument = new Aspose.Pdf.Document(dataDir + "test.pdf"))
{
// Create PDF document
using (var destDocument = new Aspose.Pdf.Document())
{
// Absorb vector graphics from the source document
var graphicAbsorber = new Aspose.Pdf.Vector.GraphicsAbsorber();
graphicAbsorber.Visit(sourceDocument.Pages[1]);
// Copy the graphics into the destination document specified page and area
var area = new Aspose.Pdf.Rectangle(90, 250, 300, 400);
destDocument.Pages[1].AddGraphics(graphicAbsorber.Elements, area);
// Save PDF document
destDocument.Save(dataDir + "CopyShape_out.pdf");
}
}
}
Также поддерживается возможность обнаружения переполнения при добавлении текста:
private static void FitTextIntoRectangle()
{
// The path to the document directory
var dataDir = RunExamples.GetDataDir_AsposePdf_Text();
// Create PDF document
using (var document = new Aspose.Pdf.Document())
{
// Generate text to add: "Lorem Ipsum" text of 1000 characters
var paragraphContent = RunExamples.GetLoremIpsumString(1000);
// Create a text fragment with the desired text
var fragment = new Aspose.Pdf.Text.TextFragment(paragraphContent);
// Declare the rectangle to fit text into
var rectangle = new Aspose.Pdf.Rectangle(100, 600, 500, 700, false);
// Check whether the text fits into the rectangle
var isFitRectangle = fragment.TextState.IsFitRectangle(paragraphContent, rectangle);
// Iteratively decrease font size until text fits the rectangle
while (!isFitRectangle)
{
fragment.TextState.FontSize -= 0.5f;
isFitRectangle = fragment.TextState.IsFitRectangle(paragraphContent, rectangle);
}
// Create a paragraph from the text fragment in the specified rectangle. Now you may be sure it fits.
var paragraph = new Aspose.Pdf.Text.TextParagraph();
paragraph.VerticalAlignment = Aspose.Pdf.VerticalAlignment.Top;
paragraph.FormattingOptions.WrapMode = Aspose.Pdf.Text.TextFormattingOptions.WordWrapMode.ByWords;
paragraph.Rectangle = rectangle;
paragraph.AppendLine(fragment);
// Create a text builder to place the paragraph on the document page
var builder = new Aspose.Pdf.Text.TextBuilder(document.Pages.Add());
builder.AppendParagraph(paragraph);
// Save PDF document
document.Save(dataDir + "FitTextIntoRectangle_out.pdf");
}
}
С Aspose.PDF 23.6 поддержка добавления следующих плагинов:
Обновите Aspose.PdfForm
Также поддержка добавления возможности установить заголовок HTML, страницы Epub:
private static void SetHtmlTitle()
{
// The path to the documents directory
var dataDir = RunExamples.GetDataDir_AsposePdf_DocumentConversion();
// Open PDF document
using (var document = new Aspose.Pdf.Document(dataDir + "PDFToHTML.pdf"))
{
var options = new Aspose.Pdf.HtmlSaveOptions
{
ExplicitListOfSavedPages = new[] { 1 },
SplitIntoPages = false,
FixedLayout = true,
CompressSvgGraphicsIfAny = false,
SaveTransparentTexts = true,
SaveShadowedTextsAsTransparentTexts = true,
FontSavingMode = Aspose.Pdf.HtmlSaveOptions.FontSavingModes.AlwaysSaveAsWOFF,
RasterImagesSavingMode = Aspose.Pdf.HtmlSaveOptions.RasterImagesSavingModes.AsEmbeddedPartsOfPngPageBackground,
PartsEmbeddingMode = Aspose.Pdf.HtmlSaveOptions.PartsEmbeddingModes.EmbedAllIntoHtml,
// New property
Title = "Title for page"
};
// Save HTML document
document.Save(dataDir + "SetHtmlTitle_out.html", options);
}
}
С 23.5 поддержка добавления опции FontSize для RedactionAnnotation. Используйте следующий фрагмент кода для решения этой задачи:
private static void AddRedactionAnnotationFontSize()
{
// The path to the documents directory
var dataDir = RunExamples.GetDataDir_AsposePdf_Annotations();
// Open PDF document
using (var document = new Aspose.Pdf.Document(dataDir + "input.pdf"))
{
// Create RedactionAnnotation instance for specific page region
var annot = new Aspose.Pdf.Annotations.RedactionAnnotation(document.Pages[1],
new Aspose.Pdf.Rectangle(367, 756.919982910156, 420, 823.919982910156));
annot.FillColor = Aspose.Pdf.Color.Black;
annot.BorderColor = Aspose.Pdf.Color.Yellow;
annot.Color = Aspose.Pdf.Color.Blue;
// Text to be printed on redact annotation
annot.OverlayText = "(Unknown)";
annot.TextAlignment = Aspose.Pdf.HorizontalAlignment.Center;
// Repat Overlay text over redact Annotation
annot.Repeat = false;
// New property
annot.FontSize = 20;
// Add annotation to annotations collection of first page
document.Pages[1].Annotations.Add(annot);
// Flattens annotation and redacts page contents (i.e. removes text and image under redacted annotation)
annot.Redact();
// Save PDF document
document.Save(dataDir + "AddRedactionAnnotationFontSize_out.pdf");
}
}
Aspose.PDF объявила о выпуске .NET 7 SDK.
С Aspose.PDF 23.3 поддержка добавления следующих плагинов:
Версия 23.3 представила поддержку сохранения пропорций изображения и разрешения при вставке на страницу. Для решения этой проблемы можно использовать два метода:
private static void InsertImageWithNativeResolutionAsTable()
{
// The path to the documents directory
var dataDir = RunExamples.GetDataDir_AsposePdf_Images();
// Create PDF document
using (var document = new Aspose.Pdf.Document())
{
var page = document.Pages.Add();
var table = new Aspose.Pdf.Table
{
ColumnWidths = "600"
};
for (var j = 0; j < 2; j++)
{
var row = table.Rows.Add();
var cell = row.Cells.Add();
cell.Paragraphs.Add(new Aspose.Pdf.Image()
{
IsApplyResolution = true,
File = dataDir + "Image1.jpg"
});
}
page.Paragraphs.Add(table);
// Save PDF document
document.Save(dataDir + "ImageWithNativeResolutionAsTable_out.pdf");
}
}
И второй подход:
private static void InsertImageWithNativeResolutionAsParagraph()
{
// The path to the documents directory
var dataDir = RunExamples.GetDataDir_AsposePdf_Images();
// Create PDF document
using (var document = new Aspose.Pdf.Document())
{
var page = document.Pages.Add();
for (var j = 0; j < 2; j++)
{
page.Paragraphs.Add(new Aspose.Pdf.Image()
{
IsApplyResolution = true,
File = dataDir + "Image1.jpg"
});
}
// Save PDF document
document.Save(dataDir + "ImageWithNativeResolutionAsParagraph_out.pdf");
}
}
Изображение будет размещено в масштабированном размере и родном разрешении. Вы можете установить свойства FixedWidth или FixedHeight в сочетании с IsApplyResolution.
С Aspose.PDF 23.1.1 поддержка добавления следующих плагинов:
С версии 23.1 поддержка создания аннотации PrinterMark.
Метки принтера — это графические символы или текст, добавленные на страницу, чтобы помочь производственному персоналу идентифицировать компоненты многопластовой работы и поддерживать согласованный вывод в процессе производства. Примеры, обычно используемые в полиграфической отрасли, включают:
Мы покажем пример опции с цветными полосами для измерения цветов и плотности чернил. Существует базовый абстрактный класс PrinterMarkAnnotation, и от него наследуется класс ColorBarAnnotation - который уже реализует эти полосы. Давайте проверим пример:
private static void AddPrinterMarkAnnotation()
{
// The path to the documents directory
var dataDir = RunExamples.GetDataDir_AsposePdf_Annotations();
// Create PDF document
using (var document = new Aspose.Pdf.Document())
{
var page = document.Pages.Add();
page.TrimBox = new Aspose.Pdf.Rectangle(20, 20, 580, 820);
var rectBlack = new Aspose.Pdf.Rectangle(100, 300, 300, 320);
var rectCyan = new Aspose.Pdf.Rectangle(200, 600, 260, 690);
var rectMagenta = new Aspose.Pdf.Rectangle(10, 650, 140, 670);
var colorBarBlack = new Aspose.Pdf.Annotations.ColorBarAnnotation(page, rectBlack);
var colorBarCyan = new Aspose.Pdf.Annotations.ColorBarAnnotation(page, rectCyan,
Aspose.Pdf.Annotations.ColorsOfCMYK.Cyan);
var colorBarMagenta = new Aspose.Pdf.Annotations.ColorBarAnnotation(page, rectMagenta);
colorBarMagenta.ColorOfCMYK = Aspose.Pdf.Annotations.ColorsOfCMYK.Magenta;
var colorBarYellow = new Aspose.Pdf.Annotations.ColorBarAnnotation(page,
new Aspose.Pdf.Rectangle(400, 250, 450, 700), Aspose.Pdf.Annotations.ColorsOfCMYK.Yellow);
page.Annotations.Add(colorBarBlack);
page.Annotations.Add(colorBarCyan);
page.Annotations.Add(colorBarMagenta);
page.Annotations.Add(colorBarYellow);
// Save PDF document
document.Save(dataDir + "PrinterMarkAnnotation_out.pdf");
}
}
Также поддержка извлечения векторных изображений. Попробуйте использовать следующий код для обнаружения и извлечения векторной графики:
private static void SavePdfVectorGraphicToSvg()
{
// The path to the document directory
var dataDir = RunExamples.GetDataDir_AsposePdf_Graphs();
// Open PDF document
using (var document = new Aspose.Pdf.Document(dataDir + "test.pdf"))
{
// Attempt to save the vector graphics into a specified SVG file
document.Pages[1].TrySaveVectorGraphics(dataDir + "PdfVectorGraphicToSvg.svg");
}
}
С этого релиза поддержка конвертации PDF в DICOM изображение
private static void PdfToDicom()
{
// The path to the documents directory
var dataDir = RunExamples.GetDataDir_AsposePdf_Images();
// Open PDF document
using (var document = new Aspose.Pdf.Document(dataDir + "PagesToImages.pdf"))
{
var dicom = new Aspose.Pdf.Devices.DicomDevice();
FileStream outStream = new FileStream(dataDir + "PdfToDicom_out.dcm", FileMode.Create, FileAccess.ReadWrite);
dicom.Process(document.Pages[1], outStream);
}
}
С 22.09 поддержка добавления свойства для изменения порядка предметных рубрик (E=, CN=, O=, OU=, ) в подписи.
private static void SignPdfWithModifiedOrderOfSubjectRubrics(string pfxFilePath, string password)
{
// The path to the documents directory
var dataDir = RunExamples.GetDataDir_AsposePdf_SecuritySignatures();
// Instantiate PdfFileSignature object
using (var fileSign = new Aspose.Pdf.Facades.PdfFileSignature())
{
// Bind PDF document
fileSign.BindPdf(dataDir + "DigitallySign.pdf");
var rect = new System.Drawing.Rectangle(100, 100, 400, 100);
var signature = new Aspose.Pdf.Forms.PKCS7Detached(pfxFilePath, password);
// Set signature custom appearance
signature.CustomAppearance = new Aspose.Pdf.Forms.SignatureCustomAppearance()
{
UseDigitalSubjectFormat = true,
DigitalSubjectFormat = new Aspose.Pdf.Forms.SubjectNameElements[] { Aspose.Pdf.Forms.SubjectNameElements.CN, Aspose.Pdf.Forms.SubjectNameElements.O }
//or
//DigitalSubjectFormat = new Aspose.Pdf.Forms.SubjectNameElements[] { Aspose.Pdf.Forms.SubjectNameElements.OU, Aspose.Pdf.Forms.SubjectNameElements.S, Aspose.Pdf.Forms.SubjectNameElements.C }
};
// Sign PDF file
fileSign.Sign(1, true, rect, signature);
// Save PDF document
fileSign.Save(dataDir + "SignPdfWithModifiedOrderOfSubjectRubrics_out.pdf");
}
}
С 22.5 поддержка извлечения текста SubScript и SuperScript из PDF.
Если PDF документ содержит текст SubScript и SuperScript, такой как H2O, то извлечение текста из PDF также должно извлекать их информацию о форматировании (в извлеченном обычном тексте). Если PDF содержит текст курсивом, он также должен быть включен в извлеченное содержимое.
private static void ExtractTextSuperscript()
{
// The path to the documents directory
var dataDir = RunExamples.GetDataDir_AsposePdf_Text();
// Open PDF document
using (var document = new Aspose.Pdf.Document(dataDir + "TextWithSubscriptsSuperscripts.pdf"))
{
// Use TextFragmentAbsorber with no parameters to get all text
var absorber = new Aspose.Pdf.Text.TextFragmentAbsorber();
absorber.Visit(document.Pages[1]);
// Iterate through text fragments to find superscript text
foreach (var textFragment in absorber.TextFragments)
{
if (textFragment.TextState.Superscript)
{
Console.WriteLine(String.Format("Text {0} at {1} is superscript!", textFragment.Text, textFragment.Position));
}
}
}
}
Этот релиз включает информацию для Aspose.PDF for .NET:
пример
private static void ConvertPdfToOds()
{
// The path to the documents directory
var dataDir = RunExamples.GetDataDir_AsposePdf();
// Open PDF document
using (var document = new Aspose.Pdf.Document(dataDir + "input.pdf"))
{
// Instantiate ExcelSaveOptions object
var saveOptions = new Aspose.Pdf.ExcelSaveOptions
{
// Specify the desired table file format
Format = Aspose.Pdf.ExcelSaveOptions.ExcelFormat.ODS
};
// Save the file in ODS format
document.Save(dataDir + "PDFToODS_out.ods", saveOptions);
}
}
PDF в XMLSpreadSheet2003: Распознавание текста в подстрочном и надстрочном формате;
PDF в Excel: Распознавание текста в подстрочном и надстрочном формате;
Удаление UR подписей при сохранении документа;
Удаление флага Suspects в MarkInfo при сохранении документа;
Удаление информации при сохранении документа
Этот релиз включает следующие обновления:
Поддержка AFRelationship;
Проверка заголовка PDF;
Удаление подфильтра adbe.x509.rsa_sha1 при сохранении документа;
Форматирование поля как числа и формата даты;
Запрет использования шифрования RC4 в FDF 2.0.
С версии 22.2 стало возможным подписывать документ с использованием PdfFileSignature с LTV и с возможностью изменения хеширования с SHA1 на SHA256.
private static void SignPdfWithSha256(string pfxFilePath, string password)
{
// The path to the documents directory
var dataDir = RunExamples.GetDataDir_AsposePdf_SecuritySignatures();
// Instantiate PdfFileSignature object
using (var fileSign = new Aspose.Pdf.Facades.PdfFileSignature())
{
// Bind PDF document
fileSign.BindPdf(dataDir + "DigitallySign.pdf");
var rect = new System.Drawing.Rectangle(300, 100, 1, 1);
var signature = new Aspose.Pdf.Forms.PKCS7(pfxFilePath, password)
{
UseLtv = true,
TimestampSettings = new Aspose.Pdf.TimestampSettings("http://freetsa.org/tsr", string.Empty, Aspose.Pdf.DigestHashAlgorithm.Sha256)
};
// Sign PDF file
fileSign.Sign(1, false, rect, signature);
// Save PDF document
fileSign.Save(dataDir + "SignPdfWithSha256_out.pdf");
}
}
Теперь Aspose.PDF for .NET поддерживает загрузку документов из одного из самых популярных форматов документов, Portable Document Format (PDF) версии 2.0.
private static void EncriptPdfNonlatinPassCharacters()
{
// The path to the documents directory
var dataDir = RunExamples.GetDataDir_AsposePdf_SecuritySignatures();
using (var fileSecurity = new Aspose.Pdf.Facades.PdfFileSecurity())
{
// Bind PDF document
fileSecurity.BindPdf(dataDir + "input.pdf");
// Encrypt file using 256-bit encryption
bool isSuccessful = fileSecurity.EncryptFile("æøå", "æøå", Aspose.Pdf.Facades.DocumentPrivilege.Print,
Aspose.Pdf.Facades.KeySize.x256, Aspose.Pdf.Facades.Algorithm.AES);
Console.WriteLine(isSuccessful);
// Save PDF document
fileSecurity.Save(dataDir + "PdfNonlatinPassEncrypted_out.pdf");
}
}
Пожалуйста, используйте TextState.Invisible, чтобы получить информацию о невидимости текста вне настройки режима рендеринга.
Мы использовали следующий код для тестирования:
private static void DisplayTextInvisibility()
{
// The path to the documents directory
var dataDir = RunExamples.GetDataDir_AsposePdf_Text();
// Open PDF document
using (var document = new Aspose.Pdf.Document(dataDir + "PdfWithHiddenText.pdf"))
{
Console.WriteLine(document.FileName);
// Use TextFragmentAbsorber with no parameters to get all text
var absorber = new Aspose.Pdf.Text.TextFragmentAbsorber();
absorber.Visit(document.Pages[1]);
var textFragmentCollection = absorber.TextFragments;
// Iterate through text fragments to find hidden text
for (int i = 1; i <= textFragmentCollection.Count; i++)
{
var fragment = textFragmentCollection[i];
Console.WriteLine("Fragment {0} at {1}", i, fragment.Rectangle.ToString());
Console.WriteLine("Text: {0}", fragment.Text);
Console.WriteLine("RenderingMode: {0}", fragment.TextState.RenderingMode.ToString());
Console.WriteLine("Invisibility: {0}", fragment.TextState.Invisible);
Console.WriteLine("---");
}
}
}
private static void GetPdfLayers()
{
// The path to the documents directory
var dataDir = RunExamples.GetDataDir_AsposePdf_Layers();
// Open PDF document
using (var document = new Aspose.Pdf.Document(dataDir + "PdfWithLayers.pdf"))
{
// Get layers from the first page
var layers = document.Pages[1].Layers;
// Save each layer to the output path
foreach (var layer in layers)
{
Console.WriteLine("Document {0} contains a layer named: {1} ", document.FileName, layer.Name);
}
}
}
Настройка цвета фона для внешнего вида подписи и цвета шрифта меток в области подписи с Aspose.PDF for .NET.
private static void SignPdfWithCustomColorsInAppearance(string pfxFilePath, string password)
{
// The path to the documents directory
var dataDir = RunExamples.GetDataDir_AsposePdf_SecuritySignatures();
// Instantiate PdfFileSignature object
using (var pdfFileSignature = new Aspose.Pdf.Facades.PdfFileSignature())
{
// Bind PDF document
pdfFileSignature.BindPdf(dataDir + "DigitallySign.pdf");
var rect = new System.Drawing.Rectangle(310, 45, 200, 50);
// Create PKCS#7 object for sign
var pkcs = new Aspose.Pdf.Forms.PKCS7(pfxFilePath, password);
// Set signature custom appearance
pkcs.CustomAppearance = new Aspose.Pdf.Forms.SignatureCustomAppearance()
{
// Set colors
ForegroundColor = Aspose.Pdf.Color.DarkGreen,
BackgroundColor = Aspose.Pdf.Color.LightSeaGreen,
};
// Sign PDF file
pdfFileSignature.Sign(1, true, rect, pkcs);
// Save PDF document
pdfFileSignature.Save(dataDir + "SignPdfWithCustomColorsInAppearance_out.pdf");
}
}
В версии 21.8 свойство ForegroundColor позволяет изменять цвет текста в цифровой подписи.
private static void SignPdfWithForegroundColorInAppearance(string pfxFilePath, string password)
{
// The path to the documents directory
var dataDir = RunExamples.GetDataDir_AsposePdf_SecuritySignatures();
// Instantiate PdfFileSignature object
using (var pdfSign = new Aspose.Pdf.Facades.PdfFileSignature())
{
// Bind PDF document
pdfSign.BindPdf(dataDir + "DigitallySign.pdf");
var rect = new System.Drawing.Rectangle(310, 45, 200, 50);
// Create PKCS#7 object for sign
var pkcs = new Aspose.Pdf.Forms.PKCS7(pfxFilePath, password);
// Set signature custom appearance
pkcs.CustomAppearance = new Aspose.Pdf.Forms.SignatureCustomAppearance()
{
// Set text color
ForegroundColor = Aspose.Pdf.Color.Green
};
// Sign PDF file
pdfSign.Sign(1, true, rect, pkcs);
// Save PDF document
pdfSign.Save(dataDir + "SignPdfWithForegroundInAppearance_out.pdf");
}
}
Чтобы добавить параметры XSL, нам нужно создать собственный XsltArgumentList и установить его как свойство в XslFoLoadOptions. Следующий фрагмент показывает, как использовать этот класс с образцами файлов, описанными выше.
private static void ConvertXslfoToPdfWithArgumentList()
{
// The path to the documents directory
var dataDir = RunExamples.GetDataDir_AsposePdf_DocumentConversion();
// Create convert options
var options = new Aspose.Pdf.XslFoLoadOptions(dataDir + "XSLFOToPdfInput.xslt");
// Example of using XsltArgumentList
options.XsltArgumentList = new XsltArgumentList();
options.XsltArgumentList.AddParam("isBoldName", "", "yes");
// Open PDF document
using (var document = new Aspose.Pdf.Document(dataDir + "XSLFOToPdfInput.xml", options))
{
// Save PDF document
document.Save(dataDir + "XslfoToPdfWithArgumentList_out.pdf");
}
}
С Aspose.PDF for .NET вы можете скрывать изображения, используя ImagePlacementAbsorber из документа:
private static void HideImageInPdf()
{
// The path to the documents directory
var dataDir = RunExamples.GetDataDir_AsposePdf_Images();
// Open PDF document
using (var document = new Aspose.Pdf.Document(dataDir + "ImagePlacement.pdf"))
{
// Create ImagePlacementAbsorber instance
var absorber = new Aspose.Pdf.ImagePlacementAbsorber();
// Load the images of the first page
document.Pages[1].Accept(absorber);
// Iterate through each image placement on the first page
foreach (var imagePlacement in absorber.ImagePlacements)
{
// Hide image
imagePlacement.Hide();
}
// Save PDF document
document.Save(dataDir + "HideImageInPdf_out.pdf");
}
}
Вы можете получить полный шрифт с префиксом с помощью свойства BaseFont для класса Font.
private static void DisplayFontFullNames()
{
// The path to the documents directory
var dataDir = RunExamples.GetDataDir_AsposePdf_WorkingDocuments();
// Open PDF document
using (var document = new Aspose.Pdf.Document(dataDir + "BreakfastMenu.pdf"))
{
// Get document fonts
var fonts = document.FontUtilities.GetAllFonts();
// Iterate through the fonts
foreach (var font in fonts)
{
// Show font names
Console.WriteLine($"font name : {font.FontName} BaseFont name : {font.BaseFont}");
}
}
}
Aspose.PDF 21.4 позволяет вам объединять изображения. Следующий фрагмент кода:
private static void MergeAsJpeg()
{
// The path to the documents directory
var dataDir = RunExamples.GetDataDir_AsposePdf_Images();
List<Stream> inputImagesStreams = new List<Stream>();
using (FileStream firstImageStream = new FileStream(dataDir + "aspose.jpg", FileMode.Open))
{
inputImagesStreams.Add(firstImageStream);
using (FileStream secondImageStream = new FileStream(dataDir + "aspose-logo.jpg", FileMode.Open))
{
inputImagesStreams.Add(secondImageStream);
// Invoke PdfConverter.MergeImages to perform merge
using (Stream inputStream = Aspose.Pdf.Facades.PdfConverter.MergeImages(inputImagesStreams,
Aspose.Pdf.Drawing.ImageFormat.Jpeg, Aspose.Pdf.Facades.ImageMergeMode.Vertical, 1, 1))
{
using (FileStream outputStream = new FileStream(dataDir + "Merge_out.jpg", FileMode.Create))
{
byte[] buffer = new byte[32768];
int read;
while ((read = inputStream.Read(buffer, 0, buffer.Length)) > 0)
{
outputStream.Write(buffer, 0, read);
}
}
}
}
}
}
Также вы можете объединить свои изображения в формате Tiff:
private static void MergeAsTiff()
{
// The path to the documents directory
var dataDir = RunExamples.GetDataDir_AsposePdf_Images();
List<Stream> inputImagesStreams = new List<Stream>();
using (FileStream firstImageStream = new FileStream(dataDir + "aspose.jpg", FileMode.Open))
{
inputImagesStreams.Add(firstImageStream);
using (FileStream secondImageStream = new FileStream(dataDir + "aspose-logo.jpg", FileMode.Open))
{
inputImagesStreams.Add(secondImageStream);
// Invoke PdfConverter.MergeImagesAsTiff to perform merge
using (Stream inputStream = Aspose.Pdf.Facades.PdfConverter.MergeImagesAsTiff(inputImagesStreams))
{
using (FileStream outputStream = new FileStream(dataDir + "Merge_out.tiff", FileMode.Create))
{
byte[] buffer = new byte[32768];
int read;
while ((read = inputStream.Read(buffer, 0, buffer.Length)) > 0)
{
outputStream.Write(buffer, 0, read);
}
}
}
}
}
}
С помощью следующего фрагмента кода вы сможете получить доступ к зашифрованному содержимому ваших PDF файлов, защищенных Azure Information Protection:
private static void AzureInformationProtection()
{
// The path to the documents directory
var dataDir = RunExamples.GetDataDir_AsposePdf_Attachments();
// Open PDF document
using (var document = new Aspose.Pdf.Document(dataDir + "GetAlltheAttachments.pdf"))
{
if (document.EmbeddedFiles[1].AFRelationship == Aspose.Pdf.AFRelationship.EncryptedPayload)
{
if (document.EmbeddedFiles[1].EncryptedPayload != null)
{
// document.EmbeddedFiles[1].EncryptedPayload.Type == "EncryptedPayload"
// document.EmbeddedFiles[1].EncryptedPayload.Subtype == "MicrosoftIRMServices"
// document.EmbeddedFiles[1].EncryptedPayload.Version == "2"
}
}
}
}
В этой версии Aspose.PDF функция стала доступна для извлечения цвета фона. Вам нужно указать searchOptions.SearchForTextRelatedGraphics = true; в параметрах объекта TextFragmentAbsorber.
Пожалуйста, рассмотрите следующий код:
private static void DisplayPdfTextBackgroundColor()
{
// The path to the documents directory
var dataDir = RunExamples.GetDataDir_AsposePdf_Text();
// Open PDF document
using (var document = new Aspose.Pdf.Document(dataDir + "PdfWithTextBackgroundColor.pdf"))
{
// Use TextFragmentAbsorber with no parameters to get all text
var textFragmentAbsorber = new Aspose.Pdf.Text.TextFragmentAbsorber();
var searchOptions = new Aspose.Pdf.Text.TextSearchOptions(false);
// Setting this option into the 'true' is necessary
searchOptions.SearchForTextRelatedGraphics = true;
textFragmentAbsorber.TextSearchOptions = searchOptions;
// Accept the absorber for all the pages
document.Pages.Accept(textFragmentAbsorber);
// Loop through the fragments
foreach (var textFragment in textFragmentAbsorber.TextFragments)
{
Console.WriteLine("Text: '{0}'", textFragment.Text);
Console.WriteLine("BackgroundColor: '{0}'", textFragment.TextState.BackgroundColor);
Console.WriteLine("ForegroundColor: '{0}'", textFragment.TextState.ForegroundColor);
Console.WriteLine("Segment BackgroundColor: '{0}'", textFragment.Segments[1].TextState.BackgroundColor);
}
}
}
Также в Aspose.PDF 21.1, после конвертации PDF в HTML, стали доступны встроенные шрифты в выходном HTML документе. Это возможно благодаря новой булевой опции сохранения HtmlSaveParameter.SaveFullFont.
Вот фрагмент кода:
private static void PdfToHtmlWithFullFont()
{
// The path to the documents directory
var dataDir = RunExamples.GetDataDir_AsposePdf_DocumentConversion();
// Open PDF document
using (var document = new Aspose.Pdf.Document(dataDir + "PDFToHTML.pdf"))
{
// Instantiate HTML SaveOptions object
var options = new Aspose.Pdf.HtmlSaveOptions
{
RasterImagesSavingMode = Aspose.Pdf.HtmlSaveOptions.RasterImagesSavingModes.AsEmbeddedPartsOfPngPageBackground,
PartsEmbeddingMode = Aspose.Pdf.HtmlSaveOptions.PartsEmbeddingModes.EmbedAllIntoHtml,
LettersPositioningMethod = Aspose.Pdf.HtmlSaveOptions.LettersPositioningMethods.UseEmUnitsAndCompensationOfRoundingErrorsInCss,
FontSavingMode = Aspose.Pdf.HtmlSaveOptions.FontSavingModes.AlwaysSaveAsTTF,
SaveTransparentTexts = true,
// New option
SaveFullFont = true
};
// Save HTML document
document.Save(dataDir + "PdfToHtmlWithFullFont_out.html", options);
}
}
Analyzing your prompt, please hold on...
An error occurred while retrieving the results. Please refresh the page and try again.