diff --git a/fxbarcode/BUILD.gn b/fxbarcode/BUILD.gn
index 19ced51..344a310 100644
--- a/fxbarcode/BUILD.gn
+++ b/fxbarcode/BUILD.gn
@@ -30,6 +30,8 @@
     "cbc_ean13.h",
     "cbc_ean8.cpp",
     "cbc_ean8.h",
+    "cbc_eancode.cpp",
+    "cbc_eancode.h",
     "cbc_onecode.cpp",
     "cbc_onecode.h",
     "cbc_pdf417i.cpp",
@@ -90,6 +92,8 @@
     "oned/BC_OnedEAN8Writer.h",
     "oned/BC_OnedEANChecksum.cpp",
     "oned/BC_OnedEANChecksum.h",
+    "oned/BC_OnedEANWriter.cpp",
+    "oned/BC_OnedEANWriter.h",
     "oned/BC_OnedUPCAWriter.cpp",
     "oned/BC_OnedUPCAWriter.h",
     "pdf417/BC_PDF417.cpp",
diff --git a/fxbarcode/cbc_ean13.cpp b/fxbarcode/cbc_ean13.cpp
index b038f81..934e61c 100644
--- a/fxbarcode/cbc_ean13.cpp
+++ b/fxbarcode/cbc_ean13.cpp
@@ -27,55 +27,18 @@
 #include "third_party/base/ptr_util.h"
 
 CBC_EAN13::CBC_EAN13()
-    : CBC_OneCode(pdfium::MakeUnique<CBC_OnedEAN13Writer>()) {}
+    : CBC_EANCode(pdfium::MakeUnique<CBC_OnedEAN13Writer>()) {}
 
-CBC_EAN13::~CBC_EAN13() {}
-
-WideString CBC_EAN13::Preprocess(const WideStringView& contents) {
-  auto* pWriter = GetOnedEAN13Writer();
-  WideString encodeContents = pWriter->FilterContents(contents);
-  size_t length = encodeContents.GetLength();
-  if (length <= 12) {
-    for (size_t i = 0; i < 12 - length; i++)
-      encodeContents.InsertAtFront(L'0');
-
-    ByteString byteString = encodeContents.ToUTF8();
-    int32_t checksum = pWriter->CalcChecksum(byteString);
-    byteString += checksum + '0';
-    encodeContents = WideString::FromUTF8(byteString.AsStringView());
-  } else {
-    encodeContents = encodeContents.Left(13);
-  }
-
-  return encodeContents;
-}
-
-bool CBC_EAN13::Encode(const WideStringView& contents) {
-  if (contents.IsEmpty())
-    return false;
-
-  BCFORMAT format = BCFORMAT_EAN_13;
-  int32_t outWidth = 0;
-  int32_t outHeight = 0;
-  m_renderContents = Preprocess(contents);
-  ByteString byteString = m_renderContents.ToUTF8();
-  auto* pWriter = GetOnedEAN13Writer();
-  std::unique_ptr<uint8_t, FxFreeDeleter> data(
-      pWriter->Encode(byteString, format, outWidth, outHeight));
-  return data && pWriter->RenderResult(m_renderContents.AsStringView(),
-                                       data.get(), outWidth);
-}
-
-bool CBC_EAN13::RenderDevice(CFX_RenderDevice* device,
-                             const CFX_Matrix* matrix) {
-  return GetOnedEAN13Writer()->RenderDeviceResult(
-      device, matrix, m_renderContents.AsStringView());
-}
+CBC_EAN13::~CBC_EAN13() = default;
 
 BC_TYPE CBC_EAN13::GetType() {
   return BC_EAN13;
 }
 
-CBC_OnedEAN13Writer* CBC_EAN13::GetOnedEAN13Writer() {
-  return static_cast<CBC_OnedEAN13Writer*>(m_pBCWriter.get());
+BCFORMAT CBC_EAN13::GetFormat() const {
+  return BCFORMAT_EAN_13;
+}
+
+size_t CBC_EAN13::GetMaxLength() const {
+  return 12;
 }
diff --git a/fxbarcode/cbc_ean13.h b/fxbarcode/cbc_ean13.h
index f5887c7..a82a03f 100644
--- a/fxbarcode/cbc_ean13.h
+++ b/fxbarcode/cbc_ean13.h
@@ -7,29 +7,21 @@
 #ifndef FXBARCODE_CBC_EAN13_H_
 #define FXBARCODE_CBC_EAN13_H_
 
-#include "core/fxcrt/fx_coordinates.h"
 #include "core/fxcrt/fx_string.h"
 #include "core/fxcrt/fx_system.h"
-#include "fxbarcode/cbc_onecode.h"
+#include "fxbarcode/cbc_eancode.h"
 
 class CBC_OnedEAN13Writer;
 
-class CBC_EAN13 final : public CBC_OneCode {
+class CBC_EAN13 final : public CBC_EANCode {
  public:
   CBC_EAN13();
   ~CBC_EAN13() override;
 
-  // CBC_OneCode:
-  bool Encode(const WideStringView& contents) override;
-  bool RenderDevice(CFX_RenderDevice* device,
-                    const CFX_Matrix* matrix) override;
+  // CBC_EANCode:
   BC_TYPE GetType() override;
-
- private:
-  CBC_OnedEAN13Writer* GetOnedEAN13Writer();
-  WideString Preprocess(const WideStringView& contents);
-
-  WideString m_renderContents;
+  BCFORMAT GetFormat() const override;
+  size_t GetMaxLength() const override;
 };
 
 #endif  // FXBARCODE_CBC_EAN13_H_
diff --git a/fxbarcode/cbc_ean8.cpp b/fxbarcode/cbc_ean8.cpp
index d74a712..84ed672 100644
--- a/fxbarcode/cbc_ean8.cpp
+++ b/fxbarcode/cbc_ean8.cpp
@@ -26,54 +26,18 @@
 #include "fxbarcode/oned/BC_OnedEAN8Writer.h"
 #include "third_party/base/ptr_util.h"
 
-CBC_EAN8::CBC_EAN8() : CBC_OneCode(pdfium::MakeUnique<CBC_OnedEAN8Writer>()) {}
+CBC_EAN8::CBC_EAN8() : CBC_EANCode(pdfium::MakeUnique<CBC_OnedEAN8Writer>()) {}
 
-CBC_EAN8::~CBC_EAN8() {}
-
-WideString CBC_EAN8::Preprocess(const WideStringView& contents) {
-  auto* pWriter = GetOnedEAN8Writer();
-  WideString encodeContents = pWriter->FilterContents(contents);
-  size_t length = encodeContents.GetLength();
-  if (length <= 7) {
-    for (size_t i = 0; i < 7 - length; i++)
-      encodeContents = L'0' + encodeContents;
-
-    ByteString byteString = encodeContents.ToUTF8();
-    int32_t checksum = pWriter->CalcChecksum(byteString);
-    encodeContents += L'0' + checksum;
-  } else {
-    encodeContents = encodeContents.Left(8);
-  }
-
-  return encodeContents;
-}
-
-bool CBC_EAN8::Encode(const WideStringView& contents) {
-  if (contents.IsEmpty())
-    return false;
-
-  BCFORMAT format = BCFORMAT_EAN_8;
-  int32_t outWidth = 0;
-  int32_t outHeight = 0;
-  m_renderContents = Preprocess(contents);
-  ByteString byteString = m_renderContents.ToUTF8();
-  auto* pWriter = GetOnedEAN8Writer();
-  std::unique_ptr<uint8_t, FxFreeDeleter> data(
-      pWriter->Encode(byteString, format, outWidth, outHeight));
-  return data && pWriter->RenderResult(m_renderContents.AsStringView(),
-                                       data.get(), outWidth);
-}
-
-bool CBC_EAN8::RenderDevice(CFX_RenderDevice* device,
-                            const CFX_Matrix* matrix) {
-  return GetOnedEAN8Writer()->RenderDeviceResult(
-      device, matrix, m_renderContents.AsStringView());
-}
+CBC_EAN8::~CBC_EAN8() = default;
 
 BC_TYPE CBC_EAN8::GetType() {
   return BC_EAN8;
 }
 
-CBC_OnedEAN8Writer* CBC_EAN8::GetOnedEAN8Writer() {
-  return static_cast<CBC_OnedEAN8Writer*>(m_pBCWriter.get());
+BCFORMAT CBC_EAN8::GetFormat() const {
+  return BCFORMAT_EAN_8;
+}
+
+size_t CBC_EAN8::GetMaxLength() const {
+  return 7;
 }
diff --git a/fxbarcode/cbc_ean8.h b/fxbarcode/cbc_ean8.h
index d0c7b21..57c06fa 100644
--- a/fxbarcode/cbc_ean8.h
+++ b/fxbarcode/cbc_ean8.h
@@ -9,25 +9,19 @@
 
 #include "core/fxcrt/fx_string.h"
 #include "core/fxcrt/fx_system.h"
-#include "fxbarcode/cbc_onecode.h"
+#include "fxbarcode/cbc_eancode.h"
 
 class CBC_OnedEAN8Writer;
 
-class CBC_EAN8 final : public CBC_OneCode {
+class CBC_EAN8 final : public CBC_EANCode {
  public:
   CBC_EAN8();
   ~CBC_EAN8() override;
 
-  // CBC_OneCode:
-  bool Encode(const WideStringView& contents) override;
-  bool RenderDevice(CFX_RenderDevice* device,
-                    const CFX_Matrix* matrix) override;
+  // CBC_EANCode:
   BC_TYPE GetType() override;
-
- private:
-  CBC_OnedEAN8Writer* GetOnedEAN8Writer();
-  WideString Preprocess(const WideStringView& contents);
-  WideString m_renderContents;
+  BCFORMAT GetFormat() const override;
+  size_t GetMaxLength() const override;
 };
 
 #endif  // FXBARCODE_CBC_EAN8_H_
diff --git a/fxbarcode/cbc_eancode.cpp b/fxbarcode/cbc_eancode.cpp
new file mode 100644
index 0000000..6325b85
--- /dev/null
+++ b/fxbarcode/cbc_eancode.cpp
@@ -0,0 +1,63 @@
+// Copyright 2018 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#include "fxbarcode/cbc_eancode.h"
+
+#include <utility>
+
+#include "fxbarcode/oned/BC_OnedEANWriter.h"
+
+CBC_EANCode::CBC_EANCode(std::unique_ptr<CBC_OneDimEANWriter> pWriter)
+    : CBC_OneCode(std::move(pWriter)) {}
+
+CBC_EANCode::~CBC_EANCode() = default;
+
+CBC_OneDimEANWriter* CBC_EANCode::GetOneDimEANWriter() {
+  return static_cast<CBC_OneDimEANWriter*>(m_pBCWriter.get());
+}
+
+bool CBC_EANCode::Encode(const WideStringView& contents) {
+  if (contents.IsEmpty())
+    return false;
+
+  BCFORMAT format = GetFormat();
+  int32_t out_width = 0;
+  int32_t out_height = 0;
+  m_renderContents = Preprocess(contents);
+  ByteString str = m_renderContents.ToUTF8();
+  auto* pWriter = GetOneDimEANWriter();
+  pWriter->InitEANWriter();
+  std::unique_ptr<uint8_t, FxFreeDeleter> data(
+      pWriter->Encode(str, format, out_width, out_height));
+  return data && pWriter->RenderResult(m_renderContents.AsStringView(),
+                                       data.get(), out_width);
+}
+
+bool CBC_EANCode::RenderDevice(CFX_RenderDevice* device,
+                               const CFX_Matrix* matrix) {
+  return GetOneDimEANWriter()->RenderDeviceResult(
+      device, matrix, m_renderContents.AsStringView());
+}
+
+WideString CBC_EANCode::Preprocess(const WideStringView& contents) {
+  auto* pWriter = GetOneDimEANWriter();
+  WideString encoded_contents = pWriter->FilterContents(contents);
+  size_t length = encoded_contents.GetLength();
+  size_t max_length = GetMaxLength();
+  if (length <= max_length) {
+    for (size_t i = 0; i < max_length - length; i++)
+      encoded_contents.InsertAtFront(L'0');
+
+    ByteString str = encoded_contents.ToUTF8();
+    int32_t checksum = pWriter->CalcChecksum(str);
+    str += '0' + checksum;
+    encoded_contents = WideString::FromUTF8(str.AsStringView());
+  } else {
+    encoded_contents = encoded_contents.Left(max_length + 1);
+  }
+
+  return encoded_contents;
+}
diff --git a/fxbarcode/cbc_eancode.h b/fxbarcode/cbc_eancode.h
new file mode 100644
index 0000000..5c2e737
--- /dev/null
+++ b/fxbarcode/cbc_eancode.h
@@ -0,0 +1,38 @@
+// Copyright 2018 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+// Original code copyright 2014 Foxit Software Inc. http://www.foxitsoftware.com
+
+#ifndef FXBARCODE_CBC_EANCODE_H_
+#define FXBARCODE_CBC_EANCODE_H_
+
+#include <memory>
+
+#include "core/fxcrt/fx_string.h"
+#include "fxbarcode/cbc_onecode.h"
+#include "fxbarcode/utils.h"
+
+class CBC_OneDimEANWriter;
+
+class CBC_EANCode : public CBC_OneCode {
+ public:
+  explicit CBC_EANCode(std::unique_ptr<CBC_OneDimEANWriter> pWriter);
+  ~CBC_EANCode() override;
+
+  virtual BCFORMAT GetFormat() const = 0;
+  virtual size_t GetMaxLength() const = 0;
+
+  // CBC_EANCode:
+  bool Encode(const WideStringView& contents) override;
+  bool RenderDevice(CFX_RenderDevice* device,
+                    const CFX_Matrix* matrix) override;
+
+ protected:
+  CBC_OneDimEANWriter* GetOneDimEANWriter();
+  WideString Preprocess(const WideStringView& contents);
+
+  WideString m_renderContents;
+};
+
+#endif  // FXBARCODE_CBC_EANCODE_H_
diff --git a/fxbarcode/cbc_onecode.h b/fxbarcode/cbc_onecode.h
index eae618e..946911c 100644
--- a/fxbarcode/cbc_onecode.h
+++ b/fxbarcode/cbc_onecode.h
@@ -24,13 +24,13 @@
   virtual bool CheckContentValidity(const WideStringView& contents);
   virtual WideString FilterContents(const WideStringView& contents);
 
-  virtual void SetPrintChecksum(bool checksum);
-  virtual void SetDataLength(int32_t length);
-  virtual void SetCalChecksum(bool calc);
-  virtual bool SetFont(CFX_Font* cFont);
-  virtual void SetFontSize(float size);
-  virtual void SetFontStyle(int32_t style);
-  virtual void SetFontColor(FX_ARGB color);
+  void SetPrintChecksum(bool checksum);
+  void SetDataLength(int32_t length);
+  void SetCalChecksum(bool calc);
+  bool SetFont(CFX_Font* cFont);
+  void SetFontSize(float size);
+  void SetFontStyle(int32_t style);
+  void SetFontColor(FX_ARGB color);
 
  private:
   CBC_OneDimWriter* GetOneDimWriter();
diff --git a/fxbarcode/cbc_upca.cpp b/fxbarcode/cbc_upca.cpp
index 77c4c49..3a3e87f 100644
--- a/fxbarcode/cbc_upca.cpp
+++ b/fxbarcode/cbc_upca.cpp
@@ -26,56 +26,18 @@
 #include "fxbarcode/oned/BC_OnedUPCAWriter.h"
 #include "third_party/base/ptr_util.h"
 
-CBC_UPCA::CBC_UPCA() : CBC_OneCode(pdfium::MakeUnique<CBC_OnedUPCAWriter>()) {}
+CBC_UPCA::CBC_UPCA() : CBC_EANCode(pdfium::MakeUnique<CBC_OnedUPCAWriter>()) {}
 
-CBC_UPCA::~CBC_UPCA() {}
-
-WideString CBC_UPCA::Preprocess(const WideStringView& contents) {
-  CBC_OnedUPCAWriter* pWriter = GetOnedUPCAWriter();
-  WideString encodeContents = pWriter->FilterContents(contents);
-  size_t length = encodeContents.GetLength();
-  if (length <= 11) {
-    for (size_t i = 0; i < 11 - length; i++)
-      encodeContents = L'0' + encodeContents;
-
-    ByteString byteString = encodeContents.ToUTF8();
-    int32_t checksum = pWriter->CalcChecksum(byteString);
-    byteString += '0' + checksum;
-    encodeContents = WideString::FromUTF8(byteString.AsStringView());
-  } else {
-    encodeContents = encodeContents.Left(12);
-  }
-
-  return encodeContents;
-}
-
-bool CBC_UPCA::Encode(const WideStringView& contents) {
-  if (contents.IsEmpty())
-    return false;
-
-  BCFORMAT format = BCFORMAT_UPC_A;
-  int32_t outWidth = 0;
-  int32_t outHeight = 0;
-  m_renderContents = Preprocess(contents);
-  ByteString byteString = m_renderContents.ToUTF8();
-  CBC_OnedUPCAWriter* pWriter = GetOnedUPCAWriter();
-  pWriter->Init();
-  std::unique_ptr<uint8_t, FxFreeDeleter> data(
-      pWriter->Encode(byteString, format, outWidth, outHeight));
-  return data && pWriter->RenderResult(m_renderContents.AsStringView(),
-                                       data.get(), outWidth);
-}
-
-bool CBC_UPCA::RenderDevice(CFX_RenderDevice* device,
-                            const CFX_Matrix* matrix) {
-  return GetOnedUPCAWriter()->RenderDeviceResult(
-      device, matrix, m_renderContents.AsStringView());
-}
+CBC_UPCA::~CBC_UPCA() = default;
 
 BC_TYPE CBC_UPCA::GetType() {
   return BC_UPCA;
 }
 
-CBC_OnedUPCAWriter* CBC_UPCA::GetOnedUPCAWriter() {
-  return static_cast<CBC_OnedUPCAWriter*>(m_pBCWriter.get());
+BCFORMAT CBC_UPCA::GetFormat() const {
+  return BCFORMAT_UPC_A;
+}
+
+size_t CBC_UPCA::GetMaxLength() const {
+  return 11;
 }
diff --git a/fxbarcode/cbc_upca.h b/fxbarcode/cbc_upca.h
index 89bfc52..bf71fc9 100644
--- a/fxbarcode/cbc_upca.h
+++ b/fxbarcode/cbc_upca.h
@@ -9,25 +9,19 @@
 
 #include "core/fxcrt/fx_string.h"
 #include "core/fxcrt/fx_system.h"
-#include "fxbarcode/cbc_onecode.h"
+#include "fxbarcode/cbc_eancode.h"
 
 class CBC_OnedUPCAWriter;
 
-class CBC_UPCA final : public CBC_OneCode {
+class CBC_UPCA final : public CBC_EANCode {
  public:
   CBC_UPCA();
   ~CBC_UPCA() override;
 
-  // CBC_CodeBase:
-  bool Encode(const WideStringView& contents) override;
-  bool RenderDevice(CFX_RenderDevice* device,
-                    const CFX_Matrix* matrix) override;
+  // CBC_EANCode:
   BC_TYPE GetType() override;
-
- private:
-  CBC_OnedUPCAWriter* GetOnedUPCAWriter();
-  WideString Preprocess(const WideStringView& contents);
-  WideString m_renderContents;
+  BCFORMAT GetFormat() const override;
+  size_t GetMaxLength() const override;
 };
 
 #endif  // FXBARCODE_CBC_UPCA_H_
diff --git a/fxbarcode/oned/BC_OnedEAN13Writer.h b/fxbarcode/oned/BC_OnedEAN13Writer.h
index c800918..8436a4f 100644
--- a/fxbarcode/oned/BC_OnedEAN13Writer.h
+++ b/fxbarcode/oned/BC_OnedEAN13Writer.h
@@ -9,17 +9,17 @@
 
 #include "core/fxcrt/fx_string.h"
 #include "core/fxcrt/fx_system.h"
-#include "fxbarcode/oned/BC_OneDimWriter.h"
+#include "fxbarcode/oned/BC_OnedEANWriter.h"
 
 class CFX_DIBitmap;
 class CFX_RenderDevice;
 
-class CBC_OnedEAN13Writer final : public CBC_OneDimWriter {
+class CBC_OnedEAN13Writer final : public CBC_OneDimEANWriter {
  public:
   CBC_OnedEAN13Writer();
   ~CBC_OnedEAN13Writer() override;
 
-  // CBC_OneDimWriter
+  // CBC_OneDimEANWriter:
   uint8_t* EncodeWithHint(const ByteString& contents,
                           BCFORMAT format,
                           int32_t& outWidth,
@@ -28,8 +28,7 @@
   uint8_t* EncodeImpl(const ByteString& contents, int32_t& outLength) override;
   bool CheckContentValidity(const WideStringView& contents) override;
   WideString FilterContents(const WideStringView& contents) override;
-
-  int32_t CalcChecksum(const ByteString& contents);
+  int32_t CalcChecksum(const ByteString& contents) override;
 
  private:
   bool ShowChars(const WideStringView& contents,
diff --git a/fxbarcode/oned/BC_OnedEAN13Writer_unittest.cpp b/fxbarcode/oned/BC_OnedEAN13Writer_unittest.cpp
index 932e1f4..0f85496 100644
--- a/fxbarcode/oned/BC_OnedEAN13Writer_unittest.cpp
+++ b/fxbarcode/oned/BC_OnedEAN13Writer_unittest.cpp
@@ -9,6 +9,7 @@
 
 TEST(OnedEAN13WriterTest, Encode) {
   CBC_OnedEAN13Writer writer;
+  writer.InitEANWriter();
   int32_t width;
   int32_t height;
   uint8_t* encoded;
@@ -89,6 +90,7 @@
 
 TEST(OnedEAN13WriterTest, Checksum) {
   CBC_OnedEAN13Writer writer;
+  writer.InitEANWriter();
   EXPECT_EQ(0, writer.CalcChecksum(""));
   EXPECT_EQ(6, writer.CalcChecksum("123"));
   EXPECT_EQ(8, writer.CalcChecksum("123456789012"));
diff --git a/fxbarcode/oned/BC_OnedEAN8Writer.h b/fxbarcode/oned/BC_OnedEAN8Writer.h
index 6295c4e..9d107b9 100644
--- a/fxbarcode/oned/BC_OnedEAN8Writer.h
+++ b/fxbarcode/oned/BC_OnedEAN8Writer.h
@@ -10,17 +10,17 @@
 #include "core/fxcrt/fx_string.h"
 #include "core/fxcrt/fx_system.h"
 #include "fxbarcode/BC_Library.h"
-#include "fxbarcode/oned/BC_OneDimWriter.h"
+#include "fxbarcode/oned/BC_OnedEANWriter.h"
 
 class CFX_DIBitmap;
 class CFX_RenderDevice;
 
-class CBC_OnedEAN8Writer final : public CBC_OneDimWriter {
+class CBC_OnedEAN8Writer final : public CBC_OneDimEANWriter {
  public:
   CBC_OnedEAN8Writer();
   ~CBC_OnedEAN8Writer() override;
 
-  // CBC_OneDimWriter
+  // CBC_OneDimEANWriter:
   uint8_t* EncodeWithHint(const ByteString& contents,
                           BCFORMAT format,
                           int32_t& outWidth,
@@ -31,8 +31,7 @@
   WideString FilterContents(const WideStringView& contents) override;
   void SetDataLength(int32_t length) override;
   bool SetTextLocation(BC_TEXT_LOC location) override;
-
-  int32_t CalcChecksum(const ByteString& contents);
+  int32_t CalcChecksum(const ByteString& contents) override;
 
  private:
   bool ShowChars(const WideStringView& contents,
diff --git a/fxbarcode/oned/BC_OnedEAN8Writer_unittest.cpp b/fxbarcode/oned/BC_OnedEAN8Writer_unittest.cpp
index 16a1df6..55a0a33 100644
--- a/fxbarcode/oned/BC_OnedEAN8Writer_unittest.cpp
+++ b/fxbarcode/oned/BC_OnedEAN8Writer_unittest.cpp
@@ -9,6 +9,7 @@
 
 TEST(OnedEAN8WriterTest, Encode) {
   CBC_OnedEAN8Writer writer;
+  writer.InitEANWriter();
   int32_t width;
   int32_t height;
   uint8_t* encoded;
@@ -79,6 +80,7 @@
 
 TEST(OnedEAN8WriterTest, Checksum) {
   CBC_OnedEAN8Writer writer;
+  writer.InitEANWriter();
   EXPECT_EQ(0, writer.CalcChecksum(""));
   EXPECT_EQ(6, writer.CalcChecksum("123"));
   EXPECT_EQ(0, writer.CalcChecksum("1234567"));
diff --git a/fxbarcode/oned/BC_OnedEANWriter.cpp b/fxbarcode/oned/BC_OnedEANWriter.cpp
new file mode 100644
index 0000000..f43b9ad
--- /dev/null
+++ b/fxbarcode/oned/BC_OnedEANWriter.cpp
@@ -0,0 +1,11 @@
+// Copyright 2018 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#include "fxbarcode/oned/BC_OnedEANWriter.h"
+
+CBC_OneDimEANWriter::CBC_OneDimEANWriter() = default;
+
+CBC_OneDimEANWriter::~CBC_OneDimEANWriter() = default;
+
+void CBC_OneDimEANWriter::InitEANWriter() {}
diff --git a/fxbarcode/oned/BC_OnedEANWriter.h b/fxbarcode/oned/BC_OnedEANWriter.h
new file mode 100644
index 0000000..5d80167
--- /dev/null
+++ b/fxbarcode/oned/BC_OnedEANWriter.h
@@ -0,0 +1,19 @@
+// Copyright 2018 PDFium Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style license that can be
+// found in the LICENSE file.
+
+#ifndef FXBARCODE_ONED_BC_ONEDEANWRITER_H_
+#define FXBARCODE_ONED_BC_ONEDEANWRITER_H_
+
+#include "fxbarcode/oned/BC_OneDimWriter.h"
+
+class CBC_OneDimEANWriter : public CBC_OneDimWriter {
+ public:
+  CBC_OneDimEANWriter();
+  ~CBC_OneDimEANWriter() override;
+
+  virtual void InitEANWriter();
+  virtual int32_t CalcChecksum(const ByteString& contents) = 0;
+};
+
+#endif  // FXBARCODE_ONED_BC_ONEDEANWRITER_H_
diff --git a/fxbarcode/oned/BC_OnedUPCAWriter.cpp b/fxbarcode/oned/BC_OnedUPCAWriter.cpp
index 9e7400a..d3b9226 100644
--- a/fxbarcode/oned/BC_OnedUPCAWriter.cpp
+++ b/fxbarcode/oned/BC_OnedUPCAWriter.cpp
@@ -36,10 +36,6 @@
   m_bRightPadding = true;
 }
 
-void CBC_OnedUPCAWriter::Init() {
-  m_subWriter = pdfium::MakeUnique<CBC_OnedEAN13Writer>();
-}
-
 CBC_OnedUPCAWriter::~CBC_OnedUPCAWriter() {}
 
 bool CBC_OnedUPCAWriter::CheckContentValidity(const WideStringView& contents) {
@@ -66,6 +62,10 @@
   return filtercontents;
 }
 
+void CBC_OnedUPCAWriter::InitEANWriter() {
+  m_subWriter = pdfium::MakeUnique<CBC_OnedEAN13Writer>();
+}
+
 int32_t CBC_OnedUPCAWriter::CalcChecksum(const ByteString& contents) {
   int32_t odd = 0;
   int32_t even = 0;
diff --git a/fxbarcode/oned/BC_OnedUPCAWriter.h b/fxbarcode/oned/BC_OnedUPCAWriter.h
index 6101b4d..8e2f770 100644
--- a/fxbarcode/oned/BC_OnedUPCAWriter.h
+++ b/fxbarcode/oned/BC_OnedUPCAWriter.h
@@ -11,19 +11,19 @@
 
 #include "core/fxcrt/fx_string.h"
 #include "core/fxcrt/fx_system.h"
-#include "fxbarcode/oned/BC_OneDimWriter.h"
+#include "fxbarcode/oned/BC_OnedEANWriter.h"
 
 class CBC_OnedEAN13Writer;
 class CFX_DIBitmap;
 class CFX_Matrix;
 class CFX_RenderDevice;
 
-class CBC_OnedUPCAWriter final : public CBC_OneDimWriter {
+class CBC_OnedUPCAWriter final : public CBC_OneDimEANWriter {
  public:
   CBC_OnedUPCAWriter();
   ~CBC_OnedUPCAWriter() override;
 
-  // CBC_OneDimWriter
+  // CBC_OneDimEANWriter:
   uint8_t* EncodeWithHint(const ByteString& contents,
                           BCFORMAT format,
                           int32_t& outWidth,
@@ -32,9 +32,8 @@
   uint8_t* EncodeImpl(const ByteString& contents, int32_t& outLength) override;
   bool CheckContentValidity(const WideStringView& contents) override;
   WideString FilterContents(const WideStringView& contents) override;
-
-  void Init();
-  int32_t CalcChecksum(const ByteString& contents);
+  void InitEANWriter() override;
+  int32_t CalcChecksum(const ByteString& contents) override;
 
  private:
   bool ShowChars(const WideStringView& contents,
diff --git a/fxbarcode/oned/BC_OnedUPCAWriter_unittest.cpp b/fxbarcode/oned/BC_OnedUPCAWriter_unittest.cpp
index 3d9f6c5..cd9ff47 100644
--- a/fxbarcode/oned/BC_OnedUPCAWriter_unittest.cpp
+++ b/fxbarcode/oned/BC_OnedUPCAWriter_unittest.cpp
@@ -9,13 +9,10 @@
 
 TEST(OnedUPCAWriterTest, Encode) {
   CBC_OnedUPCAWriter writer;
+  writer.InitEANWriter();
   int32_t width;
   int32_t height;
 
-  // TODO(hnakashima): CBC_OnedUPCAWriter is unique in that it needs to be
-  // Init()'d. Get rid of this call.
-  writer.Init();
-
   // UPCA barcodes encode 12-digit numbers into 95 modules in a unidimensional
   // disposition.
   uint8_t* encoded = writer.Encode("", BCFORMAT_UPC_A, width, height);
@@ -87,6 +84,7 @@
 
 TEST(OnedUPCAWriterTest, Checksum) {
   CBC_OnedUPCAWriter writer;
+  writer.InitEANWriter();
   EXPECT_EQ(0, writer.CalcChecksum(""));
   EXPECT_EQ(6, writer.CalcChecksum("123"));
   EXPECT_EQ(2, writer.CalcChecksum("12345678901"));
