Apa yang baru
Apa yang baru di Aspose.PDF 25.12
Anotasi teks bebas dengan rotasi arbitrer di XFDF
Dukungan untuk sudut rotasi arbitrer telah ditambahkan pada anotasi Teks Bebas di XFDF, sehingga tata letak anotasi yang diimpor dan diekspor menjadi lebih fleksibel.
Document pdfDocument = new Document(inputPdf);
com.aspose.pdf.facades.PdfAnnotationEditor editor = new PdfAnnotationEditor();
editor.bindPdf(pdfDocument);
editor.importAnnotationsFromXfdf(inputXfdf);
editor.save(output);
Apa yang baru di Aspose.PDF 25.11
Peningkatan sanitasi data tersembunyi
Sanitasi PDF yang ditingkatkan kini tersedia melalui HiddenDataSanitizer untuk meningkatkan penghapusan konten tersembunyi dari dokumen.
Document document = new Document(pdfFile);
try
{
HiddenDataSanitizationOptions options = HiddenDataSanitizationOptions.all();
ImageCompressionOptions tmp = new ImageCompressionOptions();
tmp.setMaxResolution(30);
tmp.setResizeImages(true);
tmp.setCompressImages(true);
options.setImageCompressionOptions(tmp);
HiddenDataSanitizer sanitizer = new HiddenDataSanitizer(options);
sanitizer.sanitize(document);
document.save(getOutputPath("clear_all_resize_img.pdf"));
}
finally
{
document.close();
}
Pengurangan ukuran file yang ditingkatkan selama optimasi PDF
Optimasi PDF kini meningkatkan pengurangan ukuran file dengan memperbaiki cara penanganan subset font.
Document document = new Document(inputPath);
try {
OptimizationOptions tmp = new OptimizationOptions();
tmp.setSubsetFonts(true);
tmp.setAllowReusePageContent(true);
tmp.setCompressObjects(true);
tmp.setLinkDuplicateStreams(true);
tmp.setRemoveUnusedObjects(true);
tmp.setRemoveUnusedStreams(true);
tmp.setCompressAllContentStreams(true);
OptimizationOptions optimizeOptions = tmp;
document.optimizeResources(optimizeOptions);
document.save(outputPath);
} finally {
document.close();
}
Apa yang baru di Aspose.PDF 25.10
Dukungan konversi PDF ke PDF/E
Aspose.PDF for Java kini mendukung konversi dokumen PDF ke format PDF/E.
Document document = new Document(inputPdf);
document.convert(conversionLog, PdfFormat.PDF_E_1, ConvertErrorAction.Delete);
document.save(outputPdf);
Teks HTML dalam anotasi
Dukungan telah ditambahkan untuk menambahkan teks HTML di dalam anotasi.
Document pdf = new Document();
Page page = pdf.getPages().add();
DefaultAppearance da = new DefaultAppearance("Arial", 12, java.awt.Color.BLACK);
FreeTextAnnotation freeTextAnnot = new FreeTextAnnotation(page, new Rectangle(100, 600, 500, 700),
da);
freeTextAnnot.setRichText("<?xml version=\"1.0\"?><body xmlns=\"http://www.w3.org/1999/xhtml\" "
+ "xmlns:xfa=\"http://www.xfa.org/schema/xfa-data/1.0/\\\" xfa:APIVersion=\"Acrobat:11.0.23\" "
+ "xfa:spec=\"2.0.2\" style=\"font-size:12.0pt;color:#00eeff;font-weight:normal;font-style:normal;"
+ "font-family:Arial;font-stretch:normal\"><p dir=\"ltr\">1<p style=\"color:#00ff00;"
+ "font-style:italic\">2</p>3456</p></body>");
freeTextAnnot.getTextStyle().setColor(java.awt.Color.BLACK);
freeTextAnnot.getTextStyle().setFontName("Arial");
//freeTextAnnot.Contents = "This is a rich text";
freeTextAnnot.setModified(new Date());
freeTextAnnot.setColor(Color.getRed());
freeTextAnnot.getBorder().setWidth(0);
page.getAnnotations().add(freeTextAnnot);
pdf.save(getOutputPath("out1.pdf"));
Apa yang baru di Aspose.PDF 25.9
Plugin HTML ke PDF
Aspose.PDF for Java kini menyertakan Plugin Html ke Pdf untuk menyederhanakan alur kerja pemrosesan HTML-ke-PDF.
// Specify the input and output file paths.
String inputPath = "sample.pdf";
String outputPath = "sample.html";
// Create an instance of the PdfHtmlplugin.
PdfHtml converter = new PdfHtml();
// Create an instance of the HtmlToPdfOptionsclass.
HtmlToPdfOptions options = new HtmlToPdfOptions();
// Add the input and output file paths to the options.
options.addInput(new FileDataSource(inputPath));
options.addOutput(new FileDataSource(outputPath));
// Process the PDF to HTML conversion using the plugin and options.
ResultContainer htmlResultContainer = converter.process(options);
// Get the result from the result container.
IOperationResult result = htmlResultContainer.getResultCollectionInternal().get_Item(0);
Dukungan kepatuhan PDF 1.6
Dukungan untuk kepatuhan PDF 1.6 telah ditambahkan untuk skenario yang memerlukan versi dokumen ini.
Apa yang baru di Aspose.PDF 25.8
Dukungan gaya garis tabel
Dukungan untuk gaya border tabel telah ditambahkan untuk memberikan kontrol lebih besar atas tampilan tabel.
Document document = new Document();
try {
Page page = document.getPages().add();
GraphInfo tmp = new GraphInfo();
tmp.setDashArray(new int[]{10, 10});
tmp.setDashPhase(5);
tmp.setLineWidth(3);
Table tmp_1 = new Table();
tmp_1.setBorder(new BorderInfo(BorderSide.Box, tmp));
tmp_1.setDefaultCellBorder(new BorderInfo(BorderSide.Box, .05f, Color.getWhite()));
tmp_1.setDefaultCellPadding(new MarginInfo(4.5, 3, 4.5, 3));
tmp_1.getDefaultCellTextState().setFont(FontRepository.findFont("Arial"));
tmp_1.getDefaultCellTextState().setFontSize(10);
tmp_1.getDefaultCellTextState().setHorizontalAlignment(HorizontalAlignment.Left);
tmp_1.getDefaultCellTextState().setForegroundColor(Color.getBlack());
Table table1_allSidesSet = tmp_1;
page.getParagraphs().add(table1_allSidesSet);
for (int i = 0; i < 10; i++) {
Row newRow = table1_allSidesSet.getRows().add();
Cell cellLvl1 = newRow.getCells().add(String.valueOf(i));
}
Table tmp_2 = new Table();
tmp_2.setBorder(new BorderInfo(BorderSide.Box, 1));
tmp_2.setDefaultCellBorder(new BorderInfo(BorderSide.Box, 0.05f, Color.getWhite()));
tmp_2.setDefaultCellPadding(new MarginInfo(4.5, 3, 4.5, 3));
tmp_2.getDefaultCellTextState().setFont(FontRepository.findFont("Arial"));
tmp_2.getDefaultCellTextState().setFontSize(10);
tmp_2.getDefaultCellTextState().setHorizontalAlignment(HorizontalAlignment.Left);
tmp_2.getDefaultCellTextState().setForegroundColor(Color.getBlack());
//Style1 example
Table table2_onlyRightSideSet = tmp_2;
table2_onlyRightSideSet.getBorder().getRight().setDashArray(new int[]{5, 10});
table2_onlyRightSideSet.getBorder().getRight().setDashPhase(7);
page.getParagraphs().add(table2_onlyRightSideSet);
//Style2 example
// Table table3_roundCorner= tmp_2;
// table3_roundCorner.setCornerStyle(BorderCornerStyle.Round);
// table3_roundCorner.getBorder().setRoundedBorderRadius(15);
// page.getParagraphs().add(table3_roundCorner);
for (int i = 0; i < 10; i++) {
Row newRow = table2_onlyRightSideSet.getRows().add();
Cell cellLvl1 = newRow.getCells().add(String.valueOf(i));
}
document.save(output);
} finally {
if (document != null) {
document.close();
}
}
Ekstraksi teks ALT untuk gambar di PDF
Anda kini dapat memperoleh deskripsi teks ALT untuk gambar dalam dokumen PDF, yang membantu proses yang berorientasi pada aksesibilitas.
Document doc = new Document("input.pdf");
try {
// Create ImagePlacementAbsorber object to perform image placement search
ImagePlacementAbsorber abs = new ImagePlacementAbsorber();
// Accept the absorber for all the pages
doc.getPages().accept(abs);
// Loop through all ImagePlacements, get image and ImagePlacement Properties
ImagePlacement imagePlacement = abs.getImagePlacements().get_Item(1);
{
// Get the image using ImagePlacement object
XImage image = imagePlacement.getImage();
List<String> altTexts = image.getAlternativeText(imagePlacement.getPage());
System.out.println(altTexts.get(0));
}
} finally {
if (doc != null)
doc.close();
}
Apa yang baru di Aspose.PDF 25.7
Plugin PDF ChatGPT
Aspose.PDF for Java kini menyertakan Plugin PDF ChatGPT untuk skenario interaksi AI yang berfokus pada PDF.
Contoh ini menunjukkan cara menggunakan plugin PdfChatGpt dengan menambahkan file(s) sebagai sumber pesan:
PdfChatGpt plugin = new PdfChatGpt();
PdfChatGptRequestOptions options = new PdfChatGptRequestOptions();
options.addOutput(new FileDataSource("PdfChatGPT_output.pdf")); // Add the output file path.
// Add the PDF text source.
// In case of multiple sources, the text from each document will be added to the request message collection
// as a separate message with the role "user".
options.addInput(new FileDataSource("TextSource.pdf"));
options.setApiKey("Your API key."); // You need to provide the key to access the API.
options.setMaxTokens(1000); // The maximum number of tokens to generate in the chat completion.
// Add the request message.
// In this case, the system message with Content = "You are a helpful assistant." is added by default.
// The role of the query message is "user" by default.
options.setQuery("How many letters in the provided text?");
// Process the request.
ResultContainer result = plugin.process(options);
String fileResultPath = result.getResultCollection().get(0).getData().toString();
ChatCompletion chatCompletionObject = (ChatCompletion)result.getResultCollection().get(1).getData();
Contoh ini menunjukkan cara menggunakan plugin PdfChatGpt dengan menambahkan pesan ke permintaan:
PdfChatGpt plugin = new PdfChatGpt();
PdfChatGptRequestOptions options = new PdfChatGptRequestOptions();
options.addOutput(new FileDataSource("PdfChatGPT_output.pdf")); // Add the output file path.
options.setApiKey("Your API key."); // You need to provide the key to access the API.
options.setMaxTokens(1000); // The maximum number of tokens to generate in the chat completion.
// Add the request messages.
Message message1 = new Message() ;
message1.setContent("You are a helpful assistant.");
message1.setRole(Role.System);
options.getMessages().add(message1);
Message message2 = new Message() ;
message2.setContent("What is the biggest pizza diameter ever made?");
message2.setRole(Role.User);
options.getMessages().add(message2);
// Process the request.
ResultContainer result = plugin.process(options);
String fileResultPath = result.getResultCollection().get(0).getData().toString();
ChatCompletion chatCompletionObject = (ChatCompletion)result.getResultCollection().get(1).getData(); // The ChatGPT API chat completion object.
Contoh ini menunjukkan cara menggunakan plugin PdfChatGpt dengan menambahkan satu pesan ke permintaan:
PdfChatGpt plugin = new PdfChatGpt();
PdfChatGptRequestOptions options = new PdfChatGptRequestOptions();
options.addOutput(new FileDataSource("PdfChatGPT_output.pdf")); // Add the output file path.
options.setApiKey("Your API key."); // You need to provide the key to access the API.
options.setMaxTokens(1000); // The maximum number of tokens to generate in the chat completion.
// Add the request message.
// In this case, the system message with Content = "You are a helpful assistant." is added by default.
// The role of the query message is "user" by default.
options.setQuery("What is the lowest temperature recorded on the Earth?");
// Process the request.
ResultContainer result = plugin.process(options);
String fileResultPath = result.getResultCollection().get(0).getData().toString();
ChatCompletion chatCompletionObject = (ChatCompletion)result.getResultCollection().get(1).getData(); // The ChatGPT API chat completion object.
Apa yang baru di Aspose.PDF 25.6
PDF ke output DOCX telah ditingkatkan Formatting
Konversi PDF ke DOCX telah ditingkatkan untuk dokumen yang sebelumnya format outputnya tidak tepat.
Document doc = new Document(dataDir + "SD_Aspose.pdf");
DocSaveOptions saveOption = new DocSaveOptions();
saveOption.setMode(DocSaveOptions.RecognitionMode.EnhancedFlow);
saveOption.setFormat(DocSaveOptions.DocFormat.DocX);
saveOption.setRecognizeBullets(true);
doc.save(dataDir + "SD_Aspose.docx", saveOption);
Apa yang baru di Aspose.PDF 25.5
Mempertahankan gambar dalam konversi PDF ke ODS
Gambar kini dipertahankan saat mengonversi dokumen PDF ke ODS.
Document doc = new Document("input.pdf");
ExcelSaveOptions options = new ExcelSaveOptions();
options.setFormat(ExcelSaveOptions.ExcelFormat.ODS);
doc.save("output.ods", options);
Pembuatan tag otomatis selama konversi PDF ke PDF/A
Konversi PDF ke PDF/A kini mendukung pembuatan tag otomatis untuk meningkatkan hasil penandaan dalam dokumen keluaran.
Document document = new Document(dataDir+"source.pdf");
PdfFormat format = PdfFormat.PDF_A_1A;
PdfFormatConversionOptions options = new PdfFormatConversionOptions(format, ConvertErrorAction.Delete);
options.setAutoTaggingSettings(AutoTaggingSettings.getDefault());
document.convert(options);
document.save(dataDir+"out_"+BuildVersionInfo.ASSEMBLY_VERSION+"_"+format+"_"+document.getFileName());
document.close();
Apa yang baru di Aspose.PDF 25.4
Mempertahankan tautan hiper dalam konversi PDF ke XLSX
Tautan sekarang dipertahankan saat mengonversi dokumen PDF ke XLSX, meningkatkan navigasi dalam spreadsheet yang diekspor.
Document doc = new Document("input.pdf");
ExcelSaveOptions options = new ExcelSaveOptions();
doc.save("output.xlsx", options);
Apa yang baru di Aspose.PDF 25.3
Sejak 25.2 menambahkan kemampuan mendeteksi kompromi tanda tangan digital PDF. Anda dapat menggunakan kelas ‘SignaturesCompromiseDetector’ untuk memverifikasi tanda tangan digital terhadap kompromi. Panggil metode check() untuk memeriksa tanda tangan dokumen. Jika tidak ada kompromi tanda tangan yang terdeteksi, metode tersebut akan mengembalikan true. Untuk memverifikasi apakah tanda tangan yang ada mencakup seluruh dokumen, gunakan properti ‘SignaturesCoverage’.
void check(String pdfFile) {
final Document document = new Document(pdfFile);
try {
SignaturesCompromiseDetector detector = new SignaturesCompromiseDetector(document);
CompromiseCheckResult result = null;
CompromiseCheckResult[] referenceToResult = {result};
System.out.println(detector.check(referenceToResult));
if (detector.check(referenceToResult)){
System.out.println("No signature compromise detected");
}
result = referenceToResult[0];
System.out.println(SignaturesCoverage.PartiallySigned == result.getSignaturesCoverage());
System.out.println(result.hasCompromisedSignatures());
} finally {
if (document != null) {
(document).close();
}
}
}
Apa yang baru di Aspose.PDF 25.2
Sejak 25.2 menambahkan kemampuan mengonversi PDF ke format berkas PDF/X-4:
String iccProfile = "PSO_MFC_Paper_eci";
String outputConditionIdentifier = "FOGRA41";
String inputPdf= dataDir + "PDFToPDFX.pdf";
String outputPdf= dataDir + "PDFToPDFX_out.pdf";
PdfFormat format = PdfFormat.PDF_X_4;
Document document = new Document(inputPdf);
PdfFormatConversionOptions options = new PdfFormatConversionOptions(format, ConvertErrorAction.Delete);
options.setIccProfileFileName(dataDir + iccProfile + ".icc");
options.setOutputIntent(new OutputIntent(outputConditionIdentifier));
document.convert(options);
document.save(outputPdf);
Sejak versi 25.2, kini memungkinkan untuk meratakan tengah output HTML:
Document doc = new Document(dataDir + "pdf_sample.pdf");
// Instantiate HTML Save options object
HtmlSaveOptions newOptions = new HtmlSaveOptions();
// Enable option to embed all resources inside the HTML
newOptions.PartsEmbeddingMode = HtmlSaveOptions.PartsEmbeddingModes.EmbedAllIntoHtml;
// This is just optimization for IE and can be omitted
newOptions.LettersPositioningMethod = LettersPositioningMethods.UseEmUnitsAndCompensationOfRoundingErrorsInCss;
newOptions.RasterImagesSavingMode = HtmlSaveOptions.RasterImagesSavingModes.AsEmbeddedPartsOfPngPageBackground;
newOptions.FontSavingMode = HtmlSaveOptions.FontSavingModes.SaveInAllFormats;
newOptions.AntialiasingProcessing = HtmlSaveOptions.AntialiasingProcessingType.TryCorrectResultHtml;
newOptions.setSplitIntoPages(false);// force write HTMLs of all pages into one output document
newOptions.setUseZOrder(true);
com.aspose.pdf.SaveOptions.BorderPartStyle style = new com.aspose.pdf.SaveOptions.BorderPartStyle();
style.LineType = com.aspose.pdf.SaveOptions.HtmlBorderLineType.Solid;
style.color = java.awt.Color.BLACK;
style.setWidthInPoints(1);
newOptions.PageBorderIfAny = new com.aspose.pdf.SaveOptions.BorderInfo(style);
doc.save(dataDir + "HTML_19.6.html", newOptions);
Selain itu, sejak versi 25.2, kini dimungkinkan untuk mendapatkan nilai ascent dan descent dari sebuah teks dengan font dan ukuran menggunakan Aspose.PDF. Fitur baru ini telah diimplementasikan ke dalam kelas ‘com.aspose.pdf.Font’.
Metode yang ditambahkan:
Mengukur Titik Ascent Maksimum
-public double getAscentPoint(String str, float fontSize)
Mengukur Titik Descent Maksimum
- public double getDescentPoint(String str, float fontSize)
String someText = "Testing text";
float fontSize = 10;
TextFragment tf = new TextFragment(someText);
Font f1 = tf.getTextState().getFont();
double getWidthPoint = f1.measureString(someText, fontSize);
double getAscentPoint = f1.getAscentPoint(someText, fontSize);
double getDescentPoint = f1.getDescentPoint(someText, fontSize);
System.out.println(f1.getFontName());
System.out.println(getWidthPoint);
System.out.println(getAscentPoint);
System.out.println(getDescentPoint);
Apa yang baru di Aspose.PDF 25.1
Kemampuan untuk melewatkan jalur ke profil ICC eksternal untuk konversi PDF/X dan PDF/A sudah ada dalam pustaka selama beberapa tahun, diaktifkan oleh properti PdfFormatConversionOptions.IccProfileFileName. Sekarang juga memungkinkan untuk melewatkan data guna mengisi properti OutputIntent menggunakan objek kelas OutputIntent.
Cuplikan berikut menunjukkan cara mengonversi dokumen anotasi ke PDF/X-1 menggunakan profil ICC anotasi FOGRA39:
String iccProfile = "Coated_Fogra39L_VIGC_300.icc";
String outputConditionIdentifier = "FOGRA39";
Document pdfDocument = new Document("58191_1.pdf");
try {
PdfFormatConversionOptions options = new PdfFormatConversionOptions("log.log", PdfFormat.PDF_X_1A, ConvertErrorAction.Delete);
options.setIccProfileFileName(iccProfile);
options.setOutputIntent(new OutputIntent(outputConditionIdentifier));
pdfDocument.convert(options);
pdfDocument.save("42686_1_PDF_X_1A.pdf");
} finally {
if (pdfDocument != null) {
pdfDocument.dispose();
}
}
Sejak 25.1 menambahkan kemampuan untuk memperoleh informasi tentang hak istimewa saat menggunakan dokumen:
Document document = new Document();
document.getPages().add();
try
{
PdfFileInfo info = new PdfFileInfo();
info.bindPdf(document);
DocumentPrivilege privilege = info.getDocumentPrivilege();
System.out.println(2 == privilege.getCopyAllowLevel());
System.out.println(2 == privilege.getPrintAllowLevel());
System.out.println(-1 == privilege.getChangeAllowLevel());
privilege.setCopyAllowLevel(0);
privilege.setCopyAllowLevel(1);
privilege.setCopyAllowLevel(2);
privilege.setPrintAllowLevel(0);
privilege.setPrintAllowLevel(1);
privilege.setPrintAllowLevel(2);
privilege.setChangeAllowLevel(0);
privilege.setChangeAllowLevel(1);
privilege.setChangeAllowLevel(2);
privilege.setChangeAllowLevel(3);
privilege.setChangeAllowLevel(4);
PdfFileSecurity fs = new com.aspose.pdf.facades.PdfFileSecurity(document, dataDir + "out_new_Doc"+version+".pdf");
fs.setPrivilege(privilege);
}
finally {
if (document != null) document.dispose();
}
Apa yang baru di Aspose.PDF 24.12
Sejak versi 24.12, telah memungkinkan dukungan untuk karakter pasangan surrogate.
Istilah ‘surrogate pair’ mengacu pada pengkodean karakter Unicode dengan titik kode tinggi dalam skema pengkodean UTF-16.
String surrogate_pair = "рџЊ‰";
System.out.println(surrogate_pair.length());//==2
Document doc = new Document();
Page p = doc. getPages().add();
//add the path to the required fonts that contains surrogate pair characters
FontRepository.addLocalFontPath("C:\\Fonts\\Noto_Emoji");
Font f = FontRepository.findFont("Noto Emoji");
System.out.println(f.doesFontContainAllCharacters(surrogate_pair));
TextFragment textFragment = new TextFragment();
TextSegment segment = new TextSegment(surrogate_pair);
segment.getTextState().setFont(f);
textFragment.setText(surrogate_pair);
textFragment.getSegments().add(segment);
p.getParagraphs().add(textFragment);
doc.save(dataDir + "out_24_11_.pdf");
Sejak versi 24.12, kini memungkinkan untuk mengonversi dokumen PDF ke PDF/A-4. Bagian 4 dari standar, yang berbasis pada PDF 2.0, diterbitkan pada akhir 2020.
Potongan kode berikut menunjukkan cara mengonversi dokumen ke format PDF/A-4 ketika dokumen masukan merupakan versi PDF yang lebih lama dari 2.0.
Document document = new Document(inputPdf);
// Only PDF-2.x documents can be converted to PDF/A-4
document.convert("log1.xml", PdfFormat.v_2_0, ConvertErrorAction.Delete);
document.save(tmpOutputFile);
document = new Document(tmpOutputFile);
document.convert("log2.xml", PdfFormat.PDF_A_4, ConvertErrorAction.Delete);
document.save("output.pdf");
Apa yang baru di Aspose.PDF 24.9
Pada rilis ini memungkinkan untuk membuat PDF yang dapat diakses menggunakan fungsi tingkat rendah:
Potongan kode berikut bekerja dengan dokumen PDF dan konten bertagnya, memanfaatkan pustaka Aspose.PDF untuk memprosesnya.
//Create template document with simple text
Document documentTemp = new Document();
Page page = documentTemp .getPages().add();
TextFragment fragment = new TextFragment("Helloworld");
page.getParagraphs().add(fragment);
documentTemp .save(output);
//Add tag to the text in the document
Document document = new Document(output);
OperatorCollection operators = document.getPages().get_Item(1).getContents();
for (int i = 1; i <= operators.size(); i++) {
Operator op = operators.get_Item(i);
if (op instanceof BT) {
BDC bdc = new BDC("P", new BDCProperties(new Integer[]{1}, "ru", "Hello world"));
operators.insert(i - 1, bdc);
i += 1;
}
if (op instanceof ET) {
operators.insert(i + 1, new EMC());
i += 1;
}
}
ITaggedContent content = document.getTaggedContent();
SpanElement span = content.createSpanElement();
content.getRootElement().appendChild(span);
for (Operator op : operators) {
if (op instanceof BDC) {
BDC bdc = (BDC)op;
if (bdc != null) {
span.tag(bdc);
}
}
}
document.save(output);
Kelas GraphicalPdfComparer ditambahkan untuk perbandingan grafis dokumen dan halaman PDF. Perbandingan grafis menangani gambar halaman dokumen. Ia mengembalikan hasil sebagai objek ImagesDifference atau sebagai dokumen PDF yang berisi gambar yang digabungkan dari yang asli dan perbedaannya. Perbandingan grafis paling berguna untuk dokumen yang memiliki perbedaan kecil pada teks atau konten grafis.
Potongan kode berikut menunjukkan perbandingan grafis dua dokumen PDF dan menyimpan gambar dengan perbedaan ke dalam dokumen PDF yang dihasilkan:
GraphicalPdfComparer comparer = new GraphicalPdfComparer();
comparer.setThreshold(3.0);
comparer.setColor(Color.getRed());
comparer.setResolution(new Resolution(300));
Document doc1 = new Document(dataDir+"graph_compare.pdf");
Document doc2 = new Document(dataDir+"graph_compare_.pdf");
comparer.compareDocumentsToPdf(doc2, doc1, dataDir+"graph_compare_24_9__.pdf");
doc1.close();
doc2.close();
Apa yang baru di Aspose.PDF 24.8
Sejak versi 24.8, dukungan untuk format PDF/A-4:
Document document = new Document(inputPdf);
// Only PDF-2.x documents can be converted to PDF/A-4
document.convert(new ByteArrayOutputStream(), PdfFormat.v_2_0, ConvertErrorAction.Delete);
boolean converted = document.convert(logFile, PdfFormat.PDF_A_4, ConvertErrorAction.Delete);
document.save(outputFile);
Selain itu, apakah memungkinkan menambahkan teks alternatif untuk Image Stamp:
Properti AlternativeText telah ditambahkan ke ImageStamp - jika nilai diberikan kepadanya, maka saat menambahkan ImageStamp ke dokumen akan memiliki Teks Alternatif.
String p1_Alt1 = "*** page 1, Alt text 1 ***",
p1_Alt2 = "*** page 1, Alt text 2 ***",
p2_Alt1 = "--- page 1, Alt text 1 ---",
p2_Alt2 = "--- page 1, Alt text 2 ---";
StructTreeRootElement structTreeRoot = document.getTaggedContent().getStructTreeRootElement();
ImageStamp imageStamp = new ImageStamp(dataDir + "test.jpg");
imageStamp.setXIndent(100);
imageStamp.setYIndent(700);
imageStamp.setWidth(50);
imageStamp.setHeight(50);
imageStamp.setQuality(100);
imageStamp.setAlternativeText(p1_Alt1);
// To page 1
document.getPages().get_Item(1).addStamp(imageStamp);
imageStamp.setYIndent(500);
imageStamp.setAlternativeText(p1_Alt2);
document.getPages().get_Item(1).addStamp(imageStamp);
// To page 2
document.getPages().add();
imageStamp.setXIndent(400);
imageStamp.setYIndent(700);
imageStamp.setWidth(50);
imageStamp.setHeight(50);
imageStamp.setAlternativeText(p2_Alt1);
document.getPages().get_Item(2).addStamp(imageStamp);
imageStamp.setYIndent(500);
imageStamp.setAlternativeText(p2_Alt2);
document.getPages().get_Item(2).addStamp(imageStamp);
// Save document
document.save(outFile);
Selain itu, kode berikut menunjukkan cara menambahkan AlternativeText pada gambar yang ada di FigureElements.
String inFile = dataDir + "46040.pdf";
String outFile = dataDir + "46040_1_out.pdf";
Document document = new Document(inFile);
ITaggedContent taggedContent = document.getTaggedContent();
StructureElement rootElement = taggedContent.getRootElement();
Iterator tmp0 = (rootElement.getChildElements()).iterator();
while (tmp0.hasNext())
{
com.aspose.pdf.tagged.logicalstructure.elements.Element element = (com.aspose.pdf.tagged.logicalstructure.elements.Element)tmp0.next();
if (element instanceof com.aspose.pdf.tagged.logicalstructure.elements.FigureElement)
{
com.aspose.pdf.tagged.logicalstructure.elements.FigureElement figureElement = (com.aspose.pdf.tagged.logicalstructure.elements.FigureElement)element;
// Set Alternative Text
figureElement.setAlternativeText("Figure alternative text (technique 1)");
}
}
// Save document
document.save(outFile);
Apa yang baru di Aspose.PDF 24.7
Sejak rilis 24.7, sebagai bagian dari penyuntingan PDF yang ditandai, telah ditambahkan metode pada Aspose.Pdf.LogicalStructure.Element:
- Tag (tambahkan tag ke operator tertentu seperti gambar, teks, dan tautan)
- InsertChild
- RemoveChild
- ClearChilds
Metode-metode ini memungkinkan Anda mengedit tag file PDF, misalnya:
Document document = new Document(dataDir + "test.pdf");
// Retrieve the first page of the document.
Page page = document.getPages().get_Item(1);
// Initialize variables to hold BDC (Begin Dictionary Context) elements for different purposes.
BDC imageBdc = null;
BDC pBdc = null;
BDC link1Bdc = null;
BDC link2Bdc = null;
BDC helloBdc = null;
// Iterate through the contents of the page.
for (int i = 1; i <= page.getContents().size(); i++)
{
// Get the current operator from the page contents.
Operator op = page.getContents().get_Item(i);
// Check if the operator is an instance of BDC.
if (op instanceof BDC) {
BDC bdc = (BDC)op; // Cast the operator to BDC type.
if (bdc != null)
{
// Check if the MCID (Mark Content Identifier) of the BDC is 0.
if (bdc.getProperties().getMCID()[0] != null && bdc.getProperties().getMCID()[0] == 0)
{
helloBdc = bdc; // Store the BDC for later use.
}
}
}
// Check if the operator is an instance of Do (Draw Object).
if (op instanceof Do) {
Do doXobj = (Do)op; // Cast the operator to Do type.
if (doXobj != null)
{
// Create a new BDC for an image and insert it into the page contents.
imageBdc = new BDC("Figure");
page.getContents().insert(i - 2, imageBdc); // Insert before the current operator.
i++; // Increment the index to account for the inserted BDC.
page.getContents().insert(i + 1, new EMC()); // Insert an EMC (End Mark Content).
i++; // Increment the index again.
}
}
// Check if the operator is an instance of TextShowOperator (for text display).
if (op instanceof TextShowOperator) {
TextShowOperator tx = (TextShowOperator)op; // Cast the operator to TextShowOperator type.
if (tx != null)
{
// Check for specific text content and insert corresponding BDCs.
if (tx.getText().contains("efter Ukendt forfatter er licenseret under"))
{
pBdc = new BDC("P");
page.getContents().insert(i - 1, pBdc); // Insert before the current operator.
i++; // Increment the index.
page.getContents().insert(i + 1, new EMC()); // Insert an EMC.
i++; // Increment the index.
}
if (tx.getText().contains("CC"))
{
link1Bdc = new BDC("Link");
page.getContents().insert(i - 1, link1Bdc); // Insert before the current operator.
i++; // Increment the index.
page.getContents().insert(i + 1, new EMC()); // Insert an EMC.
i++; // Increment the index.
}
if (tx.getText().contains("Dette billede"))
{
link2Bdc = new BDC("Link");
page.getContents().insert(i - 1, link2Bdc); // Insert before the current operator.
i++; // Increment the index.
page.getContents().insert(i + 1, new EMC()); // Insert an EMC.
i++; // Increment the index.
}
}
}
}
// Retrieve the tagged content from the document.
ITaggedContent tagged = document.getTaggedContent();
// Process the tagged content to modify structure attributes.
// Get the first child element of the root element in the tagged content.
com.aspose.pdf.tagged.logicalstructure.elements.Element p = tagged.getRootElement().getChildElements().get_Item(1);
p.clearChilds(); // Clear existing child elements.
// Tag the helloBdc with the parent structure element.
MCRElement mcr = p.tag(helloBdc);
// Create and set structure attributes for the tagged element.
StructureAttributes attrs = com.aspose.pdf.tagged.logicalstructure.elements.InternalHelper.getParentStructureElement(mcr)
.getAttributes().createAttributes(AttributeOwnerStandard.Layout);
StructureAttribute attr = new StructureAttribute(AttributeKey.SpaceAfter);
attr.setNumberValue(30.625); // Set space after attribute.
attrs.setAttribute(attr); // Apply the attribute to the structure.
// Create a new FigureElement in the tagged content.
com.aspose.pdf.tagged.logicalstructure.elements.FigureElement figure = tagged.createFigureElement();
tagged.getRootElement().insertChild(figure, 2); // Insert the figure element at the second position.
figure.setAlternativeText("A fly."); // Set alternative text for the figure.
// Tag the imageBdc with the figure element.
MCRElement mcr = figure.tag(imageBdc);
// Retrieve the parent structure element of the specified MCR (Marked Content Reference)
StructureAttributes attrs = com.aspose.pdf.tagged.logicalstructure.elements.InternalHelper.getParentStructureElement(mcr)
.getAttributes().createAttributes(AttributeOwnerStandard.Layout);
// Create a new StructureAttribute for space after the element
StructureAttribute spaceAfter = new StructureAttribute(AttributeKey.SpaceAfter);
spaceAfter.setNumberValue(3.625); // Set the space after value to 3.625 units
attrs.setAttribute(spaceAfter); // Assign the space after attribute to the structure attributes
// Create a new StructureAttribute for bounding box (BBox)
StructureAttribute bbox = new StructureAttribute(AttributeKey.BBox);
bbox.setArrayNumberValue(new Double[][] { new Double[] { (71.9971) }, new Double[] { (375.839) }, new Double[] { (523.299) }, new Double[] { (714.345) } });
// Set the bounding box values for the structure attribute
attrs.setAttribute(bbox); // Assign the bounding box attribute to the structure attributes
// Create a new StructureAttribute for placement
StructureAttribute placement = new StructureAttribute(AttributeKey.Placement);
placement.setNameValue(AttributeName.Placement_Block); // Set the placement type to block
attrs.setAttribute(placement); // Assign the placement attribute to the structure attributes
// Retrieve the fourth child element from the root element of the tagged structure
StructureElement p2 = (StructureElement)tagged.getRootElement().getChildElements().get_Item(3);
p2.clearChilds(); // Clear any existing child elements from p2
// Create a new SpanElement to be added to p2
SpanElement span1 = tagged.createSpanElement();
// Create structure attributes for the span element
StructureAttributes attrs = span1.getAttributes().createAttributes(AttributeOwnerStandard.Layout);
// Create a new StructureAttribute for text decoration type
StructureAttribute textDecorationType = new StructureAttribute(AttributeKey.TextDecorationType);
textDecorationType.setNameValue(AttributeName.TextDecorationType_Underline); // Set text decoration to underline
attrs.setAttribute(textDecorationType); // Assign the text decoration type attribute to the structure attributes
// Create a new StructureAttribute for text decoration thickness
StructureAttribute textDecorationThickness = new StructureAttribute(AttributeKey.TextDecorationThickness);
textDecorationThickness.setNumberValue(0); // Set the thickness of the text decoration to 0
attrs.setAttribute(textDecorationThickness); // Assign the text decoration thickness attribute to the structure attributes
// Create a new StructureAttribute for text decoration color
StructureAttribute textDecorationColor = new StructureAttribute(AttributeKey.TextDecorationColor);
textDecorationColor.setArrayNumberValue(new Double[][] { new Double[] { (0.0196075) }, new Double[] { (0.384308) }, new Double[] { (0.756866) } });
// Set the RGB color values for the text decoration
attrs.setAttribute(textDecorationColor); // Assign the text decoration color attribute to the structure attributes
p2.appendChild(span1); // Append the span1 element to p2
// Create a new MCR element and tag it with pBdc
MCRElement mcr = p2.tag(pBdc);
// Retrieve the parent structure element of the MCR and create layout attributes
StructureAttributes attrs = com.aspose.pdf.tagged.logicalstructure.elements.InternalHelper.getParentStructureElement(mcr)
.getAttributes().createAttributes(AttributeOwnerStandard.Layout);
// Create a new StructureAttribute for text alignment
StructureAttribute textAlign = new StructureAttribute(AttributeKey.TextAlign);
textAlign.setNameValue(AttributeName.TextAlign_Center); // Set text alignment to center
attrs.setAttribute(textAlign); // Assign the text alignment attribute to the structure attributes
// Create a new StructureAttribute for space after the element
StructureAttribute spaceAfter = new StructureAttribute(AttributeKey.SpaceAfter);
spaceAfter.setNumberValue(21.75); // Set the space after value to 21.75 units
attrs.setAttribute(spaceAfter); // Assign the space after attribute to the structure attributes
// Create a new SpanElement to be added to p2
SpanElement span2 = tagged.createSpanElement();
// Create structure attributes for the span element
StructureAttributes attrs = span2.getAttributes().createAttributes(AttributeOwnerStandard.Layout);
// Create a new StructureAttribute for text decoration type
StructureAttribute textDecorationType = new StructureAttribute(AttributeKey.TextDecorationType);
textDecorationType.setNameValue(AttributeName.TextDecorationType_Underline); // Set text decoration to underline
attrs.setAttribute(textDecorationType); // Assign the text decoration type attribute to the structure attributes
// Create a new StructureAttribute for text decoration color using the specified key.
StructureAttribute textDecorationColor = new StructureAttribute(AttributeKey.TextDecorationColor);
// Set the array number value for the text decoration color attribute.
// The color is represented in an array of RGB values, where each value is a Double.
textDecorationColor.setArrayNumberValue(new Double[][] {
new Double[] { (0.0196075) }, // Red component
new Double[] { (0.384308) }, // Green component
new Double[] { (0.756866) } // Blue component
});
// Set the text decoration color attribute to the attrs object.
attrs.setAttribute(textDecorationColor);
// Append a child span element to the parent element p2.
p2.appendChild(span2);
// Create a new LinkElement instance for the second link.
LinkElement link2 = tagged.createLinkElement();
// Assign a unique ID to the link element using a randomly generated UUID.
link2.setId(UUID.randomUUID().toString());
// Append the link2 element as a child of span2.
span2.appendChild(link2);
// Tag the link2 element with the corresponding annotation from the page's annotations.
link2.tag(page.getAnnotations().get_Item(1));
// Tag the link2 element with additional metadata or context (link2Bdc).
link2.tag(link2Bdc);
// Create another LinkElement instance for the first link.
LinkElement link1 = tagged.createLinkElement();
// Assign a unique ID to the link1 element using a randomly generated UUID.
link1.setId(UUID.randomUUID().toString());
// Append the link1 element as a child of span1.
span1.appendChild(link1);
// Tag the link1 element with the corresponding annotation from the page's annotations.
link1.tag(page.getAnnotations().get_Item(2));
// Tag the link1 element with additional metadata or context (link1Bdc).
link1.tag(link1Bdc);
// Remove the first child element from the root element of the tagged document.
tagged.getRootElement().removeChild(0);
// Save the document to the specified output directory with the filename "_out.pdf".
document.save(dataDir + "_out.pdf");
Apa yang baru di Aspose.PDF 24.6
Sejak versi 24.6 Aspose.PDF for Java memungkinkan menandatangani PDF dengan java.security.cert.X509Certificate, java.security.PrivateKey:
Kode ini mengambil sertifikat dan kunci pribadi dari penyimpanan sertifikat, lalu menggunakannya untuk menerapkan tanda tangan digital pada halaman pertama dokumen PDF.
KeyStore trustStore = KeyStore.getInstance("Windows");
trustStore.load(null, null);
java.security.cert.X509Certificate certificate = (java.security.cert.X509Certificate) trustStore.getCertificate("ProfMoriarty");
PrivateKey key = (PrivateKey) trustStore.getKey("ProfMoriarty", null);
PdfFileSignature pdfSign = new PdfFileSignature(getInputPdf());
Signature signature = new ExternalSignature(certificate, key);
pdfSign.sign(1, "reasonTest", "contactTest", "locationTest", true, new java.awt.Rectangle(1, 691, 100, 100), signature);
pdfSign.save("PDFJAVA.pdf");
pdfSign.close();
Apa yang baru di Aspose.PDF 24.5
Sejak rilis 24.5, Plugin Editor Form telah diimplementasikan.
Cara Mengedit Form di PDF menggunakan Editor Form
- Atur kunci lisensi Anda
- Buat sebuah instans dari kelas
FormEditor, yang menyediakan metode untuk memanipulasi formulir PDF - Buat sebuah instans dari kelas FormEditorAddOptions, yang menentukan opsi untuk menambahkan bidang formulir ke dokumen PDF
- Tambahkan sumber file input dan sumber file output ke objek FormEditorAddOptions, menggunakan kelas FileDataSource yang mewakili jalur file atau aliran
- Panggil metode Process pada objek
FormEditor, dengan melewatkan objek FormEditorAddOptions sebagai parameter - Akses hasil menggunakan ResultContainer.resultCollection
// Specify the input and output paths for the PDF files.
String inputPath = "sample.pdf";
String outputPath = "out.pdf";
// Create an instance of the FormEditor plugin.
FormEditor pdfFormPlugin = new FormEditor();
// Create options for adding form fields.
ArrayList<FormFieldCreateOptions> options = new ArrayList<FormFieldCreateOptions>();
// Create a textbox form field.
FormTextBoxFieldCreateOptions tmp1 = new FormTextBoxFieldCreateOptions(1, new Rectangle(10, 600, 90, 610));
tmp1.setValue("TextBoxField");
tmp1.setColor(Color.getChocolate());
tmp1.setPartialName("TexBoxField");
options.add(tmp1);
// Create a combo box form field.
FormComboBoxFieldCreateOptions tmp2 = new FormComboBoxFieldCreateOptions(1, new Rectangle(310, 800, 350, 815));
tmp2.setColor(com.aspose.pdf.Color.getRed());
tmp2.setEditable(new Boolean[]{true});
tmp2.setDefaultAppearance(new DefaultAppearance("Arial Bold", 12, java.awt.Color.GREEN));
ArrayList<String> list1 = new ArrayList<String>();
list1.add("p1");
list1.add("p2");
list1.add("p3");
tmp2.setOptions(list1);
tmp2.setSelected(new Integer[]{2});
tmp2.setPartialName("ComboBoxField");
options.add(tmp2);
// Create a checkbox form field.
FormCheckBoxFieldCreateOptions tmp3 = new FormCheckBoxFieldCreateOptions(1, new Rectangle(10, 700, 90, 715));
tmp3.setValue("CheckBoxField 1");
tmp3.setPartialName("CheckBoxField_1");
tmp3.setColor(Color.getBlue());
options.add(tmp3);
// Create a checkbox form field.
FormCheckBoxFieldCreateOptions tmp4 = new FormCheckBoxFieldCreateOptions(1, new Rectangle(100, 700, 190, 715));
tmp4.setChecked(new Boolean[]{true});
tmp4.setValue("CheckBoxField 2");
tmp4.setDefaultAppearance(new DefaultAppearance("Arial Bold", 12, java.awt.Color.GREEN));
tmp4.setStyle(new Integer[]{BoxStyle.Cross});
options.add(tmp4);
// Create a checkbox form field.
FormCheckBoxFieldCreateOptions tmp5 = new FormCheckBoxFieldCreateOptions(1, new Rectangle(200, 700, 390, 715));
tmp5.setPartialName("CheckBoxField_3");
tmp5.setValue("CheckBoxField 3");
tmp5.setStyle(new Integer[]{BoxStyle.Star});
tmp5.setChecked(new Boolean[]{true});
tmp5.setTextHorizontalAlignment(new HorizontalAlignment[]{HorizontalAlignment.Center});
options.add(tmp5);
FormEditorAddOptions opt = new FormEditorAddOptions(options);
// Add input and output files to the options.
opt.addInput(new FileDataSource(inputPath));
opt.addOutput(new FileDataSource(outputPath));
// Process the form fields using the plugin.
ResultContainer results = pdfFormPlugin.process(opt);
Rilis ini memungkinkan kami bekerja dengan lapisan PDF. Misalnya:
- kunci lapisan PDF
- ekstrak elemen lapisan PDF
- ratakan PDF berlapis
- gabungkan Semua Lapisan di dalam PDF menjadi satu
Kunci lapisan PDF
Sejak rilis 24.5, Anda dapat membuka PDF, mengunci lapisan tertentu pada halaman pertama, dan menyimpan dokumen dengan perubahan tersebut. Ada dua metode baru dan satu properti yang ditambahkan:
Layer.Lock(); - Mengunci lapisan. Layer.Unlock(); - Membuka kunci lapisan. Layer.Locked; - Properti yang menunjukkan status kunci lapisan.
Document document = new Document(input);
Page page = document.getPages().get_Item(1);
Layer layer = page.getLayers().get(0);
layer.lock();
document.save(output);
Ekstrak elemen lapisan PDF
Pustaka Aspose.PDF for Java memungkinkan ekstraksi setiap lapisan dari halaman pertama dan menyimpan tiap lapisan ke file terpisah.
Untuk membuat PDF baru dari sebuah lapisan, gunakan potongan kode berikut:
Document document = new Document(inputPath);
java.util.List<Layer> layers = document.getPages().get_Item(1).getLayers();
for (Layer layer : layers)
{
layer.save(outputPath);
}
Ratakan lapisan PDF
Pustaka Aspose.PDF for Java membuka PDF, mengiterasi setiap lapisan pada halaman pertama, dan meratakan setiap lapisan, menjadikannya permanen pada halaman.
Document document = new Document(input);
Page page = document.getPages().get_Item(1);
for (Layer layer : page.getLayers())
{
layer.flatten(true);
}
document.save(output);
Metode Layer.flatten(boolean cleanupContentStream) menerima parameter boolean yang menentukan apakah akan menghapus penanda grup konten opsional dari aliran konten. Atur parameter cleanupContentStream ke false untuk mempercepat proses perataan.
Gabungkan Semua Lapisan dalam PDF menjadi satu
Pustaka Aspose.PDF for Java memungkinkan penggabungan semua lapisan PDF atau lapisan tertentu pada halaman pertama menjadi lapisan baru dan menyimpan dokumen yang diperbarui.
Dua metode telah ditambahkan untuk menggabungkan semua lapisan pada halaman:
- void mergeLayers(String newLayerName);
- void mergeLayers(String newLayerName, String newOptionalContentGroupId);
Parameter kedua memungkinkan penamaan ulang penanda grup konten opsional. Nilai defaultnya adalah “oc1” (/OC /oc1 BDC).
Document document = new Document(input);
Page page = document.getPages().get_Item(1);
page.mergeLayers("NewLayerName");
// Or page.mergeLayers("NewLayerName", "OC1");
document.save(output);
Apa yang baru di Aspose.PDF 24.4
Rilis ini memperkenalkan plugin Java untuk PDF:
- Form Flattener Plugin
FormFlattener pdfFormPlugin = new FormFlattener();
FormFlattenAllFieldsOptions opt = new FormFlattenAllFieldsOptions();
opt.addInput(new FileDataSource("sample.pdf"));
opt.addOutput(new FileDataSource("sample-flat.pdf"));
ResultContainer result = pdfFormPlugin.process(opt);
// Check result.
java.util.List < IOperationResult > resultCollectionInternal = result.getResultCollection();
- Form Ekspor
Rectangle rect = new com.aspose.pdf.Rectangle(0, 220, 600, 330);
// Plugin use.
FormExporter pdfFormPlugin = new FormExporter();
SelectField selectField = new SelectField() {
public boolean invoke(Field field) {
return field instanceof TextBoxField && field.getPageIndex() == 2 && rect.isInclude(field.getRect(), 0);
}
};
FormExporterValuesToCsvOptions opt = new FormExporterValuesToCsvOptions(selectField, ';');
opt.addInput(new FileDataSource(inputFileNameWithFields));
opt.addInput(new FileDataSource(getInputPath("document-1.pdf")));
opt.addInput(new FileDataSource(getInputPath("document-2.pdf")));
opt.addInput(new FileDataSource(getInputPath("document-3.pdf")));
opt.addOutput(new FileDataSource(getOutputPath("out.csv")));
ResultContainer result = pdfFormPlugin.process(opt);
// Check result.
System.out.println(result.getResultCollectionInternal().size() > 0);
System.out.println(result.getResultCollectionInternal().get_Item(0).isFile());
System.out.println(result.getResultCollectionInternal().get_Item(0).getData().toString());
- Plugin Penggabungan
String input1 = "sample.pdf";
String input2 = "sample.pdf";
String output = "TestMergeFileAndStream_ResultAsFile.pdf";
Merger merger = new Merger();
MergeOptions opt = new MergeOptions();
opt.addInput(new FileDataSource(input1));
opt.addInput(new StreamDataSource(new FileInputStream(input2)));
opt.addOutput(new FileDataSource(output));
ResultContainer results = merger.process(opt);
System.out.println(results.getResultCollection().size());
System.out.println(results.getResultCollection().get(0).isFile());
- Plugin Pengoptimal
Bagaimana mengurangi ukuran Dokumen PDF?
String input = "Test.pdf";
String output = "Optimized.pdf";
Optimizer optimizer = new Optimizer();
OptimizeOptions opt = new OptimizeOptions();
opt.addInput(new FileDataSource(input));
opt.addOutput(new FileDataSource(output));
optimizer.process(opt);
Bagaimana mengubah ukuran Dokumen PDF?
String input = "sample.pdf";
String output = "ResizeMain.pdf";
Optimizer organizer = new Optimizer();
ResizeOptions opt = new ResizeOptions();
opt.addInput(new FileDataSource(input));
opt.addOutput(new FileDataSource(output));
opt.setPageSize(PageSize.getA1());
organizer.process(opt);
Bagaimana memutar Dokumen PDF?
String input = "sample.pdf";
String output = "OptimizerRotateMain.pdf";
Optimizer optimizer = new Optimizer();
RotateOptions opt = new RotateOptions();
opt.addInput(new FileDataSource(input));
opt.addOutput(new FileDataSource(output));
opt.setRotation(Rotation.on90);
ResultContainer results = optimizer.process(opt);
Apa yang baru di Aspose.PDF 24.3
Mulai dari 24.3, terapkan pencarian melalui daftar frasa dalam TextFragmentAbsorber.
String[] expressions = new String[] {
//detect phone number
"\\b\\d{3}-\\d{3}-\\d{4}\\b",
//detect card number
"\\b(?:\\d[ -]*?){13,16}\\b"
};
Document document = new Document(input);
TextFragmentCollection newTextFragmentCollection = new TextFragmentCollection();
Pattern[] regexes = new Pattern[6];
for (int i = 0; i < expressions.length; i++) {
regexes[i] = Pattern.compile(expressions[i], Pattern.CASE_INSENSITIVE);
}
TextFragmentAbsorber newAbsorber = new TextFragmentAbsorber(regexes, new TextSearchOptions(true));
document.getPages().accept(newAbsorber);
HashMap < Pattern, TextFragmentCollection > map = newAbsorber.getRegexResults();
Fitur berikutnya adalah menambahkan kemampuan mengonversi tabel untuk konverter PDF ke Markdown.
Document doc = new Document(dataDir + "56201.pdf");
MarkdownSaveOptions saveOptions = new MarkdownSaveOptions();
doc.save(dataDir + "56201.md", saveOptions);
Apa yang baru di Aspose.PDF 24.2
Mulai dari 24.2, memungkinkan menambahkan Watermark di PDF dengan AcroForms. TextStamp cocok untuk digunakan dengan file AcroForm. Jika Anda menggunakan TextStamp untuk file XFA, teks akan digambar pada halaman seperti pada file PDF biasa (dapat dilihat di penampil PDF yang tidak dapat membaca file XFA, misalnya di peramban Chrome). Untuk menambahkan teks ke file XFA, harus diubah dalam file XFA pada internal XML.
String sourceName = dataDir + "551.3xfa.pdf";
String targetName = dataDir + "output_2_" + BuildVersionInfo.AssemblyVersion + ".pdf";
Document pdfDocument = new Document(sourceName);
XFA xfa = pdfDocument.getForm().getXFA();
String watermark =
"<subform>" +
"<draw rotate=\"90\" x=\"100px\" y=\"100px\">" +
"<value>" +
"<text>Sample Stamp</text>\n" +
"</value>" +
"<font typeface=\"Arial\" size=\"14px\" weight=\"bold\" posture=\"italic\">" +
"<fill>" +
"<color value=\"0,128,0\"/>" +
"</fill>" +
"</font>" +
"</draw>" +
"</subform>";
xfa.appendToTemplate("//tpl:pageArea", watermark);
pdfDocument.save(targetName);
pdfDocument.close();
Atur StateModel untuk Anotasi Kita dapat menggunakan setReviewState dan setMarkedState dari kelas MarkupAnnotation untuk mengatur status yang diperlukan. Semua anotasi markup memiliki opsi Set State yang tersedia.
// Open the source PDF document
Document pdfDocument = new Document();
pdfDocument.getPages().add();
// Create annotation
TextAnnotation textAnnotation = new TextAnnotation(pdfDocument.getPages().get_Item(1), new Rectangle(200,
400, 400, 600));
//Set annotation title
textAnnotation.setTitle("Sample Annotation Title");
//Set annotation subject
textAnnotation.setSubject("Sample Subject");
//Specify the annotation contents
textAnnotation.setContents("Sample contents for the annotation");
textAnnotation.setOpen(true);
textAnnotation.setIcon(TextIcon.Key);
com.aspose.pdf.Border border = new com.aspose.pdf.Border(textAnnotation);
border.setWidth(5);
border.setDash(new Dash(1, 1));
textAnnotation.setBorder(border);
String userName1 = "Aspose1";
textAnnotation.setReviewState(AnnotationState.Rejected, userName1);
textAnnotation.setRect(new Rectangle(200, 400, 400, 600));
//Add annotation in the annotations collection of the page
pdfDocument.getPages().get_Item(1).getAnnotations().add(textAnnotation);
pdfDocument.processParagraphs();
//Save the output file
pdfDocument.save(dataDir + "output_24_2_Rejected.pdf");
pdfDocument = new Document(dataDir + "output" + version + "3.pdf");
TextAnnotation textAnnotation2 = (TextAnnotation) pdfDocument.getPages().get_Item(1).getAnnotations().get_Item(1);
String userName2 = "Aspose2";
textAnnotation2.setReviewState(AnnotationState.Accepted, userName2);
pdfDocument.save(dataDir + "output_24_2_Rejected_and_Accepted.pdf");
Dari 24.2, terapkan konversi OFD ke PDF:
Document document = new Document(inputPath, new OfdLoadOptions());
document.save(outputPath);
Apa yang baru di Aspose.PDF 24.1
Dari rilis 24.1, terapkan konversi PDF ke Markdown:
final Document doc = new Document(inputPdfPath);
MarkdownSaveOptions saveOptions = new MarkdownSaveOptions();
saveOptions.setHeadingRecognitionStrategy(HeadingRecognitionStrategy.Outlines);
doc.save(markdownOutputFilePath, saveOptions);
Selain itu, pada 24.1 gangguan thread menggunakan InterruptMonitor telah diimplementasikan.
final InterruptMonitor monitor = new InterruptMonitor();
new Thread(new Runnable() {
public void run() {
InterruptMonitor.setThreadLocalInstance(monitor);
Document document = new Document();
try {
Page page = document.getPages().insert(1);
PageInfo pageInfo = page.getPageInfo();
pageInfo.setLandscape(true);
Table topicTable = new Table();
topicTable.setBorder(new BorderInfo(BorderSide.All, 0.5 f, Color.getBlack()));
topicTable.setDefaultCellBorder(new BorderInfo(BorderSide.All, 0.5 f, Color.getBlack()));
topicTable.setColumnWidths("5% 10% 5% 60% 10% 10%");
topicTable.setRepeatingRowsCount(1);
Row topicRow = topicTable.getRows().add();
topicRow.getCells().add("text");
topicRow.getCells().add("text");
topicRow.getCells().add("text");
topicRow.getCells().add("text");
topicRow.getCells().add("text");
topicRow.getCells().add("text");
//foreach to while statements conversion
Iterator tmp0 = (topicRow.getCells()).iterator();
while (tmp0.hasNext()) {
Cell cell = (Cell) tmp0.next();
cell.setVerticalAlignment(VerticalAlignment.Center);
cell.setAlignment(HorizontalAlignment.Center);
}
Row row2 = topicTable.getRows().add();
row2.getCells().add("text");
row2.getCells().add("text");
row2.getCells().add("text");
String LongText = "Lorem ipsum dolor sit amet, consectetuer adipiscing elit. Aenean commodo ligula eget dolor. Aenean massa. Cum sociis natoque penatibus et magnis dis parturient montes, nascetur ridiculus mus. Donec quam felis, ultricies nec, pellentesque eu, pretium quis, sem. Nulla consequat massa quis enim. Donec pede justo, fringilla vel, aliquet nec, vulputate eget, arcu. In enim justo, rhoncus ut, imperdiet a, venenatis vitae, justo. Nullam dictum felis eu pede mollis pretium. Integer tincidunt. Cras dapibus. Vivamus elementum semper nisi. Aenean vulputate eleifend tellus.";
row2.getCells().add(LongText);
row2.getCells().add("text");
row2.getCells().add("text");
page.getParagraphs().add(topicTable);
document.save(dataDir + "out" + version + ".pdf");
} catch (com.aspose.pdf.exceptions.OperationCanceledException ex) {
System.out.println("Interrupting the save thread at " + System.currentTimeMillis());
} finally {
if (document != null) {
document.close();
}
}
}
}).start();
System.out.println("Process is started thread at " + System.currentTimeMillis());
// The timeout should be less than the time required for full document save (without interruption).
Thread.sleep(500);
// Interrupt the process
monitor.interrupt();
System.out.println("Interrupted the save thread at " + System.currentTimeMillis());
Apa yang baru di Aspose.PDF 23.12
Formulir dapat ditemukan dan teks dapat diganti menggunakan potongan kode berikut:
Document document = new Document(input);
String expectedText = "This is a text added while creating new PDF in Kofx Power PDF Standard.";
XFormCollection forms = document.getPages().get_Item(1).getResources().getForms();
Iterator tmp0 = (forms).iterator();
while (tmp0.hasNext()) {
XForm form = (XForm) tmp0.next();
if ("Typewriter".equals(form.getIT()) && "Form".equals(form.getSubtype())) {
TextFragmentAbsorber absorber = new TextFragmentAbsorber();
absorber.visit(form);
Iterator tmp1 = (absorber.getTextFragments()).iterator();
while (tmp1.hasNext()) {
TextFragment fragment = (TextFragment) tmp1.next();
fragment.setText("");
}
}
}
document.save(output);
Atau, formulir dapat dihapus sepenuhnya:
Document document = new Document(input);
XFormCollection forms = document.getPages().get_Item(1).getResources().getForms();
//foreach to while statements conversion
Iterator tmp0 = (forms).iterator();
while (tmp0.hasNext()) {
XForm form = (XForm) tmp0.next();
if ("Typewriter".equals(form.getIT()) && "Form".equals(form.getSubtype())) {
String name = forms.getFormName(form);
forms.delete(name);
}
}
document.save(output);
Varian lain untuk menghapus formulir:
Document document = new Document(input);
XFormCollection forms = document.getPages().get_Item(1).getResources().getForms();
for (int i = 1; i <= forms.size(); i++) {
if ("Typewriter".equals(forms.get_Item(i).getIT()) && "Form".equals(forms.get_Item(i).getSubtype())) {
forms.delete(forms.get_Item(i).getName());
}
}
document.save(output);
- Semua formulir dapat dihapus menggunakan potongan kode berikut:
Document document = new Document(input);
XFormCollection forms = document.getPages().get_Item(1).getResources().getForms();
forms.clear();
document.save(output);
Apa yang baru di Aspose.PDF 23.11
Mulai rilis ini, memungkinkan menghapus teks tersembunyi dari file PDF:
Document document = new Document(inputFile);
TextFragmentAbsorber textAbsorber = new TextFragmentAbsorber();
textAbsorber.setTextReplaceOptions(new TextReplaceOptions(TextReplaceOptions.ReplaceAdjustment.None));
document.getPages().accept(textAbsorber);
msStringBuilder result = new msStringBuilder();
//foreach to while statements conversion
Iterator tmp0 = (textAbsorber.getTextFragments()).iterator();
while (tmp0.hasNext()) {
TextFragment fragment = (TextFragment) tmp0.next();
if (fragment.getTextState().isInvisible()) {
result.append(fragment.getText());
fragment.setText("");
}
}
document.save(outputFile);
Apa yang baru di Aspose.PDF 23.10
Pembaruan saat ini memperkenalkan tiga versi Penghapusan tag dari PDF yang ditandai.
- Hapus beberapa elemen node dari documentElement (elemen pohon akar):
Document document = new Document(inputPath);
RootElement structure = document.getLogicalStructure();
Element documentElement = structure.getChildren().get_Item(0);
Element structElement = (documentElement.getChildren().getCount() > 1) ? documentElement.getChildren().get_Item(1) : null;
documentElement.getChildren().remove(structElement);
// You can also delete the structElement itself
//if (structElement != null)
//{
// structElement.remove();
//}
document.save(outputPath);
- Hapus semua tag elemen yang ditandai dari dokumen, tetapi pertahankan elemen struktur:
Document document = new Document(inputPath);
RootElement structure = document.getLogicalStructure();
Element root= structure.getChildren().get_Item(0);
Queue<Element> queue = new ArrayDeque<Element>();
queue.add(root);
for (Element element : structure.getChildren() ) {
queue.add(element);
for (Element child : element.getChildren())
{
queue.add(child);
}
}
for (Element element:queue ) {
if (element instanceof TextElement || element instanceof FigureElement)
element.remove();
}
document.save(outputPath);
- Hapus semua tag:
Document document = new Document(inputPath);
RootElement structure = document.getLogicalStructure();
Element root = structure.getChildren().get_Item(0);
root.remove();
document.save(outputPath);
Kami telah menerapkan fitur baru untuk mengukur tinggi karakter. Gunakan kode berikut untuk mengukur tinggi sebuah karakter:
Document doc = new Document("input.pdf");
TextFragmentAbsorber absorber = new TextFragmentAbsorber();
absorber.visit(doc.getPages().get_Item(1));
double height = absorber.getTextFragments().get_Item(1).getTextState().measureHeight('h')
Catatan bahwa pengukuran didasarkan pada font yang disematkan dalam dokumen. Jika ada informasi untuk suatu dimensi yang hilang, metode ini mengembalikan 0.
Apa yang baru di Aspose.PDF 23.9
Dukungan mulai 23.9 untuk menghapus anotasi anak dari bidang yang dapat diisi.
contoh 1:
String input = "55343_1.pdf";
Document doc = new Document(input);
final String fieldName = "1 Vehicle Identification Number";
Field field = (Field) doc.getForm().get_Item(fieldName);
System.out.println(0 == field.size());
Rectangle rect = field.getRect();
doc.getForm().addFieldAppearance(field, 2, rect);
System.out.println(2 == field.size());
field = (Field) doc.getForm().get_Item(fieldName);
System.out.println(2 == field.size());
doc.getForm().removeFieldAppearance(field, 1);
System.out.println(0 == field.size());
field = (Field) doc.getForm().get_Item(fieldName);
System.out.println(0 == field.size());
contoh 2:
{
String option1 = "option 1";
String option2 = "option 2";
String outputPdf = "output.pdf";
final Document document = new Document();
try /*JAVA: was using*/ {
Page page = document.getPages().add();
CheckboxField checkbox = new CheckboxField(page, new Rectangle(50, 50, 70, 70));
// Set the first checkbox group option value
checkbox.setExportValue(option1);
checkbox.addOption(option2);
document.getForm().add(checkbox);
java.util.List < String > tmp0 = new ArrayList < String > ();
tmp0.add("Off");
tmp0.add(option1);
tmp0.add(option2);
System.out.println(collectionAssert_AreEqual(tmp0, checkbox.getAllowedStates()));
checkbox.setValue(option2);
WidgetAnnotation f = document.getForm().get_Item(1);
document.getForm().removeFieldAppearance((Field) f, 2);
checkbox = (CheckboxField) document.getForm().get_Item(1);
java.util.List < String > tmp1 = new java.util.ArrayList < String > ();
tmp1.add("Off");
tmp1.add(option1);
System.out.println(collectionAssert_AreEqual(tmp1, checkbox.getAllowedStates()));
document.save(outputPdf);
} finally {
if (document != null)(document).close();
}
}
public static boolean collectionAssert_AreEqual(java.util.List < String > value1,
java.util.List < String > value2) {
if (value1.size() == value2.size()) {
for (int i = 0; i < value1.size(); i++) {
if (!value1.get(i).equals(value2.get(i)))
return false;
}
} else {
return false;
}
return true;
}
Menambahkan gambar dengan ImageFilterType.Flate tidak mempertahankan transparansi.
Document document = new Document();
Page page = document.getPages().add();
FileInputStream stream = new FileInputStream(("55037_1.png"));
page.getResources().getImages().addWithImageFilterType(stream, ImageFilterType.Flate);
page.getContents().add(new GSave());
Rectangle rectangle = new Rectangle(413, 428, 548, 564);
Matrix matrix = new Matrix(
new double[] {
rectangle.getURX() - rectangle.getLLX(), 0, 0, rectangle.getURY() - rectangle.getLLY(), rectangle.getLLX(), rectangle.getLLY()
});
page.getContents().add(new ConcatenateMatrix(matrix));
XImage ximage = page.getResources().getImages().get_Item(page.getResources().getImages().size());
page.getContents().add(new Do(ximage.getName()));
page.getContents().add(new GRestore());
document.save(getOutputPath("55157.pdf"));
stream.close();
Apa yang baru di Aspose.PDF 23.8
Fungsi untuk mendeteksi Pembaruan Inkremen dalam dokumen PDF telah ditambahkan pada 23.8. Fungsi ini mengembalikan ’true’ bila dokumen disimpan dengan pembaruan inkremen, sebaliknya, mengembalikan ‘false’.
Document doc = new Document(dataDir+"PDF_Support_Tech_Note.pdf");
boolean not_updatedIncrementally = doc.hasIncrementalUpdate();
System.out.println(not_updatedIncrementally);
doc.getPages().add();
doc.saveIncrementally(dataDir+"PDF_updatedIncrementally.pdf");
doc = new Document(dataDir+"PDF_updatedIncrementally.pdf");
boolean updatedIncrementally = doc.hasIncrementalUpdate();
System.out.println(updatedIncrementally);
doc.close();
Fitur lain adalah Salin OutputIntents dari input PDF ke tujuan PDF.
Kami menambahkan properti publik baru Document.getOutputIntents() untuk memungkinkan akses ke intent keluaran dalam dokumen. Untuk sementara, hanya penggunaan intent keluaran yang sudah ada dalam beberapa dokumen yang didukung, pengguna tidak dapat membuat OutputIntent dari awal.
Document document1 = new Document(dataDir+"pdfa.pdf");
Document resultDocument = new Document();
resultDocument.getPages().add(document1.getPages());
for (OutputIntent intent : document1.getOutputIntents())
{
resultDocument.getOutputIntents().addItem(intent);
}
resultDocument.save(dataDir+"resultpath.pdf");
Dari dukungan Aspose.PDF 23.8 untuk menambahkan ekstraksi bentuk:
{
String input1 = getInputPdf("46298_1");
String input2 = getInputPdf("46298_2");
Document source = new Document(input1);
Document dest = new Document(input2);
Page destPage = dest.getPages().get_Item(1);
TextFragmentAbsorber tfAbsorber = new TextFragmentAbsorber();
tfAbsorber.visit(source.getPages().get_Item(1));
//foreach to while statements conversion
Iterator tmp0 = ( tfAbsorber.getTextFragments()).iterator();
while (tmp0.hasNext())
{
TextFragment textFragment = (TextFragment)tmp0.next();
System.out.println(textFragment.getText());
addTextImproved(destPage, textFragment);
}
ImagePlacementAbsorber imageAbsorber = new ImagePlacementAbsorber();
imageAbsorber.visit(source);
Iterator tmp1 = ( imageAbsorber.getImagePlacements()).iterator();
while (tmp1.hasNext())
{
ImagePlacement image = (ImagePlacement)tmp1.next();
destPage.addImage(image.getImage().toStream(), image.getRectangle());
}
GraphicsAbsorber vectorAbsorber = new GraphicsAbsorber();
vectorAbsorber.visit(source.getPages().get_Item(1));
Rectangle area = new Rectangle(90, 250, 300, 400);
dest.getPages().get_Item(1).addGraphics(vectorAbsorber.getElements(), area);
dest.save(getOutputPath("46298-out.pdf"));
}
private static void addTextImproved(Page page, TextFragment textFragment)
{
TextFragment local = new TextFragment();
local.setPosition(textFragment.getPosition());
// Recalculate a new position since page size differs the originl PDF
local.getPosition().setXIndent(textFragment.getPosition().getXIndent());//2.5 * 72;
double newPageHeight = page.getPageRect(true).getHeight();
double oldPageHeight = textFragment.getPage().getPageRect(true).getHeight();
local.getPosition().setYIndent(textFragment.getPosition().getYIndent());
local.setText(textFragment.getText());
local.getTextState().setFont(textFragment.getTextState().getFont());
local.getTextState().setFontSize(textFragment.getTextState().getFontSize());
local.getTextState().setFormattingOptions(textFragment.getTextState().getFormattingOptions());
local.getTextState().setForegroundColor(textFragment.getTextState().getForegroundColor());
TextBuilder textBuilder = new TextBuilder(page);
textBuilder.appendText(local);
}
Juga mendukung kemampuan mendeteksi Overflow saat menambahkan teks:
Document doc = new Document();
String paragraphContent = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras nisl tortor, efficitur sed cursus in, lobortis vitae nulla. Quisque rhoncus, felis sed dictum semper, est tellus finibus augue, ut feugiat enim risus eget tortor. Nulla finibus velit nec ante gravida sollicitudin. Morbi sollicitudin vehicula facilisis. Vestibulum ac convallis erat. Ut eget varius sem. Nam varius pharetra lorem, id ullamcorper justo auctor ac. Integer quis erat vitae lacus mollis volutpat eget et eros. Donec a efficitur dolor. Maecenas non dapibus nisi, ut pellentesque elit. Sed pellentesque rhoncus ante, a consectetur ligula viverra vel. Integer eget bibendum ante. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Curabitur elementum, sem a auctor vulputate, ante libero iaculis dolor, vitae facilisis dolor lorem at orci. Sed laoreet dui id nisi accumsan, id posuere diam accumsan.";
Rectangle rectangle = new Rectangle(100, 600, 500, 700, false);
TextParagraph paragraph = new TextParagraph();
TextFragment fragment = new TextFragment(paragraphContent);
paragraph.setVerticalAlignment(VerticalAlignment.Top);
paragraph.getFormattingOptions().setWrapMode(TextFormattingOptions.WordWrapMode.ByWords);
paragraph.setRectangle(rectangle);
boolean isFitRectangle = fragment.getTextState().isFitRectangle(paragraphContent, rectangle);
while (!isFitRectangle)
{
fragment.getTextState().setFontSize(fragment.getTextState().getFontSize() - 0.5f);
isFitRectangle = fragment.getTextState().isFitRectangle(paragraphContent, rectangle);
}
paragraph.appendLine(fragment);
TextBuilder builder = new TextBuilder(doc.getPages().add());
builder.appendParagraph(paragraph);
doc.save(output);
Apa yang baru di Aspose.PDF 23.7
Dari versi 23.7, dukung Penyesuaian Halaman Preset Dialog Cetak:
Document document = new Document();
document.getPages().add();
document.setPrintScaling(PrintScaling.None);//PrintScaling.Default
document.save(outputPdf);
Document documentOutput = new Document(outputPdf);
int printScaling = documentOutput.getPrintScaling();
System.out.println("PrintScaling: " + printScaling);
Apa yang baru di Aspose.PDF 23.6
Dari versi 23.6, dukung penambahan kemampuan mengatur judul halaman HTML, Epub.
kode untuk HTML:
HtmlSaveOptions options = new HtmlSaveOptions();
options.setFixedLayout(true);
options.setRasterImagesSavingMode(HtmlSaveOptions.RasterImagesSavingModes.AsEmbeddedPartsOfPngPageBackground);
options.setPartsEmbeddingMode(HtmlSaveOptions.PartsEmbeddingModes.EmbedAllIntoHtml);
options.setTitle("</title>NEW PAGE & TITILE</head>");
Document document = new Document(inputPath);
document.save(outPath, options);
kode untuk EPUB:
EpubSaveOptions epubSaveOptions = new EpubSaveOptions();
epubSaveOptions.setTitle("</title>NEW PAGE & TITILE</head>");
epubSaveOptions.setContentRecognitionMode(EpubSaveOptions.RecognitionMode.PdfFlow);
Document document = new Document(inputPath);
document.save(outPath, epubSaveOptions);
Dukungan mulai versi 23.6 untuk menyediakan API penempatan grafik vektor:
Document document = new Document(input);
VectorGraphicsAbsorber vectorAbsorber = new VectorGraphicsAbsorber();
vectorAbsorber.visit(document.getPages().get_Item(1));
SubPath subPath1 = vectorAbsorber.getSubPaths().get_Item(2);
SubPath subPath2 = vectorAbsorber.getSubPaths().get_Item(3);
SubPath subPath3 = vectorAbsorber.getSubPaths().get_Item(4);
Point point1 = new Point(subPath1.getPosition().getX() + 200, subPath1.getPosition().getY() - 100);
Point point2 = new Point(subPath2.getPosition().getX() + 200, subPath2.getPosition().getY() - 100);
Point point3 = new Point(subPath3.getPosition().getX() + 200, subPath3.getPosition().getY() - 100);
subPath1.setPosition(point1);
subPath2.setPosition(point2);
subPath3.setPosition(point3);
document.save(output);
Apa yang baru di Aspose.PDF 23.1
Dukungan versi 23.1 untuk membuat anotasi PrinterMark. Ditambahkan satu varian anotasi: ColorBarAnnotation.
Document doc = new Document();
Page page = doc.getPages().add();
page.setTrimBox(new com.aspose.pdf.Rectangle(20, 20, 580, 820));
Rectangle rectBlack = new com.aspose.pdf.Rectangle(100, 300, 300, 320);
Rectangle rectCyan = new com.aspose.pdf.Rectangle(200, 600, 260, 690);
Rectangle rectMagenta = new com.aspose.pdf.Rectangle(10, 650, 140, 670);
ColorBarAnnotation colorBarBlack = new ColorBarAnnotation(page, rectBlack);
ColorBarAnnotation colorBarCyan = new ColorBarAnnotation(page, rectCyan, ColorsOfCMYK.Cyan);
ColorBarAnnotation colorBaMagenta = new ColorBarAnnotation(page, rectMagenta);
colorBaMagenta.setColorOfCMYK(ColorsOfCMYK.Magenta);
ColorBarAnnotation colorBarYellow = new ColorBarAnnotation(page, new com.aspose.pdf.Rectangle(400, 250, 450, 700), ColorsOfCMYK.Yellow);
page.getAnnotations().add(colorBarBlack);
page.getAnnotations().add(colorBarCyan);
page.getAnnotations().add(colorBaMagenta);
page.getAnnotations().add(colorBarYellow);
doc.save("outFile.pdf");
Apa yang baru di Aspose.PDF 22.12
Dukungan pada rilis ini untuk mengonversi PDF ke Gambar DICOM:
DicomDevice device = new DicomDevice(PageSize.getA4());
Document doc = new Document("Input.pdf");
ByteArrayOutputStream stream = new ByteArrayOutputStream();
device.process(doc.getPages().get_Item(1), stream);
Apa yang baru di Aspose.PDF 22.9
Dukungan pada 22.09 menambahkan properti untuk mengubah urutan rubrik subjek (E=, CN=, O=, OU=,) ke dalam tanda tangan.
String inputPdf = getInputPath("input.pdf");
String inputPfx = getInputPath("input.pfx");
String outputPdf = getOutputPath("out.pdf");
final PdfFileSignature fileSign = new PdfFileSignature();
try
{
fileSign.bindPdf(inputPdf);
java.awt.Rectangle rect = new java.awt.Rectangle(100, 100, 400, 100);
PKCS7Detached signature = new PKCS7Detached(inputPfx, "123456789");
signature.setDate(new Date());
signature.setCustomAppearance( new SignatureCustomAppearance());
signature.getCustomAppearance().setUseDigitalSubjectFormat(true);
signature.getCustomAppearance().setDigitalSubjectFormat(new /*SubjectNameElements*/int[] { SubjectNameElements.CN, SubjectNameElements.O });
fileSign.sign(1, true, rect, signature);
fileSign.save(outputPdf);
}
finally {
if (fileSign != null)
fileSign.close();
}
Apa yang baru di Aspose.PDF 22.8
Dukungan pada Aspose.PDF 23.8 untuk menambahkan metode dalam membangun kembali tabel xref:
PdfFileSanitization sanitizer = new PdfFileSanitization();
try {
sanitizer.bindPdf(dataDir + "50528_1.pdf");
sanitizer.rebuildXrefAndTrailer();
sanitizer.save(dataDir + "50528_1" + version + ".pdf");
} finally {
if (sanitizer != null) ( sanitizer).close();
}
Apa yang baru di Aspose.PDF 22.6
PDF ke PDF_A_1A - terapkan opsi untuk menghapus warna transparansi guna menghindari ukuran file output yang besar.
Mulai versi 22.5 pelanggan dapat mengontrol kualitas transparansi yang dikonversi, serta ukuran file output sebagai hasilnya:
opts.setTransparencyResolution(300);
Apa yang baru di Aspose.PDF 22.5
Selama konversi PDF/A, konten transparan dihapus dan digantikan dengan gambar. Kami telah menerapkan fitur baru, dan kini pelanggan dapat mengontrol kualitas gambar dengan parameter TransparencyResolution:
com.aspose.pdf.Document pdfDocument = new com.aspose.pdf.Document("input.pdf");
PdfFormatConversionOptions options = new PdfFormatConversionOptions("log.xml", PdfFormat.PDF_A_1A, ConvertErrorAction.Delete);
options.setTransparencyResolution(300);
pdfDocument.convert(options);
pdfDocument.save("finalOutput.pdf");
Apa yang baru di Aspose.PDF 22.4
Rilis ini mencakup informasi untuk Aspose.PDF for Java:
- PDF ke ODS: Kenali teks dalam subskrip dan superskrip;
contoh
Document pdfDocument = new Document("Superscript-Subscript.pdf");
ExcelSaveOptions options = new ExcelSaveOptions();
options.Format = ExcelSaveOptions.ExcelFormat.ODS;
pdfDocument.Save("output.ods"), options);
-
PDF ke XMLSpreadSheet2003: Kenali teks dalam subskrip dan superskrip;
-
PDF ke Excel: Kenali teks dalam subskrip dan superskrip;
Apa yang baru di Aspose.PDF 22.3
PDF ke ODS: Dukungan untuk RTL tersedia di versi 22.3
ExcelSaveOptions options = new ExcelSaveOptions();
options.setFormat(ExcelSaveOptions.ExcelFormat.ODS);
pdfDocument.save("output.ods", options);
Apa yang baru di Aspose.PDF 22.2
Rilis ini mencakup PDF ke XSLX: Dukungan untuk RTL (Ibrani, Arab).
Apa yang baru di Aspose.PDF 22.1
Aspose.PDF for Java memungkinkan memuat dokumen Portable Document Format (PDF) versi 2.0.
Apa yang baru di Aspose.PDF 21.10
Bagaimana cara mendeteksi teks tersembunyi?
Silakan gunakan kode berikut:
Document pdf = new Document(inFile);
Page page = pdf.getPages().get_Item(1);
TextFragmentAbsorber textFragmentAbsorber = new com.aspose.pdf.TextFragmentAbsorber();
page.accept(textFragmentAbsorber);
TextFragmentCollection textFragmentCollection = textFragmentAbsorber.getTextFragments();
int fragmentsCount = textFragmentAbsorber.getTextFragments().size();
int invisibleCount = 0;
Iterator tmp0 = ( textFragmentCollection).iterator();
while (tmp0.hasNext())
{
com.aspose.pdf.TextFragment fragment = (com.aspose.pdf.TextFragment)tmp0.next();
System.out.println(fragment.getText());
System.out.println(fragment.getTextState().isInvisible());
if (fragment.getTextState().isInvisible())
invisibleCount++;
}
Apa yang baru di Aspose.PDF 21.8
Bagaimana cara mengubah warna teks di digital Signature?
Pada versi 21.8 setForegroundColor, memungkinkan mengubah warna teks di Digital Signature:
Please, use the following code:
PdfFileSignature pdfSign = new PdfFileSignature();
pdfSign.bindPdf(inFile);
//create a rectangle for signature location
java.awt.Rectangle rect = new java.awt.Rectangle(310, 45, 200, 50);
PKCS7 pkcs = new PKCS7(inPfxFile, "");
pkcs.setCustomAppearance( new SignatureCustomAppearance());
//set text color
pkcs.getCustomAppearance().setForegroundColor(Color.getGreen());
// sign the PDF file
pdfSign.sign(1, true, rect, pkcs);
//save output PDF file
pdfSign.save(outFile);
Apa yang baru di Aspose.PDF 21.6
Menyembunyikan gambar menggunakan ImagePlacementAbsorber dari dokumen
Dengan Aspose.PDF for Java Anda dapat menyembunyikan gambar menggunakan ImagePlacementAbsorber dari dokumen:
Document doc = new Document("input.pdf");
for (Page page : doc.getPages()) {
ImagePlacementAbsorber ipa = new ImagePlacementAbsorber();
ipa.visit(page);
for (ImagePlacement ip : ipa.getImagePlacements()) {
ip.hide();
}
}
doc.save("out.pdf");
Apa yang baru di Aspose.PDF 21.5
Menambahkan API untuk menggabungkan gambar
Aspose.PDF 21.4 memungkinkan Anda menggabungkan Gambar. Menggabungkan daftar aliran gambar menjadi satu aliran gambar. Format output png/jpg/tiff didukung, jika menggunakan format yang tidak didukung aliran output akan dienkode sebagai JPEG secara default. Ikuti cuplikan kode berikut:
InputStream inputStream;
ArrayList<InputStream> inputImagesStreams = new ArrayList<InputStream>();
InputStream inputFile300dpi = new FileInputStream("image1.jpg");
try {
inputImagesStreams.add(inputFile300dpi);
InputStream inputFile600dpi = new FileInputStream("image2.jpg");
try {
inputImagesStreams.add(inputFile600dpi);
inputStream = PdfConverter.mergeImages(
inputImagesStreams,
com.aspose.pdf.ImageFormat.Jpeg,
ImageMergeMode.Vertical,
new Integer(1),
new Integer(1)
);
} finally {
if (inputFile600dpi != null) (inputFile600dpi).close();
}
} finally {
if (inputFile300dpi != null) (inputFile300dpi).close();
}
Document doc = new Document();
Page p = doc.getPages().add();
Image image = new Image();
image.setImageStream(inputStream);
p.getParagraphs().add(image);
doc.save("out.pdf");
inputStream.close();
Anda juga dapat menggabungkan gambar Anda dalam format Tiff:
InputStream inputStream;
ArrayList<InputStream> inputImagesStreams = new ArrayList<InputStream>();
InputStream inputFile1 = new FileInputStream("1.tif");
try {
inputImagesStreams.add(inputFile1);
InputStream inputFile2 = new FileInputStream("2.tif");
try {
inputImagesStreams.add(inputFile2);
inputStream = PdfConverter.mergeImagesAsTiff(inputImagesStreams);
} finally {
if (inputFile2 != null) (inputFile2).close();
}
} finally {
if (inputFile1 != null) (inputFile1).close();
}
Document doc = new Document();
Page p = doc.getPages().add();
Image image = new Image();
image.setImageStream(inputStream);
p.getParagraphs().add(image);
doc.save("out2.pdf");
inputStream.close();
Apa yang baru di Aspose.PDF 21.02
Aspose.PDF v21.02 Menandatangani PDF dengan Tanda Tangan PAdES LTV
final Document document = new Document(inputPdf);
try
{
PdfFileSignature signature = new PdfFileSignature(document);
PKCS7 pkcs7 = new PKCS7(getInputPath("cert.pfx"), "password");
//Sign PDF with PAdES LTV Signatures
pkcs7.setUseLtv(true);
signature.sign(1, true, new Rectangle(100, 100, 300, 300), pkcs7);
signature.save(outputPdf);
}
finally { if (document != null) (document).dispose(); }