Ganti Teks dalam PDF
Ganti Teks di semua halaman dokumen PDF
Untuk mengganti teks di semua halaman dalam dokumen PDF menggunakan Aspose.PDF for Java:
-
Pertama gunakan TextFragmentAbsorber untuk menemukan frasa tertentu yang akan diganti.
-
Kemudian, periksa semua TextFragments untuk mengganti teks dan mengubah atribut lainnya.
-
Akhirnya, simpan output PDF menggunakan metode save dari kelas Document.
package com.aspose.pdf.examples;
import com.aspose.pdf.*;
public class ExampleReplaceText {
private static String _dataDir = "/home/admin1/pdf-examples/Samples/";
public static void ReplaceTextOnAllPages() {
Document pdfDocument = new Document(_dataDir+"sample.pdf");
// Buat objek TextAbsorber untuk menemukan semua contoh dari frasa pencarian masukan
TextFragmentAbsorber textFragmentAbsorber = new TextFragmentAbsorber("Web");
// Terima absorber untuk halaman pertama dokumen
pdfDocument.getPages().accept(textFragmentAbsorber);
// Dapatkan fragmen teks yang diekstraksi ke dalam koleksi
TextFragmentCollection textFragmentCollection = textFragmentAbsorber.getTextFragments();
// Lakukan loop melalui fragmen
for (TextFragment textFragment : (Iterable<TextFragment>) textFragmentCollection) {
// Perbarui teks dan properti lainnya
textFragment.setText("World Wide Web");
textFragment.getTextState().setFont(FontRepository.findFont("Verdana"));
textFragment.getTextState().setFontSize(12);
textFragment.getTextState().setForegroundColor(Color.getBlue());
textFragment.getTextState().setBackgroundColor(Color.getGray());
}
// Simpan file PDF yang telah diperbarui
pdfDocument.save(_dataDir+"Updated_Text.pdf");
}
}
Ganti Teks di wilayah halaman tertentu
Untuk mengganti teks di wilayah halaman tertentu, pertama kita perlu membuat objek TextFragmentAbsorber, menentukan wilayah halaman menggunakan TextSearchOptions.setRectangle dan kemudian melakukan iterasi melalui semua TextFragment untuk mengganti teks. Setelah operasi ini selesai, kita hanya perlu menyimpan output PDF menggunakan metode simpan dari objek Document.
Cuplikan kode berikut menunjukkan cara mengganti teks di semua halaman dokumen PDF.
public static void ReplaceTextInParticularRegion(){
// muat file PDF
Document pdfDocument = new Document(_dataDir+"sample.pdf");
// membuat objek TextFragment Absorber
TextFragmentAbsorber textFragmentAbsorber = new TextFragmentAbsorber("PDF");
// cari teks dalam batas halaman
textFragmentAbsorber.getTextSearchOptions().setLimitToPageBounds(true);
// tentukan wilayah halaman untuk Opsi Pencarian Teks
textFragmentAbsorber.getTextSearchOptions().setRectangle(new Rectangle(100, 700, 400, 770));
// cari teks dari halaman pertama file PDF
pdfDocument.getPages().get_Item(1).accept(textFragmentAbsorber);
// iterasi melalui TextFragment individu
for(TextFragment tf : textFragmentAbsorber.getTextFragments())
{
// ganti teks dengan "---"
tf.setText("---");
}
// Simpan file PDF yang diperbarui
pdfDocument.save(_dataDir+"Updated_Text.pdf");
}
Mengganti Teks Berdasarkan Ekspresi Reguler
Jika Anda ingin mengganti beberapa frasa berdasarkan ekspresi reguler, pertama-tama Anda perlu menemukan semua frasa yang cocok dengan ekspresi reguler tersebut menggunakan TextFragmentAbsorber. Anda harus melewatkan ekspresi reguler sebagai parameter ke konstruktor TextFragmentAbsorber. Anda juga perlu membuat objek TextSearchOptions yang menentukan apakah ekspresi reguler sedang digunakan atau tidak. Setelah Anda mendapatkan frasa yang cocok di TextFragments, Anda perlu melakukan loop melalui semuanya dan memperbarui sesuai kebutuhan. Akhirnya, Anda perlu menyimpan PDF yang telah diperbarui menggunakan metode Save dari objek Document.
Cuplikan kode berikut menunjukkan cara mengganti teks berdasarkan ekspresi reguler.
public static void ReplaceTextWithRegularExpression() {
// memuat file PDF
Document pdfDocument = new Document(_dataDir + "sample.pdf");
// Membuat objek TextAbsorber untuk menemukan semua instance dari frasa pencarian yang dimasukkan
TextFragmentAbsorber textFragmentAbsorber = new TextFragmentAbsorber("\\d{4}-\\d{4}");
// seperti 1999-2000
// Mengatur opsi pencarian teks untuk menentukan penggunaan ekspresi reguler
TextSearchOptions textSearchOptions = new TextSearchOptions(true);
textFragmentAbsorber.setTextSearchOptions(textSearchOptions);
// Terima absorber untuk halaman pertama dokumen
pdfDocument.getPages().accept(textFragmentAbsorber);
// Dapatkan fragmen teks yang diekstraksi ke dalam koleksi
TextFragmentCollection textFragmentCollection = textFragmentAbsorber.getTextFragments();
// Melakukan loop melalui fragmen
for (TextFragment textFragment : (Iterable<TextFragment>) textFragmentCollection) {
// Memperbarui teks dan properti lainnya
textFragment.setText("ABCD-EFGH");
textFragment.getTextState().setFont(FontRepository.findFont("Verdana"));
textFragment.getTextState().setFontSize(12);
textFragment.getTextState().setForegroundColor(Color.getBlue());
textFragment.getTextState().setBackgroundColor(Color.getGray());
}
// Simpan file PDF yang telah diperbarui
pdfDocument.save(_dataDir + "Updated_Text.pdf");
}
Mengganti font dalam file PDF yang ada
Aspose.PDF untuk Java mendukung kemampuan untuk mengganti teks dalam dokumen PDF. Namun, terkadang Anda memiliki persyaratan untuk hanya mengganti font yang digunakan di dalam dokumen PDF. Jadi, alih-alih mengganti teks, hanya font yang digunakan yang diganti. Salah satu overload dari konstruktor TextFragmentAbsorber menerima objek TextEditOptions sebagai argumen dan kita dapat menggunakan nilai RemoveUnusedFonts dari enumerasi TextEditOptions.FontReplace untuk memenuhi persyaratan kita.
Cuplikan kode berikut menunjukkan cara mengganti font di dalam dokumen PDF.
public static void ReplaceFonts() {
// Membuat objek Dokumen
Document pdfDocument = new Document(_dataDir + "sample.pdf");
// Mencari fragmen teks dan setel opsi edit sebagai hapus font yang tidak terpakai
TextFragmentAbsorber textFragmentAbsorber = new TextFragmentAbsorber(
new TextEditOptions(TextEditOptions.FontReplace.RemoveUnusedFonts));
// Menerima absorber untuk semua halaman dokumen
pdfDocument.getPages().accept(textFragmentAbsorber);
// Melintasi semua TextFragments
TextFragmentCollection textFragmentCollection = textFragmentAbsorber.getTextFragments();
for (TextFragment textFragment : (Iterable<TextFragment>) textFragmentCollection)
{
String fontName = textFragment.getTextState().getFont().getFontName();
// jika nama font adalah ArialMT, ganti nama font dengan Arial
if (fontName.equals("ArialMT")) {
textFragment.getTextState().setFont(FontRepository.findFont("Arial"));
}
}
// Simpan file PDF yang telah diperbarui
pdfDocument.save(_dataDir + "Updated_Text.pdf");
}
Gunakan Font Non-Inggris (Jepang) Saat Mengganti Teks
Cuplikan kode berikut menunjukkan cara mengganti teks dengan karakter Jepang. Harap dicatat bahwa untuk menambahkan teks Jepang, Anda perlu menggunakan font yang mendukung karakter Jepang (misalnya MSGothic).
public static void UseNonEnglishFontWhenReplacingText() {
// Instansiasi objek Dokumen
Document pdfDocument = new Document(_dataDir + "sample.pdf");
// Mari kita ganti setiap kata "page" dengan beberapa teks Jepang dengan font tertentu
// TakaoMincho yang mungkin terinstal di OS
// Juga, mungkin font lain yang mendukung hieroglif
TextFragmentAbsorber textFragmentAbsorber = new TextFragmentAbsorber("page");
// Buat instance opsi Pencarian Teks
TextSearchOptions searchOptions = new TextSearchOptions(true);
textFragmentAbsorber.setTextSearchOptions(searchOptions);
// Terima absorber untuk semua halaman dokumen
pdfDocument.getPages().accept(textFragmentAbsorber);
// Dapatkan fragmen teks yang diekstraksi ke dalam koleksi
TextFragmentCollection textFragmentCollection = textFragmentAbsorber.getTextFragments();
// Loop melalui fragmen-fragmen
for (TextFragment textFragment : (Iterable<TextFragment>) textFragmentCollection) {
// Perbarui teks dan properti lainnya
textFragment.setText("ファイル");
textFragment.getTextState().setFont(FontRepository.findFont("MSGothic"));
textFragment.getTextState().setFontSize(12);
textFragment.getTextState().setForegroundColor(Color.getBlue());
textFragment.getTextState().setBackgroundColor(Color.getGray());
}
// Simpan dokumen yang telah diperbarui
pdfDocument.save(_dataDir + "Japanese_Text.pdf");
}
Penggantian Teks harus secara otomatis mengatur ulang Konten Halaman
Aspose.PDF untuk Java mendukung fitur untuk mencari dan mengganti teks di dalam file PDF. Namun, baru-baru ini beberapa pelanggan mengalami masalah selama penggantian teks ketika TextFragment tertentu diganti dengan konten yang lebih kecil dan beberapa spasi ekstra ditampilkan dalam PDF hasil atau jika TextFragment diganti dengan string yang lebih panjang, maka kata-kata tumpang tindih dengan konten halaman yang ada. Jadi, ada kebutuhan untuk memperkenalkan mekanisme yang setelah teks di dalam dokumen PDF diganti, konten harus diatur ulang.
Untuk mengatasi skenario yang disebutkan di atas, Aspose.PDF untuk Java telah ditingkatkan sehingga tidak ada masalah seperti itu muncul ketika mengganti teks di dalam file PDF. Cuplikan kode berikut menunjukkan cara mengganti teks di dalam file PDF dan konten halaman harus diatur ulang secara otomatis.
public static void RearrangeContent() {
// Muat file PDF sumber
Document pdfDocument = new Document(_dataDir + "sample.pdf");
// Buat objek TextFragment Absorber dengan ekspresi reguler
TextFragmentAbsorber textFragmentAbsorber = new TextFragmentAbsorber("[PDF,Web]");
TextSearchOptions textSearchOptions = new TextSearchOptions(true);
textFragmentAbsorber.setTextSearchOptions(textSearchOptions);
//Anda juga dapat menentukan opsi ReplaceAdjustment.WholeWordsHyphenation untuk membungkus teks pada baris berikutnya atau saat ini
//jika baris saat ini menjadi terlalu panjang atau pendek setelah penggantian:
//textFragmentAbsorber.getTextReplaceOptions().setReplaceAdjustmentAction(TextReplaceOptions.ReplaceAdjustment.WholeWordsHyphenation);
// Terima absorber untuk semua halaman dokumen
pdfDocument.getPages().accept(textFragmentAbsorber);
// Dapatkan fragmen teks yang diekstraksi ke dalam koleksi
TextFragmentCollection textFragmentCollection = textFragmentAbsorber.getTextFragments();
// Ganti setiap TextFragment
for (TextFragment textFragment : (Iterable<TextFragment>) textFragmentCollection) {
// Setel font dari fragmen teks yang diganti
textFragment.getTextState().setFont(FontRepository.findFont("Arial"));
// Setel ukuran font
textFragment.getTextState().setFontSize(10);
textFragment.getTextState().setForegroundColor(Color.getBlue());
textFragment.getTextState().setBackgroundColor(Color.getGray());
// Ganti teks dengan string yang lebih besar dari placeholder
textFragment.setText("This is a larger string for the testing of this feature");
}
// Simpan PDF hasil
pdfDocument.save(_dataDir + "RearrangeContentsUsingTextReplacement_out.pdf");
}
Merender Simbol yang Dapat Diganti selama Pembuatan PDF
Simbol yang dapat diganti adalah simbol khusus dalam string teks yang dapat digantikan dengan konten yang sesuai saat waktu berjalan. Simbol yang dapat diganti saat ini didukung oleh Model Objek Dokumen baru dari namespace Aspose.PDF adalah $P
, $p
, \n
, \r
. $p
dan $P
digunakan untuk menangani penomoran halaman saat waktu berjalan. $p
digantikan dengan nomor halaman tempat kelas Paragraf saat ini berada. $P
digantikan dengan jumlah total halaman dalam dokumen. Saat menambahkan TextFragment ke koleksi paragraf dokumen PDF, itu tidak mendukung pemindah baris di dalam teks. Namun untuk menambahkan teks dengan pemindah baris, silakan gunakan TextFragment dengan TextParagraph:
- gunakan “\r\n” atau Environment.NewLine dalam TextFragment alih-alih menggunakan “\n” tunggal;
- buat objek TextParagraph. Itu akan menambahkan teks dengan pemisahan baris;
- tambahkan TextFragment dengan TextParagraph.AppendLine;
- tambahkan TextParagraph dengan TextBuilder.AppendParagraph.
public static void RenderingReplaceableSymbols() {
// memuat file PDF
Document pdfDocument = new Document(_dataDir + "sample.pdf");
Page page = pdfDocument.getPages().add();
// Inisialisasi TextFragment baru dengan teks yang mengandung penanda baris baru yang diperlukan
TextFragment textFragment = new TextFragment("Nama Pelamar: " + System.lineSeparator() + " Joe Smoe");
// Atur properti text fragment jika diperlukan
textFragment.getTextState().setFontSize(12);
textFragment.getTextState().setFont(FontRepository.findFont("TimesNewRoman"));
textFragment.getTextState().setBackgroundColor(Color.getLightGray());
textFragment.getTextState().setForegroundColor(Color.getRed());
// Buat objek TextParagraph
TextParagraph par = new TextParagraph();
// Tambahkan TextFragment baru ke paragraph
par.appendLine(textFragment);
// Atur posisi paragraph
par.setPosition (new Position(100, 600));
// Buat objek TextBuilder
TextBuilder textBuilder = new TextBuilder(page);
// Tambahkan TextParagraph menggunakan TextBuilder
textBuilder.appendParagraph(par);
_dataDir = _dataDir + "RenderingReplaceableSymbols_out.pdf";
pdfDocument.save(_dataDir);
}
Simbol yang Dapat Diganti di Area Header/Footer
Simbol yang dapat diganti juga dapat ditempatkan di dalam bagian Header/Footer dari file PDF. Silakan lihat cuplikan kode berikut untuk detail tentang cara menambahkan simbol yang dapat diganti di bagian footer.
public static void ReplaceableSymbolsInHeaderFooterArea() {
Document doc = new Document();
Page page = doc.getPages().add();
MarginInfo marginInfo = new MarginInfo();
marginInfo.setTop(90);
marginInfo.setBottom(50);
marginInfo.setLeft(50);
marginInfo.setRight(50);
// Menetapkan instance marginInfo ke properti Margin dari sec1.PageInfo
page.getPageInfo().setMargin(marginInfo);
HeaderFooter hfFirst = new HeaderFooter();
page.setHeader(hfFirst);
hfFirst.getMargin().setLeft(50);
hfFirst.getMargin().setRight(50);
// Membuat paragraf Teks yang akan menyimpan isi untuk ditampilkan sebagai header
TextFragment t1 = new TextFragment("judul laporan");
t1.getTextState().setFont(FontRepository.findFont("Arial"));
t1.getTextState().setFontSize(16);
t1.getTextState().setForegroundColor(Color.getBlack());
t1.getTextState().setFontStyle(FontStyles.Bold);
t1.getTextState().setHorizontalAlignment(HorizontalAlignment.Center);
t1.getTextState().setLineSpacing(5f);
hfFirst.getParagraphs().add(t1);
TextFragment t2 = new TextFragment("Nama_Laporan");
t2.getTextState().setFont(FontRepository.findFont("Arial"));
t2.getTextState().setForegroundColor(Color.getBlack());
t2.getTextState().setHorizontalAlignment(HorizontalAlignment.Center);
t2.getTextState().setLineSpacing(5f);
t2.getTextState().setFontSize(12);
hfFirst.getParagraphs().add(t2);
// Membuat objek HeaderFooter untuk bagian tersebut
HeaderFooter hfFoot = new HeaderFooter();
// Mengatur objek HeaderFooter ke footer ganjil & genap
page.setFooter(hfFoot);
hfFoot.getMargin().setLeft(50);
hfFoot.getMargin().setRight(50);
// Menambahkan paragraf teks yang berisi nomor halaman saat ini dari total jumlah halaman
TextFragment t3 = new TextFragment("Dibuat pada tanggal uji");
TextFragment t4 = new TextFragment("nama laporan ");
TextFragment t5 = new TextFragment("Halaman $p dari $P");
// Membuat objek tabel
Table tab2 = new Table();
// Menambahkan tabel dalam koleksi paragraf dari bagian yang diinginkan
hfFoot.getParagraphs().add(tab2);
// Mengatur lebar kolom tabel
tab2.setColumnWidths("165 172 165");
// Membuat baris dalam tabel dan kemudian sel dalam baris
Row row3 = tab2.getRows().add();
row3.getCells().add();
row3.getCells().add();
row3.getCells().add();
// Mengatur perataan vertikal teks sebagai perataan tengah
row3.getCells().get_Item(0).setAlignment(HorizontalAlignment.Left);
row3.getCells().get_Item(1).setAlignment(HorizontalAlignment.Center);
row3.getCells().get_Item(2).setAlignment(HorizontalAlignment.Right);
row3.getCells().get_Item(0).getParagraphs().add(t3);
row3.getCells().get_Item(1).getParagraphs().add(t4);
row3.getCells().get_Item(2).getParagraphs().add(t5);
Table table = new Table();
table.setColumnWidths("33% 33% 34%");
table.setDefaultCellPadding(new MarginInfo());
table.getDefaultCellPadding().setTop(10);
table.getDefaultCellPadding().setBottom(10);
// Menambahkan tabel dalam koleksi paragraf dari bagian yang diinginkan
page.getParagraphs().add(table);
// Mengatur batas sel default menggunakan objek BorderInfo
table.setDefaultCellBorder(new BorderInfo(BorderSide.All, 0.1f));
// Mengatur batas tabel menggunakan objek BorderInfo yang disesuaikan lainnya
table.setBorder(new BorderInfo(BorderSide.All, 1f));
table.setRepeatingRowsCount(1);
// Membuat baris dalam tabel dan kemudian sel dalam baris
Row row1 = table.getRows().add();
row1.getCells().add("kol1");
row1.getCells().add("kol2");
row1.getCells().add("kol3");
String CRLF = "\r\n";
for (int i = 0; i <= 10; i++) {
Row row = table.getRows().add();
row.setRowBroken(true);
for (int c = 0; c <= 2; c++) {
Cell c1;
if (c == 2)
c1 = row.getCells().add(
"Aspose.Total for Java adalah kompilasi dari setiap komponen Java yang ditawarkan oleh Aspose. Ini dikompilasi setiap hari untuk memastikan berisi versi terbaru dari masing-masing komponen Java kami. "
+ CRLF
+ "basis harian untuk memastikan berisi versi terbaru dari masing-masing komponen Java kami. "
+ CRLF
+ "Menggunakan Aspose.Total untuk pengembang Java dapat membuat berbagai aplikasi.");
else
c1 = row.getCells().add("item1" + c);
c1.setMargin(new MarginInfo());
c1.getMargin().setLeft(30);
c1.getMargin().setTop(10);
c1.getMargin().setBottom(10);
}
}
_dataDir = _dataDir + "ReplaceableSymbolsInHeaderFooter_out.pdf";
doc.save(_dataDir);
}
Hapus Semua Teks dari Dokumen PDF
Hapus Semua Teks menggunakan Operator
Dalam beberapa operasi teks, Anda perlu menghapus semua teks dari dokumen PDF dan untuk itu, Anda perlu mengatur teks yang ditemukan sebagai nilai string kosong biasanya. Intinya adalah bahwa mengubah teks untuk banyak fragmen teks memicu sejumlah pemeriksaan dan operasi penyesuaian posisi teks. Mereka penting dalam skenario pengeditan teks. Kesulitannya adalah Anda tidak dapat menentukan berapa banyak fragmen teks yang akan dihapus dalam skenario di mana mereka diproses dalam sebuah loop.
Oleh karena itu, kami merekomendasikan menggunakan pendekatan lain untuk skenario menghapus semua teks dari halaman PDF. Silakan pertimbangkan potongan kode berikut yang bekerja sangat cepat.
public static void RemoveAllTextUsingOperators() {
// Buka dokumen
Document pdfDocument = new Document(_dataDir + "sample.pdf");
// Loop melalui semua halaman Dokumen PDF
for (int i = 1; i <= pdfDocument.getPages().size(); i++) {
Page page = pdfDocument.getPages().get_Item(i);
OperatorSelector operatorSelector = new OperatorSelector(new com.aspose.pdf.operators.TextShowOperator());
// Pilih semua teks di halaman
page.getContents().accept(operatorSelector);
// Hapus semua teks
page.getContents().delete(operatorSelector.getSelected());
}
// Simpan dokumen
pdfDocument.save(_dataDir + "RemoveAllText_out.pdf");
}